2015.11.21
這是受朋友委託維修的挖土機,挖土機有其中一軸壞掉,壞掉的馬達就是 MG995
.jpg)
圖片來源:http://goo.gl/frqE62
也沒有維修過類似的東西,當時東西也不在我這裡,沒有想太多先買一顆馬達再說!!當天發現遙控器發出的訊號不一樣,就帶回家處理了。
挖土機拆開之後,出乎我意料的亂+簡單....
就是一堆線插在接收器而已,每一個軸都單獨聽訊號而已,沒有所謂的中央控制器,後來想想也是,這樣是最簡單的作法。
接收器的狀況如圖
因為當時手上買的是聽角度的 MG995就沒有想太多,利用Arduino 讀取訊號後,再轉換訊號,發出角度的訊號給馬達。
接線方式:
將收接器的訊號接到Arduino UNO pin10,MG995接到Arduino UNO pin9,Arduino 與接收器共地。
備註:當時沒拍到接上 MG995的照片,這是接收訊號的照片
.jpg)
讀取、寫判斷式、發出訊號,這些事情已經熟到不能再熟,很快就完成了,程式碼如下
以下的程式碼是根據遙控器廳的訊號做改變的程式碼,與在Arduino上面常用的不同喔!!!
--------------------------------------------------------------------
#include <Servo.h>
int value;
int angle;
Servo myservo;
void setup(){
myservo.attach(9);
Serial.begin(9600);
pinMode(10,INPUT);
}
void loop(){
value= pulseIn(10, HIGH, 25000);
Serial.print(value);
Serial.print(",");
if(value >= 1450 && value <=1550){
angle = angle+0;
}
else if( value >=1050 && value <=1250){
angle=angle+3;
}
else if (value >1250 && value <= 1450){
angle ++;
}
else if( value >1550 && value <= 1750){
angle --;
}
else if(value >1750 && value <= 2000){
angle = angle -3;
}
if(angle <= 0){
angle = 0;
}
else if(angle >= 180){
angle = 180;
}
Serial.println(angle);
delay(10);
myservo.write(angle);
}
-------------------------------------------------------------------------
這樣就可以動了,以為修好了!!皆大歡喜,結果發現0-180度太短了,這一定要用連續旋轉版本.....請看下一篇
我們常用的轉動伺服馬達的程式碼(角度),這是Arduino本身的範例程式,各位可以在Example 找到此程式
-------------------------------------------------------------------------
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop()
{
for(pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for(pos = 180; pos>=0; pos-=1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
-------------------------------------------------------------------------
MG995的扭力較大,所以需要的電壓電流較大,如果單純使用Arduino 會有可能發生,電腦一直重複讀到Arduino 的聲音,狀況就是,一下有抓到Arduino ,一下抓不到,感覺Arduino 很像一直在關機的感覺,其實這是Arduino 本身的保護機制,因為負載的電流太大了。
解決辦法: 將MG995 另外供電,提示一下,如果開迴路控制,一個控制器是無法完成控制的,所以要讓它們閉迴路控制,就讓各位去思考如何去接線吧