寫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