SimpleFOC之ESP32(九)—— WIFI、UDP和TCP

目录

  • 说明
  • 一、网络通信
    • 1.1、准备工作
    • 1.2、UDP通信
    • 1.3、TCP通信
  • 二、硬件准备
  • 三、代码参考
  • 四、代码演示
    • 4.1、WIFI_AP模式UDP通信
    • 4.2、WIFI_STA模式TCP client通信
  • 五、UDP通信控制电机
    • 5.1、硬件准备
    • 5.2、代码演示
      • 5.2.1、串口通信更改为UDP通信
      • 5.2.2、笔记本连接AP
      • 5.2.3、UDP发送指令
      • 5.2.4、观察电机运动
  • 写后感


SimpleFOC教程目录:请点击

说明

  • 你一般是怎么看教程的,是不是直接往下翻,找到接线图和代码比划一番结束,所以你也看不到这段话是不是!这让我想起了电影《卧虎藏龙》里碧眼狐狸偷了武功秘籍,但是不识字只能看图比划,而她的徒弟识字,不仅看图还读了心经所以武功超越了师父。文字往往才是核心技术,图片不过是外在的表现形式。
  • simpleFOC的官方代码到上一篇就结束了,网上相关的教程也很少提到无线通信这块。电机控制是个很硬件的技术,无论是电路设计还是嵌入式编程;而无线通信因为协议的复杂性,更适合厂家以接口函数的方式提供给用户,所以更像软件编程。两者结合非常有跨界感。
  • 一般有两年以上工作经验的嵌入式工程师,用惯了keil,习惯了直接操作寄存器或者底层函数的安全感,根本接受不了arduino这种软件化的编程方式。这就像是右手拿筷子吃饭的人很难再学会左手拿筷子,不是学不会而是觉得没必要,不愿学。
  • 本人18年开始接触arduino,这几年见证了这个平台的飞速发展,各芯片厂家通过提供底层驱动与arduino平台对接,arduino再以统一的函数提供给用户,这样无论用什么芯片,编程都是一样的,也不用考虑底层,所以非常方便。这一点很像当年C语言代替汇编编程,当然目前arduino还处于发展阶段。(用keil编程时,如果有些芯片的驱动你不想自己写,百度也没找到合适的,完全可以到arduino的网站搜下,找到芯片的Arduino Library,稍微修改下就可以成为你的了,省心靠谱,这个技术我一般不告诉别人!)

一、网络通信

  • 考虑到读这篇文章的同学比较偏硬件,所以从最基本的知识点切入,先通过网络调试助手演示通信过程。
  • 四个概念
    • 1、UDP(User Datagram Protocol),利用 IP 提供面向无连接的通信服务,不提供复杂的控制机制,所以速度很快。
    • 2、TCP(Transmission Control Protocol),提供面向有连接的通信传输,三次握手、四次挥手、确认应答、超时重发,数据传输可靠性高。
    • 3、AP(Access Point),提供无线接入服务,允许其它无线设备接入提供数据访问,路由器工作在该模式。
    • 4、Sta(Station), 类似于无线终端,Sta本身并不接受无线的接入,它可以连接到AP,无线网卡工作在该模式。

1.1、准备工作

1.1.1、网络调试助手
SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第1张图片

1.1.2、ipconfig查看本机地址,

  • 最好是两台电脑之间通信,一台电脑运行两个调试软件也可以。
    SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第2张图片
    SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第3张图片

1.2、UDP通信

  • UDP不需要事先建立连接,只要知道对方的IP和端口号就可以发送数据,
    SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第4张图片
    SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第5张图片

1.3、TCP通信

  • TCP通信分为server和client,先设置好server,client连接server建立连接,才能发送数据,
    SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第6张图片
    SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第7张图片

二、硬件准备

SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第8张图片
或者

ESP32drive 购买链接:某宝购买

USB转TTL,最好能提供较强的3.3V供电能力,比如板载AMS1117-3.3芯片,这样可以不用12V外部供电,

三、代码参考

  • ESP32的arduino库提供非常多的示例,可以参考,
    SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第9张图片
  • Arduino官方的wifi库可以详细了解函数的用法
    SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第10张图片

四、代码演示

4.1、WIFI_AP模式UDP通信

ESP32模块配置为AP模式,电脑连接ESP32,发送指令控制ESP32的板载LED亮灭。

  • 4.1.1、编译上传代码
//此代码演示,ESP32做为热点,电脑连接ESP32
//连接热点后,ESP32给电脑分配IP,电脑向指定的IP和端口发送数据,192.168.4.1 , 1234
//网络调试助手向ESP32发送 on ,LED指示灯亮;发送 off ,LED指示灯灭
//wifi库函数用法请参考:https://www.arduino.cc/en/Reference/WiFi
//请阅读教程《SimpleFOC之ESP32(九)—— WIFI、UDP和TCP通信》:https://blog.csdn.net/loop222/article/details/121201638

#include 

#define LEDpin 2
#define LEDoff digitalWrite(LEDpin, LOW)
#define LEDon  digitalWrite(LEDpin, HIGH)

const char* ssid = "ESP32drive";   //AP名称
const char* pswd = "123456abcd";   //AP密码,至少8位

uint16_t udp_port = 1234;  //端口号,ESP32默认IP:192.168.4.1

WiFiUDP udp;

int recv_length;
char recvbuff[255];  //存储接收到的数据

//*******************************************************************************************
void setup() {
  pinMode(LEDpin, OUTPUT);
  LEDon;
  
  Serial.begin(115200);
  Serial.println("AP mode:");
  
  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid,pswd);          //建立热点
  
  Serial.print(WiFi.softAPIP());   //串口打印模块IP和端口号 192.168.4.1,1234
  Serial.print(",");
  Serial.println(udp_port);
  
  udp.begin(udp_port);             //启动UDP监听端口,等待电脑发送数据
  Serial.println("Ready!");
}
//*******************************************************************************************
void loop() {
  int recv_length=udp.parsePacket();    //获取接收的数据的长度
  if(recv_length)                       //如果有数据那么recv_length不为0
  {
    int len = udp.read(recvbuff, 255);  //读取数据到recvbuff中
    if (len > 0)
    {
      if( ( strcmp(recvbuff,"on") )==0 )LEDon;        //判断收到的数组为on,LED亮
      else if( ( strcmp(recvbuff,"off") )==0 )LEDoff; //off,LED灭
      
      Serial.println(recvbuff);  //串口打印网口收到的数据
    }
    
    //将接收到的数据发送回去
    udp.beginPacket(udp.remoteIP(),udp.remotePort());  //准备发送数据到目标IP和目标端口
    udp.print("Receive:");
    udp.println(recvbuff);  //数据放入发送的缓冲区
    udp.endPacket();              //发送
    
    for(int i=0;i<255;i++)     //清空接收数组
    {recvbuff[i] = 0;}
  }
}
//*******************************************************************************************
  • 4.1.2、ESP32上电运行,笔记本连接ESP32,ESP32给笔记本分配IP,
    SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第11张图片
  • 4.1.3、UDP发送指令,
    SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第12张图片

4.2、WIFI_STA模式TCP client通信

网络调试助手配置为TCP server模式,ESP32连接电脑,网络调试助手发送指令控制板载LED亮灭。

  • 4.2.1、编译上传代码,
//此代码演示,ESP32连接路由器,所以需要输入路由器的ID和密码
//连接路由器后,向指定的网址和端口发送数据,所以需要先设置好网络调试助手
//网络调试助手向ESP32发送 on ,LED指示灯亮;发送 off ,LED指示灯灭
//wifi库函数用法请参考:https://www.arduino.cc/en/Reference/WiFi
//请阅读教程《SimpleFOC之ESP32(九)—— WIFI、UDP和TCP通信》:https://blog.csdn.net/loop222/article/details/121201638

#include 

#define LEDpin 2
#define LEDoff digitalWrite(LEDpin, LOW)
#define LEDon  digitalWrite(LEDpin, HIGH)

const char* ssid = "TP-LINK123";   //路由器的ID和密码
const char* pswd = "123456abcd";

const char * ServerAddress = "192.168.1.106";  //网络调试助手设置的IP和端口,通过ipconfig获取电脑IP
const int ServerPort = 1234;            //网络调试助手设置的端口号

WiFiClient client;

//*******************************************************************************************
void setup()
{
  pinMode(LEDpin, OUTPUT);
  LEDon;
  
  Serial.begin(115200);
  delay(10);
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pswd);   //开始连接路由器wifi
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);             //没有连接上,每隔0.5秒打印一个.
    Serial.print(".");
  }
  
  Serial.println("WIFI connected!");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());   //查看路由器分配给ESP32的IP
  Serial.print("ESP Mac Address: ");
  Serial.println(WiFi.macAddress());

  if(client.connect(ServerAddress,ServerPort)){   //连接TCP server
    Serial.println("server connected");   //连上服务器
  }
  LEDoff;
}
//*******************************************************************************************
void loop(){
  if(WiFi.status() != WL_CONNECTED) {
    Serial.println("wifi disconnect"); //关闭路由器后打印
    WiFi.disconnect();                 //断开连接
    delay(1000);
  }
  if(!client.connected()){
    Serial.println("server closed");   //关闭服务器后打印
    client.stop();
    delay(1000);
  }
  if(client.available() > 0)
  {
    //百度Arduino String,可以找到string的很多用法
    String line = client.readString();
    if(line.equalsIgnoreCase("on"))LEDon;        //LED亮,判断字符串是否相等,忽略大小写
    else if(line.equalsIgnoreCase("off"))LEDoff; //LED灭
    
    Serial.println(line);
    line = "";   //清空接收字符串
  }
}
//*******************************************************************************************
  • 4.2.1、电脑上建立TCP server,等待ESP32连接,连接后发送指令,控制LED亮灭,
    SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第13张图片

五、UDP通信控制电机

5.1、硬件准备

  • 用电池更能提现无线通信的简洁,

    ESP32drive 购买链接:某宝购买
    带编码器电机 购买链接:某宝购买

5.2、代码演示

5.2.1、串口通信更改为UDP通信

  • 在 电流闭环控制Lowside 的代码基础上更改,
    SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第14张图片

5.2.2、笔记本连接AP

  • ESP32配置为AP模式,
    SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第15张图片

5.2.3、UDP发送指令

SimpleFOC之ESP32(九)—— WIFI、UDP和TCP_第16张图片

5.2.4、观察电机运动



写后感

  • 就本文描述的UDP通信,搁十年前用有线的方式实现,硬件设计+软件调试,经验丰富的工程师怎么也得大半年捣腾,什么PHY,网口隔离变压器,还要移植LWIP,方方面面都要考虑。现在三天,最多一星期就可以实现。技术进步又方便又可怕,跟不上技术发展的老工程师就得被淘汰。
  • 无线通信是ESP的“看家”技术,博大精深,展开了半年也写不完,本文只讲几个最基本的应用,对物联网有兴趣的同学可以深入研究!


    (完)


    欢迎加入simpleFOC技术交流群:923734429 群已满根据提示添加新群 (入群申请写:CSDN)


    请继续阅读相关文章:
    SimpleFOC之ESP32(一)—— 搭建开发环境
    SimpleFOC之ESP32(二)—— 开环控制
    SimpleFOC之ESP32(三)—— 闭环控制
    SimpleFOC之ESP32(四)—— 电流闭环控制Inline
    SimpleFOC之ESP32(五)—— 电流闭环控制Lowside
    SimpleFOC之ESP32(六)—— 双电机控制
    SimpleFOC之ESP32(七)—— 霍尔电机
    SimpleFOC之ESP32(八)—— ABZ编码器电机
    SimpleFOC之ESP32(九)—— WIFI、UDP和TCP
    SimpleFOC之ESP32(十)—— ESP-NOW和力矩反馈

你可能感兴趣的:(simpleFOC,udp,tcp/ip,ESP32,simpleFOC)