生活随笔
收集整理的這篇文章主要介紹了
Arduino获取商业遥控器(如天地飞等)PWM信号的例子
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
如果我們做了一個小的創(chuàng)意作品,而它需要遠距離的無線控制,比如遙控車、遙控航模、遙控船等,這時候我們必定會認真考慮如何實現(xiàn)無線控制這個問題。藍牙、WiFi、ZigBee、NRF、HC-12等都可以,但是也都不同程度上存在一定的弊端,而且使用以上幾種方式都得另外制作一個遙控器實體,既然如此那么為什么不考慮直接使用成熟的商業(yè)遙控器呢?比如便宜好用的天地飛、高端的Futaba等。它們自身就是一個成熟的遙控器,有兩個遙桿,至少四路信號輸出,千米級的穩(wěn)定傳輸,一切看來似乎都是這么美好!但問題是如何接收到并解析出它們所發(fā)出的信號呢?下面就來解決一下這個問題!
首先得了解一下遙控器的基本常識,就是遙控器和接收機之間有自己的通信協(xié)議,這個協(xié)議各個遙控器廠商都有自己的一套標準而且之間互不兼容,但是接收機輸出的信號卻有較為統(tǒng)一的標準,常見的有PWM、PPM、各種.bus(比如Futaba的s.bus),這里面最簡單的自然就是PWM了,接收機的每個引腳單獨輸出一路PWM信號,發(fā)送給執(zhí)行器或者飛控,在固定翼航模上面通常都是直接發(fā)給執(zhí)行器(舵機、電調(diào)等),實現(xiàn)對它們的直接控制。
PWM是一種高低電平信號,通過高電平的持續(xù)時間(脈沖寬度)來傳輸信息,在遙控器上這個脈沖寬度通常大約是1000-2000毫秒,電調(diào)和舵機接收的信號范圍通常也是1000-2000毫秒。那么如何使用Arduino來獲取到這個脈沖寬度呢?這就要用到Arduino的外部中斷了(當然單片機系統(tǒng)都有中斷功能),通過兩次中斷事件發(fā)生的時間間隔來獲取脈沖寬度。解決了這個問題,那么就可以使用遙控器去控制航模、車模、船模了!(令人愉快的事情又多了一件!)
下面是Arduino MEGA獲取天地飛7遙控器信號并發(fā)給電調(diào)和舵機來控制航模的一段代碼:
#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信号的例子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。