首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 23-09-28 04:01
  • 2536
  • 13406
blog.csdn.net

目录

  • 说明
  • 一、网络通信
    • 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、网络调试助手
在这里插入图片描述
 
1.1.2、ipconfig查看本机地址,

  • 最好是两台电脑之间通信,一台电脑运行两个调试软件也可以。
    在这里插入图片描述
    在这里插入图片描述
     

1.2、UDP通信

  • UDP不需要事先建立连接,只要知道对方的IP和端口号就可以发送数据,
    在这里插入图片描述
    在这里插入图片描述
     

1.3、TCP通信

  • TCP通信分为server和client,先设置好server,client连接server建立连接,才能发送数据,
    在这里插入图片描述
    在这里插入图片描述
     

二、硬件准备

在这里插入图片描述
或者
在这里插入图片描述
ESP32drive 购买链接:某宝购买
 
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通信》:http://iyenn.com/rec/391944.html

#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;}
  }
}
//*******************************************************************************************
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 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通信》:http://iyenn.com/rec/391944.html

#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 = "";   //清空接收字符串
  }
}
//*******************************************************************************************
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 4.2.1、电脑上建立TCP server,等待ESP32连接,连接后发送指令,控制LED亮灭,
    在这里插入图片描述
     

五、UDP通信控制电机

5.1、硬件准备

  • 用电池更能提现无线通信的简洁,
    在这里插入图片描述
    ESP32drive 购买链接:某宝购买
    带编码器电机 购买链接:某宝购买
     

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和力矩反馈
文章知识点与官方知识档案匹配,可进一步学习相关知识
网络技能树首页概览38202 人正在系统学习中
注:本文转载自blog.csdn.net的loop222的文章"https://blog.csdn.net/loop222/article/details/122698068"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top