10680| 1
|
[项目] 32路舵机控制板与乐高蓝牙遥控车 |
图1 Arduino蓝牙遥控乐高机械手车实验全景图 上一篇文章《乐高8275科技套件B模型的Arduino电控改造》描述的是:我用标准舵机替换掉了乐高Technic电机,并用Arduino系统全电控了乐高8275机械手车,网址: https://www.eefocus.com/zhang700309/blog/12-07/281931_aa45c.html。前几天,花了一些功夫改装了一个乐高SET套件作品,写了一篇文章,如果就此拆掉这些积木,再换个作品继续用这些积木进行搭建,当然可以。但为免过于草率,我在想能否换些另外的电控,测试一下这些玩意的功效,也是蛮有意思的。所以这次我把遥控车接收器从Arduino控制器换成了32路舵机控制板。 其实32路舵机控制板也像Arduino控制板一样是个国际标准,并不是哪家公司所独有的技术,很多国内外的机器人配件公司和Arduino设备商都有类似的产品,下面一张图展示的是国外Lynxmotion公司和国内DFRobot的产品,它们都必备有动作存储器部件,区别是Lynxmotion公司的产品采用老式9针串行接口,而DFRobot公司的产品用的是USB接口,另外可以插装蓝牙和APC220无线模块,这样便于制作遥控作品。Lynxmotion公司网址:https://www.lynxmotion.com/。DFRobot公司网址:https://goo.gl/g4oQB。 图2 Lynxmotion公司和DFRobot的32路舵机控制板对照图 点击所有图片,都可以放大清晰观看。 由机器人专家Jim Frye领衔的Lynxmotion公司是国际知名的机器人套件生产商,可以在它的网站里看到很多COOL的机器人作品图片、视频以及有关机器人的资讯。下图是该公司在“SERVO” 杂志上的广告页,可以欣赏下,图中红色矩形框标注的是该公司的32路舵机控制板。我看了下图的时候,就想到我肯定不会花那多钱海淘这些套件去感受科技,自己用国内公司的32路舵机控制板,再从网路上很容易买到些舵机关节连接板,加上乐高零件,自己也应该能高仿下Lynxmotion公司的机器人套件。 图3 Lynxmotion公司在“SERVO” 杂志上的广告页 SERVO Magazine 是创办于2003年10月份的美国经典的机器人杂志,是由T&L Publications创办发行的月刊。它是面向最广大机器人爱好者的杂志,是百分之百的机器人实践专门杂志,里面的内容有专题文章、访谈、教程、DIY项目、黑客(创客)、零部件来源,还有更多分类。SERVO Magazine 网址:https://www.servomagazine.com/index.php。还有一本名为“Make”杂志,无线电杂志社已经把它翻译成简体中文,中文名为《爱上制作》,可以在当当网买到,“Make”杂志网址:https://makezine.com/。看到下面图片,感觉美国人玩得很开心,而且还没耽误工作。 图4 Servo杂志和Maker杂志 闲话不再说了,还是谈谈这篇文章的焦点,DFRobot公司的USB版32位舵机控制板吧。用上这个板子,我的乐高遥控车上的接收器从机,没有编写一行程序,只需遥控器主机发字符串命令,就可以控制小车完成规定动作。 实验视频: 我这篇文章的实验项目是用Arduino遥控主机来控制32路舵机控制板,然后舵机控制板再驱动遥控车两个轮子的舵机以及机械手舵机工作,所以对于舵机控制板,这次我只讲与这个实验项目有关的内容,更多关于这个板子的用法,我会在今后的文章中逐一介绍,也可以先看看它的说明书网页,https://wiki.dfrobot.com.cn/index.php?title=%E9%A6%96%E9%A1%B5。 我将从三个方面来讲解这个项目,1、32路舵机控制板的电源供给和跳线帽设置;2、舵机零速时PWM信号脉宽值的确定;3、遥控器主机的程序编制。 1、32路舵机控制板的电源供给和跳线帽设置 32路舵机控制板各端口分布和功能说明图: 图5 DF-USBSSC32控制板各端口分布和功能图 上图中标号1、9、10、11端口都可以供电,10号端口提供逻辑电源,我用9V方块电池供电,12号端口提供舵机电源,我用5节2400ma充电电池供电,“11 VL和VS1连通跳线帽”不插上(看上图),断开!,逻辑电源与舵机电源分开供电。由于不用电脑USB供电,所以“2 USB供电选择跳线帽”也不插上,断开!其他跳线帽都插上短接,蓝牙模块插在“16 无限数传接口”上。 实验项目采用Arduino遥控主机来控制这个32路舵机控制板,跳线帽设置和电源供给应如下图所示。注意:下图跳线帽部分如果是白色空白,说明没有插上跳线帽,如果是黑色矩形,说明插上了跳线帽短接。 图6 Arduino控制器和32路舵机控制板之间串口通讯时的跳线帽和电源设置 由于舵机电源不能超过6.8V,所以只能最多用5节充电电池,但我采用的是乐高Technic套件的电池盒供电,里面是装6节5号电池的,于是我用一个铁钉把一个电池位给短接了。图 7 乐高电池盒的电池位短接方法 32路舵机控制板的通信波特率,我设置为115200b/s,用通过” 7 拨码开关“来设置,把两个拨码开关都拨到ON端。如下图。 图8 舵机控制板上DIP拨码开关与波特率设置 2、舵机零速时PWM信号脉宽值的确定 舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由单片机发出PWM信号(脉宽调制信号)来控制舵机运行。PWM信号的周期为20ms,基准脉冲宽度为1500us,实际脉冲宽度范围从500us到2500us。如果是180度舵机,PWM信号脉冲宽度的范围就对应着舵机的转角范围从-90°到+90°,如果是360°旋转舵机,就对应着舵机的转速和转向,脉宽为500us,对应舵机以最高速度反转,脉宽为2500us,对应舵机以最高速度正转,如果脉宽为基准脉宽1500us,那转速为多少?应该为零速。但是即使360°舵机是一个厂家、一个批次的产品,当单片机发出脉宽为1500us的PWM信号时,这种舵机的转速可能也会偏离零速,所以需要PC机舵机控制软件来确定各个舵机应该发出脉宽为多少的PWM信号,才会使某一舵机速度为零。 要用舵机控制软件来确定舵机零速时的PWM信号脉宽值,首先要对32路舵机控制板的跳线帽进行设置,还要安装USB驱动软件。 图9 USB调试时的跳线帽和电源设置 如图9所示,连接USB电缆到控制板,将红圈1位置(标注接地符号的那个跳线帽)的跳线帽插到红圈2位置,即采用USB电源给控制板逻辑部分供电,舵机部分则还是采用乐高电池盒供电,并接到“12 VS1电源端子”,使用USB供电后红圈3要断开,“10 VL逻辑电源端子”的9V方块电池的电源也要断开!DIP拨码开关都拨到ON处,波特率选择为115.2Kb/s。乐高机械手车的右轮子和左轮子的舵机分别连在的5号和7号舵机端子上,机械手舵机连在3号舵机端子上。 USB驱动软件和舵机控制软件以及关于DF-USBSSC32控制板的全部资料我从厂家获取来,并打包成RAR文件,可以下载:https://115.com/file/dp42m70j#DF-USBSSC32资料.rar。 安装好驱动程序后,把舵机控制板上的蓝牙模块拿下来,再插到电脑USB接口上,在Windows操作系统的设备管理器里,可以看到自动生成的串口号是什么,我的电脑显示串口号为COM17。不同电脑产生的串口号可能不同,您就用自己操作时生成的串口号。 图10 舵机控制板的USB串口号生成 接着打开舵机控制软件 ,选择为串口号COM17,设置波特率为115200,点击“连接”按钮,然后调整我用红色矩形框标注的对应三个舵机速度的P3、P5、P7值,眼睛看看或者耳朵听听,到底设置为多少,舵机才不转动。这次实验项目连在3、5、7端子的舵机脉宽要分别微调至1510、1505和1500,三个舵机才一点也不转动。确定了零速脉宽值后,把它们记录下来,最后要填写到文章后面的遥控器主机程序相应程序行中,该程序行,我将用红色字体标注出来,最后点击“断开”按钮,释放COM17串口资源。 图11 用舵机控制软件调整舵机零速 另外,我把主从机的两个蓝牙模块的波特率都设置为115200b/s,至于蓝牙模块的参数设置,可见《乐高8275科技套件B模型的Arduino电控改造》,网址: https://www.eefocus.com/zhang700309/blog/12-07/281931_aa45c.html 。由于上篇文章里,蓝牙模块的波特率采用默认值,9600b/s,没必要用AT命令特别设置,但要把波特率改为115200b/s,需在SSCOM3.2串口助手软件的发送行输入AT命令“AT+ UART=115200,0,0 ”来设置,可以再输入“AT+ UART?”查询设置是否正确。如下图所示。 图12 蓝牙模块波特率参数设置 3、遥控器主机的程序编制 只有主机遥控器才需要编写程序,机械手车上的从机接收器由于使用了32路舵机控制板,不需要编写程序,舵机控制板接受到主机遥控命令后,会自动领会,并驱动舵机工作的。主机程序部分由于有详细的注释,就不累述了。注意:向Arduino控制器“写”程序前,先把蓝牙模块从控制器的TTL串行接口上拔下来,否则程序无法“写”入,“写”完程序后,再插上蓝牙模块。 主机遥控器程序任务是:采集遥控器的游戏杆扩展板上的PS摇杆和大拇指按键信息,处理后,通过蓝牙串口,向遥控车上的舵机控制板发送字符串控制命令,这些命令分别控制小车的前后左右行走、机械手抓取或松开物体。 [mw_shl_code=cpp,false]int JoyStick_X = 1; //游戏杆扩展板的PS摇杆X轴连在模拟端口1 int JoyStick_Y = 0; //游戏杆扩展板的PS摇杆Y轴连在模拟端口0 int button_Grab =3; //红色B按键连在数字端口3 int button_Release =4; //蓝色C按键连在数字端口4 //B按键控制遥控车机械手抓取物体 //C按键控制遥控车机械手松开物体 int B,C;//存储游戏杆扩展板的开关量按键的当前读取值 int x,y; //存储游戏杆扩展板的模拟量PS摇杆X,Y轴的当前读取值 //初始化 void setup() { //把游戏杆扩展板上B、C按键设置为开关量输入模式 pinMode(button_Grab, INPUT); pinMode(button_Release, INPUT); //启动串行通信 Serial.begin(115200);//设置串行通信的波特率 } //主程序 void loop() { x=analogRead(JoyStick_X);//读取PS摇杆X轴的模拟量信息 y=analogRead(JoyStick_Y);//读取PS摇杆Y轴的模拟量信息 //读取游戏杆扩展板上B、C按键“是否按下”的状态 B= digitalRead(button_Grab); C= digitalRead(button_Release); //如果PS摇杆Y轴向前摇动 if(y>812) { //向遥控车的舵机控制板发送小车前进命令 Serial.println("#5 P2500 #7 P500"); } //如果PS摇杆Y轴向后摇动 else if(y<212) { //向遥控车的舵机控制板发送小车后退命令 Serial.println("#5 P500 #7 P2500"); } //如果PS摇杆X轴向左摇动 else if(x>812) { //向遥控车的舵机控制板发送小车向左命令 Serial.println("#5 P500 #7 P500"); } //如果PS摇杆X轴向右摇动 else if(x<212) { //向遥控车的舵机控制板发送小车向右命令 Serial.println("#5 P2500 #7 P2500"); } //如果机械手B按键为按下状态,同时C按键为松开状态 else if((B ==LOW)&&(C==HIGH)) { //向遥控车的舵机控制板发送机械手“抓取”物体命令 Serial.println("#3 P2500"); } //如果机械手C按键为按下状态,同时B按键为松开状态 else if((C==LOW)&&(B==HIGH)) { //向遥控车的舵机控制板发送机械手“松开”物体命令 Serial.println("#3 P500"); } //否则 else { //向遥控车的舵机控制板发送所有舵机停转命令 Serial.println("#3 P1510 #5 P1505 #7 P1500"); } delay(200);//延时,等待数据发送成功 } [/mw_shl_code] 主机程序写入后,按照图6所示设置舵机控制板上跳线帽和电源供给,两个设置波特率的DIP拨码开关都拨到ON,主从机都插上蓝牙模块,就可以遥控乐高机械手车了。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed