281浏览
查看: 281|回复: 15

[K10教程] 【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车

[复制链接]
【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图2

行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板,100%采用国产芯片,知识产权自主可控,符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成2.8寸LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源,教学过程中无需额外连接其他设备,便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等AI人工智能项目。

主要特点
集成摄像头&内置算法,可进行离线图像检测
集成麦克风&内置算法,可进行离线语音识别
集成扬声器&内置算法,可进行离线语音合成
2.8寸彩色屏幕,数据展示更清晰
集成度高,利于教学
接口丰富,兼容软件多,扩展性好

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图1

驴友花雕  高级技神
 楼主|

发表于 2026-7-21 19:53:57

【花雕动手做】K10 UDP双向通信陀螺仪姿态控制麦轮小车

实验扩展板与麦轮小车

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图2

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图1

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-7-21 19:55:22

【花雕动手做】K10 UDP双向通信陀螺仪姿态控制麦轮小车

遥控发射端掌控宝(带锂电池)

掌控板是国内专为**中小学 Python 创客教育**设计的开源微型开发板,搭载 ESP32 主控,自带 WiFi + 蓝牙,是一块 “掌上微型电脑”DFRobot。

一、核心板载硬件(不用外接配件就能玩)

1. **1.3 寸 OLED 显示屏**:128×64 分辨率,显示文字、动画、图片,支持中文;
2. **交互部件**:A/B 物理按键、6 路金手指触摸键、3 颗全彩 RGB 灯、蜂鸣器(播放音乐);
3. **内置传感器**:麦克风(拾音)、光线传感器、三轴加速度 / 磁场传感器(做电子罗盘、计步器);
4. **通信**:WiFi、蓝牙双无线,可联网、两块板子无线互传数据;
5. **拓展**:底部金手指引出全部 IO,能外接舵机、温湿度、电机等模块。

二、两种编程方式,零基础友好

1. **图形化积木编程(mPython/Mind+)**:拖拽模块,小学生也能上手;
2. **MicroPython 代码编程**:直接写 Python 代码,衔接初高中信息技术课程。

三、常见用途

- 课堂教学:编程入门、物联网、STEAM 科创课;
- 趣味制作:电子表、声光小游戏、声控彩灯、便携噪声 / 光照检测仪;
- 物联网:联网看天气、远程控制设备、环境数据上传云端;
- 可穿戴:智能手环、电子徽章、便携小仪器。

四、特点

体积小巧、一体化集成传感器、国产教育硬件、软硬件全开源,不用复杂接线就能快速做出智能小作品。

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图1

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-7-21 19:57:10

【花雕动手做】K10 UDP双向通信陀螺仪姿态控制麦轮小车

行空板K10的网络服务模块,都在这里

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图1

添加WIFI和UDP广播模块

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图2

相关积木

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图4

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图3


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-7-21 19:59:22

【花雕动手做】K10 UDP双向通信陀螺仪姿态控制麦轮小车

板载传感器与小车扩展板相关积木

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图2

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图3

辅助:屏幕显示相关积木

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图4

LED控制模块

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图1


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-7-21 20:03:48

【花雕动手做】K10 UDP双向通信陀螺仪姿态控制麦轮小车

知识点:行空板 K10 WiFi 局域网 UDP 广播

一、UDP 基础概念
UDP 全称用户数据报协议,属于 TCP/IP 网络协议,是无连接、广播式、尽力传输的通信方式。
放到行空板场景:所有设备连同一个 WiFi 路由器,组成局域网,依靠 IP + 端口收发数据;支持一台发送、全网所有设备同时接收,也就是 UDP 广播。
和 TCP 最大区别:不用提前握手建立连接,发消息直接抛到局域网里,速度快、代码简单,但不自动重传丢包数据。

二、运行硬性前提(必须满足)
全部通信行空板 K10 连接同一个 WiFi 热点;
设备自动获取同一段内网 IP(常见 192.168.4.xxx、192.168.1.xxx);
通信双方设置完全一致的端口号(截图示例固定 8888);
程序开头必须先执行 WiFi 配网连接,没连上 WiFi,UDP 模块无法启动。

三、相关图形积木功能解析
1. 基础服务端积木
设置 UDP 服务器端口 8888
本机开启 UDP 监听服务,占用 8888 端口,持续等候局域网内所有广播数据包。一块板子可同时做服务端 + 客户端。
当 UDP 服务器收到 广播消息
事件回调块:一旦局域网内有设备发出广播数据,立刻触发内部执行逻辑(点灯、屏幕打印、动作指令)。
UDP 服务器发送消息 "xxx"
向外发送全网广播包,当前 WiFi 局域网里所有开启 UDP 8888 端口的设备全部收到这条内容。
2. 基础客户端积木
设置 UDP 客户端连接到服务器 IP 192.168.4.1 端口 8888
客户端绑定目标服务端的内网 IP 与端口,建立通信目标;广播场景下 IP 可填局域网广播地址,实现一对多群发。
UDP 客户端发送消息 "xxx"
两种用法:①定向发给上面填写的单个服务器 IP;②发送全网广播,所有同端口设备接收。
当 UDP 客户端收到 广播消息
客户端独立监听广播数据包,收到数据后执行内部程序逻辑。

四、两种常用工作模式
模式 1:一对多广播(教学最常用)
1 块主控发送,N 台从板同步接收动作
主控(发送端):WiFi 联网 → UDP 开启 8888 端口 → 按键 / 陀螺仪触发「服务器发送消息」;
所有从板:WiFi 连同一个热点 → UDP 端口 8888 → 绑定「收到广播消息」回调,识别指令点灯、动作;
特点:一块板子下发指令,几十台设备同步响应。
模式 2:点对点双向通信
A 板客户端连 B 板服务端 IP,双向互发消息,适合一问一答、状态回传(比如小车上报速度、传感器数值回传给主控)。

五、完整积木程序标准结构
发送主控模板
【连接 WiFi】填入 WiFi 名称、密码(第一步必加)
【设置 UDP 服务器端口 8888】
循环 / 按键触发:【UDP 服务器发送消息 "hong"】
接收从板模板
【连接 WiFi】同一个 WiFi 账号密码
【设置 UDP 服务器端口 8888】
【当 UDP 服务器收到广播消息】
判断收到文本,匹配hong/bai/qian等指令,执行 RGB 变色、屏幕文字。

六、UDP 核心优缺点
优点
天然一对多广播:一次发送全网同端口设备接收,批量控制效率高;
速度快延迟低:无握手、无校验重传,体感几乎无卡顿;
兼容多设备:行空板、电脑、手机、ESP32 全都能互通;
数据承载量大:相比离线 Radio 射频,UDP 支持长文本、大量传感器数值、中等长度数据流;
覆盖范围广:路由器 WiFi 全屋覆盖,穿墙能力优于 2.4G 私有射频。
缺点
强依赖 WiFi 网络:无路由器、无 WiFi 环境完全无法运行,户外断电场景不能用;
无可靠传输:干扰、信号弱时会丢包,没有自动补发;稳定场景可重复发送 2 次指令;
功耗更高:WiFi 模块持续通电工作,电池续航比离线 Radio 短;
多组隔离麻烦:多小组实验要分不同 WiFi 热点才能互不干扰,不像 Radio 简单改 Group 数字。

七、实操避坑关键点
WiFi 必须一模一样:发送、接收板子 WiFi 名称、密码完全一致,大小写不能错;
端口号统一:所有设备 UDP 端口必须都是 8888,数字不同收不到;
广播无需精准匹配单个 IP:发全网广播时不用填每台从板 IP,局域网全部 8888 端口设备自动接收;
不要超大段文本发送,过长数据包容易分包乱码;
程序逻辑里不要加超长delay(),会阻塞 UDP 消息监听;
路由器 2.4G WiFi 稳定性优于 5G,行空板优先连 2.4G 频段。

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图1

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图2

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-7-21 20:05:10

【花雕动手做】K10 UDP双向通信陀螺仪姿态控制麦轮小车

局域网(Local Area Network,简称LAN)是一种在相对较小的地理范围(如一个办公室、一栋楼或者一个校园)内连接计算机和其他设备的计算机网络系统。局域网的特点是覆盖范围小、传输速度快、没有长距离通信费用。

在局域网中,用户可以共享硬件(如打印机)、软件和数据。局域网中的设备可以通过有线(如以太网)或无线(如Wi-Fi)技术连接。局域网的主要用途包括共享资源、传输数据和通信。

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图1

以行空板为例进行组网。

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图2

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图3


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-7-23 17:08:04

【花雕动手做】K10 UDP双向通信陀螺仪姿态控制麦轮小车

掌控板陀螺仪姿态服务器端

【花雕动手做】行空板 K10 系列实验之UDP双向通信掌控板陀螺仪姿态控制小车

实验开源代码

  1. // 掌控板核心底层库,提供屏幕、加速度姿态传感器、RGB灯带硬件接口
  2. #include <MPython.h>
  3. // DFRobot物联网工具库,用于创建WiFi热点、读取热点IP地址
  4. #include <DFRobot_Iot.h>
  5. // UDP服务器通信库,实现UDP报文监听、消息发送与接收回调
  6. #include <DFRobot_UDPServer.h>
  7. // 提前声明全部回调函数,告诉编译器后续定义的事件函数
  8. void onUdpServerRecvMsg(String message); // UDP收到客户端消息触发
  9. void TiltForwardEvent();                // 板子向前倾斜触发
  10. void TiltBackEvent();                   // 板子向后倾斜触发
  11. void TiltLeftEvent();                   // 板子向左倾斜触发
  12. void TiltRightEvent();                  // 板子向右倾斜触发
  13. void ScreenDownEvent();                 // 屏幕朝下翻转触发
  14. // 创建全局网络对象
  15. DFRobot_Iot       myIot;        // WiFi热点管理对象
  16. DFRobot_UDPServer myserver;     // UDP服务器对象
  17. // 上电初始化函数,通电/复位仅执行一次
  18. void setup() {
  19.     // 掌控板硬件整体初始化(屏幕、传感器、RGB全部启动)
  20.         mPython.begin();
  21.     // 绑定UDP接收回调:收到客户端UDP消息自动执行onUdpServerRecvMsg
  22.         myserver.setCallback(onUdpServerRecvMsg);
  23.     // 绑定加速度传感器姿态手势事件(事件回调,无需loop轮询)
  24.         accelerometer.onGesture(accelerometer.TiltForward, TiltForwardEvent);
  25.         accelerometer.onGesture(accelerometer.TiltBack, TiltBackEvent);
  26.         accelerometer.onGesture(accelerometer.TiltLeft, TiltLeftEvent);
  27.         accelerometer.onGesture(accelerometer.TiltRight, TiltRightEvent);
  28.         accelerometer.onGesture(accelerometer.ScreenDown, ScreenDownEvent);
  29.     // 光标定位屏幕第1行,打印标题
  30.         display.setCursorLine(1);
  31.         display.printLine("掌控板 UOP 服务器"); // 注释:代码内文字应为UDP,属于书写笔误
  32.     // 开启SoftAP WiFi热点:热点名称UDP,连接密码12345678
  33.         myIot.setSoftAP("UDP", "12345678");
  34.     // 光标切换第2行,拼接并打印热点服务器IP(ESP32热点默认192.168.4.1)
  35.         display.setCursorLine(2);
  36.         display.printLine((String("服务器IP :") + String(myIot.getWiFiSoftIP())));
  37.     // 光标第4行,打印热点开启提示
  38.         display.setCursorLine(4);
  39.         display.printLine("已设置AP热点");
  40.     // 设置UDP服务器监听端口8888,客户端通信端口必须保持一致
  41.         myserver.setPort(8888);
  42.     // 设置RGB灯带全局亮度为8,范围0~255
  43.         rgb.brightness(round(8));
  44. }
  45. // 主循环
  46. void loop() {
  47.     // 所有功能依靠各类事件异步回调执行,无需轮询,循环留空
  48. }
  49. // =====================事件回调函数=====================
  50. // UDP服务器收到客户端发来消息时触发
  51. void onUdpServerRecvMsg(String message) {
  52.     // 全部RGB灯亮粉紫色,作为收到网络数据提示
  53.         rgb.write(-1, 0xCC33CC);
  54.         delay(1000);       // 灯光保持1秒
  55.         rgb.write(-1, 0x000000); // 全部灯光熄灭
  56. }
  57. // 掌控板向前倾斜触发
  58. void TiltForwardEvent() {
  59.         myserver.sendUdpMsg("A");        // UDP向外发送指令"A"(前进指令)
  60.         rgb.write(1, 0x00FF00);          // 第1颗RGB灯设为绿色
  61.         display.setCursorLine(3);
  62.         display.printLine("前进");        // 屏幕第3行刷新状态文字
  63. }
  64. // 掌控板向后倾斜触发
  65. void TiltBackEvent() {
  66.         myserver.sendUdpMsg("B");        // 发送指令"B"(后退)
  67.         rgb.write(1, 0xFF0000);          // 第1颗RGB灯红色
  68.         display.setCursorLine(3);
  69.         display.printLine("后退");
  70. }
  71. // 掌控板向左倾斜触发
  72. void TiltLeftEvent() {
  73.         myserver.sendUdpMsg("C");        // 发送指令"C"(左横走)
  74.         rgb.write(1, 0x0000FF);          // 第1颗RGB灯蓝色
  75.         display.setCursorLine(3);
  76.         display.printLine("左横走");
  77. }
  78. // 掌控板向右倾斜触发
  79. void TiltRightEvent() {
  80.         myserver.sendUdpMsg("D");        // 发送指令"D"(右横走)
  81.         rgb.write(1, 0xFF9900);          // 第1颗RGB灯橙黄色
  82.         display.setCursorLine(3);
  83.         display.printLine("右横走");
  84. }
  85. // 掌控板屏幕朝下翻转触发
  86. void ScreenDownEvent() {
  87.         myserver.sendUdpMsg("E");        // 发送指令"E"(停车)
  88.         rgb.write(1, 0x333333);          // 第1颗RGB灯灰色
  89.         display.setCursorLine(3);
  90.         display.printLine("停车");
  91. }
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-7-23 17:17:31

【花雕动手做】K10 UDP双向通信陀螺仪姿态控制麦轮小车

# 掌控板 UDP 热点姿态服务器 代码解读

一、头文件

  1. #include <MPython.h>
  2. #include <DFRobot_Iot.h>
  3. #include <DFRobot_UDPServer.h>
复制代码

1. `MPython.h`:掌控板底层驱动库,封装屏幕、加速度传感器、RGB 灯带等板载外设;
2. `DFRobot_Iot.h`:物联网 WiFi 工具,用于创建 SoftAP 热点、读取热点 IP;
3. `DFRobot_UDPServer.h`:UDP 服务器库,实现 UDP 报文监听、收发、接收回调绑定。


二、函数前置声明

  1. void onUdpServerRecvMsg(String message);
  2. void TiltForwardEvent();
  3. void TiltBackEvent();
  4. void TiltLeftEvent();
  5. void TiltRightEvent();
  6. void ScreenDownEvent();
复制代码

C++ 语法要求:自定义回调函数写在`loop`之后,必须提前声明,告知编译器函数原型。

- `onUdpServerRecvMsg`:UDP 收到客户端消息触发;
- 其余 5 个函数:对应加速度传感器五种姿态手势触发。


三、全局对象

  1. DFRobot_Iot       myIot;
  2. DFRobot_UDPServer myserver;
复制代码

- `myIot`:WiFi 管理对象,负责开启热点;
- `myserver`:UDP 服务器实例,监听端口、发送 UDP 指令。


四、setup () 上电初始化(仅执行一次)

  1. void setup() {
  2.         mPython.begin();
  3.         myserver.setCallback(onUdpServerRecvMsg);
  4.         accelerometer.onGesture(accelerometer.TiltForward, TiltForwardEvent);
  5.         accelerometer.onGesture(accelerometer.TiltBack, TiltBackEvent);
  6.         accelerometer.onGesture(accelerometer.TiltLeft, TiltLeftEvent);
  7.         accelerometer.onGesture(accelerometer.TiltRight, TiltRightEvent);
  8.         accelerometer.onGesture(accelerometer.ScreenDown, ScreenDownEvent);
  9.         display.setCursorLine(1);
  10.         display.printLine("掌控板 UOP 服务器");
  11.         myIot.setSoftAP("UDP", "12345678");
  12.         display.setCursorLine(2);
  13.         display.printLine((String("服务器IP :") + String(myIot.getWiFiSoftIP())));
  14.         display.setCursorLine(4);
  15.         display.printLine("已设置AP热点");
  16.         myserver.setPort(8888);
  17.         rgb.brightness(round(8));
  18. }
复制代码

逐行解析:

1. `mPython.begin()`:掌控板硬件初始化,启动屏幕、传感器、灯光驱动;
2. `myserver.setCallback()`:绑定 UDP 接收回调,后台自动监听网络数据;
3. `accelerometer.onGesture(手势, 回调函数)`
姿态事件绑定(边沿触发):只有姿态切换瞬间执行一次,持续保持倾斜不会重复触发;
4. `display.setCursorLine()`:定位屏幕光标到指定行数,打印标题;
5. `myIot.setSoftAP("UDP","12345678")`:开启 WiFi 热点,名称 UDP,密码 12345678,掌控板作为无线基站;
6. `myIot.getWiFiSoftIP()`:读取 ESP32 热点默认 IP(192.168.4.1),打印到屏幕,客户端连接目标地址;
7. `myserver.setPort(8888)`:UDP 服务器监听端口 8888,客户端端口必须一致;
8. `rgb.brightness(8)`:设置 RGB 灯带全局亮度,取值 0~255。


五、loop () 主循环

  1. void loop() {
  2. }
复制代码

全部逻辑依托**异步事件回调**执行,不需要循环轮询传感器、网络,循环留空,CPU 占用极低。

六、全部事件回调函数

### 1. UDP 接收回调

  1. void onUdpServerRecvMsg(String message) {
  2.         rgb.write(-1, 0xCC33CC);
  3.         delay(1000);
  4.         rgb.write(-1, 0x000000);
  5. }
复制代码

客户端发送任意 UDP 消息触发:

- `write(-1,颜色)`:点亮**全部灯带**粉紫色,持续 1 秒后熄灭;
- 作用:双向通信指示灯,直观判断小车客户端成功回传消息。

### 2. 向前倾斜

  1. void TiltForwardEvent() {
  2.         myserver.sendUdpMsg("A");
  3.         rgb.write(1, 0x00FF00);
  4.         display.setCursorLine(3);
  5.         display.printLine("前进");
  6. }
复制代码

发送指令`A`;仅点亮第 1 颗 RGB 绿灯;屏幕第 3 行刷新状态。

### 3. 向后倾斜

  1. void TiltBackEvent() {
  2.         myserver.sendUdpMsg("B");
  3.         rgb.write(1, 0xFF0000);
  4.         display.setCursorLine(3);
  5.         display.printLine("后退");
  6. }
复制代码

发送指令`B`;第 1 颗红灯。

### 4. 向左倾斜

  1. void TiltLeftEvent() {
  2.         myserver.sendUdpMsg("C");
  3.         rgb.write(1, 0x0000FF);
  4.         display.setCursorLine(3);
  5.         display.printLine("左横走");
  6. }
复制代码

发送指令`C`;第 1 颗蓝灯。

### 5. 向右倾斜

  1. void TiltRightEvent() {
  2.         myserver.sendUdpMsg("D");
  3.         rgb.write(1, 0xFF9900);
  4.         display.setCursorLine(3);
  5.         display.printLine("右横走");
  6. }
复制代码

发送指令`D`;第 1 颗橙黄灯。

### 6. 屏幕朝下翻转

  1. void ScreenDownEvent() {
  2.         myserver.sendUdpMsg("E");
  3.         rgb.write(1, 0x333333);
  4.         display.setCursorLine(3);
  5.         display.printLine("停车");
  6. }
复制代码

发送指令`E`;第 1 颗灰色灯。


# 整体项目架构

## 角色互换(重点区分你之前方案)

- **掌控板:UDP 服务端 + 姿态遥控器**,自建热点 `UDP`;
- **行空板 K10 小车:UDP 客户端**,连接热点,接收 `A/B/C/D/E` 控制麦克纳姆轮;

指令映射表

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图1

# 五大核心要点解读

## 1. 姿态属于【边沿单次触发】

`accelerometer.onGesture` 机制:**只有姿态切换一瞬间执行一次发包**。
持续保持倾斜不会持续发送指令,属于**点动控制**。

> 短板:无法实现持续前进;想要持续运动,需要改写为 loop 轮询姿态。

## 2. 灯光两套区分逻辑

- 姿态动作:只点亮**第 1 颗灯**;
- 收到客户端消息:点亮**全部灯带**;
两种状态互不干扰,调试时很容易区分是【遥控下发指令】还是【小车回传消息】。

## 3. SoftAP 封闭局域网

掌控板自建热点,无需家用路由器,适合小车室内独立遥控,延迟低、组网简单。

## 4. 指令格式发生变更

之前方案使用拼音字符串 `qian/hou/zuo/you/ting`;
当前使用单字母 `A/B/C/D/E`;
**小车客户端判断条件必须同步修改,否则无法响应电机动作。**

## 5. 全回调无阻塞架构

姿态识别、UDP 收发全部为事件驱动,不会互相阻塞,响应稳定;loop 空置,方便后续自由添加其他功能。

# 配套使用硬性要求

1. Mind + 扩展库:MPython、DFRobot\_Iot、DFRobot\_UDPServer;
2. 上电顺序:先启动掌控板(热点先建立),再上电行空板小车;
3. 小车 UDP 客户端连接 WiFi 名称:`UDP`,密码`12345678`,目标 IP:`192.168.4.1`,端口`8888`;
4. 客户端代码接收判断匹配 `A、B、C、D、E`。

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-7-23 17:20:43

【花雕动手做】K10 UDP双向通信陀螺仪姿态控制麦轮小车

掌控板陀螺仪姿态服务器端
Mind+图形编程


【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图1

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-7-23 17:46:11

【花雕动手做】K10 UDP双向通信陀螺仪姿态控制麦轮小车

行空板 K10 UDP 双向通信小车客户端

【花雕动手做】行空板 K10 系列实验之UDP双向通信掌控板陀螺仪姿态控制小车

实验开源代码


  1. // WiFi连接工具库,STA模式接入外部WiFi热点
  2. #include <DFRobot_Iot.h>
  3. // 行空板K10硬件底层库:屏幕、画布、按键、RGB灯带驱动
  4. #include "unihiker_k10.h"
  5. // microbit电机拓展板库,独立控制M1/M2/M3/M4四路麦克纳姆轮电机
  6. #include <Microbit_Motor.h>
  7. // UDP客户端通信库,主动连接UDP服务器、收发字符串报文
  8. #include <DFRobot_UDPClient.h>
  9. // 函数前置声明,告知编译器后续定义的回调函数
  10. void onUdpClientRecvMsg(String message);  // UDP客户端收到服务器消息触发
  11. void onButtonAPressed();                 // A按键按下触发
  12. // 全局对象与变量实例化
  13. DFRobot_UDPClient myclient;    // UDP客户端通信对象
  14. UNIHIKER_K10      k10;         // K10主控硬件对象,统一管理所有板载外设
  15. Microbit_Motor    motorbit;    // 四路电机控制对象,驱动麦克纳姆四轮底盘
  16. uint8_t           screen_dir=2;// 屏幕方向参数2:正向竖屏显示
  17. DFRobot_Iot       myIot;       // WiFi联网工具对象
  18. // 上电初始化函数,通电/复位仅执行1次
  19. void setup() {
  20.     // 绑定UDP接收回调:收到服务器下发消息自动执行onUdpClientRecvMsg
  21.         myclient.setCallback(onUdpClientRecvMsg);
  22.     // 初始化行空板全部底层硬件驱动(屏幕、按键、灯光)
  23.         k10.begin();
  24.     // 按照预设方向初始化屏幕
  25.         k10.initScreen(screen_dir);
  26.     // 创建绘图画布,所有文字图形必须绘制在画布才能输出到屏幕
  27.         k10.creatCanvas();
  28.     // 绑定A按键按下事件,按下A自动运行onButtonAPressed函数
  29.         k10.buttonA->setPressedCallback(onButtonAPressed);
  30.     // 设置屏幕背景深灰色 0x333333
  31.         k10.setScreenBackground(0x333333);
  32.     // 在画布纵向第5行绘制红色标题
  33.         k10.canvas->canvasText("  行空板UDP客户端", 5, 0xFF0000);
  34.     // 第一次刷新画布,显示初始标题
  35.         k10.canvas->updateCanvas();
  36.     // STA模式连接【掌控板UDP服务器】开启的WiFi热点,名称UDP,密码12345678
  37.         myIot.wifiConnect("UDP", "12345678");
  38.     // 阻塞循环:一直等待WiFi连接成功,未连上不执行后续网络初始化
  39.         while (!myIot.wifiStatus()) {}
  40.     // WiFi联网成功,追加两行状态提示文字
  41.         k10.canvas->canvasText("      已连接服务器", 7, 0x33FFFF);
  42.         k10.canvas->canvasText("       可以开车了!", 9, 0xFFFFFF);
  43.     // UDP客户端连接服务器固定地址与端口
  44.     // 192.168.4.1 是ESP32 SoftAP热点默认IP,通信端口统一8888
  45.         myclient.connectToServer("192.168.4.1",8888);
  46.     // 二次刷新画布,更新联网成功提示
  47.         k10.canvas->updateCanvas();
  48.     // 设置RGB灯带全局亮度等级6,亮度取值范围0~255
  49.         k10.rgb->brightness(round(6));
  50. }
  51. // 主循环
  52. void loop() {
  53.     // 全部业务逻辑依靠UDP接收、按键异步回调触发,无需轮询扫描,循环留空
  54. }
  55. // ====================== 事件回调函数 ======================
  56. // UDP客户端收到掌控板服务器下发消息触发,message为接收的字符串指令
  57. void onUdpClientRecvMsg(String message) {
  58.     // 默认先点亮第0颗灯带灰色
  59.         k10.rgb->write(0, 0x333333);
  60.     // 收到指令"A" → 四轮全部正转,小车前进
  61.         if ((message==String("A"))) {
  62.                 motorbit.motorRun(ALL, CW, 200);        // ALL=全部电机,CW正转,速度200
  63.                 k10.rgb->write(-1, 0x00FF00);           // -1代表全部灯带点亮绿色
  64.                 delay(1000);                            // 灯光保持1秒
  65.                 k10.rgb->write(-1, 0x000000);           // 熄灭全部灯带
  66.         }
  67.     // 收到指令"B" → 四轮全部反转,小车后退
  68.         if ((message==String("B"))) {
  69.                 motorbit.motorRun(ALL, CCW, 200);       // CCW反转
  70.                 k10.rgb->write(-1, 0xFF0000);           // 全灯红色
  71.                 delay(1000);
  72.                 k10.rgb->write(-1, 0x000000);
  73.         }
  74.     // 收到指令"C" → 麦克纳姆轮左横走
  75.         if ((message==String("C"))) {
  76.                 motorbit.motorRun(M1, CCW, 200);
  77.                 motorbit.motorRun(M2, CW, 200);
  78.                 motorbit.motorRun(M3, CCW, 200);
  79.                 motorbit.motorRun(M4, CW, 200);
  80.                 k10.rgb->write(-1, 0x0000FF);           // 全灯蓝色
  81.                 delay(1000);
  82.                 k10.rgb->write(-1, 0x000000);
  83.         }
  84.     // 收到指令"D" → 麦克纳姆轮右横走
  85.         if ((message==String("D"))) {
  86.                 motorbit.motorRun(M1, CW, 200);
  87.                 motorbit.motorRun(M2, CCW, 200);
  88.                 motorbit.motorRun(M3, CW, 200);
  89.                 motorbit.motorRun(M4, CCW, 200);
  90.                 k10.rgb->write(-1, 0xFF6600);           // 全灯橙橘色
  91.                 delay(1000);
  92.                 k10.rgb->write(-1, 0x000000);
  93.         }
  94.     // 收到指令"E" → 停止所有电机,小车停车
  95.         if ((message==String("E"))) {
  96.                 motorbit.motorStop(ALL);                // 停止全部电机
  97.                 k10.rgb->write(-1, 0x333333);           // 全灯灰色
  98.                 delay(1000);
  99.                 k10.rgb->write(-1, 0x000000);
  100.         }
  101. }
  102. // A按键按下触发回调函数
  103. void onButtonAPressed() {
  104.     // UDP客户端主动向掌控板服务器发送测试消息,用于双向通信调试
  105.         myclient.sendUdpMsg("hello,I am client");
  106. }
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-7-23 17:53:14

【花雕动手做】K10 UDP双向通信陀螺仪姿态控制麦轮小车

# 行空板 K10 UDP 客户端(麦克纳姆轮小车)代码解读

一、头文件作用

  1. #include <DFRobot_Iot.h>
  2. #include "unihiker_k10.h"
  3. #include <Microbit_Motor.h>
  4. #include <DFRobot_UDPClient.h>
复制代码

1. `DFRobot_Iot.h`:WiFi 工具库,STA 模式连接热点、检测联网状态;
2. `unihiker_k10.h`:行空板 K10 硬件库,操作屏幕画布、A 按键、RGB 灯带;
3. `Microbit_Motor.h`:四路电机驱动库,独立控制 M1/M2/M3/M4 麦克纳姆轮电机;
4. `DFRobot_UDPClient.h`:UDP 客户端库,连接远端 UDP 服务器、收发字符串消息。

二、函数前置声明

  1. void onUdpClientRecvMsg(String message);
  2. void onButtonAPressed();
复制代码

C++ 语法规定:自定义回调写在 loop 下方,必须提前声明。

- `onUdpClientRecvMsg`:收到服务器 UDP 消息自动执行,`message`存放接收文本;
- `onButtonAPressed`:板载 A 按键按下触发。

三、全局对象与变量

  1. DFRobot_UDPClient myclient;
  2. UNIHIKER_K10      k10;
  3. Microbit_Motor    motorbit;
  4. uint8_t           screen_dir=2;
  5. DFRobot_Iot       myIot;
复制代码

1. `myclient`:UDP 客户端通信实例;
2. `k10`:行空板主控硬件对象;
3. `motorbit`:四路电机控制对象;
4. `screen_dir=2`:屏幕正向竖屏;
5. `myIot`:WiFi 连接工具对象。

四、setup () 上电初始化(仅执行一次)

  1. void setup() {
  2.         myclient.setCallback(onUdpClientRecvMsg);
  3.         k10.begin();
  4.         k10.initScreen(screen_dir);
  5.         k10.creatCanvas();
  6.         k10.buttonA->setPressedCallback(onButtonAPressed);
  7.         k10.setScreenBackground(0x333333);
  8.         k10.canvas->canvasText("  行空板UDP客户端", 5, 0xFF0000);
  9.         k10.canvas->updateCanvas();
  10.         myIot.wifiConnect("UDP", "12345678");
  11.         while (!myIot.wifiStatus()) {}
  12.         k10.canvas->canvasText("      已连接服务器", 7, 0x33FFFF);
  13.         k10.canvas->canvasText("       可以开车了!", 9, 0xFFFFFF);
  14.         myclient.connectToServer("192.168.4.1",8888);
  15.         k10.canvas->updateCanvas();
  16.         k10.rgb->brightness(round(6));
  17. }
复制代码

逐行解析:

1. `myclient.setCallback()`:绑定 UDP 接收回调,后台监听服务器下发报文;
2. `k10.begin()`:初始化屏幕、按键、RGB 全部硬件;
3. `initScreen + creatCanvas`:初始化屏幕、创建绘图画布;
4. `buttonA->setPressedCallback()`:绑定 A 按键按下事件;
5. 设置深灰色屏幕底色,打印红色标题并刷新画布;
6. `wifiConnect("UDP", "12345678")`:连接**掌控板创建的 WiFi 热点**;
7. `while (!myIot.wifiStatus()) {}` 阻塞等待 WiFi 连上,不联网不继续执行;
8. 联网成功,追加两行屏幕状态提示;
9. `connectToServer("192.168.4.1",8888)`
连接掌控板 UDP 服务器:ESP32 热点默认 IP,端口固定 8888;
10. 刷新画布、设置 RGB 全局亮度 = 6。

五、loop () 主循环

  1. void loop() {
  2. }
复制代码

全部功能依靠**异步事件回调**执行,不需要轮询网络、按键,循环空置,节省算力。

六、事件回调核心逻辑

### 1. UDP 接收回调 onUdpClientRecvMsg (String message)

  1. void onUdpClientRecvMsg(String message) {
  2.         k10.rgb->write(0, 0x333333);
  3.         if ((message==String("A"))) {
  4.                 motorbit.motorRun(ALL, CW, 200);
  5.                 k10.rgb->write(-1, 0x00FF00);
  6.                 delay(1000);
  7.                 k10.rgb->write(-1, 0x000000);
  8.         }
  9.         if ((message==String("B"))) {
  10.                 motorbit.motorRun(ALL, CCW, 200);
  11.                 k10.rgb->write(-1, 0xFF0000);
  12.                 delay(1000);
  13.                 k10.rgb->write(-1, 0x000000);
  14.         }
  15.         if ((message==String("C"))) {
  16.                 motorbit.motorRun(M1, CCW, 200);
  17.                 motorbit.motorRun(M2, CW, 200);
  18.                 motorbit.motorRun(M3, CCW, 200);
  19.                 motorbit.motorRun(M4, CW, 200);
  20.                 k10.rgb->write(-1, 0x0000FF);
  21.                 delay(1000);
  22.                 k10.rgb->write(-1, 0x000000);
  23.         }
  24.         if ((message==String("D"))) {
  25.                 motorbit.motorRun(M1, CW, 200);
  26.                 motorbit.motorRun(M2, CCW, 200);
  27.                 motorbit.motorRun(M3, CW, 200);
  28.                 motorbit.motorRun(M4, CCW, 200);
  29.                 k10.rgb->write(-1, 0xFF6600);
  30.                 delay(1000);
  31.                 k10.rgb->write(-1, 0x000000);
  32.         }
  33.         if ((message==String("E"))) {
  34.                 motorbit.motorStop(ALL);
  35.                 k10.rgb->write(-1, 0x333333);
  36.                 delay(1000);
  37.                 k10.rgb->write(-1, 0x000000);
  38.         }
  39. }
复制代码

逻辑说明:
收到服务器字母指令,执行对应电机动作,同时点亮对应 RGB 颜色,**维持 1 秒后自动熄灭**。
指令动作对照表:

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图1

> 关键特点:
> 掌控板姿态手势是**边沿触发,只发送一次 UDP 包**;
> 小车收到指令电机只持续运行 1 秒,属于【点动控制】,无法长距离持续行驶。
> 同时回调内部`delay()`会阻塞网络事件,连续快速遥控容易卡顿。

### 2. A 按键回调

  1. void onButtonAPressed() {
  2.         myclient.sendUdpMsg("hello,I am client");
  3. }
复制代码

按下 A 键,小车主动向掌控板服务器发送测试文本,用来双向调试通信链路是否正常。

# 整套项目组网关系

- **服务端:掌控板**
开启热点名称`UDP`,密码`12345678`,UDP 服务器 8888;
依靠陀螺仪姿态发送 A/B/C/D/E。
- **客户端:本段代码(行空板 K10 小车)**
连接热点,接收字母指令,驱动麦克纳姆四轮电机。

# 五大核心要点解读

## 1. 网络架构:SoftAP+STA 本地封闭局域网

掌控板自建 WiFi 基站,小车作为 STA 接入,不需要家用路由器,室内机器人遥控延迟低。

## 2. 异步回调编程范式

WiFi 连接、UDP 消息、按键全部事件驱动,不在 loop 循环不断扫描信号,资源占用低。

## 3. 麦克纳姆轮横向平移原理

普通两轮差速小车不能左右平移;代码通过控制四个电机对角反向旋转,产生横向合力实现纯平移。

## 4. 通信硬性匹配规则

WiFi 名称、密码、服务器 IP、端口四者必须完全一致;任意一处写错,无法建立 UDP 通信。

## 5. 当前方案固有短板(实操重点)

1)点动模式:每次倾斜遥控器,小车只运动 1 秒,不能持续行进;
2)`delay()`阻塞回调:频繁切换姿态会造成指令丢失、响应卡顿;
3)无指令超时保护,网络丢包时小车不会自动停机。

# 运行必要条件

1. Mind + 添加全部依赖库:unihiker\_k10、DFRobot\_Iot、DFRobot\_UDPClient、Microbit\_Motor;
2. 开发板选择:行空板 K10(esp32s3bit);
3. 硬件:microbit 四路电机拓展板,M1~M4 接麦克纳姆轮;
4. 上电顺序:**先上电掌控板(服务器),再上电行空板小车(客户端)**。

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-7-23 17:56:09

【花雕动手做】K10 UDP双向通信陀螺仪姿态控制麦轮小车

行空板 K10 UDP 双向通信小车客户端

Mind+图形编程


【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图1

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-7-23 21:03:30

【花雕动手做】K10 UDP双向通信陀螺仪姿态控制麦轮小车

实验场景图与视频记录

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图1



【【花雕动手做】行空板 K10 系列实验之UDP双向通信掌控板陀螺仪姿态控制小车#行空板K10 #udp通讯 #陀螺仪 #DIY动手做 #科技改变生活】

https://www.bilibili.com/video/BV1Vig46fETj/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987





回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-7-23 21:05:14

【花雕动手做】K10 UDP双向通信陀螺仪姿态控制麦轮小车

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图1

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图3

【花雕动手做】K10 UDP 双向通信陀螺仪姿态控制麦轮小车图2
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2026-7-24 11:08:32

【花雕动手做】K10 UDP双向通信陀螺仪姿态控制麦轮小车

【行空板 K10 系列实验之UDP双向通信掌控板陀螺仪姿态控制小车#行空板K10 #udp通讯 #陀螺仪 #DIY动手做 #科技改变生活】

https://www.bilibili.com/video/BV17bg46eEKe/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail