基于arduino的幻尔总线机器人

  • Post author:
  • Post category:其他


因创客协会招新和培养下一届需要,出一期arduino通过蓝牙控制实验室总线机器人的教程。

在这里插入图片描述

我的接线是:

TX —-> RX

RX —-> TX

GND —-> GND

VCC —> VCC

arduinoUNOR3的硬件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;		//标志位清零

}

}



版权声明:本文为weixin_51102592原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。