接下來終於要進入高潮了,這篇會有點長,要介紹的主題包含硬體架設,在 Ubuntu 上開發 Arduino,Arduino 紅外線發送接收程式,及 Ubuntu 的 Serial 程式。
準備硬體
接法及紅外線簡介可參考這篇,非常詳細。其中要注意的是每個人用的紅外線接收零件可能略有不同,請一定要照規格上的腳位接。
以我這裡用的 TL1838
接收部分,接完長這樣
發送時,接完長這樣
(這張圖好像接反了,總之 LED 長腳接 pin 3,短腳接地)
開發環境
安裝 Arduino 開發環境,在 Ubuntu 12.04 上只需
sudo apt-get install arduino arduino-core arduino-mk
此外,還需要紅外線控制(編解碼)的 library Arduino-IRemote
cd /usr/share/arduino/libraries/
sudo git clone https://github.com/coopermaa/Arduino-IRremote IRemote
接收 Go!
選擇 Arduino IDE 的 File —> Examples —> IRemote —> IRecvDump 程式就跑出來了,在前幾行的地方,有個 RECV_PIN 從 11 改成 4,如下:
int RECV_PIN = 4;
程式上傳後,打開內建的 Serial Monitor,再拿著遙控器對著接收器隨便按個幾個鍵,紅外線的編碼即會顥示出來,接下來要做的就是將等會要用到按鍵都按過一輪,並記下來,如下圖:
發送 Go!
我家電視的遙控器是 NEC 32 bits 編碼,並且加入從 serial 讀進指定字元,傳出對應的紅外線:
if ((d = Serial.read()) != -1) { switch (d) { case '1': code = 0x1CE3807F; break; case '2': code = 0x1CE340BF; break; case '3': code = 0x1CE3C03F; break; case '4': code = 0x1CE320DF; break; case '5': code = 0x1CE3A05F; break; case '6': code = 0x1CE3609F; break; case '7': code = 0x1CE3E01F; break; case '8': code = 0x1CE310EF; break; case '9': code = 0x1CE3906F; break; case '0': code = 0x1CE300FF; break; case 'q': code = 0x1CE3708F; break; // volume up case 'a': code = 0x1CE3F00F; break; // volume down case 'w': code = 0x1CE350AF; break; // channel up case 's': code = 0x1CE3D02F; break; // channel down case 'e': code = 0x1CE3C837; break; // source case 'd': code = 0x1CE3A25D; break; // enter case 'p': code = 0x1CE348B7; break; // power default: code = 0; } if (code != 0) { irsend.sendNEC(code, 32); }
完整的程式可參考 github 上的 ir-tx.cpp
使用指令編繹、上傳
這支程式計畫是要在 NAS 上跑,NAS 上用指令編譯上傳會比較方便,所以若是需要用指令編譯的話,要先準備一隻 Makefile,內容如下:
BOARD_TAG = uno ARDUINO_PORT = /dev/ttyACM0 ARDUINO_LIBS = IRremote ARDUINO_DIR = /usr/share/arduino include /usr/share/arduino/Arduino.mk .PHONY: minicom minicom: sudo minicom -D ${ARDUINO_PORT} -b 9600 -o
在原本的 Arduino 程式內需加上一些 header,舉例來說之前的 ir-tx.cpp 需在開頭加入:
#include <arduino.h> #include <hardwareserial.h>
接著在放程式及 Makefile 目錄下:
make # 編譯 make upload #上傳 make minicom # 打開 minicom
即可編譯,上傳。
Serial 程式
在確定用 minicom 傳接都沒問題後,在上一篇內有提到一隻 web.py 裡頭呼叫了外部程式 serial_tx 來傳送 serial 字元給 arduino,這程式請參考 serial_tx.c。
若是發生 minicom 可正常傳接收串列資料,但自己的程式不行,可用 stty 來輔助除錯,它可將串列設定全都印出。
No comments:
Post a Comment