1、硬件

    arduino uno r3 改进板、sg90舵机(180度 x 4)、JoyStick Shield PS2游戏摇杆扩展板(或者按键 遥杆模块)、3D打印件、M3螺丝螺母(10mm 15mm 25mm )以及M2螺丝螺母。

2、接线

        开发版使用DC口7V-12V 供电(只用usb(5v)供电口 舵机驱动不了,usb口和DC口可同时供电),舵机正负极并联后直接使用拓展版5v供电,舵机信号线按照代码依次接到D9、D10、D11、D12,对应开发板 9、10、11、12 IO口。

 3、代码

#include <Servo.h>

Servo servob, servot, servol, servor;  // 舵机对象 底座、夹子、小臂、大臂

int bpos = 0, tpos = 0, lpos = 0, rpos = 0;  // 舵机初始角度

int FirstShotX, FirstShotY;

// 舵机动作 num 舵机 1 底座 2 夹子 3 小臂 4 大臂  status true 正向
void action(int num, bool status) {
  int plus = 1;
  if (status != 1) plus = -1;
  switch (num) {
    case 1:
      if (status) bpos += 2;
      else bpos -= 2;
      if (bpos > 180) bpos = 180;
      else if (bpos < 0) bpos = 0;
      servob.write(bpos);
      Serial.println("底座:" + String(bpos));
      delay(5);
      break;
    case 2:
      if (status) tpos += 6;
      else tpos -= 6;
      if (tpos > 180) tpos = 180;
      else if (tpos < 0) tpos = 0;
      servot.write(tpos);
      Serial.println("夹子:" + String(tpos));
      delay(5);
      break;
    case 3:
      if (status) lpos += 2;
      else lpos -= 2;
      if (lpos > 180) lpos = 180;
      else if (lpos < 0) lpos = 0;
      servol.write(lpos);
      delay(8);
      Serial.println("小臂:" + String(lpos));
      break;
    case 4:
      if (status) rpos += 2;
      else rpos -= 2;
      if (rpos > 180) rpos = 180;
      else if (rpos < 0) rpos = 0;
      servor.write(rpos);
      Serial.println("大臂:" + String(rpos));
      delay(8);
      break;
  }
}

void setup() {
  Serial.begin(9600);
  servob.attach(9);
  servot.attach(10);
  servol.attach(11);
  servor.attach(12);

  servob.write(bpos);
  servot.write(tpos);
  servol.write(lpos);
  servor.write(rpos);
  for (int i = 0; i < 19; i++) {
    pinMode(i, INPUT);
    digitalWrite(i, 1);
  }
  FirstShotX = 0;
  FirstShotY = 0;
}

void loop() {
  for (int i = 2; i < 9; i++) {
    int someInt = digitalRead(i);
    if (someInt == 0) {
      switch (i) {
        case 2:
          Serial.print("--------> Button A ");
          action(2, true);
          break;
        case 3:
          Serial.print("--------> Button B ");
          action(1, false);
          break;
        case 4:
          Serial.print("--------> Button C ");
          action(2, false);
          break;
        case 5:
          Serial.print("--------> Button D ");
          action(1, true);
          break;
        case 6: Serial.print("--------> Button E "); break;
        case 7: Serial.print("--------> Button F "); break;
        case 8: Serial.print("--------> Button KEY "); break;
        default: break;
      }
    }
  }

  int sensorValue = analogRead(A0);
  if (FirstShotX == 0) {
    FirstShotX = sensorValue;
    Serial.print("FirstShotX = ");
    Serial.println(FirstShotX);
  }
  int x = sensorValue - FirstShotX;
  if (abs(x) > 20)
    action(3, x > 20);
  // Serial.print("X = ");
  // Serial.print(x);
  sensorValue = analogRead(A1);
  if (FirstShotY == 0) {
    FirstShotY = sensorValue;
    Serial.print("FirstShotY = ");
    Serial.println(FirstShotY);
  }
  int y = sensorValue - FirstShotY;
  if (abs(y) > 20)
    action(4, y > 20);
  // delay(10);
}

         代码只是实现了功能,遥杆控制机械臂的大臂、小臂,按键控制底座转动和夹子。舵机的移动得根据实际情况更改每次角度+-的大小调以及延时时间试出最合适的参数。还有就是舵机安装时初始角度都弄到0度安装到机械臂上。

ardunio 机械臂

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐