2015.11.21
這是受朋友委託維修的挖土機,挖土機有其中一軸壞掉,壞掉的馬達就是 MG995
圖片來源:http://goo.gl/frqE62
也沒有維修過類似的東西,當時東西也不在我這裡,沒有想太多先買一顆馬達再說!!當天發現遙控器發出的訊號不一樣,就帶回家處理了。
挖土機拆開之後,出乎我意料的亂+簡單....
就是一堆線插在接收器而已,每一個軸都單獨聽訊號而已,沒有所謂的中央控制器,後來想想也是,這樣是最簡單的作法。
接收器的狀況如圖
因為當時手上買的是聽角度的 MG995就沒有想太多,利用Arduino 讀取訊號後,再轉換訊號,發出角度的訊號給馬達。
接線方式:
將收接器的訊號接到Arduino UNO pin10,MG995接到Arduino UNO pin9,Arduino 與接收器共地。
備註:當時沒拍到接上 MG995的照片,這是接收訊號的照片
讀取、寫判斷式、發出訊號,這些事情已經熟到不能再熟,很快就完成了,程式碼如下
以下的程式碼是根據遙控器廳的訊號做改變的程式碼,與在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 另外供電,提示一下,如果開迴路控制,一個控制器是無法完成控制的,所以要讓它們閉迴路控制,就讓各位去思考如何去接線吧