SimpleFOC之ESP32(九)—— WIFI、UDP和TCP
目录说明 SimpleFOC教程目录:请点击 说明你一般是怎么看教程的,是不是直接往下翻,找到接线图和代码比划一番结束,所以你也看不到这段话是不是!这让我想起了电影《卧虎藏龙》里碧眼狐狸偷了武功秘籍,但是不识字只能看图比划,而她的徒弟识字,不仅看图还读了心经所以武功超越了师父。文字往往才是核心技术,图片不过是外在的表现形式。simpleFOC的官方代码到上一篇就结束了,网上相关的教程也很少提到无线
目录
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、网络调试助手
1.1.2、ipconfig查看本机地址,
- 最好是两台电脑之间通信,一台电脑运行两个调试软件也可以。
1.2、UDP通信
- UDP不需要事先建立连接,只要知道对方的IP和端口号就可以发送数据,
1.3、TCP通信
- TCP通信分为server和client,先设置好server,client连接server建立连接,才能发送数据,
二、硬件准备
或者
ESP32drive 购买链接:https://item.taobao.com/item.htm?ft=t&id=662591519566,图锐科技
USB转TTL,最好能提供较强的3.3V供电能力,比如板载AMS1117-3.3芯片,这样可以不用12V外部供电,
三、代码参考
- ESP32的arduino库提供非常多的示例,可以参考,
- Arduino官方的wifi库可以详细了解函数的用法
四、代码演示
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 <WiFi.h>
#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,
- 4.1.3、UDP发送指令,
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 <WiFi.h>
#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亮灭,
五、UDP通信控制电机
5.1、硬件准备
- 用电池更能提现无线通信的简洁,
ESP32drive 购买链接:https://item.taobao.com/item.htm?ft=t&id=662591519566,图锐科技
电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技
5.2、代码演示
5.2.1、串口通信更改为UDP通信
- 在 电流闭环控制Lowside 的代码基础上更改,
5.2.2、笔记本连接AP
- ESP32配置为AP模式,
5.2.3、UDP发送指令
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和力矩反馈
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)