【R231】斜三角履带机械臂小车
作者:机器谱
概述 WiFi遥控搬运 |
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 | 231号样机3D文件 |
2 | 231号样机例程源代码 |
【整体打包】-【231】斜三角履带机械臂小车-概述-资料附件.zip | 2.99MB | 下载28次 | 下载 |
WiFi遥控搬运
1. 功能描述
本文提供的示例所实现的功能为:用手机APP,通过WiFi通信遥控231b样机实现移动和搬运。
2. 电子硬件
在这个示例中,我们采用了以下硬件,请大家参考:
主控板 | Basra(兼容Arduino Uno) |
扩展板 | Bigfish2.1 |
电池 | 7.4V锂电池 |
通信 | WiFi无线路由器 |
2510通信转接板 |
/********************************************************************* 版权说明: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-28 https://www.robotway.com/ ************************* wifi protocol **************************** * ff 00 xx 00 ff Controlled robot motion,xx :00 ~ 04 xx: 00:Stop 01:Forward 02:Backword 03:Left 04:Right * ff 02 01 xx ff left speed slider, adjust speed, xx : 0 ~ 10 * ff 02 02 xx ff right speed slider, operate panel, xx : 0 ~ 10 参考:WIFI机器人网·机器人创意工作室上位机与下位机通信协议(V1.1版) http://www.wifi-robots.com/thread-7051-1-1.html *************************** main process ***************************** __________________________ | \ start - wait mode - infrared start - automode 60s \ \ | \ ------------------ wifi mode - wait 10s \____________________________________| *************************** servo motor ****************************** 引脚 角度 机械手爪 D3 打开:90 夹取:60 机械手臂 D4 抬起:90 放下:60 注:上述舵机角度为本套程序使用的,可根据需求修改。 ********************************************************************/ #include <Servo.h> Servo servoX; Servo servoY; bool dataComplete; bool isPanelOpen; bool isPanelDown; int ServoMotorOpenD3 = 90; //舵机角度 int ServoMotorCloseD3 = 60; int ServoMotorUpD4 = 90; int ServoMotorDownD4 = 60; int moveDirection; // 1-forward, 2-backward, 3-left, 4-right, 5-stop int inputData[4]; //data from wifi int GripperDireciton; // 0 - close, 10 - open int DownDireciton; // 0 - Down, 10 - Up void setup() { Serial.begin(9600); servoX.attach(3); servoY.attach(4); isPanelOpen = false; isPanelDown = false; GripperDireciton = 10; DownDireciton = 10; } void loop() { WiFi_Rescue_Robot(); } void WiFi_Rescue_Robot() { WifiControl(); Move(moveDirection); } void WifiControl() { //control by wifi if (dataComplete) //接收完 WiFi 数据后 { //operate wheel if(inputData[0] == 0x00) { if(inputData[1] != moveDirection) { moveDirection = inputData[1]; } } //speed slider else if(inputData[0] == 0x02) { //adjust speed if(inputData[1] == 0x01) { if(inputData[2] != DownDireciton) { DownDireciton = inputData[2]; if(DownDireciton == 0 && !isPanelDown) { servoY.write(ServoMotorDownD4); isPanelDown = true; } else if(DownDireciton == 10 && isPanelDown) { servoY.write(ServoMotorUpD4); isPanelDown = false; } } } //operate panel else if(inputData[1] == 0x02) { if(inputData[2] != GripperDireciton) { GripperDireciton = inputData[2]; if(GripperDireciton == 0 && !isPanelOpen) { servoX.write(ServoMotorCloseD3); isPanelOpen = true; } else if(GripperDireciton == 10 && isPanelOpen) { servoX.write(ServoMotorOpenD3); isPanelOpen = false; } } } } } } void serialEvent() { static int i; static boolean revStart; while (Serial.available()) { //get data from wifi int inData = Serial.read(); if (inData == 0xff && !revStart) { revStart = true; } else if(revStart) { inputData[i] = inData; i++; if(i > 3) { if(inputData[3] == 0xff) { dataComplete = true; i = 0; revStart = false; } else { i = 0; revStart = false; } } } } } void Move(int direction) { switch (direction) { case 0x01:MoveForward();break; case 0x02:MoveBackward();break; case 0x03:MoveLeft();break; case 0x04:MoveRight();break; case 0x05:MoveStop();break; default:MoveStop();break; } } void MoveForward() { //motor_0 clockwise digitalWrite(5, LOW); digitalWrite(6, HIGH); //motor_1 clockwise digitalWrite(9, LOW); digitalWrite(10, HIGH); } void MoveBackward() { //motor_0 clockwise digitalWrite(5, HIGH); digitalWrite(6, LOW); //motor_1 clockwise digitalWrite(9, HIGH); digitalWrite(10, LOW); } void MoveRight() { //motor_0 clockwise digitalWrite(5, HIGH); digitalWrite(6, LOW); //motor_1 clockwise digitalWrite(9, LOW); digitalWrite(10, HIGH); } void MoveLeft() { //motor_0 clockwise digitalWrite(5, LOW); digitalWrite(6, HIGH); //motor_1 clockwise digitalWrite(9, HIGH); digitalWrite(10, LOW); } void MoveStop() { //motor_0 clockwise digitalWrite(5, HIGH); digitalWrite(6, HIGH); //motor_1 clockwise digitalWrite(9, HIGH); digitalWrite(10, HIGH); } |
本部分及后面的APP设置内容,可与【U011】如何使用探索者通信模块-WiFi无线路由器一文对照阅读
为203号样机安装WiFi无线路由器和摄像头。
硬件连接步骤:
(1)在2510通信转接板的4针接口上,按如图方式插上3根杜邦线。
(2)杜邦线的另一端插接在WiFi模块的串口针上。
(3)连接USB线。
(4)将整套装置固定在样机上(注意:图中贴有黄色便条的MEGA2560主控板部分与本文所述功能无关,请忽略)。
3. 示例程序
编程环境:Arduino 1.8.19
手机APP的键值按上述规则进行配置,然后单片机接收到不同的信息,对应执行不同的动作。
例程代码(Rescue_Robot_Clear.ino)如下:
4. 安卓手机APP设置及操作
(1)安装WIFIRobot.apk到安卓手机内。
(2)打开主控板的开关启动设备,并使用手机连接GL-AR150-xxx(xxx为随机数字与字母)密码:goodlife
(3)打开“WIFIROBOTS”APP。
(4)选择设置(以V1.06版界面为例,你也可以安装其他版本,设置方法相同)
(5)按照下图所示进行参数配置,点击确定
(6)点击前后左右可以控制救援机器人运动,如下图。
(7)点击速度调整可以打开调整面板,如下图。
(8)滑动写有左侧速度的控件,将其调整为0,可以控制清障手臂向下运动,如下图。
(9)将左侧速度的控件,调整为10,可以控制清障手臂向上运动,如下图。
(10)将右侧速度的控件,调整为0,可以控制清障手臂夹取障碍物,如下图。
(11)将右侧速度的控件,调整为10,可以控制清障手臂松开障碍物,如下图。
5. 资料清单
序号 | 内容 |
1 | 231号样机-WiFi遥控搬运-例程 |
2 | WiFi无线路由器-安卓APK文件 |
【整体打包】-【231】斜三角履带机械臂小车-WiFi遥控搬运-资料附件.zip | 4.76MB | 下载5次 | 下载 |
|