arduino控制直流电机能控制这样的接收器吗

Arduino UNO WiFi = Arduino UNO板 + ESP8266 - 網昱多媒體
2016年元旦當天,收到創辦人Federico Musto先生寄來的聖誕禮物:。
跟新的Arduino系列控制板一樣,UNO WiFi板的排插外側有印上接腳的編號(所以我們不用了):
這張控制板的尺寸和UNO一樣,板子上整合了Arduino UNO和ESP8266(具備Wi-Fi網路連線的系統級晶片)。它採用ATmega328微控器執行Arduino程式,並且同樣採用ATmega16U2作為USB序列埠通訊晶片。廣告一下,ESP8266的說明和程式設計請參閱《》第12和13章。
ESP8266晶片透過序列通訊介面連接其他微控器(如:Arduino板),但由於Arduino控制板的序列埠肩負接收程式碼的重責大任,因此,UNO WiFi板採用NXP(恩智浦半導體)的SC16IS750IBS序列轉I2C/SPI介面的晶片,把EP8266的序列介面轉換成I2C,再連接到Arduino的ATmega328微控器。
平時,Arduino UNO的網路資料經由I2C介面(亦即:A4和A5腳)傳送到SC16IS750IBS,再從這個晶片的序列埠,轉送給ESP8266晶片,反之亦然。
上傳程式給Arduino時,除了透過控制板的USB介面,也可以用Wi-Fi無線方式上傳。透過無線上傳程式時,程式檔將從ESP8266的序列埠直接傳入Arduino的序列埠。ESP8266的序列埠和I2C介面通訊會依照使用情況自動切換,我們的程式碼無須介入。
設置Wi-Fi網路和ESP8266的運作模式
Arduino Uno WiFi板子上的16M bit(2MB)快閃記憶體,用於儲存ESP8266的韌體,此網路晶片的預設工作模式為AP+STA,也就是同時充當網路基地台(Access Point)和無線終端設備(Station)。
若要啟用OTA(Over The Air,無線上傳程式碼)功能,ESP8266必須先設置成STA(無線終端)模式。Arduino UNO WiFi的無線網路參數,都是用瀏覽器設置。設置參數之前,要先透過Wi-Fi連接此控制板。
接上電源之後不久,即可探尋到此控制板的Wi-Fi訊號:
連上Arduino Uno WiFi基地台,再透過瀏覽器連接到http://192.168.240.1/網址,即可進入此控制板的無線網路設置畫面。
這個網頁程式存在EP8266韌體中,可顯示無線網路的運作狀況和資訊,例如,IP位址、MAC位址、工作模式…等等,也有提供一個相當於無線版「序列埠監測視窗」的WiFi Console(WiFi控制台)。
在WIFI設定畫面,設定讓無線網路連接到家裡的無線路由器之後,再按下右上角的SWITCH TO STA MODE(切換到連線終端模式),詳細的操作說明可參閱arduino.org網站的。
設定成STA模式,UNO WiFi板便失去無線基地台(AP)的能力,但仍具備網路連線功能。連接UNO WiFi板的電腦,必須和它連線到相同的無線網路環境。UNO WiFi板預設的主機名稱是“arduino”,透過“arduino.local”網址,即可開啟它的網路設定頁面:
http://arduino.local/
使用Arduino IDE 1.7.10版撰寫程式
Arduino UNO WiFi控制板是Arduino S.R.L公司的產品,請使用該公司的來編寫程式。Arduino S.R.L公司的Jeff告知,在今年五月舊金山Maker Faire會展中,該公司宣佈計劃未來會透過add-on platform packages(外掛平台套件)來支援arduino.cc的Arduino IDE,減少開發者使用Arduino IDE的困擾。
先在IDE主功能表的「工具→板子」選擇Arduino Uno WiFi板,再從「工具→序列埠」選擇有線序列埠(如下圖中的COM5),或者網路埠(如下圖中的arduino at 192.168.7.185)。
這項「網路埠」連線功能,可讓開發人員在遠端更新Arduino控制板的軟體。
Arduino UNO WiFi網路程式入門
以往,Arduino都是透過乙太網路或者Wi-Fi無線網路擴展板(像Arduino官網的這一款)連接網際網路,這兩種方案都使用SPI介面與Arduino控制板相連。
Arduino UNO WiFi板的ESP8266晶片則是經由I2C連接Arduino微控器,加上每個網路晶片的控制方式都不一樣,所以UNO WiFi板的網路程式也不同於乙太網路程式;若不使用Wi-Fi網路功能,這塊板子的程式設計方式和普通的UNO相同。
在連接乙太網路模組的情況下,Arduino UNO板的數位10~13腳無法挪作他用;Arduino UNO WiFi則是犧牲了A4和A5兩個類比腳。
底下的程式將使用Arduino IDE內建的WebSever(網站伺服器)範例,說明UNO WiFi板的程式架構。上傳此程式碼之後,使用者將能透過底下的網址讀取UNO WiFi板的自製網站:
我們自訂的網路程式路徑,始終被附加在arduino.local/arduino/後面。底下是WiFi網站伺服器程式的架構,由於無線網路的IP、閘道器(gateway)位址…等參數,都是透過瀏覽器設置,所以我們的程式碼裡面不需要設定:
其中負責處理前端資料的WiFiData類型,定義在ArduinoWiFi程式庫資料夾裡的SC16IS750.h檔案中。每當有用戶連接此控制板時,process()自訂函式將讀取URL網址最後面的參數,其值若是“webserver”,則呼叫WebServer()自訂函式輸出網頁,若非“webserver”,ESP8266會自行在網頁上輸出“Not found.”(查無此資源)。
修改自Arduino IDE內建的WebSever(網站伺服器)範例的完整程式碼如下:
#include &Wire.h&
#include &ArduinoWiFi.h&
開啟瀏覽器,輸入此網址:
http://&IP&/arduino/webserver/
http://&hostname&.local/arduino/webserver/
相關說明請參閱:
http://labs.arduino.org/WebServer
void setup() {
Wifi.begin();
Wifi.println("WebServer Server is up");
// 輸出訊息到(網頁的)WiFi控制台
void loop() {
while (Wifi.available()) {
process(Wifi);
delay(50);
void process(WifiData client) {
// 讀取命令
String command = client.readStringUntil('/');
if (command == "webserver") {
WebServer(client);
void WebServer(WifiData client) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Refresh: 5");
// 每5秒自動更新(重新整理)網頁
client.println();
client.println("&html&");
client.println("&head& &meta charset=\"utf-8\"&&title&UNO WIFI物聯網&/title& &/head&");
client.print("&body&");
for (int analogChannel = 0; analogChannel & 4; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("類比輸入 ");
client.print(analogChannel);
client.print(" 的值為 ");
client.print(sensorReading);
client.print("&br/&");
client.print("&/body&");
client.println("&/html&");
client.print(DELIMITER); // 中斷與用戶的連線
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
#include &Wire.h&#include &ArduinoWiFi.h&/*
開啟瀏覽器,輸入此網址:
http://&IP&/arduino/webserver/
http://&hostname&.local/arduino/webserver/
相關說明請參閱:
http://labs.arduino.org/WebServer*/ void setup() {
Wifi.begin();
Wifi.println("WebServer Server is up");
// 輸出訊息到(網頁的)WiFi控制台} void loop() {
while (Wifi.available()) {
process(Wifi);
delay(50);}void process(WifiData client) {
// 讀取命令
String command = client.readStringUntil('/');
if (command == "webserver") {
WebServer(client);
}}void WebServer(WifiData client) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Refresh: 5");
// 每5秒自動更新(重新整理)網頁
client.println();
client.println("&html&");
client.println("&head& &meta charset=\"utf-8\"&&title&UNO WIFI物聯網&/title& &/head&");
client.print("&body&");
for (int analogChannel = 0; analogChannel & 4; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("類比輸入 ");
client.print(analogChannel);
client.print(" 的值為 ");
client.print(sensorReading);
client.print("&br/&");
client.print("&/body&");
client.println("&/html&");
client.print(DELIMITER); // 中斷與用戶的連線}
乙太網路和WiFi擴展板程式,都是透過底下的語法中斷用戶端的連線:
client.stop();
UNO WiFi控制板則是透過這個敘述中斷連線,其中的DELIMITER常數也是定義在SC16IS750.h檔案裡面:
client.print(DELIMITER);
文章分類文章分類
Adobe&&(22)
Adobe ACA認證教材&&(17)
CSS樣式表&&(8)
Flash與ActionScript&&(49)
iPhone / iPod Touch&&(4)
Microsoft&&(14)
動態網頁製作&&(25)
哈玩意&&(6)
改造遊樂器&&(28)
教學文件&&(79)
數位相機與攝影機&&(17)
書籍堪誤&&(18)
桌面應用程式&&(3)
機器人&&(15)
生活雜趣&&(17)
硬體與DIY&&(160)
行動裝置&&(51)
課程資訊&&(4)
麥金塔歲月&&(21)查看: 42470|回复: 25
Arduino 从模型遥控接收机获取PPM控制信号
本帖最后由 johnsonzzd 于
21:53 编辑
无线遥控就是利用高频无线电波实现对模型的控制。如天地飞的的6通道2.4 GHz遥控器,一套200多块,具有自动跳频抗干扰能力,从理论上讲可以让上百人在同一场地同时遥控自己的模型而不会相互干扰。而且在遥控距离方面也颇具优势,2.4 GHz遥控系统的功率仅仅在100 mW以下,而它的遥控距离可以达到1km以上。
0.png (15.21 KB, 下载次数: 121)
20:52 上传
遥控器发射机、接收机原理
每个通道信号脉宽0~2ms,变化范围为1~2ms之间。1帧PPM信号长度为20ms,理论上最多可以有10个通道,但是同步脉冲也需要时间,模型遥控器最多9个通道。
1.png (74.14 KB, 下载次数: 174)
20:52 上传
2.jpg (156.37 KB, 下载次数: 86)
20:54 上传
只连接了通道3(油门)
arduino要测量脉宽时间很简单。有专门的库函数pulseIn( )。问题在于这个库函数使用查询方式,程序在测量期间一直陷在这里,CPU利用率太低。因此下面代码采用中断方式,效率很高。
代码参考:,42286.0.html
//read PPM signals from 2 channels of an RC reciever
//http://arduino.cc/forum/index.php/topic,42286.0.html
//接收机两个通道分别接arduino的数字口2、3脚
//Most Arduino boards have two external interrupts: numbers 0 (on digital pin 2) and 1 (on digital pin 3).
//The Arduino Mega has an additional four: numbers 2 (pin 21), 3 (pin 20), 4 (pin 19), and 5 (pin 18).
int ppm1 = 2;&&
int ppm2 = 3;
unsigned long rc1_PulseStartTicks,rc2_PulseStartT& & & &
volatile int rc1_val, rc2_&&
void setup() {
& & & & Serial.begin(9600);&&
& & & & //PPM inputs from RC receiver
& & & & pinMode(ppm1, INPUT);
& & & & pinMode(ppm2, INPUT);
& & & & // 电平变化即触发中断
& & & & attachInterrupt(0, rc1, CHANGE);& &
& & & & attachInterrupt(1, rc2, CHANGE);& &
void rc1()
{
& & & & // did the pin change to high or low?
& & & & if (digitalRead( ppm1 ) == HIGH)
& & & & & & & & rc1_PulseStartTicks = micros();& & // store the current micros() value
& & & & else
& & & & & & & & rc1_val = micros() - rc1_PulseStartT
void rc2()
{
& & & & // did the pin change to high or low?
& & & & if (digitalRead( ppm2 ) == HIGH)
& & & & & & & & rc2_PulseStartTicks = micros();& &
& & & & else
& & & & & & & & rc2_val = micros() - rc2_PulseStartT
void loop() {
& & & & //print values
& & & & Serial.print(&channel 1:&&&);
& & & & Serial.print(rc1_val);&&
& & & & Serial.print(&& && &&&&);
& & & & Serial.print(&channel 2:&&&);& &
& & & & Serial.println(rc2_val);&&
}
复制代码
上述代码每个通道都要占用一个中断口。但是一般的Arduino只有数字口2、3具有中断功能,也就是说只能接两个通道。如果想使用更多的通道,就需要用mega了,mega有5个外部中断源。其实,还有一种简单办法可以用一个中断接收所有通道。这就是绕过接收机的解码电路,使用arduino直接对PPM信号解码。这种方式麻烦的地方是需要拆开接收机,把解码前的PPM信号引出来。
3.png (47.63 KB, 下载次数: 107)
20:52 上传
打开接收机后,寻找PPM信号接口有几种办法:
1.& && &&&查芯片资料,如Futaba接收机使用BU4015BF移位寄存器芯片,管脚1或9焊一根线引出即可。2.& && &&&使用示波器3.& && &&&使用arduino,写入测量脉宽的程序,在电路板上找吧,直到出现一些随机数估计就是了。找到以后使用下面代码进行解码。此段代码使用查询方式,效率较低。更有效率的办法是使用两个中断。一个中断检测同步信号,另一个中断处理PPM信号。
//http://diydrones.com/profiles/blogs/705844:BlogPost:38393
#define channumber 4 //How many channels have your radio?
int value[channumber];
void setup()
{
& & & & Serial.begin(57600); //Serial Begin
& & & & pinMode(3, INPUT); //Pin 3 as input
}
void loop()
{
& & & & while(pulseIn(3, LOW) & 5000){} //Wait for the beginning of the frame
& & & & for(int x=0; x&=channumber-1; x++)//Loop to store all the channel position
& & & & {
& & & & & & & & value[x]=pulseIn(3, LOW);
& & & & }
& & & & for(int x=0; x&=channumber-1; x++)//Loop to print and clear all the channel readings
& & & & {
& & & & & & & & Serial.print(value[x]); //Print the value
& & & & & & & & Serial.print(& &);
& & & & & & & & value[x]=0; //Clear the value afeter is printed
& & & & }
& & & & Serial.println(&&); //Start a new line
}
支持下!!最近正好需要!
很强大,收下了
这个,好啊!
支持下!!
记录下。。学习。
谢谢楼主,这正是我想要的,想用ARDUINO控制遥控车。
学习············
请问有没简单的方法 ,实现同时读6路PWM波呢?
正在找方面 学习了
楼主是否了解mwc是怎么做的呢
有没有这种库,输入ppm信号解码
请问楼主,如何将获取到的信号输出控制电机呢?
好东西,学习学习。。。
很好的内容
Powered by鍙?渶涓

我要回帖

更多关于 arduino无人机控制器 的文章

 

随机推荐