零、
一个核心问题:要驱动六足机器人,这里可分成动作组和控制组(可拓展通讯组)。
动作组只需要通过可视化软件【Zide】进行调试,调试好以后存储在寄存器中,当程序需要设备运动的时候,就可以通过串口指令直接调用相关的动作组,简单方便。
控制组要么直接利用厂家提供的上位机软件发送指令,要么二次拓展利用STM32、ARDUINO等单片机进行串口指令发送来控制。
文章目录
- 零、
- 一、控制板简介
- 二、控制板用什么供电?
- 三、PWM控制舵机
- 四、重点:进行二次开发
- 1.调用指令进行控制
- 2.官方上位机学习
- 总结
一、控制板简介
启灵者 ZL-IS2 24 路舵机控制板是一款图形化编程,用来控制动作组,和搭配其他单片机控制的控制板,IS2 解决了多舵机控制和图形化编辑动作组的相关问题,能够通过 ZIde 简单简单的对机器人动作组进行编程,可视化的动作组编程,比无法实时看到机器人运动的编程要更加准确,方便查看。
先看总览图:
【电源端子】:舵机和 CPU 共用一个电源,供电电压 5~8.4V,电源功率可根据舵机数量自行搭配,比如五六个舵机的时,额定电流要达到 3A 以上,十五六个舵机时额定电流要达到8A 以上电流,由于不是每个舵机都同时工作,所以舵机越多,电流增长的速度可以适当减小,比如当使用二十四个舵机时,电流 10A 左右就足够了。
【控制器开关】:开启-ON/关闭-OFF。
【USB 调试口】:主要用于和上位机通信使用,可调试动作组,配置控制器的手柄,红外遥控器等功能。
【执行按键】:在非编程模式下,短按执行按键一下(蜂鸣器响一声,编程灯慢闪)执行动作组一遍,长按执行按键(蜂鸣器响二声且不超过五秒,编程灯快闪)则循环执行动作组,
在执行的过程中按下执行按键则暂停执行,再次按下时则继续执行,长按执行按键(超过五秒,蜂鸣器长响一声)则清除已存储的动作组;在编程模式下按下执行按键则退出编程模式。
【编程按键】:在非执行模式下,长按编程按键(蜂鸣器响二声)则进入编程模式,此时编程灯亮起,在编程模式下按下编程按键则记录当前舵机状态一次,依次记录多组舵机状态时就可以形成一系列的动作;在编程模式下按下执行按键退出编程功能,编程灯灭掉。
【二次开发通讯接口】:即无线模块接口,用于接无线同步模块或者二次开发时作为通信串口使用。
【蓝牙接口】:主要接蓝牙模块配合小程序使用。
【蜂鸣器】:主要用在声响提示方面。
【红外接口】:可接入红外接收头,搭配红外遥控使用,可控制总线执行备,或者作为其他触发源使用。
【总线通信接口】:2 组黄色端子就是总线通信接口,主要接 Arduino 拓展板总线接口、总线 WIFI 等用于给控制器输入指令的设备。
【手柄接口】:可搭配 6P 线接入 PS2 手柄接收器,搭配手柄遥控使用,可控制总线执行设备,或者作为其他触发源使用。
【总线舵机接口】:6 组白色端子就是总线执行接口,主要接执行设备,如总线舵机,总线MP3、总线马达等总线设备,理论上每条线上可串联 255 个设备,由于线的承载能力,建议每条线上串联不超过 5 个设备为宜。
【PWM 舵机接口】:接 PWM 舵机使用,白针-信号接口、红针-舵机电源正极、黑针-舵机电源负极,一共可接 24 路 PWM 舵机。
【电源灯】:红色,通电之后红灯常亮。
【工作灯】:绿色,供上电源时,控制器正常工作,工作灯每 1S 闪烁一次,其他情况均为控制器异常。
【编程灯】:蓝色,在编程模式下时常亮,退出编程模式时熄灭,执行动作组一遍时慢闪,循环执行动作时快闪
二、控制板用什么供电?
如图,使用7.4V航模电池接稳压模块输入端,输出端输出5V左右电压给控制板来驱动舵机。
三、PWM控制舵机
PWM(脉宽调制)控制舵机是一种常见的控制方式,通过调节PWM信号的脉冲宽度来改变舵机的位置。具体步骤如下:
首先,选择一个支持PWM输出的控制板或微控制器。常见的有Arduino、Raspberry Pi等。
将舵机的信号线连接到控制板或微控制器的PWM输出引脚。
在代码中设置PWM输出的频率和脉冲宽度范围。频率一般为50Hz,脉冲宽度范围一般为1ms到2ms,其中1ms对应舵机的最小角度,2ms对应舵机的最大角度。
使用代码控制PWM输出引脚的脉冲宽度,来控制舵机的位置。一般来说,脉冲宽度的增加会使舵机逆时针旋转,脉冲宽度的减小会使舵机顺时针旋转。
具体原理我不过多说明,其实很简单,这个不是重点。
四、重点:进行二次开发
我的目的是使用STM32对舵机控制板发送串口指令控制机器人做动作组,这样的话,便可以基于stm32来拓展出更多的功能,不在受到舵机控制板的局限了。
可以看到,这里是用串口进行通信的。
1.调用指令进行控制
先来看官方给出的stm32和adruino的二次开发例程:
int main(void) {
rcc_init(); //主频设置72M
tb_usart_init(); //初始化串口
tb_interrupt_open(); //总中断打开
while(1) {
uart1_send_str((u8 *)"$DGT:0-4,1!"); //串口1 调用 0到4 动作,执行1次 其他命令参照控制器指令
zx_uart_send_str((u8 *)"$DGT:0-4,1!"); //总线口 调用 0到4 动作,执行1次 其他命令参照控制器指令
delay_ms(10000); //延时10秒
}
}
SoftwareSerial mySerial(A4,A5); //创建一个软串口的类,模拟引脚4,5分别代表 RX, TX引脚 AR多功能板
//SoftwareSerial mySerial(10,2); //创建一个软串口的类,模拟引脚4,5分别代表 RX, TX引脚 AR扩展版
void setup() {
Serial.begin(115200); //硬件串口
mySerial.begin(115200); //设置软串口波特率
}
void loop() {
Serial.print("$DGT:0-4,1!"); //串口1 调用 0到4 动作,执行1次 其他命令参照控制器指令
mySerial.print("$DGT:0-4,1!"); //总线口 调用 0到4 动作,执行1次 其他命令参照控制器指令
delay(10000); //延时10秒
}
可以看到,二者基本都是初始化了一个通信串口,然后发送了一个指令给舵机控制板,驱动舵机完成相应指令。阅读开发手册,可以找到指令集:
序号 | 舵机操作指令 | 指令解释 | 备注 |
1 | #IndexPpwmTtime! | 单个舵机指令,Index 为 3 位,000-254;pwm为 4 位,0500-2500;time 为 4 位,0000-9999,单位毫秒,总共 15 位数据,不足的位数补 0 | |
2 | {#000P1500T1000!#001P0900T1000!} | 多个舵机指令,将多个单舵机指令放在一起,用{}封起来即可 | |
3 | $DGS:0! | 调用动作 G0000,前提是动作 G0000 已经存储 | 重点 |
4 | $DGT:0-10,1! | 调用动作 G0000~G0010 组 1 次,若为 0 次则代表循环执行 | 重点 |
5 | $CGP:1-10! 获取动作 1~10 组,从 USB 打印出 | ||
6 | #005PSCK+010! | 设置 5 号舵机的偏差为 10,偏差最大绝对值 500 | |
7 | $DST! | 所有舵机停止在当前位置 | 重点 |
8 | $DST:x! | x 号舵机停止在当前位置 | 重点 |
9 | $DKT:1,5! | 执行组合组 1 动作组 5 次 | 重点 |
其实最主要要掌握第4条指令,即我们主控板串口发送这条指令,让某个动作组启动执行多少次。
2.官方上位机学习
既然动作组是可以用串口指令控制的,那么如何将动作组存储进舵机控制板的寄存器中就是一个比较重要的问题了。打开官方上位机Zide。
共有380种动作组,这里我以地快速前进为例:
可以看到,它对应编号为G00005-G00008,共四个舵机指令。
如果我想让低快速前进这个动作循环执行4次,也就是向前走4步时,便可以用串口发送如下指令:
uart1_send_str((u8 *)"$DGT:5-8,4!"); //串口1 调用 5到8 动作,执行4次 其他命令参照控制器指令
其他动作同理。这样就很好了,官方上位机把所有24路舵机的PWM电平该设置为多少都写好了,我们不用管,只需要去调用就完事了,对我而言,只需要前进、后退、左转、右转、掉头等等动作组,那后续进行二次开发时,我只需要注重STM32端的串口指令编写及下发即可。
总结
官方上位机十分的人性化,下一节我将开始编写STM32端的代码,这里最大的问题是:我需要将STM32用导线与舵机控制板连接,那么我如果想要远程控制发送特定指令时,该采取什么方式呢?很明显,要么蓝牙,要么wifi,要么用一个无线收发模块。