生活随笔
收集整理的這篇文章主要介紹了
Arduino获取商业遥控器(如天地飞等)PWM信号的例子
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
如果我們做了一個(gè)小的創(chuàng)意作品,而它需要遠(yuǎn)距離的無(wú)線控制,比如遙控車(chē)、遙控航模、遙控船等,這時(shí)候我們必定會(huì)認(rèn)真考慮如何實(shí)現(xiàn)無(wú)線控制這個(gè)問(wèn)題。藍(lán)牙、WiFi、ZigBee、NRF、HC-12等都可以,但是也都不同程度上存在一定的弊端,而且使用以上幾種方式都得另外制作一個(gè)遙控器實(shí)體,既然如此那么為什么不考慮直接使用成熟的商業(yè)遙控器呢?比如便宜好用的天地飛、高端的Futaba等。它們自身就是一個(gè)成熟的遙控器,有兩個(gè)遙桿,至少四路信號(hào)輸出,千米級(jí)的穩(wěn)定傳輸,一切看來(lái)似乎都是這么美好!但問(wèn)題是如何接收到并解析出它們所發(fā)出的信號(hào)呢?下面就來(lái)解決一下這個(gè)問(wèn)題!
首先得了解一下遙控器的基本常識(shí),就是遙控器和接收機(jī)之間有自己的通信協(xié)議,這個(gè)協(xié)議各個(gè)遙控器廠商都有自己的一套標(biāo)準(zhǔn)而且之間互不兼容,但是接收機(jī)輸出的信號(hào)卻有較為統(tǒng)一的標(biāo)準(zhǔn),常見(jiàn)的有PWM、PPM、各種.bus(比如Futaba的s.bus),這里面最簡(jiǎn)單的自然就是PWM了,接收機(jī)的每個(gè)引腳單獨(dú)輸出一路PWM信號(hào),發(fā)送給執(zhí)行器或者飛控,在固定翼航模上面通常都是直接發(fā)給執(zhí)行器(舵機(jī)、電調(diào)等),實(shí)現(xiàn)對(duì)它們的直接控制。
PWM是一種高低電平信號(hào),通過(guò)高電平的持續(xù)時(shí)間(脈沖寬度)來(lái)傳輸信息,在遙控器上這個(gè)脈沖寬度通常大約是1000-2000毫秒,電調(diào)和舵機(jī)接收的信號(hào)范圍通常也是1000-2000毫秒。那么如何使用Arduino來(lái)獲取到這個(gè)脈沖寬度呢?這就要用到Arduino的外部中斷了(當(dāng)然單片機(jī)系統(tǒng)都有中斷功能),通過(guò)兩次中斷事件發(fā)生的時(shí)間間隔來(lái)獲取脈沖寬度。解決了這個(gè)問(wèn)題,那么就可以使用遙控器去控制航模、車(chē)模、船模了!(令人愉快的事情又多了一件!)
下面是Arduino MEGA獲取天地飛7遙控器信號(hào)并發(fā)給電調(diào)和舵機(jī)來(lái)控制航模的一段代碼:
#include <Servo.h>
#define forward_back_pin 19
#define left_right_pin 20
#define power_pin 21
#define forward_back_int_pin 4
#define left_right_int_pin 3
#define pow_int_pin 2
#define forward_back_servo_pin1 8
#define forward_back_servo_pin2 9
#define left_right_servo_pin1 10
#define left_right_servo_pin2 11
#define pow_servo_pin 12Servo forward_back_servo1
;
Servo forward_back_servo2
;
Servo left_right_servo1
;
Servo left_right_servo2
;
Servo pow_servo
; int power_val
=0,forward_back_val
=0,left_right_val
=0;
unsigned long timer1
=0,timer2
=0,timer3
=0;void setup() {Serial
.begin(115200);pinMode(power_pin
,INPUT
);pinMode(left_right_pin
,INPUT
);pinMode(forward_back_pin
,INPUT
);attachInterrupt(pow_int_pin
,power
,CHANGE
);attachInterrupt(forward_back_int_pin
,forward_back
,CHANGE
);attachInterrupt(left_right_int_pin
,left_right
,CHANGE
);pow_servo
.attach(pow_servo_pin
,1000,2000);forward_back_servo1
.attach(forward_back_servo_pin1
,1000,2000);forward_back_servo2
.attach(forward_back_servo_pin2
,1000,2000);left_right_servo1
.attach(left_right_servo_pin1
,1000,2000);left_right_servo2
.attach(left_right_servo_pin2
,1000,2000);
}void loop() {
pow_servo
.write(power_val
);turn();fly();}void turn(){left_right_servo1
.write(left_right_val
);left_right_servo2
.write(left_right_val
);
}
void fly(){forward_back_servo1
.write(3000-forward_back_val
);forward_back_servo2
.write(forward_back_val
);
}
void power(){if(digitalRead(power_pin
)==HIGH
){timer1
=micros();}else{power_val
=micros()-timer1
;}
}
void forward_back(){if(digitalRead(forward_back_pin
)==HIGH
){timer2
=micros();}else{forward_back_val
=micros()-timer2
;}}
void left_right(){if(digitalRead(left_right_pin
)==HIGH
){timer3
=micros();}else{left_right_val
=micros()-timer3
;}}
總結(jié)
以上是生活随笔為你收集整理的Arduino获取商业遥控器(如天地飞等)PWM信号的例子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。