81浏览
查看: 81|回复: 13

[K10教程] 【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移

[复制链接]
本帖最后由 驴友花雕 于 2026-7-21 09:15 编辑

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图2

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

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


【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图1

驴友花雕  高级技神
 楼主|

发表于 前天 17:04

【花雕动手做】行空板K10掌控板陀螺仪UDP广播遥控小车

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

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图1

添加WIFI和UDP广播模块

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图2


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 前天 17:07

【花雕动手做】行空板K10掌控板陀螺仪UDP广播遥控小车

相关积木

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图3

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图2

辅助:屏幕显示相关积木

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图5

电机与LED控制模块

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图4

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图1


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 前天 17:08

【花雕动手做】行空板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 双向通信 AB 键控制小车左右横移图1

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图2

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 前天 17:10

【花雕动手做】行空板K10掌控板陀螺仪UDP广播遥控小车

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

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

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图1

以行空板为例进行组网。

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图3

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图2

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 前天 17:56

【花雕动手做】行空板K10掌控板陀螺仪UDP广播遥控小车

实验扩展板与麦轮小车

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图2

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图1
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 前天 17:59

【花雕动手做】行空板K10掌控板陀螺仪UDP广播遥控小车

本帖最后由 驴友花雕 于 2026-7-21 09:25 编辑

行空板 K10 UDP 通信服务器端

【花雕动手做】行空板 K10 系列实验之UDP双向通信AB键控制小车左右横移

实验开源代码
  1. // 引入DFRobot物联网工具库,提供WiFi热点创建、IP读取等网络基础功能
  2. #include <DFRobot_Iot.h>
  3. // 引入行空板K10官方硬件驱动库,操作屏幕、画布、A/B按键、RGB灯带等板载外设
  4. #include "unihiker_k10.h"
  5. // 引入UDP服务器通信库,实现局域网UDP数据接收与发送
  6. #include <DFRobot_UDPServer.h>
  7. // 函数前置声明:告诉编译器下方存在这三个回调函数
  8. void onUdpServerRecvMsg(String message);  // UDP收到消息触发
  9. void onButtonAPressed();                 // A按键按下触发
  10. void onButtonBPressed();                 // B按键按下触发
  11. // 全局变量与对象创建
  12. uint8_t           screen_dir=3;        // 屏幕显示方向参数3,横向翻转显示
  13. UNIHIKER_K10      k10;                  // 行空板K10主硬件对象,统一管理所有板载外设
  14. DFRobot_Iot       myIot;                // 物联网网络工具对象,用于开启WiFi热点、获取本机IP
  15. DFRobot_UDPServer myserver;             // UDP服务器对象,负责监听端口、收发UDP消息
  16. // 上电初始化函数,设备通电/复位仅执行一次
  17. void setup() {
  18.     // 初始化行空板全部底层硬件(IO、屏幕、按键、灯光驱动)
  19.         k10.begin();
  20.     // 绑定UDP接收回调:服务器监听到客户端消息,自动执行onUdpServerRecvMsg
  21.         myserver.setCallback(onUdpServerRecvMsg);
  22.     // 按预设参数初始化屏幕显示方向
  23.         k10.initScreen(screen_dir);
  24.     // 创建绘图画布,所有文字、图形必须绘制在画布上才能输出到屏幕
  25.         k10.creatCanvas();
  26.     // 绑定A按键按下事件,按下A自动运行onButtonAPressed函数
  27.         k10.buttonA->setPressedCallback(onButtonAPressed);
  28.     // 绑定B按键按下事件,按下B自动运行onButtonBPressed函数
  29.         k10.buttonB->setPressedCallback(onButtonBPressed);
  30.     // 设置屏幕背景色为纯白色 0xFFFFFF
  31.         k10.setScreenBackground(0xFFFFFF);
  32.     // 在画布纵向第3行绘制红色标题文字
  33.         k10.canvas->canvasText("   行空板K10 UDP 服务器", 3, 0xFF0000);
  34.     // 开启SoftAP独立WiFi热点,热点名称K10,连接密码88888888
  35.         myIot.setSoftAP("K10", "88888888");
  36.     // 获取热点本地IP地址,拼接文本后在第5行用蓝色打印,客户端通信需要该IP
  37.         k10.canvas->canvasText((String("     服务器IP:") + String(myIot.getWiFiSoftIP())), 5, 0x0000FF);
  38.     // 第7行深绿色提示文字,告知按键发送内容
  39.         k10.canvas->canvasText("发送消息 hello,I am server", 7, 0x006600);
  40.     // 将画布上所有绘制内容一次性刷新到实体屏幕,不调用则无画面显示
  41.         k10.canvas->updateCanvas();
  42.     // 设置RGB灯带全局亮度等级3,取值范围0~255,数值越小亮度越低
  43.         k10.rgb->brightness(round(3));
  44.     // 设置UDP服务器监听端口为8888,客户端收发数据端口必须和服务器保持一致
  45.         myserver.setPort(8888);
  46. }
  47. // 主循环函数,初始化完成后无限循环运行
  48. void loop() {
  49.     // 全部功能依靠按键、UDP接收异步回调自动执行,无需轮询检测,循环留空
  50. }
  51. // ====================== 事件回调函数 ======================
  52. // UDP服务器收到客户端消息时触发,message存储收到的字符串
  53. void onUdpServerRecvMsg(String message) {
  54.     // 仅点亮第1颗RGB灯为红色,作为收到网络数据的提示
  55.         k10.rgb->write(1, 0xFF0000);
  56.     // 红灯保持1秒
  57.         delay(1000);
  58.     // 熄灭全部RGB灯带(黑色0x000000代表关灯)
  59.         k10.rgb->write(-1, 0x000000);
  60. }
  61. // A按键按下触发的回调函数
  62. void onButtonAPressed() {
  63.     // UDP向连接的客户端发送字符串指令 zuo(左横走)
  64.         myserver.sendUdpMsg("zuo");
  65. }
  66. // B按键按下触发的回调函数
  67. void onButtonBPressed() {
  68.     // UDP向连接的客户端发送字符串指令 you(右横走)
  69.         myserver.sendUdpMsg("you");
  70. }
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 前天 21:33

【花雕动手做】K10 UDP双向通信AB键控制小车左右横移

本帖最后由 驴友花雕 于 2026-7-21 09:30 编辑

# 行空板 K10 UDP 热点服务器 代码解读

一、头文件导入

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


1. `DFRobot_Iot.h`:DFRobot 物联网网络库,负责创建 WiFi 热点、读取本机 IP、WiFi 基础操作;
2. `unihiker_k10.h`:行空板 K10 底层硬件库,控制屏幕、画布、A/B 按键、RGB 灯带;
3. `DFRobot_UDPServer.h`:UDP 服务器专用库,实现局域网 UDP 消息收发、接收事件绑定。

二、函数前置声明

  1. void onUdpServerRecvMsg(String message);
  2. void onButtonAPressed();
  3. void onButtonBPressed();
复制代码


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

- `onUdpServerRecvMsg`:UDP 收到客户端消息触发,`message`保存接收的文本;
- `onButtonAPressed`:A 按键按下触发;
- `onButtonBPressed`:B 按键按下触发。

三、全局变量与对象实例

  1. uint8_t           screen_dir=3;
  2. UNIHIKER_K10      k10;
  3. DFRobot_Iot       myIot;
  4. DFRobot_UDPServer myserver;
复制代码


1. `screen_dir=3`:屏幕旋转参数 3,横向翻转显示画面;
2. `k10`:行空板硬件总对象,统一操作屏幕、按键、灯光;
3. `myIot`:WiFi 网络工具对象,用于开启热点;
4. `myserver`:UDP 服务器实例,监听端口、收发网络消息。

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

  1. void setup() {
  2.         k10.begin();
  3.         myserver.setCallback(onUdpServerRecvMsg);
  4.         k10.initScreen(screen_dir);
  5.         k10.creatCanvas();
  6.         k10.buttonA->setPressedCallback(onButtonAPressed);
  7.         k10.buttonB->setPressedCallback(onButtonBPressed);
  8.         k10.setScreenBackground(0xFFFFFF);
  9.         k10.canvas->canvasText("   行空板K10 UDP 服务器", 3, 0xFF0000);
  10.         myIot.setSoftAP("K10", "88888888");
  11.         k10.canvas->canvasText((String("     服务器IP:") + String(myIot.getWiFiSoftIP())), 5, 0x0000FF);
  12.         k10.canvas->canvasText("发送消息 hello,I am server", 7, 0x006600);
  13.         k10.canvas->updateCanvas();
  14.         k10.rgb->brightness(round(3));
  15.         myserver.setPort(8888);
  16. }
复制代码


逐行拆解:

1. `k10.begin()`:初始化行空板全部硬件驱动(屏幕、按键、RGB);
2. `myserver.setCallback(接收函数)`:绑定 UDP 接收回调,后台自动监听网络数据;
3. `k10.initScreen(screen_dir)`:按参数 3 设置屏幕横向显示;
4. `k10.creatCanvas()`:创建绘图画布,所有文字必须绘制在画布;
5. `buttonA/buttonB->setPressedCallback()`:分别给 A、B 按键绑定按下事件;
6. `setScreenBackground(0xFFFFFF)`:屏幕底色设置纯白色;
7. `canvasText(文字,纵向位置,颜色)`:画布第 3 行绘制红色标题;
8. `myIot.setSoftAP("K10","88888888")`:开启独立 WiFi 热点,名称 K10,密码 88888888,行空板充当小型路由器;
9. `myIot.getWiFiSoftIP()`:读取热点本地 IP,拼接字符串打印在第 5 行,客户端通信必须填写该 IP;
10. 第 7 行打印绿色提示文字;
11. `updateCanvas()`:把画布内容刷新到实体屏幕,不调用无画面;
12. `rgb->brightness(3)`:RGB 灯带全局亮度 3(范围 0~255);
13. `myserver.setPort(8888)`:UDP 服务器监听 8888 端口,客户端端口必须一致才能通信。

五、loop () 主循环

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


所有交互逻辑全部依靠**异步回调**自动触发,不需要在循环轮询按键、网络信号,循环留空不影响功能运行。

六、三大事件回调函数

### 1. UDP 接收回调 onUdpServerRecvMsg

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


客户端任意 UDP 消息到达时执行:

1. `write(1,0xFF0000)`:只点亮第 1 颗 RGB 灯为红色,作为网络接收提示;
2. `delay(1000)`:红灯保持 1 秒;
3. `write(-1,0x000000)`:熄灭全部 RGB 灯带。

### 2. A 按键按下回调

  1. void onButtonAPressed() {
  2.         myserver.sendUdpMsg("zuo");
  3. }
复制代码


按下 A 键,UDP 向所有连接的客户端广播字符串`zuo`(左横走指令)。

### 3. B 按键按下回调

  1. void onButtonBPressed() {
  2.         myserver.sendUdpMsg("you");
  3. }
复制代码


按下 B 键,UDP 广播字符串`you`(右横走指令)。

# 整体功能总览

行空板 K10 作为**独立局域网 UDP 服务器**,无家用路由器也能实现设备直连通信:
1. 开机自动发射 WiFi 热点`K10`,端口固定 8888;
2. 屏幕显示服务器 IP 与操作提示;
3. 按键交互:A 键发左移指令`zuo`,B 键发右移指令`you`;
4. 网络反馈:收到任意 UDP 消息,第 1 颗红灯闪烁 1 秒提示;
5. 配套使用:搭配另一块 K10 UDP 陀螺仪客户端,WiFi 无线控制麦克纳姆轮小车左右横移。


# 五大核心知识点解读

## 1. SoftAP 热点模式,封闭本地局域网

行空板不连接外部 WiFi,自身生成无线网络,遥控设备直接接入,延迟低、无外网依赖,适合小车室内遥控。

## 2. 异步回调架构,低 CPU 占用

按键、UDP 消息都采用事件回调,不在 loop 循环持续扫描信号,程序运行流畅,不会出现卡顿。

## 3. RGB 灯光分层提示设计

仅收到网络消息时点亮第 1 颗红灯,不占用全灯带状态显示,可额外搭配运动指令专属灯光,互不干扰。

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

客户端通信三要素必须和服务器完全统一:热点名称密码、服务器 IP、端口 8888,任意一项不匹配则收发失败。
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 昨天 09:33

【花雕动手做】K10 UDP双向通信AB键控制小车左右横移

Mind+图形编程

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图1
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 昨天 09:40

【花雕动手做】K10 UDP双向通信AB键控制小车左右横移

行空板K10UDP广播接收端小车

【花雕动手做】行空板 K10 系列实验之UDP双向通信AB键控制小车左右横移

实验开源代码

  1. // 物联网WiFi工具库:连接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. uint8_t           screen_dir=2;        // 屏幕显示方向2:正向竖屏显示
  14. UNIHIKER_K10      k10;                 // K10主控硬件对象,统一管理屏幕、按键、RGB
  15. DFRobot_Iot       myIot;               // WiFi连接工具对象,用于接入服务器热点
  16. DFRobot_UDPClient myclient;            // UDP客户端对象,负责连接服务器、收发UDP报文
  17. Microbit_Motor    motorbit;            // 四路电机控制对象,驱动麦克纳姆四轮底盘
  18. // 上电初始化函数,通电/复位仅执行1次
  19. void setup() {
  20.     // 初始化行空板全部底层硬件(IO、屏幕、灯光、按键驱动)
  21.         k10.begin();
  22.     // 绑定UDP接收回调:客户端收到服务器下发消息时自动执行onUdpClientRecvMsg
  23.         myclient.setCallback(onUdpClientRecvMsg);
  24.     // 按预设方向2初始化屏幕显示
  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模式连接服务器端K10开启的WiFi热点,名称K10,密码88888888
  37.         myIot.wifiConnect("K10", "88888888");
  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灯带全局亮度等级5,亮度范围0~255
  49.         k10.rgb->brightness(round(5));
  50. }
  51. // 主循环,初始化完成后无限循环运行
  52. void loop() {
  53.     // 全部逻辑依靠UDP接收、按键异步回调触发,无需循环轮询,留空即可
  54. }
  55. // ====================== 事件回调函数 ======================
  56. // UDP客户端收到服务器下发消息触发,message为接收的字符串内容
  57. void onUdpClientRecvMsg(String message) {
  58.     // 收到网络消息,全部RGB灯点亮绿色作为接收提示
  59.         k10.rgb->write(-1, 0x00FF00);
  60.     // 绿灯保持2秒
  61.         delay(2000);
  62.     // 2秒后熄灭所有RGB灯带
  63.         k10.rgb->write(-1, 0x000000);
  64.     // 判断服务器下发指令为"you":执行麦克纳姆轮右横走
  65.         if ((message==String("you"))) {
  66.                 motorbit.motorRun(M1, CW, 200);   // M1左前电机正转
  67.                 motorbit.motorRun(M2, CCW, 200);  // M2右前电机反转
  68.                 motorbit.motorRun(M3, CW, 200);   // M3左后电机正转
  69.                 motorbit.motorRun(M4, CCW, 200);  // M4右后电机反转
  70.         }
  71.     // 判断服务器下发指令为"zuo":执行麦克纳姆轮左横走
  72.         if ((message==String("zuo"))) {
  73.                 motorbit.motorRun(M1, CCW, 200);  // M1左前电机反转
  74.                 motorbit.motorRun(M2, CW, 200);   // M2右前电机正转
  75.                 motorbit.motorRun(M3, CCW, 200);  // M3左后电机反转
  76.                 motorbit.motorRun(M4, CW, 200);   // M4右后电机正转
  77.         }
  78. }
  79. // A按键按下触发回调函数
  80. void onButtonAPressed() {
  81.     // UDP客户端主动向服务器发送测试文本消息
  82.         myclient.sendUdpMsg("hello,I am client");
  83. }
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 昨天 09:44

【花雕动手做】K10 UDP双向通信AB键控制小车左右横移

# 行空板 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 模式连接外部 WiFi 热点、检测联网状态;
2. `unihiker_k10.h`:行空板 K10 硬件底层库,操作屏幕画布、实体按键、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. uint8_t           screen_dir=2;
  2. UNIHIKER_K10      k10;
  3. DFRobot_Iot       myIot;
  4. DFRobot_UDPClient myclient;
  5. Microbit_Motor    motorbit;
复制代码

1. `screen_dir=2`:屏幕显示参数,2 代表正向竖屏显示,适合小车手持调试;
2. `k10`:行空板主硬件对象,统一管理屏幕、按键、RGB 灯光;
3. `myIot`:WiFi 连接工具对象,用于接入服务器创建的 WiFi 热点;
4. `myclient`:UDP 客户端实例,负责连接指定 IP 与端口、收发网络报文;
5. `motorbit`:四路电机控制对象,驱动麦克纳姆四轮电机。

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

  1. void setup() {
  2.         k10.begin();
  3.         myclient.setCallback(onUdpClientRecvMsg);
  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("K10", "88888888");
  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(5));
  17. }
复制代码

逐行拆解:

1. `k10.begin()`:初始化行空板全部底层硬件驱动;
2. `myclient.setCallback(回调函数)`:绑定 UDP 接收事件,后台自动监听服务器下发消息;
3. `k10.initScreen(screen_dir)`:按参数 2 初始化竖屏显示;
4. `k10.creatCanvas()`:创建绘图画布,所有文字图形必须绘制在画布;
5. `buttonA->setPressedCallback()`:给 A 按键绑定按下触发函数;
6. `setScreenBackground(0x333333)`:屏幕底色设深灰色;
7. `canvasText(文字,纵向位置,颜色)`:画布第 5 行绘制红色标题,`updateCanvas()`刷新到屏幕;
8. `myIot.wifiConnect("K10", "88888888")`:连接 UDP 服务器端开启的 WiFi 热点;
9. `while (!myIot.wifiStatus()) {}`:阻塞死循环,程序暂停等待 WiFi 连接成功,未联网不会执行后续 UDP 逻辑;
10. WiFi 连上后,追加两行提示文字,提示通信就绪;
11. `connectToServer("192.168.4.1",8888)`:连接服务器固定 IP 与端口(ESP32 热点默认 IP,端口统一 8888);
12. 再次刷新画布,更新联网成功提示;
13. 设置 RGB 灯带全局亮度为 5(范围 0~255)。

五、loop () 主循环

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

所有网络接收、按键交互逻辑均采用异步回调机制,无需在循环内轮询检测信号,循环留空不影响功能,节省芯片算力。

六、事件回调函数核心逻辑

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

  1. void onUdpClientRecvMsg(String message) {
  2.         k10.rgb->write(-1, 0x00FF00);
  3.         delay(2000);
  4.         k10.rgb->write(-1, 0x000000);
  5.         if ((message==String("you"))) {
  6.                 motorbit.motorRun(M1, CW, 200);
  7.                 motorbit.motorRun(M2, CCW, 200);
  8.                 motorbit.motorRun(M3, CW, 200);
  9.                 motorbit.motorRun(M4, CCW, 200);
  10.         }
  11.         if ((message==String("zuo"))) {
  12.                 motorbit.motorRun(M1, CCW, 200);
  13.                 motorbit.motorRun(M2, CW, 200);
  14.                 motorbit.motorRun(M3, CCW, 200);
  15.                 motorbit.motorRun(M4, CW, 200);
  16.         }
  17. }
复制代码

1. 收到任意 UDP 消息,全部 RGB 灯亮绿色 2 秒,作为网络数据接收提示,2 秒后熄灭所有灯;
2. 判断收到指令`you`:四轮对角差速,麦克纳姆轮整车向右横向平移;
   - M1 左前正转、M2 右前反转、M3 左后正转、M4 右后反转;速度 200;
3. 判断收到指令`zuo`:四轮反向对角差速,整车向左横向平移;
   - M1 左前反转、M2 右前正转、M3 左后反转、M4 右后正转。

### 2. A 按键按下回调 onButtonAPressed ()

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

按下 A 键,客户端主动向 UDP 服务器发送测试文本,用于双向通信调试,验证收发链路是否正常。

# 整体配套工作流程

1. 服务端 K10 先上电,开启 WiFi 热点`K10`,启动 UDP 8888 服务器;
2. 本小车客户端 K10 上电,自动连接热点,等待联网成功后连接 UDP 服务器;
3. 服务器按 A 发送`zuo`、按 B 发送`you`;
4. 小车客户端收到对应指令,直接控制四轮实现左 / 右横移;
5. 小车端按 A 按键,向服务器回发测试消息,双向互通。

# 五大核心要点解读

1. **SoftAP+STA 本地局域网架构**
服务器做 WiFi 基站,小车客户端作为 STA 接入,无需家用路由器,封闭局域网遥控,延迟低、无外网依赖。
2. **阻塞式 WiFi 等待机制**
`while (!myIot.wifiStatus()) {}` 强制等待联网完成,避免 WiFi 未就绪就执行 UDP 连接,防止通信初始化失败。
3. **麦克纳姆轮横向平移控制逻辑**
普通两轮差速小车无法左右横移,本代码通过对角电机相反转向产生横向合力,实现无转向偏移纯平移。
4. **异步回调低占用设计**
网络接收、按键检测全部由底层硬件回调触发,不在 loop 循环轮询,电机响应流畅不卡顿。
5. 双向通信闭环设计
服务器下发运动指令控制小车,小车可主动上传消息给服务器,方便调试通信链路状态。

# 使用硬性约束

1. Mind + 必须添加全部依赖扩展库:unihiker\_k10、DFRobot\_Iot、DFRobot\_UDPClient、Microbit\_Motor;
2. 开发板型号选择行空板 K10(esp32s3bit);
3. 电机拓展板正确接线 M1/M2/M3/M4 四轮;
4. 上电顺序:先开 UDP 服务器,再启动小车客户端,否则无法连接热点。

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 昨天 09:46

【花雕动手做】K10 UDP双向通信AB键控制小车左右横移

Mind+图形编程

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图1
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 昨天 09:49

【花雕动手做】K10 UDP双向通信AB键控制小车左右横移

本帖最后由 驴友花雕 于 2026-7-21 09:57 编辑

实验场景图与视频记录

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图2

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图1

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图3
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 昨天 10:30

【花雕动手做】K10 UDP双向通信AB键控制小车左右横移

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图2

【花雕动手做】K10 UDP 双向通信 AB 键控制小车左右横移图1


【【花雕动手做】行空板 K10 系列实验之UDP双向通信AB键控制小车左右横移 #智能小车编程 #编程遥控车 #DIY动手做 #行空板K10 #科技改变生活】

https://www.bilibili.com/video/BV1J3Kt6cEmC/?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