项目1-08 AiTall_V3 具身智能小车
PBL技术核心_主控一体化编程

齐护具身智能机器人小车

齐护AiTall V3人工智能开发板


在这里插入图片描述

一、项目场景介绍
1.1 项目背景
1.2 课程设计理念
1.3 课程教学目标
1.4 课程基本信息
三、课程重难点
3.1 教学重点
3.2 教学难点
四、课前准备
4.1 软件环境
4.2 教学素材
4.3 硬件器材
4.4 硬件接线对应主控模块IO
4.5 硬件使用注意问题
电源能量管理
wifi信号
电机方向
Small核心模块与手柄连接
五、课程分层课时教学设计(由浅入深 PBL 阶梯任务)
第 1 课时:项目导入 + 硬件认知拆解
第 2 课时:硬件引脚原理 + 规范接线实操
第 3 课时:编程环境入门 + 基础彩灯控制
编程实训:点亮小车的RGB灯
第 4 课时:感知模块应用 + OLED 数据显示
编程实训:OLED显示超声波的数值
编程实训:光电开关控制RGB灯
第 5 课时:电机驱动控制 + 小车基础行驶
编程实训:电机控制
第 6 课时:巡线避障 + 手柄遥控进阶控制
编程实训:光电开关控制电机的启停
编程实训:遥控器控制电机的启停
第 7 课时:AI 大模型交互 + 语音智能控制
编程实训: AI控制执行器与传感器读取
第 8 课时:项目整合调试 + 成果展示评价
编程实训: 具身智能小车综合应用编程
六、课程教学实施策略
七、常见教学故障排查指引
八、课程评价体系
8.1 过程性评价
8.2 功能性评价
8.3 成果性评价
8.4 素养评价
九、课程拓展延伸方向
十、课程练习源程序下载

适用学段:中小学创客、人工智能、机器人社团课

课程类型:PBL 项目式学习、主控一体化编程实训

项目主题:基于大模型交互的具身智能机器人小车研发

一、项目场景介绍
1.1 项目背景
依托齐护 AiTall_V3 全套软硬件平台,结合本地 ESP32 主控设备与 AI 小智大模型对话系统,打造可语音交互、遥控操控、自主传感避障巡线的具身智能小车。采用项目驱动、由浅入深、实操落地的教学模式,让学生从硬件认知、接线装配、基础编程,逐步进阶到传感器应用、电机运动控制、蓝牙遥控、AI 语音交互,最终完成综合智能小车功能开发,理解具身智能、人机交互、物联网传感核心原理。

1.2 课程设计理念
以真实智能小车成品为最终项目目标,拆解分层学习任务,遵循认知 — 装配 — 编程 — 调试 — 创新学习逻辑;融合硬件实操、图形化编程、代码逻辑、人工智能应用,兼顾动手能力、逻辑思维、问题排查与创新设计素养培养,贴合中小学科创教学课标要求。

1.3 课程教学目标
知识目标
认识 AiTall_V3 小车全套硬件模块,掌握各传感器、执行器功能特性
熟记主板 IO 引脚定义,规范掌握硬件接线标准与安全操作规范
理解彩灯、超声波、光电巡线、电机驱动基础工作原理
掌握 MicroPython 基础编程逻辑,熟悉 Mixly 编程软件使用
初步认知蓝牙通信、串口数据传输、AI 大模型人机交互原理
能力目标
具备独立完成硬件组装、线路排查、故障检修的实操能力
能够根据功能需求编写、修改、调试基础控制程序
学会利用传感器数据实现小车感知、判断、动作响应
掌握手柄遥控、语音指令双重控制小车的实操方法
具备小组协作完成项目整合、功能优化与成果展示能力
素养目标
培养严谨规范的工程思维、敢于试错的调试意识、智能科技探索兴趣,树立人机协同、智能创造的科创观念。

1.4 课程基本信息
项目载体:AiTall_V3 具身智能小车

开发平台:齐护桌面版 Mixly3.0、在线 Mixly 编程平台

编程语言:MicroPython

授课形式:PBL 项目分组教学、实操实训、问题研讨

课时安排:拆分阶梯课时,总计 8 课时阶梯式学习

授课对象:中小学科创教师、中小学生创客学员

三、课程重难点
3.1 教学重点
硬件模块识别与标准接线规范
基础模块独立编程与功能调试
电机运动控制、巡线避障传感逻辑
蓝牙手柄串口通信数据解析
AI 语音唤醒、指令控制设备交互
3.2 教学难点
引脚对应关系记忆与接线故障排查
多传感器协同工作逻辑编写
手柄信号接收与小车动作联动
AI 大模型指令理解与硬件设备联动控制
多功能程序整合与整体项目稳定调试
四、课前准备
4.1 软件环境
电脑端安装齐护教育版 Mixly 软件,浏览器登录在线 Mixly3.0 平台;提前完成主板固件初始化,统一网络环境为 2.4G WiFi。

NO 软件 版本
1 齐护在线版Mixly3.0 在线Mixly3.0
2 齐护教育版Mixly MicroPython ESP32S3 1.0-2.0-3.0
4.2 教学素材
项目 PPT、硬件接线图、引脚对照表、分步案例程序、故障排查手册、成品演示视频

4.3 硬件器材
AiTall_V3 主控主板、Small 核心模块、DRV8833 电机驱动、WS2812 彩灯、超声波传感器、双光电巡线模块、OLED 显示屏、蓝牙手柄、小车车架、18650动力电池、配套连接线等。

小车套件硬件:

4.4 硬件接线对应主控模块IO
NO 模块(点击可链接到模块学习教程) 对应AiTall V3主板IO
1 WS2812 RGB彩灯模块 黑线信号-10(白线不接或其它任意端子上)
2 电机驱动板DRV8833电机侧(方向反了对调电机或IO) 右电机OUT1-2,左电机OUT3-4
3 电机驱动板DRV8833控制侧(电源接5V,J2要短接) 左(IN1-11,IN2-12),右(IN3-13,IN4-14)
4 双光电反射巡线模块 左黑线-45,右白线-48
5 超声波传感器(背面两个拔码开关到GPIO侧) Trig白线-47,Echo黑线-21
6 齐护Small核心主板(与AiTall串口通信) Small 16-8 ,Samll 17-18
7 OLED显示屏 对应接主板上的OLED的I2C端子
4.5 硬件使用注意问题
电源能量管理
电池要保持足够的电量,否则主板会重启或电机远行不正常

wifi信号
wifi要采用2.4G的,不可以用5G或手机热点时开启5G也是错误的,路由器或手机都要关闭5G信号,并保持信号强度有2格或以上。

电机方向
当接好线时发现电机运行方向不对,可以多种方法调节运行方向:

1.对调IN1-2, 或IN3-4的IO;

2.对调OUT电机的方向或组别;

3.在程序里重新设置电机的定义IO。

Small核心模块与手柄连接
要预先上传蓝牙手柄转接程序,通过串口转发到AiTall V3主控。如果采购成批定制类的齐护有预烧录,不用再次上传。

五、课程分层课时教学设计(由浅入深 PBL 阶梯任务)
如下第1课至第7课的编程应用程序采用齐护教育版Mixly【 MicroPython[ESP32S3] 】板卡,用户也可以选择齐护在线Mixly3编程,注意线上跟线下的文件不通用!第8课的综合应用程序采用的是齐护在线Mixly软件。

第 1 课时:项目导入 + 硬件认知拆解
课程导入:播放智能小车演示视频,展示语音控制、自动避障、遥控行驶效果,发布最终项目任务

硬件识别:逐一认识小车主控、传感器、电机、显示、通信各类模块

结构认知:了解小车车架装配结构,区分输入类、输出类硬件设备

课堂任务:分组清点器材,熟记模块名称与基础作用

第 2 课时:硬件引脚原理 + 规范接线实操
讲解主板 IO 引脚定义,对应各模块接线端口要求

安全接线规范教学,区分电源线、信号线正负极接法

分步完成彩灯、显示屏、电机、传感器基础接线

易错点讲解:电机方向、传感器拨码、串口通信接线注意事项

课堂任务:小组完成全车线路连接,自查接线正误

蓝牙手柄与Samll核心的程序上传

蓝牙手柄的基础应用学习请参考【蓝牙手柄】

注:如果采购成批定制类的齐护有预烧录,不用再次上传。

参考【ESP32手柄转发例程】或直接上传例程即可,MAC地址一定要输入自己对应的,这个核心板就专用于这个手柄的连接。如果一个场景内有多个手柄请一定要标号识别,这样对应使用!

上传完成程序后测试连接状态:连接成功能后Small板上的RGB灯会亮绿色(可按一下Small上的RST重连或重启手柄_常按10秒单圆键),断开亮红色,连接成功后测试:按X串口打印,按左L2绿灯灭,松开亮绿灯,代表手柄与Small_ESP32正常连接。如上为例程的功能,如果用户有自行修改功能,按修改后在功能测试。

主板固件上传
注:在线Mixly与桌面版本Mixly的固件不能通用,只能二选一使用!

本项目主板采用Micropython编程语言,所以在编程前要先初始化固件一次。按着BOOT–按一下RST—选择COM—初始化固件—放开BOOT–等待固件完成上传。

在线Mixly选ESP32S3-右上角-【初始化固件】;

桌面版齐护教育版Mixly-右下角选主板【MicroPyhon ESP32S3】–初如化固件。

第 3 课时:编程环境入门 + 基础彩灯控制
Mixly 编程软件界面讲解,区分在线版与桌面版使用差异
ESP32S3 主板固件初始化操作教学
基础程序逻辑学习,完成彩灯点亮、闪烁基础案例
程序上传、设备调试基础操作训练
课堂任务:独立编写彩灯启停闪烁控制程序
编程实训:点亮小车的RGB灯
例1 让RGB灯亮红色1秒-半闭1秒-关闭,循环

import time
import neopixel
import machine

rgb = neopixel.NeoPixel(machine.Pin(10), 4)
while True:
rgb[0] = (100, 0, 0)
rgb.write()
time.sleep_ms(1000)
rgb[0] = (0, 0, 0)
rgb.write()
time.sleep_ms(1000)
例2 手柄控制RGB灯的开关,串口解析收到的Small模块的手柄信息,当向上B41或向下B61时对RGB灯模块进行不同的动作控制,其它同理。

import neopixel
import machine

uart1=machine.UART(1, tx=8, rx=18, baudrate=9600)
rgb = neopixel.NeoPixel(machine.Pin(10), 4)
while True:
try:
if uart1.any() > 3:
serialMsg = uart1.readline().strip().decode(“ASCII”)
print(serialMsg)
if serialMsg == “B41”:
rgb[0] = (100, 0, 0)
rgb.write()
elif serialMsg == “B61”:
rgb[0] = (0, 0, 0)
rgb.write()
except Exception as e:
print(e)
第 4 课时:感知模块应用 + OLED 数据显示
超声波测距原理学习,编写距离检测程序
OLED 屏幕驱动使用,实现实时数据画面显示
光电巡线传感器原理,识别黑白路面感应信号
结合传感信号,控制彩灯同步做出状态反馈
课堂任务:完成超声波数值屏显、光电感应控灯功能
编程实训:OLED显示超声波的数值
间隔0.3秒更新一次超声波传感器的实时数据并显示在OLED屏上。

import uasyncio as asyncio
import time
import ssd1306_oled
import sonar
import mixiot
import esp32_client
import _thread
from machine import I2C, Pin
from es8311 import ES8311Audio

es8311 = ES8311Audio(scl_pin=17, sda_pin=16, mclk_pin=4, pa_pin=-1)
es8311.es8311_init()
es8311.set_volume(85)
__xiaozhi_mcp_tools = []
__xiaozhi_board = {
“microphone”: {“sck”: 5, “ws”: 6, “sd”: 7},
“speaker”: {“sck”: 5, “ws”: 6, “sd”: 15},
“display”: ssd1306_oled.SSD1306_I2C(128, 64, I2C(scl=Pin(17), sda=Pin(16)), rotate=0)
}
esp32_client.first_show(__xiaozhi_board)
__xz_client = esp32_client.ESP32RealtimeClient(ota_url=esp32_client.ota_xiaozhi_url,
modes=[{“mode”: “auto”, “pin”: 0}],
board=__xiaozhi_board,
mcp_tools=__xiaozhi_mcp_tools,
auth_code=“12b842”)
def testThread():
while True:
__xz_client.display_log( (“距离:” + str(sonar.Sonar(47, 21).checkdist())))
time.sleep_ms(300)

mixiot.wlan_connect(“QDP”,“66666666”)
_thread.start_new_thread(testThread, ())
asyncio.run(__xz_client.start())
编程实训:光电开关控制RGB灯
巡线编程块在 齐护机器人–传感器 中找到。

当光电开光感应的白色时会亮灯,左右不同的状态控制RGB灯亮蓝色或关闭。这就是巡线的原理,当在黑色色内时灭灯,离开黑线区进入白线区时亮灯,通过此信号可以控制小车的运行方向。

import neopixel
import machine

bt45 = machine.Pin(45, machine.Pin.IN)
bt48 = machine.Pin(48, machine.Pin.IN)

rgb = neopixel.NeoPixel(machine.Pin(10), 4)
while True:
if bt45.value() == 1:
rgb[3] = (0, 0, 100)
rgb.write()
elif bt48.value() == 1:
rgb[0] = (0, 0, 100)
rgb.write()
else:
rgb[0] = (0, 0, 0)
rgb[3] = (0, 0, 0)
rgb.write()
第 5 课时:电机驱动控制 + 小车基础行驶
DRV8833 电机驱动工作原理讲解
PWM 调速原理学习,掌握电机正转、反转、停止逻辑
单电机、双电机独立编程控制
行驶方向故障调试方法,修正小车行进姿态
课堂任务:实现小车前进、后退、启停基础运动
编程实训:电机控制
注:测试电机转动时请将小车反倒(车轮向上)放在桌面上测试,否则运行时小车会跑出桌面带来损伤!

例1 单个电机转动与停止

程序控制 一个电机正转2秒–停止1秒–反转2秒–停止1秒–循环

桌面版本Mixly,PWM选占空比输出范围为: 0-1023,选占空比16位:0-65535

在线版本Mixly,PWM输出范围为: 0-65535

当一个控制IO为0时,另一个PWM的大小为转速,反转时侧相反即可另一个IO为0,PWM速度为原0的IO控制。

import time
import machine
pwm11 = machine.PWM(machine.Pin(11))
pwm12 = machine.PWM(machine.Pin(12))
#PWM选占空比输出范围为: 0-1023,选占空比16位:0-65535
while True:
pwm11.duty(1000)
pwm12.duty(0)
time.sleep_ms(2000)
pwm11.duty(0)
pwm12.duty(0)
time.sleep_ms(1000)
pwm11.duty(0)
pwm12.duty(1000)
time.sleep_ms(2000)
pwm11.duty(0)
pwm12.duty(0)
time.sleep_ms(1000)
例2 双电机的转动与停止

同时控制两组电机的正反转,此时可以实现让小车前进或后退。

import time
import machine
pwm11 = machine.PWM(machine.Pin(11))
pwm12 = machine.PWM(machine.Pin(12))
pwm13 = machine.PWM(machine.Pin(13))
pwm14 = machine.PWM(machine.Pin(14))
#PWM选占空比输出范围为: 0-1023,选占空比16位:0-65535
while True:
pwm11.duty(1000)
pwm12.duty(0)
pwm13.duty(1000)
pwm14.duty(0)
time.sleep_ms(2000)
pwm11.duty(0)
pwm12.duty(0)
pwm13.duty(0)
pwm14.duty(0)
time.sleep_ms(1000)
pwm11.duty(0)
pwm12.duty(1000)
pwm13.duty(0)
pwm14.duty(1000)
time.sleep_ms(2000)
pwm11.duty(0)
pwm12.duty(0)
pwm13.duty(0)
pwm14.duty(0)
time.sleep_ms(1000)
第 6 课时:巡线避障 + 手柄遥控进阶控制
双光电传感器逻辑编程,实现小车自动巡线行驶
超声波距离判断,编写智能避障程序
Small 核心模块与蓝牙手柄配对通信设置
串口数据解析,手柄按键对应小车动作指令
课堂任务:完成遥控操控、自动巡线避障双模式运行
编程实训:光电开关控制电机的启停
电机随光电巡线开关的状态不同执行不同的运行方式(小车巡线运行原理)。

import machine

bt48 = machine.Pin(48, machine.Pin.IN)
bt45 = machine.Pin(45, machine.Pin.IN)
pwm11 = machine.PWM(machine.Pin(11))
pwm12 = machine.PWM(machine.Pin(12))
pwm13 = machine.PWM(machine.Pin(13))
pwm14 = machine.PWM(machine.Pin(14))
#PWM选占空比输出范围为: 0-1023,选占空比16位:0-65535
while True:
if bt48.value() 1 and bt45.value() 0:
pwm11.duty(1000)
pwm12.duty(0)
pwm13.duty(0)
pwm14.duty(1000)
elif bt48.value() 1 and bt45.value() 1:
pwm11.duty(0)
pwm12.duty(1000)
pwm13.duty(0)
pwm14.duty(1000)
elif bt48.value() 0 and bt45.value() 1:
pwm11.duty(0)
pwm12.duty(1000)
pwm13.duty(1000)
pwm14.duty(0)
else:
pwm11.duty(0)
pwm12.duty(0)
pwm13.duty(0)
pwm14.duty(0)
编程实训:遥控器控制电机的启停
通过遥控器控制电机的动作,不同的组合可以实现不一样的动作,初步实现了手动遥控小车动作。

import neopixel
import machine
pwm11 = machine.PWM(machine.Pin(11))
pwm12 = machine.PWM(machine.Pin(12))
pwm13 = machine.PWM(machine.Pin(13))
pwm14 = machine.PWM(machine.Pin(14))
uart1=machine.UART(1, tx=8, rx=18, baudrate=9600)
rgb = neopixel.NeoPixel(machine.Pin(10), 4)
while True:
try:
if uart1.any() > 3:
serialMsg = uart1.readline().strip().decode(“ASCII”)
print(serialMsg)
if serialMsg == “B41”:
pwm11.duty(1000)
pwm12.duty(0)
pwm13.duty(1000)
pwm14.duty(0)
elif serialMsg == “B61”:
pwm11.duty(0)
pwm12.duty(1000)
pwm13.duty(0)
pwm14.duty(1000)
else:
pwm11.duty(0)
pwm12.duty(0)
pwm13.duty(0)
pwm14.duty(0)
except Exception as e:
print(e)
第 7 课时:AI 大模型交互 + 语音智能控制
AI 小智大模型对话平台功能介绍
语音唤醒词、控制指令词设置方法
语音指令控制彩灯开关、小车行进动作
语音查询传感器实时状态数据
手柄快捷唤醒、退出 AI 对话实操训练
课堂任务:实现人机语音交互控制设备功能
编程实训: AI控制执行器与传感器读取
关于AI应用的基础学习可以参考【AiTall V3】详细应用教程

例1 AI控制开关灯

唤醒词:齐护机器人(可自定义)

命令词:AI退出或没唤醒前可用的指令(对话过程中不无效)

程序功能说明:在没有与AI对话时可以用命令词(开灯、关灯)控制灯的开关,通过唤醒词(齐护机器人)唤醒AI对话后,可以进行任意内容的对话,在对话过程中可以表达要控制灯的含义或明确指令AI会理解用户的意思并通过MCP帮你控制灯的开关。

import uasyncio as asyncio
import ssd1306_oled
import neopixel
import mixiot
import machine
import esp32_client
from machine import I2C, Pin
from es8311 import ES8311Audio

es8311 = ES8311Audio(scl_pin=17, sda_pin=16, mclk_pin=4, pa_pin=-1)
es8311.es8311_init()
es8311.set_volume(80)
__xiaozhi_mcp_tools = []
__xiaozhi_board = {
“microphone”: {“sck”: 5, “ws”: 6, “sd”: 7},
“speaker”: {“sck”: 5, “ws”: 6, “sd”: 15},
“display”: ssd1306_oled.SSD1306_I2C(128, 64, I2C(scl=Pin(17), sda=Pin(16)), rotate=0)
}
esp32_client.first_show(__xiaozhi_board)
__xz_client = esp32_client.ESP32RealtimeClient(ota_url=esp32_client.ota_xiaozhi_url,
modes=[{“mode”: “auto”, “pin”: 0}],
board=__xiaozhi_board,
mcp_tools=__xiaozhi_mcp_tools,
auth_code=“12b842”)
def RGB_on():
print(“开灯”)
rgb[0] = (100, 0, 0)
rgb.write()

def RGB_off():
print(“关灯”)
rgb[0] = (0, 0, 0)
rgb.write()

def switch_RGB_light(action=False):
#对话过程中通过MCP控制灯
print(action)
if action == 1:
RGB_on()
elif action == 0:
RGB_off()
return action

__xiaozhi_mcp_tools.append({
‘id’: ‘self.switch_RGB_light’,
‘func’: switch_RGB_light,
‘info’: {
‘name’: ‘self.switch_RGB_light’,
‘description’: ‘控制RGB彩灯的开关’,
‘inputSchema’: {
‘type’: ‘object’,
‘properties’: {
‘action’: {
‘type’: ‘boolean’,
‘description’: ‘开关动作:1或0’
}
},
‘required’: []
}
}
})

mixiot.wlan_connect(“QDP”,“66666666”)
rgb = neopixel.NeoPixel(machine.Pin(10), 4)
#唤醒词及AI退出或没唤醒前可用的指令词
__xz_client.enable_wake_word([“qi hu ji qi ren”], True, [{“words”: [“kai deng”], “callback”: RGB_on}, {“words”: [“guan deng”], “callback”: RGB_off}])
asyncio.run(__xz_client.start())
例2 AI控制小车前进后退

通过AI的MCP互动控制小车的前进后退,说【齐护机器人】唤醒AI后,可以在对话过程中表达你要小车前进或后退的意思给AI,它会帮你控制。

import uasyncio as asyncio
import time
import ssd1306_oled
import mixiot
import machine
import esp32_client
from machine import I2C, Pin
from es8311 import ES8311Audio

es8311 = ES8311Audio(scl_pin=17, sda_pin=16, mclk_pin=4, pa_pin=-1)
es8311.es8311_init()
es8311.set_volume(80)
__xiaozhi_mcp_tools = []
__xiaozhi_board = {
“microphone”: {“sck”: 5, “ws”: 6, “sd”: 7},
“speaker”: {“sck”: 5, “ws”: 6, “sd”: 15},
“display”: ssd1306_oled.SSD1306_I2C(128, 64, I2C(scl=Pin(17), sda=Pin(16)), rotate=0)
}
esp32_client.first_show(__xiaozhi_board)
__xz_client = esp32_client.ESP32RealtimeClient(ota_url=esp32_client.ota_xiaozhi_url,
modes=[{“mode”: “auto”, “pin”: 0}],
board=__xiaozhi_board,
mcp_tools=__xiaozhi_mcp_tools,
auth_code=“12b842”)
def smart_car(action):
print(action)
if action == “backward”:
pwm11.duty(0)
pwm12.duty(1000)
pwm13.duty(0)
pwm14.duty(1000)
time.sleep_ms(1000)
STOP()
elif action == “forward”:
pwm11.duty(1000)
pwm12.duty(0)
pwm13.duty(1000)
pwm14.duty(0)
time.sleep_ms(1000)
STOP()
else:
STOP()
return action

__xiaozhi_mcp_tools.append({
‘id’: ‘self.smart_car’,
‘func’: smart_car,
‘info’: {
‘name’: ‘self.smart_car’,
‘description’: ‘智能小车’,
‘inputSchema’: {
‘type’: ‘object’,
‘properties’: {
‘action’: {
‘type’: ‘string’,
‘description’: ‘小车的运行方向:forward或backward’
}
},
‘required’: [
‘action’
]
}
}
})
def STOP():
pwm11.duty(0)
pwm12.duty(0)
pwm13.duty(0)
pwm14.duty(0)

pwm11 = machine.PWM(machine.Pin(11))
pwm12 = machine.PWM(machine.Pin(12))
pwm13 = machine.PWM(machine.Pin(13))
pwm14 = machine.PWM(machine.Pin(14))
mixiot.wlan_connect(“QDP”,“66666666”)
__xz_client.enable_wake_word([“qi hu ji qi ren”], True, None)
asyncio.run(__xz_client.start())
例3 AI读取超声波距离与光电开关状态

在与AI对话时可以让AI告诉你当前传感器的值或状态,这样可以设定为对话的条件让AI帮你做一些事情 ,比如你可以这样说:如果现在超声波的距离小于10厘米就播报音乐,否则就讲个笑话。

import uasyncio as asyncio
import ssd1306_oled
import sonar
import mixiot
import machine
import esp32_client
from machine import I2C, Pin
from es8311 import ES8311Audio

es8311 = ES8311Audio(scl_pin=17, sda_pin=16, mclk_pin=4, pa_pin=-1)
es8311.es8311_init()
es8311.set_volume(80)
__xiaozhi_mcp_tools = []
__xiaozhi_board = {
“microphone”: {“sck”: 5, “ws”: 6, “sd”: 7},
“speaker”: {“sck”: 5, “ws”: 6, “sd”: 15},
“display”: ssd1306_oled.SSD1306_I2C(128, 64, I2C(scl=Pin(17), sda=Pin(16)), rotate=0)
}
esp32_client.first_show(__xiaozhi_board)
__xz_client = esp32_client.ESP32RealtimeClient(ota_url=esp32_client.ota_xiaozhi_url,
modes=[{“mode”: “auto”, “pin”: 0}],
board=__xiaozhi_board,
mcp_tools=__xiaozhi_mcp_tools,
auth_code=“12b842”)
def ultrasonic_sensor(distance):
#对话过程中查询超声波的距离
data = str(sonar.Sonar(47, 21).checkdist()) + “厘米”
print(data)
return data

__xiaozhi_mcp_tools.append({
‘id’: ‘self.ultrasonic_sensor’,
‘func’: ultrasonic_sensor,
‘info’: {
‘name’: ‘self.ultrasonic_sensor’,
‘description’: ‘超声波传感器的距离’,
‘inputSchema’: {
‘type’: ‘object’,
‘properties’: {
‘distance’: {
‘type’: ‘string’,
‘description’: ‘查询超声波距离:data’
}
},
‘required’: [
‘distance’
]
}
}
})
def optoelectronic_switch(optoelectronic):
#对话过程中查询光电开关的状态
state = (“left:” + str(pin45.value())) + (“,right:” + str(pin48.value()))
print(state)
return state

__xiaozhi_mcp_tools.append({
‘id’: ‘self.optoelectronic_switch’,
‘func’: optoelectronic_switch,
‘info’: {
‘name’: ‘self.optoelectronic_switch’,
‘description’: ‘光电开关的状态’,
‘inputSchema’: {
‘type’: ‘object’,
‘properties’: {
‘optoelectronic’: {
‘type’: ‘string’,
‘description’: ‘查询光电传感器状态,返回两位数字符串,表示左右传感器状态:state’
}
},
‘required’: [
‘optoelectronic’
]
}
}
})

mixiot.wlan_connect(“QDP”,“66666666”)
pin45 = machine.Pin(45, machine.Pin.IN)
pin48 = machine.Pin(48, machine.Pin.IN)
__xz_client.enable_wake_word([“qi hu ji qi ren”], True, None)
asyncio.run(__xz_client.start())
例4 遥控器唤醒AI对话与退出对话

用前面遥控器控制RGB灯的程序升级,加入了遥控器对AI的互动,当按上遥控器的左1键时可以唤醒对话,按右1键时退出对话。

import uasyncio as asyncio
import time
import ssd1306_oled
import neopixel
import mixiot
import machine
import esp32_client
import _thread
from machine import I2C, Pin
from es8311 import ES8311Audio

es8311 = ES8311Audio(scl_pin=17, sda_pin=16, mclk_pin=4, pa_pin=-1)
es8311.es8311_init()
es8311.set_volume(80)
__xiaozhi_mcp_tools = []
__xiaozhi_board = {
“microphone”: {“sck”: 5, “ws”: 6, “sd”: 7},
“speaker”: {“sck”: 5, “ws”: 6, “sd”: 15},
“display”: ssd1306_oled.SSD1306_I2C(128, 64, I2C(scl=Pin(17), sda=Pin(16)), rotate=0)
}
esp32_client.first_show(__xiaozhi_board)
__xz_client = esp32_client.ESP32RealtimeClient(ota_url=esp32_client.ota_xiaozhi_url,
modes=[{“mode”: “auto”, “pin”: 0}],
board=__xiaozhi_board,
mcp_tools=__xiaozhi_mcp_tools,
auth_code=“12b842”)
def testThread():
time.sleep(2)
while True:
try:
if uart1.any() > 3:
serialMsg = uart1.readline().strip().decode(“ASCII”)
print(serialMsg)
if serialMsg == “B41”:
rgb[0] = (100, 0, 0)
rgb.write()
elif serialMsg == “B61”:
rgb[0] = (0, 0, 0)
rgb.write()
elif serialMsg == “B81”:
__xz_client.send_wake_text(“你好啊”, mode=“auto”)
elif serialMsg == “BB1”:
__xz_client.send_wake_text(“再见”, mode=“manual”)
except Exception as e:
print(e)
mixiot.wlan_connect(“QDP”,“66666666”)
_thread.start_new_thread(testThread, ())
uart1=machine.UART(1, tx=8, rx=18, baudrate=9600)
rgb = neopixel.NeoPixel(machine.Pin(10), 4)
__xz_client.enable_wake_word([“qi hu ji qi ren”], True, None)
asyncio.run(__xz_client.start())
第 8 课时:项目整合调试 + 成果展示评价
整合所有分步功能,编写完整具身智能小车程序
整机通电综合调试,排查卡顿、失控、通信异常问题
小组优化功能细节,拓展个性化创意功能
项目成果演示、小组汇报、功能对比评价
课程总结:梳理知识脉络,拓展智能机器人应用场景
编程实训: 具身智能小车综合应用编程
综合程序实现:

1,连网方式的多样性:可以采用配网的方式或直接输入wifi帐号的方式;

2,小车的遥控实现:通过蓝牙手柄可以控制小车的前后左右动作;

3,遥控的AI互动:通过遥控器唤醒AI或退下AI对话;

4,AI与小车的互动控制:AI对话控制小车的动作及查询传感器状态;

5,可扩展性:用户可加入更多的互动功能及小车的动作。

import uasyncio as asyncio
import time
import ssd1306_oled
import neopixel
import mixiot
import machine
import esp32_client
import _thread
from machine import I2C, Pin
from es8311 import ES8311Audio

es8311 = ES8311Audio(scl_pin=17, sda_pin=16, mclk_pin=4, pa_pin=-1)
es8311.es8311_init()
es8311.set_volume(80)
__xiaozhi_mcp_tools = []
__xiaozhi_board = {
“microphone”: {“sck”: 5, “ws”: 6, “sd”: 7},
“speaker”: {“sck”: 5, “ws”: 6, “sd”: 15},
“display”: ssd1306_oled.SSD1306_I2C(128, 64, I2C(scl=Pin(17), sda=Pin(16)), rotate=0)
}
esp32_client.first_show(__xiaozhi_board)
__xz_client = esp32_client.ESP32RealtimeClient(ota_url=esp32_client.ota_xiaozhi_url,
modes=[{“mode”: “auto”, “pin”: 0}],
board=__xiaozhi_board,
mcp_tools=__xiaozhi_mcp_tools,
auth_code=“12b842”)
def testThread():
time.sleep(2)
while True:
try:
if uart1.any() > 3:
serialMsg = uart1.readline().strip().decode(“ASCII”)
print(serialMsg)
if serialMsg == “B41”:
rgb[0] = (100, 0, 0)
rgb.write()
elif serialMsg == “B61”:
rgb[0] = (0, 0, 0)
rgb.write()
elif serialMsg == “B81”:
__xz_client.send_wake_text(“你好啊”, mode=“auto”)
elif serialMsg == “BB1”:
__xz_client.send_wake_text(“再见”, mode=“manual”)
except Exception as e:
print(e)

mixiot.wlan_connect(“QDP”,“66666666”)
_thread.start_new_thread(testThread, ())
uart1=machine.UART(1, tx=8, rx=18, baudrate=9600)
rgb = neopixel.NeoPixel(machine.Pin(10), 4)
__xz_client.enable_wake_word([“qi hu ji qi ren”], True, None)
asyncio.run(__xz_client.start())
六、课程教学实施策略
任务拆解教学:将完整智能小车项目拆分为单一小任务,逐个突破再整合,降低学习难度
演示引领实操:教师分步演示操作与编程步骤,学生同步动手模仿练习
故障探究式学习:针对接线错误、程序报错、设备失灵常见问题,引导学生自主排查解决
分组协作模式:小组分工负责装配、编程、调试、汇报,提升团队配合能力
分层因材施教:基础学员完成标准功能,能力较强学员自主拓展创意控制效果
七、常见教学故障排查指引
设备无法上电:检查电池电量、供电线路插接牢固度
程序上传失败:核对主板端口、固件版本、软件选型匹配度
电机运转方向异常:调换电机接线或修改程序控制逻辑
WiFi 连接失败:确认使用 2.4G 频段网络,核对账号密码
手柄无法控制:检查串口接线、核心模块程序预烧录状态
AI 无语音响应:排查音频模块接线、网络连通、唤醒词设置
八、课程评价体系
8.1 过程性评价
考核器材清点、接线规范、编程实操、课堂协作、故障排查日常表现

8.2 功能性评价
按课时任务逐一验收彩灯、传感、电机、遥控、AI 交互各项基础功能

8.3 成果性评价
综合小车完整运行效果、功能完整性、运行稳定性、创意拓展设计

8.4 素养评价
评估工程规范意识、科创探索积极性、问题解决思维能力

九、课程拓展延伸方向
新增声光报警、姿态感应等拓展模块,丰富小车感知能力
优化 AI 对话指令,增加语音调速、定点行驶高级功能
设计赛道闯关任务,实现小车全自动循迹避障竞速
结合生活场景,创意设计智能迎宾、物品搬运实用小车功能
十、课程练习源程序下载
请将项目码发送给客服人员得到下载码:项目码【Q964】

点击下载【项目源程序资料:用齐护教育版Mixly打开】

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐