履带加伸缩机械手机器人

2016-04-019.1万
精华项目
AI 快速预览详细 收起
履带加伸缩机械手机器人是一个结合了履带移动平台和3D打印伸缩臂的项目。主要材料包括DFRobot Romeo BLE多合一控制器、L298N双路H桥电机驱动、金属夹持器等。通过GoBLE软件控制小车移动、机械臂升降及伸缩。该项目适用于STEM教育和青少年科创比赛,能够锻炼学生的动手能力和编程技能。


视频展示



材料
1. Romeo BLE多合一控制器  (DFR0305)
2. L298N双路H桥电机驱动  (DRI0002)
3. 金属夹持器  (ROB0099)
4. Devastator履带机器人移动平台(ROB0112)
5. 全方位蜂巢云台  (ROB0114)
6. 云台舵机支架套件  (FIT0004)
7. 7.4V 2200MA 锂电池  (FIT0137)
8. 180度舵机(SER0020) x2
9. 螺纹电机 6V100rpm
10. 3D打印伸缩臂


简介
履带加伸缩机械手机器人图1
创客喜欢用自己的双手进行创作,但有没有想过让自己做的机器人同样拥有动手能力呢?在这个项目里我打算把履带小车结合夹持器做一个有抓取功能的小车。由于装在小车上方难以抓到地面上的东西,因此还需要给小车增加伸缩的功能。我们使用3D打印机打印一个可以伸缩的支架,并找了一个可以配合的螺纹电机来实现伸缩功能。


这个机器人还是个比较粗略的原型,希望由此可以发展出更精密并且也容易制作的机械爪机器人。



制作流程

组装过程:
1.3D打印机打印伸缩臂的零件,并用螺丝组装起来。另外还打印螺纹电机的支架,把螺纹电机和伸缩臂组装起来。(模型在最后附上)
2.将蜂巢云台装在履带机器人上。
3.在云台上使用舵机支架套件来安装一个舵机。
4.把螺纹电机装在舵机上。
5.把另一个舵机装在夹持器上,使它可以做抓取动作。
6.把夹持器的舵机固定到伸缩臂上。

使用下图进行连接:
履带加伸缩机械手机器人图2
M1 – 右轮电机
M2 – 左轮电机
数字13 – 电机驱动E1
数字12 – 电机驱动M1
数字9 – 机械臂抬起/降落舵机
数字8 – 夹持器舵机


Vin – 电机驱动VD
GND – 电机驱动GND
电机驱动M1 – 螺纹电机
电池控制板电源
电池电机驱动VSGND


代码
  1. #include <Servo.h>
  2. #include <Metro.h>
  3. #include "GoBLE.h"
  4. int speedPin_M1 = 5;     //电机1速度控制 M1 Speed Control
  5. int speedPin_M2 = 6;     //电机2速度控制 M2 Speed Control
  6. int directionPin_M1 = 4;     //电机1方向控制 M1 Direction Control
  7. int directionPin_M2 = 7;     //电机2方向控制 M1 Direction Control
  8. int E1 = 13;
  9. int M1 = 12;
  10. int tGo = 13000;
  11. int tBack = 13000;
  12. int tCatch = 2000;
  13. int tRelease = 2000;
  14. bool catched = false;
  15. Servo claw; //claw platform servo
  16. Servo top; //上层舵机 top servo
  17. int clawPosition = 45; // 45 ~ 100
  18. int topPosition = 45; //45 ~ 155
  19. int recordPin = 11;
  20. int playPin = 10;
  21. int joystickX, joystickY;
  22. int buttonState[5];
  23. bool leftPressed = false;
  24. bool rightPressed = false;
  25. bool clawMoved = false;
  26. void setup() {
  27.   Goble.begin(); //启动GoBLE
  28.   Serial.begin(115200);
  29.   top.attach(9);         // Top Servo– Digital 9
  30.   claw.attach(8);        // claw Servo - Digital 8
  31.   top.write(topPosition);   //写入起始角度
  32.   claw.write(clawPosition);  //写入起始角度
  33.   pinMode(11, OUTPUT);
  34.   pinMode(12, OUTPUT);
  35.   pinMode(10, OUTPUT);
  36.   digitalWrite(10, LOW);
  37.   digitalWrite(11, LOW);
  38.   digitalWrite(12, LOW);
  39.   pinMode(13, OUTPUT);
  40.   digitalWrite(13, HIGH);
  41.   analogWrite(E1, 0);
  42. }
  43. void loop() {
  44.   if (Goble.available()) {
  45.     joystickX = Goble.readJoystickX();
  46.     joystickY = Goble.readJoystickY();
  47.     buttonState[SWITCH_UP]     = Goble.readSwitchUp();
  48.     buttonState[SWITCH_DOWN]   = Goble.readSwitchDown();
  49.     buttonState[SWITCH_LEFT]   = Goble.readSwitchLeft();
  50.     buttonState[SWITCH_RIGHT]  = Goble.readSwitchRight();
  51.     //    Serial.print("Joystick Value: ");
  52.     //    Serial.print(joystickX);
  53.     //    Serial.print("  ");
  54.     //    Serial.println(joystickY);
  55.     if (joystickY > 196) {
  56.       Serial.println("turn right");
  57.       carTurnRight(250, 250);
  58.     }
  59.     else if (joystickY < 64) {
  60.       Serial.println("turn left");
  61.       carTurnLeft(250, 250);
  62.     }
  63.     else if (joystickX > 196) {
  64.       Serial.println("move forward");
  65.       carAdvance(400, 400);
  66.     }
  67.     else if (joystickX < 64) {
  68.       Serial.println("move backward");
  69.       carBack(400, 400);
  70.     }
  71.     else {
  72.       carStop();
  73.     }
  74.     if (buttonState[SWITCH_LEFT] == PRESSED && buttonState[SWITCH_RIGHT] == PRESSED) {
  75.       analogWrite(E1, 0);
  76.       if (!clawMoved) {
  77.         if (clawPosition <= 45) {
  78.           clawPosition = 100;
  79.           claw.write(clawPosition);
  80.         }
  81.         else {
  82.           clawPosition = 45;
  83.           claw.write(clawPosition);
  84.         }
  85.         clawMoved = true;
  86.       }
  87.     }
  88.     else if (buttonState[SWITCH_LEFT] == PRESSED) {
  89.       digitalWrite(M1, LOW);
  90.       analogWrite(E1, 255);
  91.     }
  92.    
  93.     else if (buttonState[SWITCH_RIGHT] == PRESSED) {
  94.       digitalWrite(M1, HIGH);
  95.       analogWrite(E1, 255);
  96.     }
  97.     else if (buttonState[SWITCH_UP] == PRESSED) {
  98.       topPosition -= 5;
  99.       if (topPosition <= 45) {
  100.         topPosition = 45;
  101.       }
  102.       top.write(topPosition);
  103.     }
  104.     else if (buttonState[SWITCH_DOWN] == PRESSED) {
  105.       topPosition += 5;
  106.       if (topPosition >= 155) {
  107.         topPosition = 155;
  108.       }
  109.       top.write(topPosition);
  110.     }
  111.     if( buttonState[SWITCH_LEFT] == RELEASED && buttonState[SWITCH_RIGHT] == RELEASED){
  112.       analogWrite(E1, 0);
  113.     }
  114.    
  115.     if( buttonState[SWITCH_LEFT] == RELEASED || buttonState[SWITCH_RIGHT] == RELEASED){
  116.       clawMoved = false;
  117.     }
  118.   }
  119. }
  120. void carStop() {                //  Motor Stop
  121.   digitalWrite(speedPin_M2, 0);
  122.   digitalWrite(directionPin_M1, LOW);
  123.   digitalWrite(speedPin_M1, 0);
  124.   digitalWrite(directionPin_M2, LOW);
  125. }
  126. void carTurnLeft(int leftSpeed, int rightSpeed) {       //Turn Left
  127.     analogWrite (speedPin_M2, leftSpeed);
  128.   digitalWrite(directionPin_M1, LOW);
  129.   analogWrite (speedPin_M1, rightSpeed);
  130.   digitalWrite(directionPin_M2, LOW);
  131.   
  132. }
  133. void carTurnRight(int leftSpeed, int rightSpeed) {     //Turn Right
  134.   analogWrite (speedPin_M2, leftSpeed);
  135.   digitalWrite(directionPin_M1, HIGH);
  136.   analogWrite (speedPin_M1, rightSpeed);
  137.   digitalWrite(directionPin_M2, HIGH);
  138. }
  139. void carBack(int leftSpeed, int rightSpeed) {           //Move backward
  140.   analogWrite (speedPin_M2, leftSpeed);             //PWM Speed Control
  141.   digitalWrite(directionPin_M1, HIGH);
  142.   analogWrite (speedPin_M1, rightSpeed);
  143.   digitalWrite(directionPin_M2, LOW);
  144.   
  145.   
  146. }
  147. void carAdvance(int leftSpeed, int rightSpeed) {         //Move forward
  148.   analogWrite (speedPin_M2, leftSpeed);
  149.   digitalWrite(directionPin_M1, LOW);
  150.   analogWrite (speedPin_M1, rightSpeed);
  151.   digitalWrite(directionPin_M2, HIGH);
  152.   
  153.   
  154. }
复制代码



实际效果
小车可以用iOS系统的GoBLE软件控制。用左边的遥杆控制小车移动,右边的键控制机械臂升起降落以及伸缩,左右键同时按可以让夹持器夹持或松开。

注意事项
1.螺纹电机转速过慢,可以再尝试一下其它型号。
2.机械臂负重过多,会导致弯曲以及无法伸展。以后可以考虑修改构造把夹持器舵机放到后面。
3.组装时尽量把机械臂放在直立状态。
4.注意将电线和驱动固定,各个连接口打胶。


模型
下载附件伸缩臂模型.zip





创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(11)
IOHDHQ
IOHDHQ
这抖来抖去的能抓稳吗?
Amos Young
Amos Young
机械舞的灵感就是这么来的,抖啊抖
KkQ1VrB7W776
KkQ1VrB7W776
66666666666666666666666666666666666
20060606
20060606
系统有些抖
DFS1w2cb8o8
DFS1w2cb8o8
厉害厉害
DFSkangKjBr
DFSkangKjBr
学习中,希望自己能成功做出一个来!谢谢分享!
zhengx84
zhengx84
都这么高大上
iooops
iooops
语音识别 - - ?
楼主你好神奇……
dsweiliang
dsweiliang
一抖一抖的,很搞笑
hnyzcj
hnyzcj
楼主这个有点抖,哈哈
hnyzcj
hnyzcj
为什么每次总强在我前面
hnyzcj
hnyzcj回复丄帝De咗臂
在你面前我不敢说自己忙!
丄帝De咗臂
丄帝De咗臂回复hnyzcj
你是大忙人啊
- 没有更多了 -