在这里插入图片描述

在这里插入图片描述

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

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

在这里插入图片描述
实验扩展板与麦轮小车

在这里插入图片描述

在这里插入图片描述
遥控发射端掌控宝(带锂电池)

掌控板是国内专为中小学 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的网络服务模块,都在这里
在这里插入图片描述
添加WIFI和UDP广播模块

在这里插入图片描述
相关积木
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

辅助:屏幕显示相关积木

在这里插入图片描述
LED控制模块

在这里插入图片描述

知识点:行空板 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 频段。

在这里插入图片描述
在这里插入图片描述

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

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

在这里插入图片描述

以行空板为例进行组网。

在这里插入图片描述

在这里插入图片描述

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

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

实验开源代码

// 掌控板核心底层库,提供屏幕、加速度姿态传感器、RGB灯带硬件接口
#include <MPython.h>
// DFRobot物联网工具库,用于创建WiFi热点、读取热点IP地址
#include <DFRobot_Iot.h>
// UDP服务器通信库,实现UDP报文监听、消息发送与接收回调
#include <DFRobot_UDPServer.h>

// 提前声明全部回调函数,告诉编译器后续定义的事件函数
void onUdpServerRecvMsg(String message); // UDP收到客户端消息触发
void TiltForwardEvent();                // 板子向前倾斜触发
void TiltBackEvent();                   // 板子向后倾斜触发
void TiltLeftEvent();                   // 板子向左倾斜触发
void TiltRightEvent();                  // 板子向右倾斜触发
void ScreenDownEvent();                 // 屏幕朝下翻转触发

// 创建全局网络对象
DFRobot_Iot       myIot;        // WiFi热点管理对象
DFRobot_UDPServer myserver;     // UDP服务器对象


// 上电初始化函数,通电/复位仅执行一次
void setup() {
    // 掌控板硬件整体初始化(屏幕、传感器、RGB全部启动)
	mPython.begin();

    // 绑定UDP接收回调:收到客户端UDP消息自动执行onUdpServerRecvMsg
	myserver.setCallback(onUdpServerRecvMsg);

    // 绑定加速度传感器姿态手势事件(事件回调,无需loop轮询)
	accelerometer.onGesture(accelerometer.TiltForward, TiltForwardEvent);
	accelerometer.onGesture(accelerometer.TiltBack, TiltBackEvent);
	accelerometer.onGesture(accelerometer.TiltLeft, TiltLeftEvent);
	accelerometer.onGesture(accelerometer.TiltRight, TiltRightEvent);
	accelerometer.onGesture(accelerometer.ScreenDown, ScreenDownEvent);

    // 光标定位屏幕第1行,打印标题
	display.setCursorLine(1);
	display.printLine("掌控板 UOP 服务器"); // 注释:代码内文字应为UDP,属于书写笔误

    // 开启SoftAP WiFi热点:热点名称UDP,连接密码12345678
	myIot.setSoftAP("UDP", "12345678");

    // 光标切换第2行,拼接并打印热点服务器IP(ESP32热点默认192.168.4.1)
	display.setCursorLine(2);
	display.printLine((String("服务器IP :") + String(myIot.getWiFiSoftIP())));

    // 光标第4行,打印热点开启提示
	display.setCursorLine(4);
	display.printLine("已设置AP热点");

    // 设置UDP服务器监听端口8888,客户端通信端口必须保持一致
	myserver.setPort(8888);

    // 设置RGB灯带全局亮度为8,范围0~255
	rgb.brightness(round(8));
}

// 主循环
void loop() {
    // 所有功能依靠各类事件异步回调执行,无需轮询,循环留空
}

// =====================事件回调函数=====================
// UDP服务器收到客户端发来消息时触发
void onUdpServerRecvMsg(String message) {
    // 全部RGB灯亮粉紫色,作为收到网络数据提示
	rgb.write(-1, 0xCC33CC);
	delay(1000);       // 灯光保持1秒
	rgb.write(-1, 0x000000); // 全部灯光熄灭
}

// 掌控板向前倾斜触发
void TiltForwardEvent() {
	myserver.sendUdpMsg("A");        // UDP向外发送指令"A"(前进指令)
	rgb.write(1, 0x00FF00);          // 第1颗RGB灯设为绿色
	display.setCursorLine(3);
	display.printLine("前进");        // 屏幕第3行刷新状态文字
}

// 掌控板向后倾斜触发
void TiltBackEvent() {
	myserver.sendUdpMsg("B");        // 发送指令"B"(后退)
	rgb.write(1, 0xFF0000);          // 第1颗RGB灯红色
	display.setCursorLine(3);
	display.printLine("后退");
}

// 掌控板向左倾斜触发
void TiltLeftEvent() {
	myserver.sendUdpMsg("C");        // 发送指令"C"(左横走)
	rgb.write(1, 0x0000FF);          // 第1颗RGB灯蓝色
	display.setCursorLine(3);
	display.printLine("左横走");
}

// 掌控板向右倾斜触发
void TiltRightEvent() {
	myserver.sendUdpMsg("D");        // 发送指令"D"(右横走)
	rgb.write(1, 0xFF9900);          // 第1颗RGB灯橙黄色
	display.setCursorLine(3);
	display.printLine("右横走");
}

// 掌控板屏幕朝下翻转触发
void ScreenDownEvent() {
	myserver.sendUdpMsg("E");        // 发送指令"E"(停车)
	rgb.write(1, 0x333333);          // 第1颗RGB灯灰色
	display.setCursorLine(3);
	display.printLine("停车");
}

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

一、头文件

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

二、函数前置声明

void onUdpServerRecvMsg(String message);
void TiltForwardEvent();
void TiltBackEvent();
void TiltLeftEvent();
void TiltRightEvent();
void ScreenDownEvent();

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

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

三、全局对象

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

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

void setup() {
	mPython.begin();
	myserver.setCallback(onUdpServerRecvMsg);
	accelerometer.onGesture(accelerometer.TiltForward, TiltForwardEvent);
	accelerometer.onGesture(accelerometer.TiltBack, TiltBackEvent);
	accelerometer.onGesture(accelerometer.TiltLeft, TiltLeftEvent);
	accelerometer.onGesture(accelerometer.TiltRight, TiltRightEvent);
	accelerometer.onGesture(accelerometer.ScreenDown, ScreenDownEvent);
	display.setCursorLine(1);
	display.printLine("掌控板 UOP 服务器");
	myIot.setSoftAP("UDP", "12345678");
	display.setCursorLine(2);
	display.printLine((String("服务器IP :") + String(myIot.getWiFiSoftIP())));
	display.setCursorLine(4);
	display.printLine("已设置AP热点");
	myserver.setPort(8888);
	rgb.brightness(round(8));
}

逐行解析:

  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 () 主循环

void loop() {

}

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

六、全部事件回调函数

1. UDP 接收回调

void onUdpServerRecvMsg(String message) {
	rgb.write(-1, 0xCC33CC);
	delay(1000);
	rgb.write(-1, 0x000000);
}

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

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

2. 向前倾斜

void TiltForwardEvent() {
	myserver.sendUdpMsg("A");
	rgb.write(1, 0x00FF00);
	display.setCursorLine(3);
	display.printLine("前进");
}

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

3. 向后倾斜

void TiltBackEvent() {
	myserver.sendUdpMsg("B");
	rgb.write(1, 0xFF0000);
	display.setCursorLine(3);
	display.printLine("后退");
}

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

4. 向左倾斜

void TiltLeftEvent() {
	myserver.sendUdpMsg("C");
	rgb.write(1, 0x0000FF);
	display.setCursorLine(3);
	display.printLine("左横走");
}

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

5. 向右倾斜

void TiltRightEvent() {
	myserver.sendUdpMsg("D");
	rgb.write(1, 0xFF9900);
	display.setCursorLine(3);
	display.printLine("右横走");
}

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

6. 屏幕朝下翻转

void ScreenDownEvent() {
	myserver.sendUdpMsg("E");
	rgb.write(1, 0x333333);
	display.setCursorLine(3);
	display.printLine("停车");
}

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

整体项目架构

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

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

指令映射表

在这里插入图片描述

五大核心要点解读

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

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

在这里插入图片描述

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

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

实验开源代码

// WiFi连接工具库,STA模式接入外部WiFi热点
#include <DFRobot_Iot.h>
// 行空板K10硬件底层库:屏幕、画布、按键、RGB灯带驱动
#include "unihiker_k10.h"
// microbit电机拓展板库,独立控制M1/M2/M3/M4四路麦克纳姆轮电机
#include <Microbit_Motor.h>
// UDP客户端通信库,主动连接UDP服务器、收发字符串报文
#include <DFRobot_UDPClient.h>

// 函数前置声明,告知编译器后续定义的回调函数
void onUdpClientRecvMsg(String message);  // UDP客户端收到服务器消息触发
void onButtonAPressed();                 // A按键按下触发

// 全局对象与变量实例化
DFRobot_UDPClient myclient;    // UDP客户端通信对象
UNIHIKER_K10      k10;         // K10主控硬件对象,统一管理所有板载外设
Microbit_Motor    motorbit;    // 四路电机控制对象,驱动麦克纳姆四轮底盘
uint8_t           screen_dir=2;// 屏幕方向参数2:正向竖屏显示
DFRobot_Iot       myIot;       // WiFi联网工具对象


// 上电初始化函数,通电/复位仅执行1次
void setup() {
    // 绑定UDP接收回调:收到服务器下发消息自动执行onUdpClientRecvMsg
	myclient.setCallback(onUdpClientRecvMsg);

    // 初始化行空板全部底层硬件驱动(屏幕、按键、灯光)
	k10.begin();

    // 按照预设方向初始化屏幕
	k10.initScreen(screen_dir);
    // 创建绘图画布,所有文字图形必须绘制在画布才能输出到屏幕
	k10.creatCanvas();

    // 绑定A按键按下事件,按下A自动运行onButtonAPressed函数
	k10.buttonA->setPressedCallback(onButtonAPressed);

    // 设置屏幕背景深灰色 0x333333
	k10.setScreenBackground(0x333333);
    // 在画布纵向第5行绘制红色标题
	k10.canvas->canvasText("  行空板UDP客户端", 5, 0xFF0000);
    // 第一次刷新画布,显示初始标题
	k10.canvas->updateCanvas();

    // STA模式连接【掌控板UDP服务器】开启的WiFi热点,名称UDP,密码12345678
	myIot.wifiConnect("UDP", "12345678");

    // 阻塞循环:一直等待WiFi连接成功,未连上不执行后续网络初始化
	while (!myIot.wifiStatus()) {}

    // WiFi联网成功,追加两行状态提示文字
	k10.canvas->canvasText("      已连接服务器", 7, 0x33FFFF);
	k10.canvas->canvasText("       可以开车了!", 9, 0xFFFFFF);

    // UDP客户端连接服务器固定地址与端口
    // 192.168.4.1 是ESP32 SoftAP热点默认IP,通信端口统一8888
	myclient.connectToServer("192.168.4.1",8888);

    // 二次刷新画布,更新联网成功提示
	k10.canvas->updateCanvas();

    // 设置RGB灯带全局亮度等级6,亮度取值范围0~255
	k10.rgb->brightness(round(6));
}

// 主循环
void loop() {
    // 全部业务逻辑依靠UDP接收、按键异步回调触发,无需轮询扫描,循环留空
}

// ====================== 事件回调函数 ======================
// UDP客户端收到掌控板服务器下发消息触发,message为接收的字符串指令
void onUdpClientRecvMsg(String message) {
    // 默认先点亮第0颗灯带灰色
	k10.rgb->write(0, 0x333333);

    // 收到指令"A" → 四轮全部正转,小车前进
	if ((message==String("A"))) {
		motorbit.motorRun(ALL, CW, 200);        // ALL=全部电机,CW正转,速度200
		k10.rgb->write(-1, 0x00FF00);           // -1代表全部灯带点亮绿色
		delay(1000);                            // 灯光保持1秒
		k10.rgb->write(-1, 0x000000);           // 熄灭全部灯带
	}
    // 收到指令"B" → 四轮全部反转,小车后退
	if ((message==String("B"))) {
		motorbit.motorRun(ALL, CCW, 200);       // CCW反转
		k10.rgb->write(-1, 0xFF0000);           // 全灯红色
		delay(1000);
		k10.rgb->write(-1, 0x000000);
	}
    // 收到指令"C" → 麦克纳姆轮左横走
	if ((message==String("C"))) {
		motorbit.motorRun(M1, CCW, 200);
		motorbit.motorRun(M2, CW, 200);
		motorbit.motorRun(M3, CCW, 200);
		motorbit.motorRun(M4, CW, 200);
		k10.rgb->write(-1, 0x0000FF);           // 全灯蓝色
		delay(1000);
		k10.rgb->write(-1, 0x000000);
	}
    // 收到指令"D" → 麦克纳姆轮右横走
	if ((message==String("D"))) {
		motorbit.motorRun(M1, CW, 200);
		motorbit.motorRun(M2, CCW, 200);
		motorbit.motorRun(M3, CW, 200);
		motorbit.motorRun(M4, CCW, 200);
		k10.rgb->write(-1, 0xFF6600);           // 全灯橙橘色
		delay(1000);
		k10.rgb->write(-1, 0x000000);
	}
    // 收到指令"E" → 停止所有电机,小车停车
	if ((message==String("E"))) {
		motorbit.motorStop(ALL);                // 停止全部电机
		k10.rgb->write(-1, 0x333333);           // 全灯灰色
		delay(1000);
		k10.rgb->write(-1, 0x000000);
	}
}

// A按键按下触发回调函数
void onButtonAPressed() {
    // UDP客户端主动向掌控板服务器发送测试消息,用于双向通信调试
	myclient.sendUdpMsg("hello,I am client");
}

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

一、头文件作用

#include <DFRobot_Iot.h>
#include "unihiker_k10.h"
#include <Microbit_Motor.h>
#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 服务器、收发字符串消息。

二、函数前置声明

void onUdpClientRecvMsg(String message);
void onButtonAPressed();

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

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

三、全局对象与变量

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

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

void setup() {
	myclient.setCallback(onUdpClientRecvMsg);
	k10.begin();
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	k10.buttonA->setPressedCallback(onButtonAPressed);
	k10.setScreenBackground(0x333333);
	k10.canvas->canvasText("  行空板UDP客户端", 5, 0xFF0000);
	k10.canvas->updateCanvas();
	myIot.wifiConnect("UDP", "12345678");
	while (!myIot.wifiStatus()) {}
	k10.canvas->canvasText("      已连接服务器", 7, 0x33FFFF);
	k10.canvas->canvasText("       可以开车了!", 9, 0xFFFFFF);
	myclient.connectToServer("192.168.4.1",8888);
	k10.canvas->updateCanvas();
	k10.rgb->brightness(round(6));
}

逐行解析:

  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 () 主循环

void loop() {

}

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

六、事件回调核心逻辑

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

void onUdpClientRecvMsg(String message) {
	k10.rgb->write(0, 0x333333);
	if ((message==String("A"))) {
		motorbit.motorRun(ALL, CW, 200);
		k10.rgb->write(-1, 0x00FF00);
		delay(1000);
		k10.rgb->write(-1, 0x000000);
	}
	if ((message==String("B"))) {
		motorbit.motorRun(ALL, CCW, 200);
		k10.rgb->write(-1, 0xFF0000);
		delay(1000);
		k10.rgb->write(-1, 0x000000);
	}
	if ((message==String("C"))) {
		motorbit.motorRun(M1, CCW, 200);
		motorbit.motorRun(M2, CW, 200);
		motorbit.motorRun(M3, CCW, 200);
		motorbit.motorRun(M4, CW, 200);
		k10.rgb->write(-1, 0x0000FF);
		delay(1000);
		k10.rgb->write(-1, 0x000000);
	}
	if ((message==String("D"))) {
		motorbit.motorRun(M1, CW, 200);
		motorbit.motorRun(M2, CCW, 200);
		motorbit.motorRun(M3, CW, 200);
		motorbit.motorRun(M4, CCW, 200);
		k10.rgb->write(-1, 0xFF6600);
		delay(1000);
		k10.rgb->write(-1, 0x000000);
	}
	if ((message==String("E"))) {
		motorbit.motorStop(ALL);
		k10.rgb->write(-1, 0x333333);
		delay(1000);
		k10.rgb->write(-1, 0x000000);
	}
}

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

在这里插入图片描述

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

2. A 按键回调

void onButtonAPressed() {
	myclient.sendUdpMsg("hello,I am client");
}

按下 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. 上电顺序:先上电掌控板(服务器),再上电行空板小车(客户端)

行空板 K10 UDP 双向通信小车客户端
Mind+图形编程

在这里插入图片描述

实验场景图与视频记录

在这里插入图片描述

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

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐