作者QCmmm (帥虫虫)
看板ASM
標題[問題] 紅外線遙控伺服馬達的問題(Arduino)
時間Thu Nov 13 16:37:49 2014
我利用arduino寫了一個程式去控制伺服馬達的轉動
當接上伺服馬達SG90時是可以控制的
但是如果接上伺服馬達MG996R的時候
伺服馬達並不會受到紅外線遙控器的控制
自顧自地轉動
紅外線接收器上的還會微微地閃爍
在執行arduino軟體內讓伺服馬達自轉的範例程式時
兩個型號的馬達都可以順利的照著程式要求而轉動
但是只要一加上紅外線控制的程式碼
MG996R就會像脫韁的野馬一樣不理我
請問會造成這個問題的原因是什麼呢?
以下是我的程式碼
//******************************
#include <IRremote.h>
#include <Servo.h>
//***********************定義紅外線接收器*************************
const int irReceiverPin = 2; //紅外線接收器 OUTPUT 訊號接在 pin 2
//***********************設定所偵測到的IRcode*************************
long IRinitial = 0x00FF02FD; // 初始化(OK)
long IRtight = 0x00FF629D; // 夾爪夾緊(up)
long IRloose = 0x00FFA857; // 夾爪放鬆(down)
IRrecv irrecv(irReceiverPin); // 定義 IRrecv 物件來接收紅外線訊號
Servo myservo1; // 設 myservo1
int angle;
decode_results results; // 解碼結果將放在 decode_results 結構的
results 變數裏
//********************************************************************(SETUP)
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // 啟動紅外線解碼
digitalWrite(irReceiverPin,HIGH);
myservo1.attach(5,620,2200); // 定義MG996R伺服馬達輸出第5腳位(PWM)
}
//******************************************************************(Void)
void initialize(int a) //初始化
{
myservo1.write(0);
delay(a);
}
void tight(int b)
{
for(angle = 0; angle <= 180; angle += 1)
{
myservo1.write(angle);
delay(b);
}
}
void loose(int c)
{
for(angle = 180; angle >= 0; angle -= 1)
{
myservo1.write(angle);
delay(c);
}
}
//******************************************************************************(LOOP)
void loop()
{
//**************************************************************************
if (irrecv.decode(&results))
{ // 解碼成功,收到一組紅外線訊號
/***********************************************************************/
if (results.value == IRinitial) //初始化
{
initialize(15);
}
/***********************************************************************/
if (results.value == IRtight) //夾爪夾緊
{
tight(15);
}
/***********************************************************************/
if (results.value == IRloose) //夾爪放鬆
{
loose(15);
}
/***********************************************************************/
else
{
myservo1.write(myservo1.read());
}
irrecv.resume(); // 繼續收下一組紅外線訊號
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 163.24.85.126
※ 文章網址: http://webptt.com/m.aspx?n=bbs/ASM/M.1415867873.A.127.html
1F:→ alibuda174: 什麼是 脫韁的野馬 ? 11/13 17:15
2F:→ alibuda174: 不需要這一行吧 digitalWrite(irReceiverPin,HIGH); 11/13 17:15
可是這個軟體一樣是可以控制SG90,無法控制MG996R耶...
※ 編輯: QCmmm (163.24.85.126), 11/13/2014 18:26:57
3F:→ alibuda174: 嗯...試試讓伺服馬達由獨立電源供電... 11/13 20:17
我一直都是接筆電usb的接頭供電
這樣給的電壓會不夠嗎?
SG90的工作電壓為3.5~6V
MG996R的工作電壓則是4.8~7.2V
電腦USB出的電壓好像都是5V
網路上面有看到arduino專用的9V變壓器
這樣子接arduino UNO的面板會不會有問題啊?
而且我會接到6顆MG996R
這樣的電壓足夠嗎?
※ 編輯: QCmmm (163.24.85.126), 11/13/2014 21:57:11
4F:→ alibuda174: UNO的電源插頭可輸入7~12V 11/13 22:57
5F:→ alibuda174: 怕的是電流不夠吧 馬達屬於大電流的裝置 11/13 22:58
6F:→ alibuda174: 我不知道問題在哪 只是建議你可試試的方向 11/13 22:58
7F:→ alibuda174: 6顆MG996R 肯定要提供獨立電源給馬達吧 11/13 22:59
8F:→ ROGERTP6LA: 9V變壓器接在UNO版上 一樣不行哦 11/13 23:08
9F:→ ROGERTP6LA: 因為UNO的5V輸出電流有限 11/13 23:10
10F:→ ROGERTP6LA: 比較好的方式應該是將SERVO額外提供電源 11/13 23:11
11F:→ ROGERTP6LA: 這個電源要記得跟UNO共地 11/13 23:11
12F:→ ROGERTP6LA: 剩下的就一樣用PWM接腳控制SERVO 11/13 23:12
如果我在arduino板子上接上電流為2A以上的變壓器呢?
官網上寫說arduino UNO 的I/O pin輸出的直流電流為40mA
我這樣接電能解決我的問題,給予6顆MG996R足夠的電流嗎?
或是只能獨立給每一個伺服馬達都接上外部電源......?
※ 編輯: QCmmm (163.24.85.126), 11/14/2014 14:26:36
13F:→ alibuda174: 但arduino板子上的穩壓器不一定能輸出/承受2A以上 11/14 21:26