#include <Servo.h>
const int SERVOS = 4; //定義使用4個舵機
const int ACC = 10; // 閒置開始計數之前電位計值的精度
//定義使用到的陣列變數
int PIN[SERVOS], value[SERVOS], idle[SERVOS], currentAngle[SERVOS], MIN[SERVOS], MAX[SERVOS], INITANGLE[SERVOS], previousAngle[SERVOS], ANA[SERVOS];
Servo myservo[SERVOS]; //建立舵機物件
void setup() {
//各舵機的初始設定
//底部舵機
PIN[0] = 11; // 這個舵機接的pin
MIN[0] = 10; // 舵機角度最小值
MAX[0] = 179; // 舵機角度最大值
INITANGLE[0] = 90; // 啟動時舵機的預設位置
ANA[0] = 0; //搖桿接的pin
//左側舵機
PIN[1] = 10;
MIN[1] = 10;
MAX[1] = 115;
INITANGLE[1] = 90;
ANA[1] = 1;
//右側舵機
PIN[2] = 9;
MIN[2] = 40;
MAX[2] = 170;
INITANGLE[2] = 90;
ANA[2] = 2;
//夾子舵機
PIN[3] = 5;
MIN[3] = 10;
MAX[3] = 102;
INITANGLE[3] = 60;
ANA[3] = 3;
//下面的程式才是實際執行動作,將上頭的設定帶進舵機
for (int i = 0; i < SERVOS; i++) {
myservo[i].attach(PIN[i]);
myservo[i].write(INITANGLE[i]);
value[i] = 0;
idle[i] = 0;
previousAngle[i] = INITANGLE[i];
}
}
void loop() {
for (int i = 0; i < SERVOS; i++) {
value[i] = analogRead(ANA[i]); //讀取搖桿數值
currentAngle[i] = myservo[i].read(); //讀取舵機角度值
if (value[i] > 800) {
idle[i] = 0;
if (currentAngle[i] > MIN[i]) currentAngle[i] -= 2;
if (!myservo[i].attached()) {
myservo[i].attach(PIN[i]);
}
myservo[i].write(currentAngle[i]);
} else if (value[i] < 300) {
idle[i] = 0;
if (currentAngle[i] < MAX[i]) currentAngle[i] += 2;
if (!myservo[i].attached()) {
myservo[i].attach(PIN[i]);
}
myservo[i].write(currentAngle[i]);
} else {
++idle[i];
}
}
if (idle[3] > 100) {
myservo[3].detach();
idle[3] = 0;
}
delay(20); // 給舵機一點緩衝的時間
}