寫Arduino控制程式 2
日記:
今天對控制程式做了一些修改,程式新增了抵抗地心引力的補正,以及抵抗慣性的補正。
今天嘗試用一片Arduino控制兩個馬達,試著寫了兩種程式,一種不會動,另一種作動方式不對,輸入4次訊號前兩次1號馬達動,後兩次2號馬達動,都不能用。
備註:
1.移動距離轉換的數學式是 1000(acos(d/150)/144) ,將d設成所要移動的距離,將d除以承臂長度( 150 )求出比值,再用acos轉換成需要旋轉的角度,除以角速度(144)的出需要旋轉的毫秒,在1000得出需要的秒數。
2.角速度是由myservo.write(172); 旋轉5秒轉4圈算出來的,只有目測沒有量測。為什麼用myservo.write(172),因為其他的速度不會轉回同個位置。
3.引力補正是用與引力相反的微速轉動馬達來對抗引力。
4.慣性補正是用與運動相反的方向相反的高速 delay(100) 來抵抗慣性。
5.新增補正的原因是因為我們的馬達是連續旋轉型的,沒辦法讓他固定,所以用補正解決。
程式:
加了補正的程式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include <Servo.h>
Servo myservo; //旋盤上
void setup()
{
Serial.begin(9600);
myservo.attach(9);
}
void loop()
{
int d;
int e;
myservo.write(90); //啟動時固定
if(Serial.available()){
d = Serial.parseInt();
Serial.println(d);
if(0 <= d && d <= 180){
e=1000*(acos(d/150)/144); //將輸入的距離轉換成需要旋轉的時間
myservo.write(172); //固定正轉
delay(270); //旋轉此時間會讓馬達與安裝面垂直
myservo.write(172); //慣性補正
delay(100);
myservo.write(91); //引力補正
delay(1000);
myservo.write(172); //固定正轉
delay(e); //
myservo.write(8); //慣性補正
delay(100);
myservo.write(91); //引力補正
delay(1000);
myservo.write(8); //固定反轉
delay(e); //反轉相同時間復歸
myservo.write(8); //固定反轉
delay(270);
}
}
}
|
嘗試控制兩個馬達的程式(一個忘了存)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <Servo.h>
Servo myservo1;
Servo myservo2;
int x=100;
void setup()
{
Serial.begin(9600);
myservo1.attach(9);
myservo2.attach(9);
}
void loop()
{
int d;
myservo2.write(90);
if(Serial.available()){
d = Serial.parseInt();
Serial.println(d);
if(0 <= d && d <= 180){
myservo2.write(180);
delay(1000*(acos(d/150))/2.5+3.14);
myservo2.write(90);
delay(1000);
myservo2.write(0);
delay(1000*(acos(d/150))/2.5+3.14);
myservo1.write(90);
if(Serial.available()){
d = Serial.parseInt();
Serial.println(d);
if(0 <= d && d <= 180){
myservo1.write(180);
delay(1000*(acos(d/150))/2.5+3.14);
myservo1.write(90);
delay(1000);
myservo1.write(0);
delay(1000*(acos(d/150))/2.5+3.14);
}
}
}
}
}
|
問題:
每次程式跑到 1000*(acos(d/150)/144) 這一行馬達就會像失去動力般一小段時間,然後直接回到原點,將這段數學式改成常數後就沒有問題,想請問是什麼原因?
結語:
今天原本想說能至少把單個馬達的控制程式完成,看來有點高估自己了。
Comments
comments powered by Disqus