因创客协会招新和培养下一届需要,出一期arduino通过蓝牙控制实验室总线机器人的教程。
我的接线是:
TX —-> RX
RX —-> TX
GND —-> GND
VCC —> VCCarduinoUNOR3的硬件UART串口不够,所以我用D2D3引脚去模拟串口。
蓝牙的接线是:
RX —-> D2(模拟成TX)
TX —-> D3(模拟成RX)
接下来下载总线舵机给我们的官方资料:
链接:https://pan.baidu.com/s/1HnlANEti1_5fHmakhyOfRg
提取码:498t
从资料里面安装上位机软件
安装完上位机软件后,打开软件,只留下数字从1到6的六个舵机,然后拖到与我们机器人实际对应的位置(利于记录动作组和编程)
接着用USB线连接机器人,然后打开电池电源,如果连接上了机器人,右上角的有线连接会变成绿色(我们实验室没买无线连接的)。
如果没连接上可以检查一下CH340是否连接,或者检查一下线是否接好接稳了(实验室的机器人多半线是出问题了,因为太多人接线编程机器人了)
连接上机器人之后,我们就可以对机器人进行动作组的编程了。这个上位机的功能还是非常强大的,编程动作组的方式也挺多的,挑我会的讲。。。
方法一:经典添加法
直接移动舵机块,成功连接上的话,你移动这个块,机器人也会跟着动,其值从0–1000可填。
我们拖动之后,再点击添加动作,然后再动,再添加,以此类推,就可以形成动作组了
形成动作组之后,可以点击更新动作,在线运行去看一下你编的动作,没问题之后,可以点击保存动作文件保存下来(怕失误就多保存一下,保存是个好习惯T.T)
方法二:暴力掰法
点击手掰编程,然后机器人就会掉电了,还是硬的就别硬掰,会坏掉,他自动掉电之后,就可以用手掰编程了,我们编一个动作按一下RUN,或者它自动保存这个动作,保存完之后,点击角度回读,你掰的动作就会以刚刚的添加法的形式加出来了,然后点击下载就行了。
多下载,多调试,多尝试,你就已经会了总线机器人的一大半了。
接下来就是跟着手册操作了(实际上花里胡哨的,很难看懂,大概看看就好。)
打开通信协议看通讯协议的第二个指令,他的意思是说,要想和机器人通讯,得线先发两个0x55(帧头)给我,然后再发数据长度,接着才是控制动作组的指令0x06,然后才输出控制参数(编号,运行次数)
根据手册得出代码:
然后我们过去,机器人执行完之后,会返回我们arduino
0x55
,我们就可以用来判断动作是否完成了
为了便于理解,这里给出米思齐的全部程序代码截图:
转换成arduino IDE代码编程:
死循环控制机器人执行固定动作:
/*******************************发送指令的相当于操作**************************************/
int ZTLJ;//帧头累加
boolean ZXWB;//执行完毕
void wait() //等待动作完成
{while (!ZXWB) {
if (Serial.available() > 0) {
if (0x55 == Serial.read()) {
ZTLJ = ZTLJ + 1;
if (ZTLJ == 4) {
ZTLJ = 0;
ZXWB = true;
}}}
}
}
void DZZ(int bianhao, int cishu) //动作组 入口参数是编号和次数
{
ZXWB = false;
Serial.write(0x55);
Serial.write(0x55);
Serial.write(0x05);
Serial.write(0x06);
Serial.write(bianhao);
Serial.write(cishu);
Serial.write(0x00);
wait();//等待动作完成
}
/***************************************************************************/
void setup() //初始化设置
{
Serial.begin(9600); //串口初始化波特率9600
ZTLJ = 0; //帧头累加 = 0
ZXWB = false; //执行完毕 为 假
}
void loop() //死循环运行
{
DZZ(0,1); //发送动作0,执行1次
DZZ(1,1); //发送动作1,执行1次
DZZ(2,1); //发送动作2,执行1次
DZZ(3,5); //发送动作3,执行5次!!!
DZZ(4,1);
DZZ(5,1);
}
蓝牙控制代码例程(仅供参考):
#include <SoftwareSerial.h> //载入模拟串口的库函数
SoftwareSerial mySerial(3,2); //设置蓝牙的模拟串口为RX3 TX2 并使他名字为mySerial
String shuju =""; //设置一个字符串用来存储蓝牙接收的数据
int falg1=0; //设置个标志位来确定我们读完了数据
/*******************************发送指令的相当于操作**************************************/
int ZTLJ;//帧头累加
boolean ZXWB;//执行完毕
void wait() //等待动作完成
{while (!ZXWB) {
if (Serial.available() > 0) {
if (0x55 == Serial.read()) {
ZTLJ = ZTLJ + 1;
if (ZTLJ == 4) {
ZTLJ = 0;
ZXWB = true;
}}}
}
}
void DZZ(int bianhao, int cishu) //动作组 入口参数是编号和次数
{
ZXWB = false;
Serial.write(0x55);
Serial.write(0x55);
Serial.write(0x05);
Serial.write(0x06);
Serial.write(bianhao);
Serial.write(cishu);
Serial.write(0x00);
wait();//等待动作完成
}
/***************************************************************************/
void setup() //初始化设置
{
Serial.begin(9600); //串口初始化波特率9600
mySerial.begin(9600);//模拟串口波特率初始化为9600 模拟串口不宜太高
ZTLJ = 0; //帧头累加 = 0
ZXWB = false; //执行完毕 为 假
}
void loop() //死循环运行
{
while(mySerial.available()>0)//如果模拟串口(蓝牙)有数据可读
{
shuju+=char(mySerial.read());
delay(2);
falg1=1;
}
if(falg1=1)
{
if(shuju=="0")
{
DZZ(0,1); //发送动作0,执行1次
}
if(shuju=="1")
{
DZZ(1,1); //发送动作0,执行1次
}
if(shuju=="2")
{
DZZ(2,1); //发送动作0,执行1次
}
shuju=""; //串口数据清零
falg1=0; //标志位清零
}
}