【花雕动手做】行空板 K10 系列实验之通过 I2C IO 扩展板读取直流无刷减速电机 AB 两相脉冲

📅 2026/6/30 23:03:25
【花雕动手做】行空板 K10 系列实验之通过 I2C IO 扩展板读取直流无刷减速电机 AB 两相脉冲
行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板100%采用国产芯片知识产权自主可控符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成2.8寸LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源教学过程中无需额外连接其他设备便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等AI人工智能项目。主要特点集成摄像头内置算法可进行离线图像检测集成麦克风内置算法可进行离线语音识别集成扬声器内置算法可进行离线语音合成2.8寸彩色屏幕数据展示更清晰集成度高利于教学接口丰富兼容软件多扩展性好实验使用的电机3640与 IO 扩展板主打人工智能模块语音识别相关说明辅助屏幕显示相关积木扩展板模块LED控制模块知识点直流无刷减速电机 AB 两相脉冲一、什么是 AB 两相脉冲这款雅腾内置驱动无刷电机自带两相正交霍尔脉冲输出两根信号线青线 A 相、棕线 B 相会随电机转动持续输出高低电平方波信号A、B 两路波形相位固定相差 90°行业称为正交 AB 相脉冲。它属于电机内置简易测速反馈不是高精度独立编码器依靠电机内部霍尔元件感应转子磁场产生脉冲。二、核心硬件参数与线材定义输出线材青线A 相位脉冲输出棕线B 相位脉冲输出公共参考地电机黑线12V 负极必须和单片机 / 扩展板共地才能读取信号电气特性相位差A、B 波形相位角度固定 90°输出电平3.3V/5V 数字电平可直接接入行空板 IO 扩展板 C 口精度分辨率普通仅用于基础测速、转向判断不适合高精度角度定位触发逻辑电机停止时无脉冲转轴转动才持续输出交替高低电平。三、AB 两相脉冲两大核心作用测量电机转速测速电机每旋转固定角度就会产生一组脉冲通过单片机统计单位时间内脉冲总数就能换算出电机每分钟转速r/min。计算公式转速 (r/min) 采样周期内脉冲总数 ÷ 采样时长 (s) ÷ 单圈总脉冲数 × 60例2 秒采集 300 个脉冲电机转一圈输出 100 个脉冲转速 300 ÷ 2 ÷ 100 × 60 90 转 / 分钟判断电机旋转方向正转 / 反转A、B 相位差 90°两路电平变化有先后顺序以此区分转向正转CW方向线悬空A 相电平先翻转之后 B 相再翻转反转CCW方向线接负极B 相电平先翻转之后 A 相再翻转。单片机实时对比 A、B 电平先后顺序即可实时识别当前旋转方向。四、波形工作原理正交波形逻辑电机匀速转动时A、B 输出连续方波错开 1/4 个波形周期正转时序A 高 B 低 → A 高 B 高 → A 低 B 高 → A 低 B 低循环往复反转时序A 低 B 高 → A 高 B 高 → A 高 B 低 → A 低 B 低反向循环通过捕捉电平上升沿低电平跳变高电平完成脉冲计数与转向判定。五、行空板 K10IO 扩展板读取硬件要求接线规范电机青线 (A 相)、棕线 (B 相) → 扩展板C0/C1/C2/C3数字 IO 口S 舵机通道无法读取脉冲电机黑线 (12V 负极)、行空板 GND、IO 扩展板 GND 三线短接共地电机红线独立外接 DC12V 稳压电源不可借用行空板供电。程序配置要求将接入 A/B 相的 C 口设置为数字输入模式 eReadGpio循环实时读取引脚电平记录上一次电平状态捕捉上升沿实现脉冲计数减少程序内长延时 delay避免脉冲跳变被程序跳过造成计数丢失。六、优缺点对比1、优点一体化集成电机内置霍尔元件无需额外加装编码器接线简单功能齐全同时实现测速、转向识别满足机器人关节、底盘基础控制电平兼容3.3V/5V 信号可直接接入单片机无需电平转换成本低相比独立高精度编码器价格更低适合教学机器人项目。2、缺点分辨率低脉冲数量少无法精准控制旋转角度无零位信号缺少 Z 相原点脉冲不能精准复位机械位置长线易干扰导线过长时脉冲电平乱跳计数误差变大停机无记忆断电后丢失转动位置数据。七、典型应用场景适配雅腾机器人电机教育机器人头部、颈部、机械臂转速监测区分左右旋转小型行走底盘左右轮测速实现简易差速直行修正云台转向机构监测云台转动速度配合语音调速实现匀速转动自动化小型传动设备实时监控电机是否堵转长时间脉冲无增加判定堵转。八、常见使用问题与解决办法1、完全无脉冲、计数始终为 0未共地电机黑线与扩展板 GND 断开电机未上电12V 电源未接通霍尔元件不工作脉冲接错引脚接到 S 舵机通道仅 C 口支持数字输入读取。2、脉冲计数乱跳、数值波动极大线路干扰信号线过长可在脉冲引脚并联 10K 下拉电阻至 GND电源纹波大更换稳压 12V 电源减少电压波动。3、计数数值偏小、大量脉冲丢失程序存在长 delay 阻塞循环脉冲跳变被跳过优化缩短延时将脉冲读取代码放在 loop 循环最前端优先执行。4、无法区分正反转只单独读取单路脉冲未同时采集 A、B 两相电平对比时序。【花雕动手做】行空板 K10 系列实验之通过 I2C IO 扩展板读取直流无刷减速电机 AB 两相脉冲实验开源代码// 引入离线语音识别ASR库实现语音唤醒、自定义语音指令识别#includeasr.h// 行空板K10核心驱动库用于LCD屏幕、画布文字绘制、硬件底层初始化#includeunihiker_k10.h// I2C IO扩展板驱动库拓展多路GPIO实现电机控制、AB脉冲信号读取#includeDFRobot_UnihikerExpansion.h// 硬件对象实例化UNIHIKER_K10 k10;// 行空板主板主对象操控屏幕、系统硬件ASR asr;// 离线语音识别模块对象处理收音、语音解析DFRobot_UnihikerExpansion_I2Ceunihiker(Wire);// I2C扩展板对象绑定系统默认I2C通信总线uint8_tscreen_dir2;// 屏幕旋转参数2 屏幕倒置显示//// setup() 上电初始化函数设备开机/重启仅执行1次// 功能初始化主板、语音模块、I2C扩展板配置引脚模式注册6条语音指令//voidsetup(){// 初始化行空板全部底层硬件串口、I2C总线、屏幕外设等k10.begin();// 初始化语音识别模块// CONTINUOUS持续不间断收音时刻监听人声唤醒词// CN_MODE中文语音识别模式// 12000收音灵敏度阈值数值越大抗环境噪音、误唤醒能力越强asr.asrInit(CONTINUOUS,CN_MODE,12000);// 阻塞等待语音模块加载语音模型完成// _asrState 0 代表语音模块未就绪每100ms循环检测一次状态防止未初始化就调用报错while(asr._asrState0){delay(100);}// 循环检测I2C扩展板硬件通信状态未连接成功则每隔1秒重试一次while(!eunihiker.begin()){delay(1000);}// 将扩展板C0引脚配置为数字输出模式用于控制电机刹车控制线黄线eunihiker.setMode(eC0,eWriteGpio);// 根据预设screen_dir参数初始化LCD显示屏k10.initScreen(screen_dir);// 创建屏幕绘图画布缓冲区所有文字先写入画布统一刷新到屏幕k10.creatCanvas();// C1引脚配置为数字输出控制电机方向控制线蓝线切换正反转eunihiker.setMode(eC1,eWriteGpio);// C2引脚配置为数字输入模式接入电机A相脉冲输出青线读取A相电平eunihiker.setMode(eC2,eReadGpio);// C3引脚配置为数字输入模式接入电机B相脉冲输出棕线读取B相电平eunihiker.setMode(eC3,eReadGpio);// 批量注册6条离线语音控制指令采用拼音匹配识别asr.addASRCommand(01,qi dong);// ID1 语音口令启动asr.addASRCommand(11,ting zhi);// ID2 语音口令停止asr.addASRCommand(21,zheng zhuan);// ID3 语音口令正转asr.addASRCommand(31,fan zhuan);// ID4 语音口令反转asr.addASRCommand(41,du ai);// ID5 语音口令读A读取A相脉冲电平asr.addASRCommand(51,du bi);// ID6 语音口令读B读取B相脉冲电平// 上电默认C0输出高电平电机刹车线拉地开机电机锁死停止保障安全eunihiker.setGpioState(eC0,eHIGH);}//// loop() 主循环函数初始化完成后无限循环运行// 功能实时监听语音唤醒、识别语音指令执行电机控制/脉冲读取逻辑//voidloop(){// 语音唤醒判断检测是否识别到唤醒词【你好小新】if(asr.isWakeUp()){// 唤醒成功画布第6行输出红色提示文字k10.canvas-canvasText(已唤醒行空板.......,6,0xFF0000);// 将画布缓存内容刷新到实体LCD屏幕k10.canvas-updateCanvas();}else{// 未唤醒待机状态第4行输出蓝色文字提示用户唤醒关键词k10.canvas-canvasText(唤醒词为“你好小新”,4,0x0000FF);k10.canvas-updateCanvas();}// 语音指令1qi dong 启动电机if(asr.isDetectCmdID(01)){// 全屏居中24号黑色大字显示状态// 参数X坐标、Y坐标、文字颜色、字体、字号、自动换行开关k10.canvas-canvasText(电机启动,0,180,0x000000,k10.canvas-eCNAndENFont24,50,true);k10.canvas-updateCanvas();// C0输出低电平电机刹车线悬空解除刹车电机允许运转eunihiker.setGpioState(eC0,eLOW);}// 语音指令2ting zhi 停止电机if(asr.isDetectCmdID(11)){k10.canvas-canvasText(电机停止,0,180,0x000000,k10.canvas-eCNAndENFont24,50,true);k10.canvas-updateCanvas();// C0输出高电平刹车线接地电机短接线圈急停锁死eunihiker.setGpioState(eC0,eHIGH);}// 语音指令3zheng zhuan 电机正转if(asr.isDetectCmdID(21)){k10.canvas-canvasText(电机正转,0,180,0x000000,k10.canvas-eCNAndENFont24,50,true);k10.canvas-updateCanvas();// C1高电平电机方向线悬空执行正向旋转eunihiker.setGpioState(eC1,eHIGH);}// 语音指令4fan zhuan 电机反转if(asr.isDetectCmdID(31)){k10.canvas-canvasText(电机反转,0,180,0x000000,k10.canvas-eCNAndENFont24,50,true);k10.canvas-updateCanvas();// C1低电平电机方向线接负极执行反向旋转eunihiker.setGpioState(eC1,eLOW);}// 语音指令5du ai 读取A相脉冲电平if(asr.isDetectCmdID(41)){// eunihiker.getvalue(eC2, eReadGpio)读取C2引脚A相当前数字电平高/低// String()拼接文字与电平数值在屏幕大字打印A相实时状态k10.canvas-canvasText((String(读取电机A相)String((eunihiker.getvalue(eC2,eReadGpio)))),0,180,0x000000,k10.canvas-eCNAndENFont24,50,true);k10.canvas-updateCanvas();}// 语音指令6du bi 读取B相脉冲电平if(asr.isDetectCmdID(51)){// 读取C3引脚B相实时电平屏幕打印B相状态k10.canvas-canvasText((String(读取电机B相)String((eunihiker.getvalue(eC3,eReadGpio)))),0,180,0x000000,k10.canvas-eCNAndENFont24,50,true);k10.canvas-updateCanvas();}// 清空画布第6行及下方所有文字清除上一轮状态文字防止画面重叠残影k10.canvas-canvasClear(6);}代码解读一、项目整体功能本程序使用行空板 K10 离线 ASR 语音识别 I2C IO 扩展板实现两大功能语音控制 12V 内置驱动无刷减速电机启动、停止、正转、反转语音读取电机 AB 两相霍尔脉冲实时电平语音口令 “读 A” 查看 A 相、“读 B” 查看 B 相唤醒固定口令你好小新。二、头文件与硬件对象解析#includeasr.h#includeunihiker_k10.h#includeDFRobot_UnihikerExpansion.hasr.h离线语音库提供唤醒检测、自定义语音指令注册识别unihiker_k10.h行空板底层库负责 LCD 屏幕、画布绘制DFRobot_UnihikerExpansion.hI2C 扩展 IO 驱动拓展多路 GPIO同时支持数字输出、数字输入读取脉冲。UNIHIKER_K10 k10;ASR asr;DFRobot_UnihikerExpansion_I2Ceunihiker(Wire);uint8_tscreen_dir2;k10行空板主控实例操作屏幕asr语音识别实例处理麦克风收音eunihikerI2C 扩展板对象绑定硬件默认 I2C 总线screen_dir2屏幕倒置显示。三、setup () 上电初始化函数仅执行 1 次k10.begin();初始化行空板全部硬件总线、外设资源。asr.asrInit(CONTINUOUS,CN_MODE,12000);while(asr._asrState0){delay(100);}开启持续中文语音识别12000 中等抗噪灵敏度循环等待语音模块加载模型完成硬件就绪后才往下执行。while(!eunihiker.begin()){delay(1000);}循环检测 I2C 扩展板通信硬件未连接则每秒重试一次防止找不到扩展板程序卡死。引脚模式配置核心硬件分配eunihiker.setMode(eC0,eWriteGpio);// C0输出电机刹车控制线黄线k10.initScreen(screen_dir);k10.creatCanvas();eunihiker.setMode(eC1,eWriteGpio);// C1输出电机方向控制线蓝线eunihiker.setMode(eC2,eReadGpio);// C2输入电机A相脉冲青线eunihiker.setMode(eC3,eReadGpio);// C3输入电机B相脉冲棕线eWriteGpio引脚设为数字输出输出高低电平控制电机eReadGpio引脚设为数字输入读取 AB 两相脉冲电平。注册 6 条语音指令拼音匹配asr.addASRCommand(01,qi dong);// ID1 启动电机asr.addASRCommand(11,ting zhi);// ID2 停止电机asr.addASRCommand(21,zheng zhuan);// ID3 正转asr.addASRCommand(31,fan zhuan);// ID4 反转asr.addASRCommand(41,du ai);// ID5 读A相脉冲电平asr.addASRCommand(51,du bi);// ID6 读B相脉冲电平eunihiker.setGpioState(eC0,eHIGH);上电默认 C0 高电平刹车线接地电机开机锁死停止保障安全。四、loop () 无限循环主程序唤醒状态检测if(asr.isWakeUp()){k10.canvas-canvasText(已唤醒行空板.......,6,0xFF0000);k10.canvas-updateCanvas();}else{k10.canvas-canvasText(唤醒词为“你好小新”,4,0x0000FF);k10.canvas-updateCanvas();}识别到唤醒词屏幕第 6 行红色文字提示唤醒未唤醒蓝色文字提示唤醒口令updateCanvas() 将画布内容刷新到实体屏幕。2. 电机启停控制逻辑qi dong 启动C0 输出低电平刹车线悬空解除刹车电机允许转动屏幕大字显示 “电机启动”。ting zhi 停止C0 输出高电平刹车线接地电机线圈短接急停锁死屏幕显示 “电机停止”。3. 电机转向控制逻辑zheng zhuan 正转C1 高电平电机方向线悬空正向旋转fan zhuan 反转C1 低电平电机方向线接地反向旋转。4. AB 相脉冲读取指令新增功能// 读A相k10.canvas-canvasText((String(读取电机A相)String((eunihiker.getvalue(eC2,eReadGpio)))),...);// 读B相k10.canvas-canvasText((String(读取电机B相)String((eunihiker.getvalue(eC3,eReadGpio)))),...);eunihiker.getvalue(eCx, eReadGpio)读取输入引脚当前瞬时电平高 / 低语音说出 “读 A / 读 B”屏幕实时打印此刻 A/B 相脉冲高低电平直观观察脉冲信号变化。5. 屏幕清理k10.canvas-canvasClear(6);清空第 6 行及下方所有文字清除上一轮状态避免新旧文字重叠残影。五、硬件接线对应表关键要求电机 12V 黑线电源负极必须和行空板、扩展板 GND 共地否则脉冲读取失效。六、完整运行流程设备上电初始化主板、语音模块、I2C 扩展板配置控制引脚输出、脉冲引脚输入电机默认刹车停止录入 6 条语音控制口令麦克风持续监听唤醒词 “你好小新”唤醒后语音下达指令启动 / 停止控制电机刹车正转 / 反转切换电机旋转方向读 A / 读 B屏幕显示当前 AB 脉冲瞬时电平自动清空屏幕文字循环等待下一条语音指令。Mind图形编程实验场景图与视频记录当中电机未按约定启动实验待续…