机器谱

【R214】轮式机械臂小车

作者:机器谱

图文展示3264(1)

图文展示3264(1)

副标题

概述
循迹搬运
蓝牙遥控搬运
语音控制

1. 运动功能说明

      214号样机是一款搭载了机械臂的双轮小车。它的底盘具备基本的行驶和原地转向功能,机械臂具备抬升、放下、抓取等功能。整体上可以实现抓取、搬运、码放等功能,可作为搬运机器人、排爆机器人等的模型使用。

2. 结构说明

       214号样机的底盘是一个 023号样机 ,机械臂包含2个串联的 关节模组 和1个 舵机夹爪模组

3. 运动功能实现

     本样机的运动功能相当于是把底盘、关节、夹爪的动作进行组合实现。


3.1 电子硬件

在这个示例中,我们采用了以下硬件,请大家参考:

主控板Basra(兼容Arduino Uno)
扩展板Bigfish2.1
电池7.4V锂电池


/*------------------------------------------------------------------------------------

  版权说明:Copyright 2022 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

           Distributed under MIT license.See file LICENSE for detail or copy at

           https://opensource.org/licenses/MIT

           by 机器谱 2022-9-14 https://www.robotway.com/

  ------------------------------

  实验功能: 小车前进→机械臂下落→夹爪闭合→机械臂抬起→小车后退→夹爪张开

  -----------------------------------------------------

  实验接线:

机械爪:D4

腕部(连接机械爪)舵机:D7

底部舵机:D11

左轮:D9,D10

右轮:D5,D6。                                     

------------------------------------------------------------------------------------*/

#include <Servo.h>


int SERVO_SPEED=20;                                        //定义舵机转动快慢的时间

int ACTION_DELAY=200;                                      //定义所有舵机每个状态时间间隔


Servo myServo[6];


int f = 50;                                                     //定义舵机每个状态间转动的次数,以此来确定每个舵机每次转动的角度

int servo_port[6] = {4,7,11,3,8,12};                            //定义舵机引脚

int servo_num = sizeof(servo_port) / sizeof(servo_port[0]);     //定义舵机数量

float value_init[6] = {125, 130, 160, 30, 60, 120};                //定义舵机初始角度


void setup() {

  Serial.begin(9600);

  pinMode(5, OUTPUT);

  pinMode(6, OUTPUT);

  pinMode(9, OUTPUT);

  pinMode(10, OUTPUT);

  for(int i=0;i<servo_num;i++){

    ServoGo(i,value_init[i]);

  }

}


void loop() {

  /*

  servo_move(90, 130, 15, 70, 10, 150);

  servo_move(90, 90, 90, 36, 110, 75);

  servo_move(90, 130, 140, 132, 44, 16);

  servo_move(90, 90, 90, 36, 110, 75);

  while(1){

    f = 20;

    SERVO_SPEED = 20;

    servo_move(120, 90, 90, 70, 10, 150);

    servo_move(90, 90, 90, 70, 10, 150);

  };

  */

  //实现了定点多角度抓取、放置的动作

  digitalWrite(5, HIGH);

  digitalWrite(6, LOW);

  digitalWrite(9, HIGH);

  digitalWrite(10, LOW);

  delay(1000);

  digitalWrite(5, LOW);

  digitalWrite(6, LOW);

  digitalWrite(9, LOW);

  digitalWrite(10, LOW);

  delay(1000);

  servo_move(125, 70, 70, 30, 60, 120);

  delay(500);

  servo_move(98, 70, 70, 30, 60, 120);

  delay(500);

  servo_move(98, 160, 160, 30, 60, 120);

  delay(500);

  digitalWrite(5, LOW);

  digitalWrite(6, HIGH);

  digitalWrite(9, LOW);

  digitalWrite(10, HIGH);

  delay(1000);

  digitalWrite(5, LOW);

  digitalWrite(6, LOW);

  digitalWrite(9, LOW);

  digitalWrite(10, LOW);

  delay(1000);

  servo_move(125, 160, 160, 30, 60, 120);

  delay(500);

  while(true);

}


void ServoStart(int which)

{

  if(!myServo[which].attached())myServo[which].attach(servo_port[which]);

  pinMode(servo_port[which], OUTPUT);

}




void ServoStop(int which)

{

  myServo[which].detach();

  digitalWrite(servo_port[which],LOW);

}


void ServoGo(int which , int where)

{

  if(where!=200)

  {

    if(where==201) ServoStop(which);

    else

    {

      ServoStart(which);

      myServo[which].write(where);

    }

  }

}


void servo_move(float value0, float value1, float value2, float value3, float value4, float value5)

{

 

  float value_arguments[] = {value0, value1, value2, value3, value4, value5};

  float value_delta[servo_num];

 

  for(int i=0;i<servo_num;i++)

  {

    value_delta[i] = (value_arguments[i] - value_init[i]) / f;


    /**************************串口查看输出*****************************/

//    Serial.print(value_init[i]);

//    Serial.print(" ");

//    Serial.print(value_arguments[i]);

//    Serial.print(" ");

//    Serial.println(value_delta[i]);

    /**************************串口查看输出*****************************/

  }

 

  for(int i=0;i<f;i++)

  {

    for(int k=0;k<servo_num;k++)

    {

      value_init[k] = value_delta[k] == 0 ? value_arguments[k] : value_init[k] + value_delta[k];


      /**************************串口查看输出*****************************/

//      Serial.print(value_init[k]);

//      Serial.print(" ");

    }

//    Serial.println();

      /**************************串口查看输出*****************************/

   

    for(int j=0;j<servo_num;j++)

    {

      ServoGo(j,value_init[j]);

    }

    delay(SERVO_SPEED);

  }

  delay(ACTION_DELAY);

 

  /**************************串口查看输出*****************************/

//   for(int i=0;i<6;i++)

//   {

//    Serial.println(value_init[i]);

//   }

  /**************************串口查看输出*****************************/

 

}

3.2 编写程序

编程环境:Arduino 1.8.19

编写并烧录以下代码(Servo_Sync_Se.ino):

4. 扩展样机

     可以通过更换底盘、增加机械臂数量、改变机械臂安装位置、增加或减少机械臂的关节数量来对样机进行扩展。






















5. 资料清单

序号

内容
1

214号样机3D文件

2214号样机例程源代码


概述
文件下载
【整体打包】-【214】轮式机械臂小车-概述-资料附件.zip
6.78MB下载25次下载
上一页 1 下一页

1. 任务描述

      本实验中机器人(214f)将通过完成将工作区外的工件搬运至工作区的任务,来模拟机器人的搬运过程。机器人首先需要通过循迹找到未存放在工作区内的工件,然后利用机械爪将工件夹起并保持工件处于加持状态(距离地面1cm以上),最后将工件搬运至工作区即算完成任务。

循迹搬运

工件和场地如下图所示:

2. 电子硬件

    在这个示例中,我们采用了以下硬件,请大家参考:

主控板Basra(兼容Arduino Uno)
扩展板Bigfish2.1
传感器灰度×2
电池7.4V锂电池


/*********************************************************************

  版权说明:Copyright 2022 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

           Distributed under MIT license.See file LICENSE for detail or copy at

           https://opensource.org/licenses/MIT

           by 机器谱 2022-10-20 https://www.robotway.com/

***************************   实验接线 ******************************

左侧车轮接6/10端口;右侧车轮接5/9端口;

关节模块的舵机线连接到D11端口,机械爪的舵机线连接到D12端口

******************************************************************/


#include <Servo.h>


Servo servo_pin_12;

Servo servo_pin_11;


void grab();

void trun_left();

void forward();

void putdown();

void go_putdown();

void carstop();

void trun_right();

void brake();


void setup()

{

  pinMode( 18, INPUT);

  pinMode( 14, INPUT);

  pinMode( 10, OUTPUT);

  pinMode( 6, OUTPUT);

  pinMode( 5, OUTPUT);

  pinMode( 9, OUTPUT);

  servo_pin_12.attach(12);

  servo_pin_11.attach(11);

  servo_pin_12.write( 91 );


  servo_pin_11.write( 145 );


  delay( 1500 );


}


void loop()

{

  if (!( digitalRead(18) ))

  {

    if (!( digitalRead(14) ))

    {

      brake();

      grab();

      go_putdown();

    }

    else

    {

      trun_right();

    }

  }

  else

  {

    if (!( digitalRead(14) ))

    {

      trun_left();

    }

    else

    {

      forward();

    }

  }

}


void go_putdown()

{

  forward();

  delay( 500 );

  carstop();

  delay( 1000 );

  putdown();

  while ( true )

  {

    carstop();

  }


}


void trun_right()

{

  analogWrite(6 , 80);

  analogWrite(10 , 0);

  analogWrite(5 , 0);

  analogWrite(9 , 80);

}


void forward()

{

  analogWrite(6 , 80);

  analogWrite(10 , 0);

  analogWrite(5 , 80);

  analogWrite(9 , 0);

}


void carstop()

{

  analogWrite(6 , 0);

  analogWrite(10 , 0);

  analogWrite(5 , 0);

  analogWrite(9 , 0);

}


void trun_left()

{

  analogWrite(6 , 0);

  analogWrite(10 , 80);

  analogWrite(5 , 80);

  analogWrite(9 , 0);

}


void grab()

{

  servo_pin_12.write( 50 );

  delay( 1000 );

  servo_pin_11.write( 110 );

  delay( 1000 );

}


void brake()

{

  analogWrite(6 , 100);

  analogWrite(10 , 100);

  analogWrite(5 , 100);

  analogWrite(9 , 100);

  delay( 500 );

}


void putdown()

{

  servo_pin_11.write( 145 );

  delay( 1000 );

  servo_pin_12.write( 91 );

  delay( 1000 );

}

3. 示例程序

流程图:

编程环境:Arduino 1.8.19

例程代码(214f_porterage.ino)如下:

4. 资料清单

序号

内容
1

214号样机-循迹搬运-例程源代码

2工件3D文件


文件下载
【整体打包】-【214】轮式机械臂小车-循迹搬运-资料附件.zip
63.58KB下载3次下载
上一页 1 下一页
蓝牙遥控搬运

1. 功能描述

      本文提供的示例所实现的功能为:用手机APP遥控R214e号样机实现移动和搬运。

      通过手机APP遥控R214e号样机完成将工作区外的工件搬运至工作区的任务,来模拟机器人的搬运过程。首先手机遥控机器人找到未存放在工作区内的工件,然后利用机械爪将工件夹起并保持工件处于夹持状态,最后将工件搬运至工作区即算完成任务。

2. 所用样机

    R214e

3. 电子硬件

    在这个示例中,我们采用了以下硬件,请大家参考:

主控板Basra(兼容Arduino Uno)
扩展板Bigfish2.1
电池7.4V锂电池
通信

蓝牙串口模块


/*------------------------------------------------------------------------------------

  版权说明:Copyright 2022 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

           Distributed under MIT license.See file LICENSE for detail or copy at

           https://opensource.org/licenses/MIT

           by 机器谱 2022-10-26 https://www.robotway.com/

  ------------------------------

  实现功能: 从串口(蓝牙)接收字符,根据不同字符分别做出前进、原地左转、原地右转、夹爪打开、夹爪闭合、关节抬起、关节放下的动作。

  -----------------------------------------------------

  实验接线:

关节:D12

机械爪:D11

左轮:D5,D9

右轮:D10,D6。                                     

------------------------------------------------------------------------------------*/

#include <Servo.h>


int _ABVAR_1_data = 0 ;

Servo servo_pin_11;

Servo servo_pin_12;


void tai();

void zhua();

void stop();

void fang();

void jiang();

void turnright();

void turnleft();

void go();


void setup()

{

  pinMode( 10, OUTPUT);

  pinMode( 6, OUTPUT);

  pinMode( 5, OUTPUT);

  pinMode( 9, OUTPUT);

  Serial.begin(9600);

  servo_pin_11.attach(11);

  servo_pin_12.attach(12);

}


void loop()

{

  _ABVAR_1_data = Serial.parseInt() ;

  if (( ( _ABVAR_1_data ) == ( 1 ) ))

  {

    go();

  }

  if (( ( _ABVAR_1_data ) == ( 3 ) ))

  {

    turnright();

  }

  if (( ( _ABVAR_1_data ) == ( 4 ) ))

  {

    turnleft();

  }

  if (( ( _ABVAR_1_data ) == ( 5 ) ))

  {

    stop();

  }

  if (( ( _ABVAR_1_data ) == ( 6 ) ))

  {

    zhua();

  }

  if (( ( _ABVAR_1_data ) == ( 7 ) ))

  {

    fang();

  }

  if (( ( _ABVAR_1_data ) == ( 8 ) ))

  {

    tai();

  }

  if (( ( _ABVAR_1_data ) == ( 9 ) ))

  {

    jiang();

  }

}


void zhua()

{

  servo_pin_11.write( 63 );

}


void fang()

{

  servo_pin_11.write( 80 );

}


void go()

{

  analogWrite(5 , 80);

  analogWrite(9 , 0);

  analogWrite(6 , 80);

  analogWrite(10 , 0);

}


void jiang()

{

  servo_pin_12.write( 75 );

}


void turnleft()

{

  analogWrite(5 , 0);

  analogWrite(9 , 0);

  analogWrite(6 , 80);

  analogWrite(10 , 0);

}


void turnright()

{

  analogWrite(5 , 80);

  analogWrite(9 , 0);

  analogWrite(6 , 0);

  analogWrite(10 , 0);

}


void tai()

{

  servo_pin_12.write( 30 );

}


void stop()

{

  analogWrite(5 , 255);

  analogWrite(9 , 255);

  analogWrite(6 , 255);

  analogWrite(10 , 255);

}

      为样机安装好电子模块,将关节模块的舵机线连接到D12端口,机械爪的舵机线连接到D11端口。SH-01扩展板的直流电机接口组合是5/9,6/10,分别接左侧车轮电机和右侧车轮电机。

4. 示例程序

编程环境:Arduino 1.8.19

程序通过使用if语句来判断读取到的串口的不同字符值来匹配不同的动作,从而实现对机器人的远程控制。

接收到“1”的时候,执行前进;

接收到“3”的时候,执行左转;

接收到“4”的时候,执行右转;

接收到“5”的时候,执行停止;

接收到“6”的时候,机械爪闭合;

接收到“7”的时候,机械爪张开;

接收到“8”的时候,机械臂抬起;

接收到“9”的时候,机械臂放下;

手机APP的键值按上述规则进行配置,配置方法请参考蓝牙串口模块

例程代码(R214e_Bluetooth_RC.ino)如下:

5.资料清单

序号

内容
1

R214e-蓝牙遥控例程源代码

2蓝牙串口助手(新版)


文件下载
【整体打包】-【R214】轮式机械臂小车-蓝牙控制搬运-资料附件.zip
1.3MB下载2次下载
上一页 1 下一页

语音控制

1. 功能说明

      本文实例将实现语音控制R214e样机动(前进、后退、左转、右转、拿起、放下)的功能。

2. 电子硬件

      在这个示例中,我们采用了以下硬件,请大家参考:

主控板

Basra主控板(兼容Arduino Uno)

扩展板

Bigfish2.1扩展板

传感器

语音识别模块

电池7.4V锂电池


电路连接:

      ① 小车左轮电机连到Bigfish扩展板的D9,D10接口;小车右轮电机连到Bigfish扩展板的D5,D6

      ② 将语音识别模块HBR640连接到Bigfish扩展板的扩展坞上

      ③ 将关节模块的舵机线连接到Bigfish扩展板的D11端口上

      ④ 将机械爪的舵机线连接到Bigfish扩展板的D12端口上

3. 功能实现

   编程环境:Arduino 1.8.19

   实现思路:语音命令机器人前进、后退、左转、右转、拿起、放下。

3.1 配置语音库

   步骤1:将文末资料中的\语音识别模块HBR640文件夹拷贝至本机位置。

   步骤2:语音HBR640模块更改为“配置模式”,并用一个USB线将主控板连接至电脑上,将下图中的空程序烧录至主控板中

             (注意:在烧录程序的时候,语音识别HBR640要从扩展板的扩展坞上拔下来)

步骤3:打开\语音识别模块HBR640\4 开发工具\HBR640开发工具SRTool.exe(如下图所示)

步骤4:先新建一个“HBR640对话工程”文件夹,然后在软件中点击“新建”,选择“HBR640对话工程”文件夹后,再创建一个文件名“che”,

           点击“保存”

步骤5:在下图中的“未命名”区增加机器人分组。

步骤6:在下图所示位置添加前进命令,然后点击“增加”按钮,即可将前进命令添加至左侧的词条列表中。

步骤7:在下图所示位置再添加“后退”命令,然后点击“增加”按钮,即可将“后退”命令添加至左侧的词条列表中。

步骤8:按照步骤6、步骤7的方式依次再分别添加左转右转拿起放下命令至左侧的词条列表中。

步骤9:点击“保存词条”

步骤10:点击“生成”按钮。

步骤11:选择端口号,并点击“连接”,显示连接成功即可(这里以端口号COM17为例)

步骤12:点击“烧录”并选择“全部”。在烧录过程中尽量不要移动主控板,显示烧录成功即可。

步骤13:点击“测试”按钮,会在左侧的词条列表下面出现“候选命令”区。

步骤14:对着语音识别模块分别说出刚刚编辑的命令“后退”、“前进”、“左转”、“右转”、“拿起”、“放下”时,会在候选命令区出现

             对应的识别结果。

步骤15:测试成功后,点击“停止”按钮,并“断开”连接,此时语音库即已配置完成。

3.2 示例程序

     将机器人语音控制程序ohmygod.ino)下载到主控板,实验效果可参考演示视频。

/*------------------------------------------------------------------------------------

  版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

           Distributed under MIT license.See file LICENSE for detail or copy at

           https://opensource.org/licenses/MIT

           by 机器谱 2023-04-23 https://www.robotway.com/

  ------------------------------*/

/*******************************************************************************************************

实现功能:

          用语音640实现语音小车;


实现思路:

          将语音640安装好后,如果接收到命令为“前进”,小车前进1秒后停止;如果接收到命令为“后退”,小车

          后退1秒后停止;如果接收到命令为“左转”,小车左转1秒后停止;如果接收到命令为“右转”,小车右转

          1秒后停止;如果接收到命令为“拿起”,机械爪抓取物体;如果接收到命令为“放下”,机械爪释放物体


实验接线:

          小车左轮接到D9,D10;

          小车右轮接到D5,D6;

          语音640模块接到扩展板的扩展坞上;

*******************************************************************************************************/

#include<ServoTimer2.h>;

ServoTimer2 servo_arm12;

ServoTimer2 servo_leg11;

#define servo_catch 63

#define servo_release 80

#define servo_up 30

#define servo_down 70

#include "HBR640.h" //语音640需要的函数库

#define DelayTime 1000//小车执行相关动作的时间;

HBR640 hbr640;      //实例化一个语音识别模块

void setup(){

  hbr640.open(); //开始进行语音识别

  pinMode( 5 , OUTPUT);

  pinMode( 6 , OUTPUT);

  pinMode( 9 , OUTPUT);

  pinMode( 10 , OUTPUT);//将直流电机设置为输出模式;

  servo_arm12.attach(12);

  servo_arm12.write(map(servo_release,0,180,500,2500));

  servo_leg11.attach(11);

  servo_leg11.write(map(servo_down,0,180,500,2500));

}


void loop(){

  if(hbr640.isHeard()) //如果监测到识别语句

  {

    int value = hbr640.getSentence(); //获得识别语句的序号

    switch (value)

   {

    case 0x00: MotorMode(1,DelayTime); hbr640.open();break;//如果接收到命令为“前进”,小车前进1秒后停止;

    case 0x01: MotorMode(2,DelayTime); hbr640.open();break;//如果接收到命令为“后退”,小车后退1秒后停止;

    case 0x02: MotorMode(3,DelayTime); hbr640.open();break;//如果接收到命令为“左转”,小车左转1秒后停止;

    case 0x03: MotorMode(4,DelayTime); hbr640.open();break;//如果接收到命令为“右转”,小车右转1秒后停止;

    case 0x04: down();delay(1000);Catch();delay(1000);up ();delay(1000); hbr640.open();break;//如果接收到命令为“拿起”,机械爪抓取物体

    case 0x05: down();delay(1000);Release(); delay(1000);up ();delay(1000);hbr640.open();break;//如果接收到命令为“放下”,机械爪释放物体

    default:   break;

    }     

  }

}


void Catch()//拿起

{

  servo_arm12.write(map(servo_catch,0,180,500,2500));

}

void up ()//拿起

{

  servo_leg11.write(map(servo_up,0,180,500,2500));

}


void Release()//放下

{

  servo_arm12.write(map(servo_release,0,180,500,2500));

}

void down()//放下

{

  servo_leg11.write(map(servo_down,0,180,500,2500));

}


void MotorMode(int mode,int t) //直流电机模式;

{

  switch(mode)

  {

     case 1: Forward(t); break;

     case 2: Back(t); break;     

     case 3: Left(t); break;

     case 4: Right(t); break;   

     case 5: Stop(t); break;   

  }

}

void Forward(int t) //前进

{

   digitalWrite(5,LOW);digitalWrite(6,LOW);

  digitalWrite(10,HIGH);digitalWrite(9,HIGH);

   delay(t); Stop(2);  

}


void Back(int t)    //后退

{

   digitalWrite(10,LOW);digitalWrite(9,LOW);

   digitalWrite(5,HIGH);digitalWrite(6,HIGH);

   delay(t);   Stop(2);

}


void Left(int t)   //左转

{

   digitalWrite(5,HIGH);digitalWrite(6,LOW);

   digitalWrite(9,LOW);digitalWrite(10,HIGH);

   delay(t); Stop(2);

}


void Right(int t)   //右转

{

   digitalWrite(5,LOW);digitalWrite(6,HIGH);

   digitalWrite(10,LOW);digitalWrite(9,HIGH);

   delay(t); Stop(2);

}


void Stop(int t)   //停止

{

    digitalWrite(5,HIGH);digitalWrite(6,HIGH);

    digitalWrite(9,HIGH);digitalWrite(10,HIGH);

    delay(t);  

}


void serialEvent() //程序会自动调用该程序;

{

    hbr640.lisen(); //在串口接收事件中调用语音识别的监听指令

}

观察语音控制效果(注意:将语音识别HBR640模块更改为运行模式)。


4. 资料清单

序号

内容
1

【R214】-语音控制-例程源代码

2【R214】-语音控制-样机3D文件
3语音识别模块HBR640


文件下载
【整体打包】-【R214】轮式机械臂小车-语音控制-资料附件.zip
10.17MB下载5次下载
上一页 1 下一页
© 2024 机器时代(北京)科技有限公司  版权所有
机器谱——机器人共享方案网站
学习  开发  设计  应用