日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Arduino获取商业遥控器(如天地飞等)PWM信号的例子

發(fā)布時間:2024/3/26 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 //2通道 #define left_right_pin 20 //1通道 #define power_pin 21 //3通道 //中斷引腳編號 #define forward_back_int_pin 4 #define left_right_int_pin 3 #define pow_int_pin 2 //4路舵機和1路電調(diào)的引腳 #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);//注冊中斷函數(shù)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() { // Serial.println("!!!!!!!!!!!!!!!!!" ); // Serial.println("Pulse Value Is : "); // Serial.print("power:"); // Serial.println(power_val); // Serial.print("left_right:"); // Serial.println(left_right_val); // Serial.print("forward_back:"); // Serial.println(forward_back_val); // Serial.println("!!!!!!!!!!!!!!!!!" ); // delay(1000);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); } //油門信號中斷函數(shù) void power(){if(digitalRead(power_pin)==HIGH){timer1=micros();}else{power_val=micros()-timer1;} } //前后舵量信號中斷函數(shù)void forward_back(){if(digitalRead(forward_back_pin)==HIGH){timer2=micros();}else{forward_back_val=micros()-timer2;}} //左右多量信號中斷函數(shù)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)容還不錯,歡迎將生活随笔推薦給好友。