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 机械臂