2011年4月26日 星期二

_BV() 巨集介紹

在 C 語言中,我們用 bit operators (位元運算子) 處理位元的運算 (Bitwise operation):

使用巨集會讓程式比較清晰易讀。在 avr-libc 函式中有個 _BV() 巨集,它接受一個數值參數而且會轉成適當的 bit mask (位元遮罩)。BV 是 Bit Value 的縮寫。

_BV() 巨集的定義為:

這允許我們這樣做:

2011年4月24日 星期日

同時執行多個活動與 TimedAction 函式庫簡介

底下是「不使用延遲的燈號閃爍程式(Blink without delay)」這篇的程式,它的功能是讓一顆燈號閃爍,每隔一秒切換一次燈號,而且不使用 delay() 延遲函式:

我們來把程式碼整理一下。

整理與 Blink 活動相關的程式碼

2011年4月23日 星期六

不使用延遲的燈號閃爍程式 (Blink without delay)

實驗目的
讓一顆燈號閃爍,每隔一秒切換一次燈號,而且不使用 delay() 延遲函式達成目的。
材料
  • Arduino 主板 x 1
  • LED x 1
接線
  • 把 LED 接到 Arduino 板子上,LED 長腳(陽極)接到 pin13,短腳(陰極)接到 GND,如下圖:

millis() 函式簡介

millis() 函式簡介

millis() 函式會回傳 Arduino 從開始執行程式一直到目前為止的千分之一秒數值(number of milliseconds),這個數值在大約 50 天後會溢位(overflow),屆時會從 0 開始計數。

範例程式

底下是一支範例程式(millis.pde),程式邏輯很簡單,每間隔一秒印出一次 millis() 的回傳值:

下圖是程式執行結果:

image
▲ 每隔一秒印出一次 millis() 的回傳值,單位是千分之一秒(millisecond)

2011年4月22日 星期五

用 millis() 量測 button 被按了多久

實驗目的

練習用 millis() 函式來量測 button 被按了多久的時間。

這次所需的材料與接線跟「用 pulseIn() 量測 button 被按了多久」這篇的實驗是一樣的。

材料
  • Arduino 主板 x 1
  • Pushbutton x 1
  • 10K 歐姆電阻 x 1
  • 麵包板 x 1
  • 單心線 x N

2011年4月21日 星期四

attachInterrupt() 與外部中斷

實驗目的

練習使用 attachInterrupt() 函式與外部中斷。在這個實驗中,你將利用 attachInterrupt() 函式設定中斷處理函式(Interrupt Service Routine, ISR),讓程式在 pin 2 產生外部中斷時自動執行 ISR。

材料
  • Arduino 主板 x 1
  • LED x 1
  • Pushbutton x 1
  • 10K 歐姆電阻 x 1
  • 麵包板 x 1
  • 單心線 x N

用 pulseIn 量測 button 被按了多久

實驗目的

練習用 pulseIn() 函式來量測 button 被按了多久的時間。

材料
  • Arduino 主板 x 1
  • Pushbutton x 1
  • 10K 歐姆電阻 x 1
  • 麵包板 x 1
  • 單心線 x N
接線
  • 把 pushbutton 一支腳接到 +5V,另一支腳接到 pin 2 同時接一顆 10K 電阻連到 GND

image

2011年4月14日 星期四

4) 撰寫可以跟 WinLIRC TCP Server 溝通的程式

這篇是給 WinLIRC 進階使用者或開發者看的。

WinLIRC TCP Server

WinLIRC 內部有一個 TCP Server,跑在 port 8765 上,最多同時可以有 16 個 clients 跟它連線。每當成功解出遙控器一個按鈕的紅外線編碼的時候,TCP Server 就會送出一行 ASCII 字串給所有的 clients,字串裏描述被按下的按鈕為何。每行字串以換行字元 ('\n’) 作結尾。例如,client 可能會看到像這樣的字串:

00000000000cc03f 00 play BenQ.cfg

這行表示遙控器被按下按鈕 (play 鈕)。如果遙控器被按下一段時間(連發),client 可能會看到這樣的東西:

00000000000cc03f 01 play BenQ.cfg
00000000000cc03f 02 play BenQ.cfg
00000000000cc03f 03 play BenQ.cfg
00000000000cc03f 04 play BenQ.cfg
00000000000cc03f 05 play BenQ.cfg
00000000000cc03f 06 play BenQ.cfg

資料格式說明如下:

2011年4月13日 星期三

3) WinLIRC 工具簡介

在閱讀這篇文章前,我假設你已經看過「WinLIRC 紅外線遙控電腦教學」這一系列的文章。

本篇將摘要介紹 WinLIRC 的軟體工具,你可以把這篇當做是 WinLIRC 的使用參考。

WinLIRC 目錄結構

WinLIRC 軟體不需安裝,下載回來後把壓縮檔解開即可。下圖顯示 WinLIRC 的目錄結構:

image
▲ 我用的是 WinLIRC 0.8.7a

如你所見,WinLIRC 有下列這些工具:

  • winlirc.exe: WinLIRC 主程式
  • IRGraph.exe: 紅外線繒圖工具
  • RawCodes.exe: 紅外線原始資料(raw data)檢視工具
  • IRRecord.exe: 紅外線解碼工具,用來產生遙控器的 Config 檔
  • Transmit.exe: 紅外線發射工具

底下將一一介紹這幾支工具。

2011年4月12日 星期二

2) 使用 WinLIRC Helper 遙控電腦

這篇文章將教你用 WinLIRC Helper 來遙控電腦,透過一個簡單的例子示範 WinLIRC Helper 的使用方法。

前提

在閱讀這篇文章前,我假設你已經看過「WinLIRC 紅外線遙控電腦教學」一文,而且也已經把電腦紅外線接收器連接到電腦上了。

目標

我們的目標是把電腦當成一個數位相框,用遙控器來切換圖片的播放。

準備工作

1) 請隨便找一支遙控器,然後參考「 1) 遙控器紅外線解碼」一文錄製遙控器按鈕的紅外線編碼,只要錄兩顆按鈕就好,一顆管它叫 left,用來切換上一張圖片,另一顆命名為 right,用來切換下一張圖片:

image
▲ 我用的是 BenQ MP612C 投影機的遙控器

2011年4月11日 星期一

1) 遙控器紅外線解碼 Part2

這篇是「1) 遙控器紅外線解碼」的第二部份。

使用 IRRecord 進行紅外線解碼

你可以用 WinLIRC 附的 IRRecord.exe 工具來為你的遙控器進行紅外線解碼。IRRecord.exe 的語法為:

IRRecord.exe -d SerialDevice.dll ..\BenQ.cfg
上列是使用 Serial 介面的紅外線接收器的指令,如果你用的是 Audio 介面的紅外線接收器,指令為:
IRRecord.exe -d AudioCapture.dll ..\BenQ.cfg
當解碼工作完成後,解碼結果將儲存在與 IRRecord.exe 同一個資料夾下的 BenQ.cfg 檔中。

1) 遙控器紅外線解碼 Part1

這篇教學將教你用 WinLIRC 來為你的遙控器進行紅外線解碼。

image
▲ 我用的是 BenQ MP612C 投影機的遙控器

WinLIRC 紅外線遙控電腦教學

LIRC 與 WinLIRC 簡介

你想用紅外線遙控器遙控電腦嗎? 不用起身或下床,只要坐在沙發或躺在床上,拿起遙控器就可以遙控電腦,叫 Winamp 換歌、操作 KMPlayer 或 PPS 播放想看的電影或電視節目、把電腦當成數位相框來遙控,用遙控器操作 Powerpoint 簡報的播放,或者用遙控器命令電腦做任何你想做的事...,你想過這種舒服的日子嗎?有了 LIRC/WinLIRC 這個套件,就可以讓你美夢成真用遙控器來遙控電腦。

LIRC (Linux Infrared Remote Control)是一個 Linux 紅外線遙控套件,它可以用來為遙控器進行紅外線解碼與發射紅外線。LIRC 支援大部份的遙控器。那什麼是 WinLIRC 呢? 沒錯,正如你所猜想的,WinLIRC 就是 Windows 版的 LIRC。

這一系列的教學,將教你使用 WinLIRC 來遙控電腦。

2011年4月8日 星期五

利順精密 DMARD03 三軸加速度計(Accelerometer)

實驗目的

練習用 Arduino 讀取 DMT DMARD03 三軸加速度計並透過 Serial port 把感測值印到電腦端。

這篇用的是利順精密(Domintech, DMT) 的 DMARD03 數位三軸加速度計(Accelerometer),在此要特別感謝彥陽科技 Johnny 與 Edison,謝謝你們提供我 DMARD03 模組。

材料

 image
▲ DMARD03 加速度計模組

2011年4月1日 星期五

紅外線物體偵測 (3)

IRremote 函式庫也可以做紅外線物體偵測,方法是用 IRremote 讓紅外線發射器 (IR LED) 產生 38 kHz 的脈波,然後用一般 38 kHz 的紅外線接收器來偵測訊號。

註: 在「紅外線物體偵測(1)」(反射型)和「紅外線物體偵測(2)」(遮光型)這兩篇的範例程式中,紅外線發射器(IR LED) 38 kHz 的脈波是利用 tone() 函式產生的。

線路的接法還是一樣,如下圖,把紅外線發射器串接一顆 100 歐姆的電阻接到 pin 3,然後把紅外線接收器接到 pin 2:

image

2.3 用光敏電阻切換電視頻道

實驗目的

練習用光敏電阻切換電視頻道。在這個實驗裏,你將練習用 IRRemote 函式庫發射紅外線訊號,然後搭配兩顆光敏電阻來切換電視頻道,當發現左邊比較亮時,就控制電視切到上一個頻道,當發現右邊比較亮時,就控制電視切到下一個頻道。

前提

在做這個實驗前,我假設:

  1. 你已經看過「IRRemote 紅外線遙控教學」這系列的教學,而且
  2. 已經把 IRRemote 函式庫安裝起來了
材料
  • 麵包板 x 1
  • Arduino 主板 x 1
  • 發射波長為 940nm 紅外線發射器 x 1
  • 100 歐姆電阻 x 1
  • 光敏電阻(photocell) x 2
  • 10k ohm 電阻 x 2
  • 單心線 x N

2.2 自製電視紅外線遙控器(使用 Keypad)

實驗目的

練習製作一個電視紅外線遙控器。在這個實驗裏,你將練習用 IRRemote 函式庫發射紅外線訊號,然後搭配一個 Keypad 做出一個電視遙控器。預計製作的紅外線遙控器,其外觀如下:

DSC00165
▲ Keypad 數字 0 ~ 9 是作選頻道用,而 * 鍵是降低音量,# 鍵是提高音量