查看: 13951|回复: 7

履带加伸缩机械手机器人

[复制链接]
本帖最后由 RichardFu 于 2016-4-1 14:59 编辑

视频展示



材料
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打印伸缩臂


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


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



制作流程

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

使用下图进行连接:
履带连线图.png
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 (228.66 KB, 下载次数: 35)

hnyzcj  超级版主

发表于 2016-4-1 15:43:53

为什么每次总强在我前面
回复 支持 反对

使用道具 举报

hnyzcj  超级版主

发表于 2016-4-1 15:46:32

楼主这个有点抖,哈哈
回复 支持 反对

使用道具 举报

dsweiliang  版主

发表于 2016-4-1 17:46:26

一抖一抖的,很搞笑
回复 支持 反对

使用道具 举报

iooops  版主

发表于 2016-4-1 21:42:07

语音识别 - - ?

楼主你好神奇……
回复 支持 反对

使用道具 举报

丄帝De咗臂  版主

发表于 2016-4-7 17:20:43

hnyzcj 发表于 2016-4-1 15:43
为什么每次总强在我前面

你是大忙人啊
回复 支持 反对

使用道具 举报

hnyzcj  超级版主

发表于 2016-4-7 17:33:31


在你面前我不敢说自己忙!
回复 支持 反对

使用道具 举报

zhengx84  见习技师

发表于 2016-6-12 16:11:36

都这么高大上
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
关于楼主
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2016 Comsenz Inc. Powered by Discuz! X3.4 Licensed

QQ