全向HCR机器人移动平台

全向HCR(280px)

目录

1 简介
2 产品规格
3 驱动电机技术参数
4 装箱清单
5 可选配件清单
6 教程
7 全向移动HCR示例代码
8 疑难解答
9 更多

简介
HCR全向版机器人平台在继承了HCR的强大功能和扩展性的同时,由于全向轮的加入,使本平台更加的灵活。任意方向、任意角度的直接移动和旋转,让运行路线和监控角度自由灵活。
同时,全向HCR平台底部周围配备了6个红外线测距模块安装位置、6个跌落传感器安装位置、中部周围一圈配备了8个多功能模块安装位置,可根据自己的需求安装超声波或者红外线,甚至机械手。只要你有想法,你可以让你的全向HCR变身成仓库的搬运工;也可以让你的全向HCR 成为一个灵活的家庭监控机器人,它会巧妙的判断和躲开障碍物;它甚至还可以端着饮料乖巧的跟着你散步,等着你挥手后将饮料递给你。只要你有想法,全向HCR就是你实现想法的最佳平台。

注:
1、本套件以散件形式提供,需用户自行组装。
2、本套件基础版包含所有的结构件、螺丝包、开关、插座及安装推荐方案所用到的全部零配件(如螺丝、铜柱、电源导线等,详情见装箱清单)。
3、说明书及我们的技术文档中提供了我们推荐的可选配置方案的安装说明,用户可根据自己的情况来决定购买可选配件。

产品规格
结构:铝合金4+1层结构
组装后尺寸:31cmX31cmX60cm
承重:10kg
驱动电机数量 :3个
驱动轮数量 :3个
驱动轮尺寸  : 直径100mm
URM04超声波模块安装位 :6个
GP2Y0A21红外测距模块安装位 :12个
防跌落模块安装位 :6个
kinect安装位 :1个
舵机安装位 :4个
PC机安装位 :2个

驱动电机技术参数
齿轮齿数比:90:1
自由运行速度:12V:122 rpm
自由运行电流:12V:0.35A
额定转矩:12V:8.7 kg*cm
编码器分辨率:64CPR(驱动器轴)5760CPR(变压箱轴)
重量:205g
码盘电源电压:5-24v
电机线序
红色:电机正极
黑色:电机负极
绿色:编码器负极
蓝色:编码器正极
黄色:A相输出
白色:B相输出

装箱清单

全向HCR装箱清单 序号 名称 编号 单位 数量

1

底板

A1

1

2

电机支架

A2

1

3

12V直流减速电机

A3

3

4

金属全向轮

A4

3

5

红外支架

A5

6

6

控制层板

A6

1

7

3M魔术贴(20cm)

A7

1

8

弹力绳(50cm)

A8

1

9

电源开关

A9

1

10

复位开关

A10

1

11

插座

A11

1

12

12cm立柱

A12

6

13

中层板

A13

1

14

侧板

A14

2

15

模块安装架

A15

2

16

模块安装板

A16

4

17

舵机安装板

A17

2

18

顶板2

A18

1

19

9cm立柱

A19

1

20

顶板1

A20

1

21

19cm立柱

A21

2

22

28.25cm立柱

A22

2

23

kinect支架1

A23

1

24

kinect支架2

A24

1

25

M3×6圆头螺钉

B1

72

26

M4×10内6角螺钉

B2

96

27

M4螺帽

B3

3

28

M5×12圆头螺钉

B4

8

29

M6×12内6角螺钉

B5

12

30

M6平垫

B6

12

31

M6弹垫

B7

12

32

M6螺帽

B8

12

33

M3×20双通铜柱

B9

4

34

M3×6单通铜柱

B10

12

35

M3螺帽

B11

22

36

M3尼龙垫片

B12

8

37

M3×22圆头螺钉

B13

10

38

备用导线

Z1

1.5

39

内6角扳手

Z2

1

40

开口扳手

Z3

1

41

小号两用螺丝刀

Z4

1

可选配件清单

可选配件清单 序号 名称 编号 单位 数量

1

双路15A大功率电机驱动

C1

1

2

DC-DC模块

C2

1

3

GP2Y0A21距离传感器

C3

6

4

数字防跌落传感器

C4

6

5

14.8V、10A锂电池(带2A充电器)

C5

1

6

bluno Mega1280控制器

C6

1

7

MEGA传感器扩展板V2.4

C7

1

8

USB/RS232/RS485/TTL协议转换器

C8

1

9

URM04 V2.0超声波测距模块

C9

6

10

直径20mm胶圈

C10

12

11

Veyron 威龙双路12A电机驱动

C11

2

教程
点击下载全向HCR中英文说明书
推荐方案的硬件连线图:

接线图
底层传感器序号
顶层传感器序号
全向移动HCR示例代码
系统初始化及主函数

#include "MsTimer2.h"

#define DeviceAddress 0x11//设备地址

/系统相关变量/
#define DropSensor0 28//跌落传感器引脚
#define DropSensor1 29
#define DropSensor2 30
#define DropSensor3 31
#define DropSensor4 32
#define DropSensor5 33
#define ON_OFF 27//模式控制引脚。HIGH->自动避障模式;LOW->蓝牙手柄遥控模式
int Counter_1ms=0,Counter_1ms_Last=0;//定时计数器
boolean Running=false;//正在运动
int Drop_counter=0;//跌落传感器动作计数器
int AutoRun_HandControl_counter=0;//自动运行或手动控制计数器、标志
int Last_trigger_Sensor[3]={12,12,12};//上一次触发传感器编号

void setup(void)//系统初始化
{
for(byte i=4;i<=9;i++)//电机控制引脚初始化为输出模式
pinMode(i, OUTPUT);
pinMode(DropSensor0, INPUT); //设置跌落传感器引脚为输入模式
pinMode(DropSensor1, INPUT);
pinMode(DropSensor2, INPUT);
pinMode(DropSensor3, INPUT);
pinMode(DropSensor4, INPUT);
pinMode(DropSensor5, INPUT);

pinMode (IR_Distance0, INPUT);//设置红外测距传感器引脚为输入模式
pinMode (IR_Distance1, INPUT);
pinMode (IR_Distance2, INPUT);
pinMode (IR_Distance3, INPUT);
pinMode (IR_Distance4, INPUT);
pinMode (IR_Distance5, INPUT);

pinMode (ON_OFF, INPUT);//设置模式控制引脚为输入模式

Serial3.begin(19200);//设置串口3波特率为19200bps
Serial.begin(19200);//设置串口0波特率为19200bps
Serial.println("System running......");
digitalWrite(M1_PWM,LOW);//初始为停机状态
digitalWrite(M2_PWM,LOW);
digitalWrite(M3_PWM,LOW);

MsTimer2::set(1, Timer_1ms); //1ms软定时器中断入口
MsTimer2::start();//启动定时器

counter=0;
WillReceiveCNT=11;
for(byte i=0;i<34;i++)
DigitalKey[i]=0;
for(byte i=0;i<16;i++)
AnalogKey[i]=0;
}

void loop(void)
{
Drop();//判断跌落传感器是否动作
get_KEY();//接收串口数据
Keys_function_output();//按键功能输出
Get_URM4Distance();//超声波测距
Get_IRDistance();//红外测距

if(AutoRun_HandControl_counter==0&&Drop_counter==0)
AutoRun();//自动运行
else if(Drop_counter==200)//跌落传感器动作
stop();//停机
}

部分无线手柄接收演示程序
程序功能:解析从蓝牙4.0无线手柄传来的按键个数与按键键值,为进一步手柄控制做准备。

/蓝牙手柄相关变量/
int counter=0;//记录蓝牙手柄发来的数据个数
int incomingByte[30];//用于存储蓝牙手柄发来的数据
int WillReceiveCNT=11;//预计将要接收的数据最小个数
boolean ReceivingFlag=false;//正在接收
boolean ReceiveOK=false;//接收完毕
int Timer_1frame_ms=0;//1帧数据接收时间
int Timeout=0;//接收超时
uint8_t DigitalKey[34];//数字按键寄存器
uint8_t AnalogKey[16];//模拟按键寄存器

/蓝牙手柄相关函数/
void Get_KEY(void);//解析从蓝牙4.0无线手柄传来的按键个数与按键键值

void Get_KEY(void)//接收来自蓝牙手柄的数据,解析相应的按键值,详见“http://wiki.dfrobot.com.cn/index.php/(SKU:DFR0304)BLE_Wireless_Gamepad无线手柄”
{
if(Serial.available())//
{
if(ReceivingFlag==false)//若正处于准备接收中
{
ReceivingFlag=true;//启动一帧接收
Timer_1frame_ms=10;//设置一帧接收时间为10ms
counter=0;//复位数据个数计数器
}
incomingByte[counter] = Serial.read();//读取数据
//Serial.println(incomingByte[counter],DEC);

  counter++;//计数器自加
  if(incomingByte[0]==0x55)//帧头
    {
      if(counter&gt;1)
        if(incomingByte[1]==0xaa)//帧头
          {
            if(counter&gt;2)
              if(incomingByte[2]==DeviceAddress)//设备地址
                {
                  if(counter&gt;3)
                    {
                      if(counter==4)
                        WillReceiveCNT=incomingByte[3]+10;//将要接收的数据个数,详见“http://wiki.dfrobot.com.cn/index.php/(SKU:DFR0304)BLE_Wireless_Gamepad无线手柄”
                      if(counter==WillReceiveCNT)
                        {
                          int Sum=0;
                          for(int i=0;i&lt;WillReceiveCNT-1;i++)
                            {
                               Sum+=incomingByte[i];//数据累加
                            }
                          if(incomingByte[counter-1]==Sum%256)//和校验
                            {
                              ReceiveOK=true;//接收成功标志置位
                              Timeout=400;//400ms未接收到有效帧,则停止运转。
                              //for(int i=0;i&lt;counter;i++)
                              //  Serial.println(incomingByte[i],DEC);
                              Serial.println(&quot;Received OK&quot;);//打印接收成功标志
                            }
                          else
                           {
                              for(int i=0;i&lt;11;i++)
                                  {
                                     incomingByte[i]=0; 
                                  } 
                              ReceiveOK=false;
                              ReceivingFlag=false;//启动下一帧接收
                              counter=0;//复位数据计数器
                           } 
                        }
                    }
                }
          }
    }
  else
    {
      for(byte i=0;i&lt;11;i++)
          {
             incomingByte[i]=0; 
          } 
      ReceivingFlag=true;//启动一帧接收
      counter=0;//复位数据计数器
    }
}

}

部分电机驱动演示程序
程序功能:通过获到的速度和方向值来控制3个直流电机的运动速度和运动方向。

/电机驱动相关变量/
int M1_EN = 4; //M1_PWM Speed Control
int M2_EN = 5; //M2_PWM Speed Control
int M3_EN = 6; //M3_PWM Speed Control
int M1_PWM = 7; //M1_PWM Run/Stop Control
int M2_PWM = 8; //M2_PWM Run/Stop Control
int M3_PWM = 9; //M3_PWM Run/Stop Control
#define zero_speed 127//127时速度为0
float Move_Direction=0,Move_Direction_Last=0;//相对1号轮子的角度
float Direction_increment=0;//出现原路返回时角度的增量,保证不原路返回
float Move_Speed;//运动速度,范围0-127
int delta_change_degree=90;//自动避障模式下,单次方向角度改变量

/电机驱动相关函数/
void stop(void);//带刹车功能停机
void MotorDrive(void);//给3个直流电机输出对应关系的速度和方向PWM信号
void Turn_Left_Right (char a,char b,char c);//原地顺时针和原地逆时针旋转

void stop(void)//停止运动
{
Move_Speed=0;
Move_Direction=0;
for(byte i=0;i<34;i++)//复位键值
DigitalKey[i]=0;
if(Running==true)//刹车
{
analogWrite(M1_EN,zero_speed);
digitalWrite(M1_PWM,HIGH);
analogWrite(M2_EN,zero_speed);
digitalWrite(M2_PWM,HIGH);
analogWrite(M3_EN,zero_speed);
digitalWrite(M3_PWM,HIGH);
delay(10000);
}
Running=false;
analogWrite(M1_EN,zero_speed);
digitalWrite(M1_PWM,LOW);
analogWrite(M2_EN,zero_speed);
digitalWrite(M2_PWM,LOW);
analogWrite(M3_EN,zero_speed);
digitalWrite(M3_PWM,LOW);
}
void MotorDrive(float Speed,float Direction)
{
float Speed_1=0,Speed_2=0,Speed_3=0;

Speed_1=Speedsin((Direction- 0 -90)PI/180);
Speed_2=Speedsin((Direction-120-90)PI/180);
Speed_3=Speedsin((Direction-240-90)PI/180);

Speed_1 = constrain(Speed_1, -127, 127);
Speed_2 = constrain(Speed_2, -127, 127);
Speed_3 = constrain(Speed_3, -127, 127);

analogWrite (M1_EN,zero_speed+Speed_1);//(zero_speed+Speed_1)在127时速度为0,在0和255时速度最高
digitalWrite(M1_PWM,HIGH);
analogWrite (M2_EN,zero_speed+Speed_2);
digitalWrite(M2_PWM,HIGH);
analogWrite (M3_EN,zero_speed+Speed_3);
digitalWrite(M3_PWM,HIGH);
}
void Turn_Left_Right (char a,char b,char c)
{
analogWrite (M1_EN,a);
digitalWrite(M1_PWM,HIGH);
analogWrite (M2_EN,b);
digitalWrite(M2_PWM,HIGH);
analogWrite (M3_EN,c);
digitalWrite(M3_PWM,HIGH);
}

部分红外测距演示程序
程序功能:获取6个红外测距传感器测量到的距离值。

/红外测距相关变量/
#define IR_Distance0 A6//红外测距传感器引脚
#define IR_Distance1 A7
#define IR_Distance2 A8
#define IR_Distance3 A9
#define IR_Distance4 A10
#define IR_Distance5 A11

int IR_Distance_AD_Data[6]={0,0,0,0,0,0};//红外传感器AD值寄存器
int IR_Distance_Data[6]={0,0,0,0,0,0};
int Default_IR_degree[6]={150-36,150+36,270-36,270+36,30-36,30+36};//各个红外测距传感器与坐标0度角度差

void getDistance_gp2d12 (void);//获取6个红外测距传感器测量到的距离值

void getDistance_gp2d12 (void)
{
IR_Distance_AD_Data[

部分超声波测距演示程序
程序功能:分时触发和获取6个超声波测距传感器测量到的距离值。

/超声测距相关变量/
#define startAddr 0x20//超声传感器起始地址
#define CommMAXRetry 40//超声数据接收超时等待次数
#define URM4Account 6//超声传感器个数

int URM4_Distance_Data[URM4Account];//超声距离值寄存器
int Ultrasonic_Counter_Last=0;//超声命令间隔标志
int Get_URM4_counter0=0,Get_URM4_counter1=0;//超声触发/读取循环计数器
byte cmdst[10]={0x55,0xaa,0,0,0,0,0,0,0,0};//超声命令寄存器
boolean Get_Over = true;//循环读取结束标志

void URM_Init();//初始化
void URM4Trigger(int id);//触发超声波传感器测量
void URM4Reader(int id);//读取超声波传感器距离值
void transmitCommands();//发送命令
void decodeURM4(void);//接收来自对应串口的超声传感器数据
void analyzeURM4Data(byte cmd[]);//计算实际的距离值

void URM_Init()
{
Serial3.begin(19200);//设置串口3波特率为19200bps
}
void URM4Trigger(int id)//触发超声波传感器测量
{
cmdst[2] = id;
cmdst[3] = 0x00;
cmdst[4] = 0x01;
transmitCommands();
}
void URM4Reader(int id)//读取超声波传感器距离值
{
cmdst[2] = id;
cmdst[3]=0x00;
cmdst[4]=0x02;
transmitCommands();
}

void transmitCommands()//发送命令
{
cmdst[5]=cmdst[

void decodeURM4(void)//接收来自对应串口的超声传感器数据
{
if(Serial3.available())
{
unsigned long timerPoint = millis();
int RetryCounter = 0;
byte cmdrd[10];
for(int i = 0 ;i < 10; i++)
cmdrd[i] = 0;
int i=0;

boolean flag = true;
boolean valid = false;
byte headerNo = 0;

while(RetryCounter &lt; CommMAXRetry &amp;&amp; flag)
{
  if(Serial3.available())
  {
    cmdrd[i]= Serial3.read();
    //Serial.println (cmdrd[i],DEC);
    if(i &gt; 7)
    {
      flag=false;
      Serial3.flush();
      Serial.println (&quot;Receive error.&quot;);
      break;
    }
    if(cmdrd[i] == 0xAA)
    {
      headerNo = i;
      valid = true;
    }
    if(valid &amp;&amp; i == headerNo + 6)
    {
      flag = false;
      break;
    }
    i ++;
    RetryCounter = 0;
  }
  else
  {
    RetryCounter++;
    delayMicroseconds(15);
  }
}

if(valid)  
  analyzeURM4Data(cmdrd);
else 
  Serial.println(&quot;Receive error..........&quot;);  //Get an invalid error command

}
}

void analyzeURM4Data(byte cmd[])//计算实际的距离值
{
byte sumCheck = 0;
for(int h = 0;h < 7; h ++)
{
sumCheck += cmd[h];
}
if(sumCheck == cmd[7] && cmd[3] == 2 && cmd[4] == 2)
{
byte id = cmd[2] - startAddr;
URM4_Distance_Data[id] = cmd[5] * 256 + cmd[6];
if(cmd[5]==0xff)
URM4_Distance_Data[id]=500;
// Serial.print (id,HEX);
// Serial.print (" Distance = ");
// Serial.println (URM4_Distance_Data[id],DEC);
Get_Over=true;//读取超声距离结束,切数据正常
}
else if(cmd[3] == 2 && cmd[4] == 2)
{
Serial.println ("Sum error!");
Get_Over=true;//读取超声距离结束,只是数据不正确而已
}
}

疑难解答

问 1:暂无

答:

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖!

更多

Shopping car.png [Link ]
|}

标签: Arduino传感器