實驗目的
練習用 IRRemote 函式庫發射紅外線訊號。在這個實驗裏,你將學習用 IRsend 物件發射紅外線訊號。
前提
在做這個實驗前,我假設:
- 你已經看過「IRRemote 紅外線遙控教學」一文,而且
- 也已經把 IRRemote 函式庫安裝起來了
材料
- 麵包板 x 1
- Arduino 主板 x 1
- 發射波長為 940nm 的紅外線發射器 x 1
- 按鈕 (pushbutton) x 1
- 10k 歐姆電阻 x 1
- 100 歐姆電阻 x 1
- 單心線 x N
一家烤肉萬家香,開放分享才會快樂
練習用 IRRemote 函式庫發射紅外線訊號。在這個實驗裏,你將學習用 IRsend 物件發射紅外線訊號。
在做這個實驗前,我假設:
要怎麼取得遙控器的紅外線資料呢?有兩個方法,第一個是利用「1.2 顯示紅外線協定種類」的範例程式(Example1.2.pde),這支程式會把紅外線解碼結果顯示在 Serial Monitor 上:
練習製作一個 LCD 介面的紅外線解碼器(Infrared Decoder)。
在這個實驗裏,你將練習用 IRRemote 函式庫接收紅外線訊號,然後搭配一個文字型 LCD(Liquid Crystal Display)當作紅外線解碼器的顯示介面。預計製作的紅外線解碼器,其外觀如下:
練習用 IRRemote 函式庫接收紅外線訊號。在這個實驗裏,你將增加一顆 LED 當作紅外線訊號指示燈,並且讓指示燈在收到紅外線訊號的時候自動閃爍。
在做這個實驗前,我假設:
練習用 IRRemote 函式庫接收紅外線訊號。在這個實驗裏,你將利用 decode_results 結構來判斷並顯示遙控器的紅外線協定種類,如 NEC, Sony SIRC, Philips RC5 和 Philips RC6 等紅外線協定(Infrared Protocol)。
在做這個實驗前,我假設:
練習用 IRRemote 函式庫接收紅外線訊號。在這個實驗裏,你將學習用 IRrecv 物件接收紅外線訊號。
在做這個實驗前,我假設:
你想用 Arduino 做紅外線遙控嗎? 你想用 Arduino 控制你的電視、音響、冷氣機、DVD、MP3 Player、玩具遙控車或其它設備嗎? 用 Ken Shirriff 寫的 IRRemote 這個函式庫,會讓你的 Arduino 既可發射又可以接收紅外線訊號,它支援許多種紅外線協定,包括 NEC, Sony SIRC, Philips RC5, Philips RC6 和原始資料 (raw) 等紅外線協定。
這一系列的教學,將教你使用 IRRemote 函式庫來接收與發射紅外線訊號。
▲ 用 Arduino 與 IRRemote 函式庫的紅外線遙控電路。(圖片來源: Ken Shirriff’s blog)
在上一篇的實驗中,我們完成了反射型紅外線物體偵測,接下來第二個實驗要製作遮光型的紅外線物體偵測。
先來複習一下遮光型紅外線物體偵測的原理,它的原理是把紅外線接收器與發射器安置在兩端,兩者相對,發射器一樣不斷發出紅外線光束,當光線被遮擋時,就表示中間有物體或障礙物。底下這張是遮光型紅外線物體偵測的示意圖:
▲ 遮光型紅外線感測器
晚上在 Hacker Highligts: Steven’s Temperature Display 這篇文章看到一個好玩的東西,Steven Dayton 根據 Jeremy Blum 做的 Arduino+I2C+Processing 溫度顯示器用 Processing 寫了一個很好看的溫度顯示器(如左圖)。 |
這讓我想起之前我曾用 Arduino 與 SHT15 溫溼度計製作了一個溫溼度記錄器(見「Arduino 筆記 - 製作一個溫溼度記錄器)」,於是動了一個念頭,想改良 Steven Dayton 的 Processing 溫度顯示器把它套用到我的溫溼度計。Processing 程式超簡單,我把 Steven Dayton 的程式下載回來後,只花不到 5 分鐘就定了,超快的!^o^
改良後的 Processing 溫度顯示器執行畫面如下:
Arduino 腳位的電流很小 (小於 40 mA),當你想要切換大電流或大電壓設備 (例如燈泡、馬達或大風扇) 的開關時,會需要一個中繼的電路 (intermediate circuit),最簡單的辦法是使用繼電器。
練習用繼電器控制 12V 風扇。
我假設你已經知道繼電器是什麼,而且也會查 datasheet 看懂繼電器的接線圖。 如果你還不認識繼電器,建議你在做這個實驗前先看一看「繼電器簡介」一文,。
為了使用繼電器,我上網做了一些功課,底下摘要整理我所吸收到的資訊:
▲ 各式各樣的繼電器 (圖片來源: http://kjsconsulting.biz/ )
繼電器 (Relay) 是一種可以讓小電力控制大電力的開關。例如,小電壓的電池或者是微控制器,只要用繼電器就可以切換馬達 (motors)、變壓器 (transformers)、電暖爐 (heaters)、燈泡 (bulbs) 等大電流設備的開關。
練習用紅外線接收器與發射器來實作紅外線物體偵測(Infrared Object Detection)。
我們在「用紅外線動作感測器(PIR Motion Sensor)控制 LED 的開關」一文中提到,紅外線感測器有分主動式和被動式兩種。紅外線動作感測器(PIR Motion Sensor)是屬於被動式的紅外線裝置,感應器本身不會發射紅外線光束,而另一種則是會發射紅外線光束的主動式紅外線感測器。主動式紅外線感測器常用於物體的偵測,例如自動沖水小便斗或感應式水龍頭,還有避障自走車等。
主動式紅外線感測器大概可分為「反射型」和「遮光型」兩種。如下圖所示,所謂反射型紅外線感測器,是把接收器與發射器並排,讓發射器不斷發出紅外線光束,當接收器收到反射過來的光線時,表示前方有物體或障礙物:
而所謂遮光型紅外線感測器,則是把接收器與發射器安置在兩端,兩者相對,發射器一樣不斷發出紅外線光束,當光線被遮擋時,就表示中間有物體或障礙物,如下圖所示:
紅外線接收器接腳 Arduino 接腳 Vcc(+ 或 V+) 接到 +5V 電源 GND(-) 接到 GND Vout(或 OUT) 接到 pin 2。你可以接到其它 Digital pin,但程式要配合修改
▲ 有些紅外線接收器 GND 和 Vcc 是相反的,接線時請查閱你的 datasheet
接下來我們先來做第一個實驗,利用紅外線反射偵測物體。
利用紅外線反射偵測物體,在架設紅外線接收器與發射器的時候,接收器與發射器要並排,除此之外,另一個要注意的重點是,因為接收器很靈敏,所以要用個套管套住發射器(IR LED),讓光束往前直射,不然的話光束很容易受到其它物體反射而影響接收器的反應。如果手邊沒有套管,用黑膠布或捲紙把發射器包裹起來也是可以的:
底下就是利用紅外線反射偵測物體的程式(irObjectDetection.pde),在偵測到物體的時候,指示燈會閃爍:
比較微妙的地方是 tone(irLed, frequency); 這行指令,這行指令會一直產生 38 kHz 頻率的脈波 (Pulses)。我們在「控制蜂鳴器發聲」用過 tone() 指令,當時是 tone() 指令讓蜂鳴器發出不同音階的聲音。
如果你用的紅外線接收器很靈敏,即使把發射器用套管套住了,還是很容易收到從小角度透出來的光束的話,可以調整一下發射器的頻率,把頻率加或減 2~3 kHz 試看看。
下一篇將進行第二個實驗「利用遮光偵測物體」。
底下是一個 Arduino EEPROM Library 的使用範例,程式的邏輯是在 EEPROM 位址 5 的地方寫入數值 99,接著再從 EEPROM 讀出剛剛寫進去的內容:
EEPROM Library 只支援一個位元組(Byte)的讀寫,一次只能讀寫一個位元組。如果要儲存的資料只有一個位元組,這是足夠的。不過,假如是一個 int (2 bytes), long (4 bytes) 甚至是更複雜的資料結構,你就得呼叫 EEPROM Library 的函式很多次才能把資料儲存起來,這樣很不方便。
用底下提供的函式,你就可以讀寫 EEPROM 中的任何資料,而且函式只要呼叫一次就搞定。
想像一下,把 Android 手機跟 Arduino 板子結合起來可以做什麼呢?用 Android 手機遙控機器人、自走車、飛行器? 或者是控制家電,例如電燈、電風扇、電視、冷氣機、窗簾、音響? 只要你有決心,這些都是可能的。
▲ AR.Drone – iPhone 無線(Wi-Fi)遙控直升機
目前透過藍芽傳輸連接 Android 與 Arduino 的方案有兩個,一個是 Android-Firmata,另一個是 Amarino,這兩個方案作者是同一個人,叫做 Bonifaz Kaufmann。底下將簡介這兩個方案。
Android-Firmata 可以讓 Android 手機透過藍芽傳輸來控制 Arduino,它講的是 Firmata 協定。Firmata 是一個通用的通訊協定,它可以讓你的 Arduino 跟 Android 用同一套語言對話。底下是 Android-Firmata 應用架構示意圖:
▲ Android-Firmata 應用架構示意圖,Arduino 這端的 Firmata 程式在 Arduino IDE 裏就有內附。
Android-Firmata 目前只支援 Firmata 1.0,可以讓你設定數位腳位 (Digital Pins) 的輸入輸出模式 (input/output mode),讀取數位和類比 (Analog) 輸入腳位,以及開關數位腳位,另外也可以控制 PWM 腳位。可以控制 Arduino 的函式有:
使用 Android-Firmata 連接 Android 與 Arduino 的步驟大概如下:
Amarino (Android meets Arduino) 是 Bonifaz Kaufmann 寫的另一個連接 Android 與 Arduino 的軟體套件(Toolkit),跟 Android-Firmata 比起來,Amarino 一樣是走藍芽傳輸,不一樣的地方在於 Amarino 用的不是 Firmata 通訊協定,而是作者自創的一個很簡單的協定。 Amarino 的應用架構示意圖如下:
Amarino 協定封包格式非常單純,只是把要傳輸的資料夾在一個 0x12 起始符號和 0x13 確認符號中間而已。也許是比較簡單的關係,作者後來似乎把重心移到 Amarino,Android-Firmata 從 2010 年 1 月之後便沒再更新了。
要開發 Amarino 的互動應用,Arduino 這端的程式要用 MeetAndroid 函式庫,而 Android 這端的程式則要使用 AmarinoLibrary.jar 函式庫,這兩個函式庫都可以在 Amarino 官網取得。
不管是用 Android-Firmata 或 Amarino,你都將需要幾樣東西:
在 Arduino 藍芽傳輸這部份,你有兩種選擇,一種是用內建藍芽通訊的 Arduino BT,另一種則是用像 Bluetooth Mate 這類藍芽模組來擴充你 Arduino 的能力。
▲ Arduino BT (圖片來源: Sparkfun)
▲ Bluetooth Mate (圖片來源: Sparkfun)
練習使用 NETLab Toolkit 把 Processing 與 Arduino 連接起來,使用可變電阻 (potentiometer) 來控制 Processing 畫面上的矩形的水平移動。
註: 這篇跟「使用 Firmata 協定連接 Processing 與 Arduino」一文所用的例子是一樣的,文中部份內容會重覆,對沒有看到該文的朋友來說,這樣比較方便閱讀。
練習使用 Firmata 協定把 Processing 與 Arduino 連接起來,使用可變電阻 (potentiometer) 來控制 Processing 畫面上的矩形的水平移動。
註: 這篇跟「透過序列通訊把 Processing 與 Arduino 連接起來」一文所用的例子是一樣的,文中部份內容會重覆,對沒有看到該文的朋友來說,這樣比較方便閱讀。
練習透過序列通訊把 Processing 與 Arduino 連接起來。使用可變電阻 (potentiometer) 來控制 Processing 畫面上的矩形的水平移動。
由於安全性的因素,Flash Player 預設不允許 SWF 檔開啟本機的通訊端(local sockets),假如 SWF 檔會開啟 socket 通訊,當你在 Flash 開發環境外(例如 Flash Professtional CS5)開啟這個 SWF 檔時,Flash Player 會跳出底下這個「SecurityError: Error #2010: 不允許含檔案系統的本機(Local-with-filesystem) SWF 檔案使用通訊端」的警告訊息:
如果你需要在 Flash 開發環境外跑 Flash SWF 檔,不希望 Flash 太緊張跳出上面的警告訊息,那麼你必須修改 Flash 的安全性設定。底下提供兩個修改方法:
這是這系列的第三篇。
在前一篇中,你已經建立了一份 Flash 文件,並且使用 Flash Widgets 建立跟 Arduino 板子上可變電阻的連線了。下一步是加入一張圖片和一個 ClipControl 元件,利用可變電阻來控制圖片的移動,包括圖片的三維旋轉、縮放、陰影、模糊等效果。
1) 點選「檔案 > 匯入 > 匯入舞台...」或按 Ctrl+R 匯入任意一張圖片:
點選「修改 > 轉換成元件…」或按 F8 把圖片轉換成「影片片段」類型的元件:
這是這系列的第二篇。
在前一篇中,你已經把 Firmata 程式上傳到 Arduino 板子上,而且也安裝好 NETLab Toolkit 的 Flash Widgets 了。下一步是建立一個 Flash 文件,然後用 Flash Widgets 來連接 Arduino 板子上的可變電阻。
1) 首先,點兩下 NETLabHub.exe 打開 NETLab Hub 應用程式:
用 Flash Widgets 寫 Flash 程式不需要知道太多有關 Hub 的細節,因此,你只要把 Hub 打開放著就行了。
照著底下的步驟做,練習使用 NETLab Toolkit 的基本 Flash 元件,這系列教學將帶你入門教你學會使用 NETLab Tookit。
底下是範例情境的示意圖:
我們將在 Arduino 上跑 Firmata 程式,讓 Arduino 可以用 Firmata 協定跟外部的軟體溝通(在此為 Flash 程式),接著在電腦上跑 NETLab Hub 應用程式,你可以將 NETLab Hub 看做是一個序列通訊轉接成網路通訊的程式,最後再利用 NETLab Toolkit Flash widgets 寫一支 Flash 應用程式來與 Arduino 產生互動。
NETLab Toolkit 是一個實體互動速寫與製作藝術作品(tangible interaction sketching and production)的系統。它使新手和專家得以快速的整合硬體、媒體以及互動行為做出產品、設施裝備與研究。它整合了包括 Arduino 等微控制器(microcontrollers),而且透過其 Flash 元件(Flash Widgets)它提供了硬體和數位媒體速寫(media sketching)一個拖放的開發環境(drag-and drop environment),使用者不需撰寫程式碼。
Arduino | Makecontroller | XBee |
這是這系列的第二篇。
這篇教學將一步一步 (step by step) 教你在電腦上把 ArduinoMonitor 這支 Flash 程式跑起來。
讓我們先同步一下。我假設你對 Arduino 有一些基本的了解,而且也已經把 Arduino IDE 裝起來並玩過一些簡單的範例程式。假如你還沒接觸過 Arduino,建議你先閱讀底下的資料,這會比較容易讓你了解這篇教學在說什麼:
ArduinoMonitor 是一支 Flash 程式,它可以用來監測 Arduino 所有 I/O 的狀態。底下這張圖便是 ArduinoMonitor 的軟體介面:
▲ ArduinoMonitor (註: 上圖是以 Screenpresso 錄影再以 123 AVI to GIF Converter 轉成 GIF 動畫)
TinkerProxy 是一支基於 serproxy 可以把序列通訊轉接成網路通訊(Redirecting network socket connects to/from serial ports)的程式。相較於 serproxy,TinkerProxy 解決了 serproxy 無法在 Mac OSX 10.6 執行的問題。TinkerProxy 的組態設定檔(Configuration File)跟 serproxy.cfg 是完全相容的。
我假設你已經認識 serproxy,如果你不知道,在繼續往下讀之前,請先看「序列伺服器 serproxy 介紹」這篇。
TinkerProxy 可以在它的官網下載:
serproxy 是一支可以把序列通訊轉接成網路通訊(Redirecting network socket connects to/from serial ports)的程式。參考底下這張示意圖,serproxy 允許你透過網路跟 Arduino 建立通訊。
這是這系列的第二篇。
前一篇中提到,用 Arduino 做 AVR ISP Programming,我們用了兩張 Arduino 板子,一個是燒錄用的板子,叫作 ArduinoISP,另一個是要被燒錄 bootloader 的板子,稱為 Target board。其實 Target board 不一定非得使用 Arduino 板子不可,你也可以用麵包板當作 Target Board。
用麵包板做 Target Board,要準備的材料除了麵包板和 ATmega 晶片外,你還需要 4 個元件:
這篇教學教你怎麼把 Arduino 板子變成一個 AVR ISP 燒錄器(In-System Programmer),讓我們把它稱作 ArduinoISP。ArduinoISP 允許你用 Arduino 板子把 bootloader 燒錄到 AVR 晶片上,比如 Arduino 板子上所用的 ATmega168 或 ATmega328 晶片。