2011年12月27日 星期二

ARDUINO VIDEO WORKSHOP

想學 Arduino 的人有福了,Stefan Hermann 今年給大家一個非常特別的耶誕禮物: 一個完整的 Arduino Video Workshop!

BlogfeatureLearningArduino
▲ Fritzing Starter Kit

總共有 14 集影片,濃縮了 Ardiono 的基礎知識,完全免費送給你! Stefan Hermann 祝福大家耶誕快樂:

We wish you all a Merry Christmas :)

1.

Learning Arduino Episode 001 – Electronic Basics
這集將說明電子基礎,例如電壓 (Voltage)、電流 (Current)、功率 (Power) 以及串聯電路 (Series Circuit) 和並聯電路 (Parallel Circuit)

2. Learning Arduino Episode 002 – Arduino introduction
這集介紹 Arduino 這塊板子
3. Learning Arduino Episode 003 – Digital Out with Blink
這集介紹什麼是數位訊號 (Digital Signal),教你如何上傳程式到 Arduino 板子上,並且介紹 Arduino 的軟體開發環境
4. Learning Arduino Episode 004 – Digital Out with SOS
這集介紹 loop 和 arrays 的使用方法
5. Learning Arduino Episode 005 – Breadboard Prototyping
麵包板 (Breadboard) 是一個可以讓你在短時間做出雛型的方便的工具,這集將介紹麵包板的使用方法
6. Learning Arduino Episode 006 – Digital In with a button
這集介紹 Digital Input 並解釋什麼是下拉電阻 (drop down resistor)
7. Learning Arduino Episode 007 – Amplification with a transistor
有時候你會需要電晶體 (Transistor) 來放大訊號,這集介紹電晶體的主要概念
8. Learning Arduino Episode 008 – Analog Out with Fading
這集說明 digital 和 analog signals 的差別,介紹 PWM (Pulse-Width Modulation),並利用 PWM 控制 LED 達到漸暗漸亮的效果
9. Learning Arduino Episode 009 – Analog In with Servo and Knob
這集介紹可變電阻 (potentiometer) 和伺服馬達 (Servo motor) 的使用方法
10. Learning Arduino Episode 010 – Analog In with Servo and LDR
這集介紹光感電阻 (Light Dependent Resistor, LDR) 並使用 LDR 控制 Servo
11. Learning Arduino Episode 011 – Serial communication
這集介紹怎麼把 Arduino 的資料送到電腦
12. Learning Arduino Episode 012 – FIRMATA
這集介紹如何用 Firmata Library 連接 Arduino 和 Processing
13. Learning Arduino Episode 013 – PCB layout with Fritzing
這集介紹怎麼把你的電路製作成 PCB 電路板
14. Learning Arduino Episode 014 – using modules
這集介紹 Arduino 的擴充模組。註: Arduino 的模組又稱 Shield

如果你想自學 Arduino 卻不得其門而入,現在只要買個 Arduino 入門套件,然後拿 ARDUINO VIDEO WORKSHOP 這系列教學影片搭配著看,一邊看影片,一邊做練習,相信很快就可以把 Arduino 給學會。

如果你習慣看文字說明,也可以參考「Arduino 入門教學」。

真是非常感謝 Stefan Hermann 的善舉! 為了表示對他的感謝,在此放他的玉照一張:

stefan_hermann

有了 ARDIONO VIDEO WORKSHOP 這系列教學影片,以後教 Arduino 可以翹著二郎腿輕鬆上課了。:)

參考資料

2011年12月25日 星期日

EasyTransfer over I2C bus

這篇適合進階的 Arduino 使用者。

先前我們介紹過 EasyTransfer Library - 一個可以讓兩台 Arduino 透過 Serial port 通訊的 Library:

image▲ 注意線路接法,TX 要接 RX,而 RX 要接 TX。

最近 EasyTransfer Library 版本更新了,現在EasyTrasnfer 不僅可以用在 Serial port 介面,也可以用在 I2C bus 上了。

image
▲ I2C 的連接方法,SDA, SCL, GND, 5V 分別接在一起,並在 SDA 和 SCL 上加個 4.7K 歐姆的提升電阻

2011年12月24日 星期六

如何讓 IRRemote 相容於 Arduino 1.0 ?

有很多人反應 IRRemote Library 在 Arduino 1.0 上不能跑,這是因為 Arduino 1.0 core library 把 header file 檔名改掉了,解決方法是把 IRRemoteInt.h 這行:

改成這樣子:

改完之後,不管是 Arduino 1.0 或 Arduino-0023 甚至更早期的版本應該都可以 work。

mArduino - 多台 Arduino 透過 I2C 通訊

image

在寫前一篇的時候,我突然想到「I2C bus 上最多可以有 128 個設備,Arduino 也可以透過 I2C 串在一起,而一台 Arduino 只有 14 個 digital pins 和 6 個 analog pins」,既然如此,「何不利用多台 Arduino 來擴充 I/O 呢?」。

於是我寫了一個 mArduino Library,可以讓 Master 很方便的控制 Slave 的 I/O pins 達到用多台 Arduino 擴充 I/O 的目的。

下載 mArduino Library

請點底下的網址下載 mArduino:

https://github.com/coopermaa/mArduino

image

mArduino 提供了 Blink, Fade 和 AnalogReadSerial 等三個 Master 範例和 General_slave 一個 Slave 範例。

多台 Arduino 間的通訊 - 透過 I2C #4

在前面幾篇 (#1, #2#3) 中,我們已經學會 Arduino 的 I2C 通訊 - 也就是 Wire Library 的基本用法,知道怎麼讓 Master 送資料給 Slave,而且也知道怎麼讓 Slave 送資料給 Master。

不管是讓 Master 送資料給 Slave,或者是讓 Slave 送資料給 Master,這些基本上都是單向的傳輸。其實當我們在使用 I2C 通訊的時候,實際情況下並不會這麼單純,因為很多 I2C 的電子設備通常都會用到雙向傳輸。

例如底下 DS1307 這個 Real Time Clock 就是一個很好的例子:

image
▲ DS1307 Real Time Clock

DS1307 時鐘用的正是 I2C 介面, 我們既可以用 Arduino 讀取 DS1307 的時間資訊:

2011年12月23日 星期五

多台 Arduino 間的通訊 - 透過 I2C #3

在前面兩篇 (#1#2) 中,我們已經學會如何讓 Master 送資料給 Slave,其實也可以反其道而行,Slave 也可以送資料給 Master,接下來我們就來學習怎麼做。

接線

image

老樣子,這兩台 Arduino 一台是 Master,一台是 Slave,其中 Slave 所用的 address 為 1。

程式

要叫 Slave 送資料給 Master 會涉及兩個動作:

  1. Master 必須用 Wire.requestFrom() 發出 request 給 slave
  2. Slave 在收到 request 後就把資料傳給 Master

多台 Arduino 間的通訊 - 透過 I2C #2

我們在前一篇已經學會使用 I2C 建立 Arduino 間的通訊,接著再來做個簡單練習: 把 Blink 範例做個改良,讓兩台 Arduino 的 LED 可以交替閃爍。

接線

image

接線方法跟前一篇一樣,只不過這次在兩台 Arduino 的 pin 13 都加了一顆 LED。

老樣子,這兩台 Arduino 一台是 Master,一台是 Slave,其中 Slave 所用的 address 為 1。

多台 Arduino 間的通訊 - 透過 I2C #1

今天我們要介紹怎麼讓多台 Arduino 互相通訊。我們所用的通訊協定是 I2C Protocol,I2C 只需要兩支腳位就可以讓設備建立通訊,這兩支腳位一個叫作 SDA (Serial DAta line),另一個叫作 SCL (Serial CLock Line)。在大部份的 Arduino 板子上,SDA 是在 analog pin 4,而 SCL 是在 analog pin 5。

接線

參考底下的接線圖連接你的 Arduino:

image

接線方法很簡單,你只要把每一台 Arduino 的 SDA (analog pin 4), SCL (analog pin 5), GND 和 5V 分別連接在一起就可以了。另外,最好在 SDA 和 SCL 上加個接到 5V 的 4.7K 歐姆提升電阻以確保預設電壓為高電位。

I2C 是 Master-Slave 的架構,Master 可以向 Slave 發出需求要資料或傳送資料。I2C bus 上最多可以有 128 個設備。在 I2C bus 上可以有多個 Master 和多個 Slave,不過為了避免複雜,通常我們只會用一個 Master。每個 Slave 都會有一個識別的號碼,叫作 Slave address,Master 要跟 Slave 通訊的時候,就利用 Slave address 指定要跟哪個 Slave 建立對話。

底下將示範怎麼讓兩台 Arduino 透過 I2C 建立通訊。這兩台 Arduino 一台是 Master,一台是 Slave,其中 Slave 所用的 address 為 1。

2011年12月22日 星期四

Arduino 1.0 的 serialEvent 介紹

我們在「Arduino 筆記 – Serial Library 介紹」這篇學到 Arduino 序列通訊 (Serial Communication) 的方法,知道怎麼用 Arduino 讀寫 serial port 的資料。新發佈的 Arduino 1.0 在序列通訊這部份加了一個新功能: serialEvent() 函式,這次我們將介紹 serialEvent()。

serialEvent() 是 Arduino 1.0 才有的新函式,用軟體術語來說 serialEvent() 是一個 callback,它會在 serial port 有資料的時候就自動被呼叫。所以你可以寫一個 serialEvent() 專門來接收 serial port 上的資料,此後只要 serial port 上一有資料,Arduino 便會自動呼叫你的 serialEvent() 函式。

底下將以實例說明 serialEvent() 函式的用法:

用 serialEvent() 讀資料

在「Arduino 筆記 – Serial Library 介紹」一文中有個讀取 serial port 的例子 (read.pde):

我們可以用 serialEvent() 來改寫這支程式:

2011年12月21日 星期三

Talk with Arduino using C# and Firmata

C# 也可以用 Firmata 協定跟 Arduino 通訊,方法是用 Firmata.NET 這個套件。

要讓微控制器 (Microcontroller) 跟電腦建立對話,通常使用者會花很多時間在處理通訊方面的問題。用 Firmata.NET 寫 C# 程式,最大的好處就是使用者不必煩惱通訊的繁瑣細節,而且程式風格跟寫 Arduino 的程式幾乎是一致的。

由於涉及 Arduino 與電腦兩端的程式,所以問題分成兩個部份:

  1. Arduino 端: 這部份很簡單,因為 Arduino IDE 已內建 Firmata,所以只要上傳 StandardFirmata 程式到 Arduino 板子上就可以了。使用者完全不需要寫 Arduino 的程式。
  2. PC 端: 這部份便是使用 Firmat.NET 與 C# 撰寫程式。
上傳 StandardFirmata 到 Arduino

打開 Arduino IDE,點選 File > Examples > Firmata > StandardFirmata 並將程式上傳到 Arduino 板子上:

image
▲ Arduino IDE

注意一件事,StandardFirmata 這支 Arduino 程式所用的序列通訊速率是 57600 bps,所以當你在寫 PC 端的程式在開啟 Serial port 時,記得也要把通訊速率設成 57600 bps,這樣 Arduino 跟 PC 的程式兩邊才能溝通。

image

2011年12月20日 星期二

C# Serial Port Communication #3

看完上一篇學會用 SerialPort.Write() 寫資料到 serial port 的方法後,接著我們來學習用 SerialPort.Read() method 讀取 serial port 的資料。SerialPort 有很多種 Read methods,例如 Read(), ReadByte(), ReadChar(), ReadExisting(), ReadLine(), ReadTo() 等,使用者可以根據需要挑選適合的來使用。

底下將以幾個例子示範如何讀取 SerialPort。

Arduino Sketch

我們在「Lab8 使用光敏電阻控制 LED 的開關」看過 Serial Port 的程式範例 (Photocell.pde),如下,這支程式非常的簡單,它的功能是讀取光敏電阻並將讀值輸出到 Serial Port:

我們可以用 Arduino IDE 內建的 Serial Monitor 來跟 Arduino 通訊。在把上列程式編譯並上傳到 Arduino 板子上後,打開 Serial Monitor,然後你就會看到 Serial Port 不斷地收到從 Arduino 傳送過來的光敏電阻讀值:

image_thumb17
▲ Serial Monitor 所用的 baud rate 必須與程式 Serial.begin(xxxx) 相同

請將這支 Arduino 程式上傳到 Arduino 板子上。接著我們來看如何用 C# 讀取 Arduino 丟出來的資料。

C# Serial Port Communication #2

我們在前一篇已經學會如何列出電腦上所有的 serial ports,接下來我們將學習 serial port 的使用方法,也就是怎麼開啟以及讀寫 serial port。

Open, Read, Write, Close

在開啟 serial port 之前,必須先設定 serial port。例如,假如你要用 COM5, 通訊設定使用 9600 的速率 (baud), 沒有 parity bit, 每個位元組為 8 個 data bits 加上 1 個 stop bit,那麼就要這樣設定 serial port:

設定好 serial port 後,接著就可以呼叫 SerialPort 物件的 Open() method 打開 serial port。為了預防意外,例如 「serial port 不存在」或是「serial port 已經被其它程式開啟了」等這些狀況,通常我們會把程式碼寫在 try … catch 區塊裏:

打開 serial port 之後,之後便可以用 ReadXXX, WriteXXX 之類的 methods 來讀寫 serial port,這部份後面將以實例介紹。最後,當你不需要使用 serial port 的時候,最好呼叫 Close() method 關閉 serial port 以免佔著資源:

C# Serial Port Communication #1

如果你有在玩電子或內嵌系統 (Embedded System),你會常常碰到需要讓電子設備跟電腦對話的情況,最簡單的通訊方式是使用 serial port。

這篇教學將告訴你怎麼用 C# 撰寫可以透過 serial port 跟電子設備通訊的程式。

System.IO.Ports namespace

在 C#,所有跟 serial port 通訊有關的類別都定義在 System.IO.Ports 這個 namespace,所以第一件事是引用 System.IO.Ports 這個 namespace:

列出所有的 Serial Ports

要怎麼知道你電腦上面有哪些 serial ports 可用呢?方法是用 SerialPort 的 GetPortNames() 這個 static method。所以,在跑完底下這行程式碼後:

所有 serial ports 的名稱都會被放到 serialPorts 這個字串陣列裏。

我們可以跑個簡單的迴圈把它印到 Console:

下圖是 ListPorts-Console 範例程式的執行結果:

image
▲ 下載範例程式:ListPorts-Console

假如是 GUI 介面的程式,可以像底下這樣用個簡單的迴圈把所有 serial ports 填到 ComboBox 裏:

上列最後兩行會選擇第一個可用的 serial port,假如電腦上有 serial port 的話。

把所有 serial ports 填到 ComboBox 裏有個更簡單的方法:

這種寫法只要一行程式就搞定,連迴圈都不用寫。

下圖是 ListPorts-GUI 範例程式的執行結果:

image
▲ 下載範例程式:ListPorts-GUI

參考資料

2011年12月1日 星期四

Serial2Keystroke

先前我們提到 Arduino Uno Keyboard 可以讓 Arduino 透過 USB 介面送出按鍵敲擊動作 (keystroke) 給電腦,不過 Arduino Uno Keyboard 目前僅限 Uno 或 Mega 2560 的板子才能使用。假如我們用的是 Duemilanove 或是其它只能走 Serial 通訊的 Arduino 板子,這樣也可以辦得到嗎?答案是可以的。方法是這樣:

基本上這個解法分成兩個部份:

1) 要有一支 Arduino sketch,這支程式負責送字元到 serial port

2) 我們還要一支 Serial-to-Keystroke 的 PC 端工具,這支程式會讀取來自 serial port 上的資料並且負責把資料轉換成 keystrokes

聽起來有點玄嗎?事實上是很簡單的。

下載本文範例及工具

這篇提到的範例跟工具我全部打包好了,你可以點底下的連結下載:

http://goo.gl/itpNS

Hello World

底下是一支很簡單的 Arduino sketch (senda.ino),它會每隔 1 秒鐘送出一個 "Hello World" 字串到 serial port:

請打開 Arduino IDE 把上面這支程式上傳到 Arduino 板子上。

2011年11月29日 星期二

Arduino USB Business Card

USB Business Card

有人做這樣的生意,叫作 USB Business Card,中文稱作 USB 名片或是隨身碟名片:

image
▲ 圖片來源: http://www.andreonicards.com

USB Business Card 既是名片,又是一個隨身碟,所以很適合隨身攜帶又可以拿來儲存資料,把它當作禮品送給客戶,是一個很聰明的形象推銷工具。

image
▲ 圖片來源: http://www.andreonicards.com

2011年11月27日 星期日

Arduino 滑鼠自動點擊器

承上篇,這次我們來做個 Arduino 滑鼠自動點擊器。

接線

我們用個可變電阻來調整滑鼠點擊的速度:

  • 可變電阻中間腳位接到類比輸入 (Analog Input) pin3,剩下的兩支腳位,一支接到 5V,另外一支接到 GND

image

image
▲ 完成圖

Arduino Uno Mouse

這次我們將使用 darran 所寫的 Arduino UNO MouseHID 讓 Arduino 變身成電腦滑鼠。我假設你已經知道如何更新 atmega8u2 的韌體,相關文章請參考「如何讓 Arduino Uno 進入 DFU mode」跟「如何用 FLIP 更新 Atmega8u2 的韌體 」。

準備設備

你需要一張 Arduino Uno 或是 Mega 2560 的板子,還有一條單蕊線:

image
▲ 用單蕊線主要目的是把 Arduino 切到 DFU mode

下載

請連到底下的網址取得 Arduino Uno Mouse HID:

http://goo.gl/RvNvP

下載解壓縮後,把 Arduino-mouse 資料夾放到 Arduino 速寫簿 (Sketchbook) 資料夾底下。Arduino 速寫簿 (Sketchbook) 資料夾的預設位置是在「我的文件 > Arduino」這個地方。

2011年11月26日 星期六

IR2Keystroke

實驗目的

我們將做一個紅外線轉成按鍵敲擊動作 (keystroke) 的應用,我們把它稱之為 IR2Keystroke。IR2Keystroke 會用到 USBKeyboard Library,因此請參見 USBKeyboard Library 先把 library 安裝起來。

材料
接線
  • 照下表連接 Arduino 跟紅外線接收器:
紅外線接收器接腳 Arduino 接腳
Vcc(+ 或 V+) +5V
GND(-) GND
Vout(或 OUT) pin 2。也可以接到其它 Digital pin,但程式要配合修改

image
▲ 有些紅外線接收器 GND 和 Vcc 是相反的,接線時請查閱你的 datasheet

USBKeyboard Library

簡介

USBKeyboard 是專門為 darran Arduino UNO Keyboard HID 而寫的一個 library。有了 USBKeyboard library,要讓 Arduino 送出鍵盤敲擊動作 (keystrokes) 給電腦會變得很簡單。我假設你已經學會「如何讓 Arduino Uno 進入 DFU mode」而且也已經知道「如何用 FLIP 更新 Atmega8u2 的韌體」,並且已讀過文後的參考資料。

安裝

USBKeyboard library 可以在底下的網址取得:

https://github.com/coopermaa/USBKeyboard

安裝方法很簡單,把檔案解壓縮放到 Arduino 速寫簿 (Sketchbook) 資料夾的 Libraries 資料夾底下或 arduino-00xx\libraries 資料夾下即可。Arduino 速寫簿 (Sketchbook) 資料夾的預設位置是在「我的文件 > Arduino」這個地方。

image

2011年11月25日 星期五

讀取鍵盤燈號狀態

承上篇,Arduino Uno Keyboard 除了可以讓 Arduino 送出按鍵敲擊動作 (keystroke) 給電腦外,還可以讀取鍵盤上的燈號狀態 (keyboard LEDs status),例如 Num Lock, Caps Lock 和 Scroll Lock。接著我們就來看個簡單範例,學習如何用 Arduino 讀取鍵盤的燈號狀態。

image

程式碼

這個範例程式放在 Arduino Keyboard 裏。請打開 Arduino IDE, 載入 "File > Sketchbook > Arduino-keyboard > ledStatus" 然後把程式上傳到 Arduino 板子上:

image

送出按鍵敲擊動作 (Send a keystroke)

承上篇,接著我們來看個很簡單的範例,來學習如何讓 Arduino 送出一個按鍵敲擊動作 (keystroke) 給電腦。

image 

程式碼

這個範例程式放在 Arduino Keyboard 裏。請打開 Arduino IDE, 載入 "File > Sketchbook > Arduino-keyboard > senda" 然後把程式上傳到 Arduino 板子上:

image

Arduino Uno Keyboard

在看過前兩篇文章後,相信你已經學會「如何讓 Arduino Uno 進入 DFU mode」而且也已經知道「如何用 FLIP 更新 Atmega8u2 的韌體 」。接下來我們來玩 Arduino Keyboard,我們將使用 darran 所寫的 Arduino UNO Keyboard HID 並且試著跑一支範例程式讓 Arduino 送出按鍵敲擊動作 (Keystroke) 給電腦。

準備設備

你需要一張 Arduino Uno 或是 Mega 2560 的板子,還有一條單蕊線:

image
▲ 用單蕊線主要目的是把 Arduino 切到 DFU mode

下載

請連到底下的網址取得 Arduino Keyboard 韌體:

http://goo.gl/EdSW2

下載解壓縮後,把 Arduino-keyboard 資料夾放到 Arduino 速寫簿 (Sketchbook) 資料夾底下。Arduino 速寫簿 (Sketchbook) 資料夾的預設位置是在「我的文件 > Arduino」這個地方。

2011年11月16日 星期三

如何用 FLIP 更新 Atmega8u2 的韌體

在前一篇中,我們已經知道如何讓 Arduino Uno 進入 DFU mode,這一篇我們來學習如何用 FLIP 更新 Atmega8U2 的韌體。我將以 Arduino-usbserial 示範如何燒錄韌體。

準備韌體檔

Arduino-usbserial 的韌體檔座落於 "arduino-00xx\hardware\arduino\firmwares\arduino-usbserial\" 這個資料夾:

image
▲ Arduino-usbserial-uno.hex  是給 Uno 用,而 Arduino-usbserial-mega 則是供 Mega 2560 使用

你也可以連到底下的網址,直接從網路下載 hex 檔:

http://goo.gl/OipyJ

下載畫面:

image

我的板子是 Uno,所以我選擇 Arduino-usbserial-uno.hex。

2011年11月15日 星期二

如何讓 Arduino Uno 進入 DFU mode

ATmega8U2 晶片簡介

Arduino Uno 跟先前的板子最大的不同,是不再使用 FTDI 的 USB-to-serial 晶片,取而代之的,是改用 Atmega8U2 這顆晶片當作 USB-to-serial 的轉換器,它的角色是扮演電腦 USB port 跟 Arduino 主控制器 Atmega328p serial port 之間的橋梁。。

image
▲  Atmega8U2 所在的位置

Atmega8U2 上面有韌體,出廠預設燒錄的是 Arduino-usbserial,功能就是做 USB-to-serial 的轉接,然而我們可以透過一個 叫作 DFU (Device Firmware Upgrade) 的 USB 協定來更新 Atmega8U2 的韌體。

所以,如果你要更新 Atmega8U2 的韌體,就得先讓 Atmega8U2 進入 DFU mode,然後再利用專屬的軟體來燒錄韌體,一般而言,在 Windows 上會用 FLIP,而在 MAC & Linux 則是使用 dfu-programmer。這篇我們先說明如何讓 Arduino 進入 DFU mode,下一篇接著介紹如何用 FLIP 更新 Atmega8U2 的韌體。

什麼情況下會需要更新 Atmega8U2 的韌體? 嗯,因為 Atmega8U2 很有彈性,它可以讓你更換成其它韌體,所以你的 Arduino 板子就可以搖身一變變成不同的 USB 裝置,例如 MIDI controller, HID 裝置 (Keyboard, Mouse, Joystick 等等)。

2011年11月13日 星期日

在 Windows XP 上安裝 Arduino Uno 驅動程式

Arduino Uno 是 2010 年的產品,先前我一直使用 Arduino Duemilanove,最近終於跟 Uno 有了接觸。

因為我還在使用 Windows XP,所以這篇記錄一下怎麼在 Windows XP 上安裝 Arduino Uno 驅動程式。相關資訊請參考「Arduino 筆記 - 準備開發環境」。

當你把 USB Cable 接到電腦上時,會出現「尋找新增硬體精靈」:

image

選擇「從清單或特定位置安裝(進階)(S)」後按「下一步」:

image

2011年11月12日 星期六

Netlab Toolkit 與紅外線遙控簡報上線

應德明財經科技大學顏榮泉老師的邀請,今天 (11/12) 到德明分享玩 Arduino 的心得,主題是「Netlab Toolkit and Arduino」與「Arduino 紅外線遙控」。非常感謝顏老師安排這次活動,讓我可以與在場媒計系、資管系、資科系老師、政大資科系沈錳坤老師以及數名研究生分享交流,同時也感謝你們幫忙準備上課器材,讓這次活動得以順利進行。

今天上課的簡報已上線,可以在底下取得:

2011年10月29日 星期六

利用 Dropbox 同步你的 Arduino Sketches

Dropbox 很簡單好用,所以大受歡迎。底下分享一個小技巧,這個技巧可以讓你在不同電腦或作業系統 (Mac, Linux 或 Windows) 之間同步你的 Arduino Sketches。

install_graphic
▲ 圖片來源: Dropbox 

方法很簡單,只要兩個步驟:

首先,把你的 Arduino Sketches 以及 Libraries 放到 Dropbox 資料夾:

image

接著到 Arduino Prefrences 視窗把 Sketchbook location 設定到這個資料夾:

image

這樣就完成了。之後你就可以在不同電腦或是不同作業系統上同步與使用你的 Arduino sketches。真是方便!

image
▲ Arduino Sketchbook

UsbKeypad for Arduino

上一篇中我們自製了一個 USBKeyboard,這次來自製一個 USB 數字鍵盤 (Numeric USB Keypad)。

image
▲ USBKeypad: 照片來源

準備材料

除了 Arduino 板子和 USB Shield 外,你還需要一個 Keypad:

image

關於 Keypad 的介紹與使用方法,請參考我寫的「Arduino 筆記 – Lab18 讀取 3x4 Keypad 的輸入」這篇筆記。

2011年10月27日 星期四

v-usb for arduino USBKeyboard

USBKeyboard 是 V-USB for arduino 這個計畫所提供的一個範例,它實作了一個很簡單的 USB 鍵盤裝置。

這個範例名字其實取得不好,因為它並沒有真正做出一個 USB 鍵盤,事實上這個範例只用到一個按鈕,程式會在按鈕被按下時,送出 "hello world" 跟一個 Enter 的鍵盤訊息給電腦,所以也許應該把它稱作 USB Helloworld Button 比較恰當。先不管這個問題,我們還是繼續沿用 USBKeyboard 這個名字。

接下來,我們就來自製這個 USBKeyboard 吧。

硬體電路

首先,你必須為 Arduino 做個 USB Shield,底下是一個參考電路,由於 USB D+ 和 D- 用 3.3V 的電壓,因此在 D+ 和 D- 上使用稽納二極體 (Zener diodes)。你必須確保 D- 準位在 2.5V 與 3.6V 之間。

image_thumb135

2011年10月24日 星期一

V-USB examples for Arduino

我把 V-USB 提供的 4 支範例程式 (custom-class, hid-mouse, hid-custom-rq, hid-data) 移植到 Arduino 上了,現在你只要用 Arduino IDE 就可以上傳這 4 支範例程式:

image

在你開始之前,我希望你已經看過「V-USB 簡介」一文,知道 V-USB 是什麼,而且也希望你看過底下這幾篇,因為這 4 支範例程式的使用方法都寫在這幾篇裏,在這我就不再重述了:

準備硬體

要在 Arduino 上跑 V-USB 這 4 支範例程式,首先你必須準備一張 USB Shield。底下是一個參考電路,由於 USB D+ 和 D- 用 3.3V 的電壓,因此在 D+ 和 D- 上使用稽納二極體 (Zener diodes)。你必須確保 D- 準位在 2.5V 與 3.6V 之間。

image_thumb135

實物照片:

image
▲ 圖片來源: galileo  的 USB Shield

下載與安裝範例程式

Arduino 版的 V-USB 範例程式可以在底下的鏈結中取得:

下載後把檔案解壓縮到 Arduino-00xx\libraries 資料夾下,或是放到 Arduino 速寫簿(Sketchbook)資料夾的 Libraries 資料夾底下也行。

韌體調整

接著韌體要做兩個調整:

  1. 修改 usbconfig.h:  定義所用的 D+ 和 D- data lines 腳位。必須根據你的硬體調整 USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT 和 USB_CFG_DPLUS_BIT。其它不需要修改。 
  2. 這點很重要!由於 Arduino 的 timer0 ISR 執行時間太久,會影響 V-USB 的運作,所以你必須修改 Arduino-00xx\hardware\arduino\cores\arduino\wiring.c 的 Timer0 ISR,把 "sei();" 加到 ISR 的第一行,像這樣子:

完成之後,你就可以用 Arduino IDE 打開範例程式並且上傳到 Arduino 板子上執行。

就這樣!

希望你可以順利使用這四支範例程式。如果你遇到什麼困難,歡迎留言或寫信來詢問。

延伸閱讀

2011年10月21日 星期五

V-USB hid-data 範例解說

承上篇,這篇將摘要說明 V-USB hid-data 範例程式。

hid-data 分成韌體和指令列工具 (commandline) 兩個部份。

韌體

usbconfig.h

底下是 hid-data 對 usbconfig.h 所做的調整:

  • USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT 與 USB_CFG_DPLUS_BIT

這些設定 USB bus D+ 和 D- 所用的接腳。預設是:

#define USB_CFG_IOPORTNAME      D
#define USB_CFG_DMINUS_BIT      4
#define USB_CFG_DPLUS_BIT       2

  • #define USB_CFG_HAVE_INTRIN_ENDPOINT    1

這個設定 interrupt-in endpoint 1,這是 HID device 的必要選項。

  • #define USB_CFG_INTR_POLL_INTERVAL      100

這個設定 interrupt-in endpoint 1 的 poll interval,單位為 miliseconds,不能小於 10 ms。

  • USB_CFG_VENDOR_ID 與 USB_CFG_DEVICE_ID

這些設定 VID 和 PID。預設是:

#define  USB_CFG_VENDOR_ID       0xc0, 0x16
#define  USB_CFG_DEVICE_ID       0xdf, 0x05

資料表示方式是 low byte first,VID 0x16c0 和 PID 0x05df 是 obdev 提供的共享 VID/PID。

  • USB_CFG_DEVICE_NAME and USB_CFG_DEVICE_NAME_LEN

這些設定 Device Name 和資料長度,hid-data 把 Device Name 設成 "DataStore",資料長度是 9:

#define USB_CFG_DEVICE_NAME     'D', 'a', 't', 'a', 'S', 't', 'o', 'r', 'e'
#define USB_CFG_DEVICE_NAME_LEN 9

  • USB_CFG_DEVICE_CLASS 與 USB_CFG_INTERFACE_CLASS

這些設定 Device Class 和 Interface Class。hid-mouse 的設定為:

#define USB_CFG_DEVICE_CLASS        0
#define USB_CFG_INTERFACE_CLASS     3

USB 有定義一些常用的 device class,可在 USB Class Codes 這個頁面中找到,0 代表由 interface 指定。而 interface class 定義 3 代表這個是 HID Class。

  • #define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH    22

這個設定 HID report descriptor 的資料長度。你必須在程式裏定義一個叫 usbHidReportDescriptor 的陣列,用來存放 report descriptor,而且陣列 size 要跟這個設定一致為 22 bytes 才行。

  • USB_CFG_IMPLEMENT_FN_READ 與 USB_CFG_IMPLEMENT_FN_WRITE  

這會設定呼叫 usbFunctionWrite() 來處理 control-out transfer,而用 usbFunctionRead() 來處理 control-in transfer:

#define USB_CFG_IMPLEMENT_FN_WRITE      1
#define USB_CFG_IMPLEMENT_FN_READ       1

main.c

主程式分成 main() 和 usbFunctionSetup() 兩個函式。關於 main() 和 usbFunctionSetup() 兩個函式的說明,請參考「V-USB custom-class 範例解說」一文。

在這個範例程式中,main loop 的工作很單純,只是不斷呼叫 usbPoll() 讓 driver 處理工作。根據 V-USB 的說明,usbPoll() 至少每 50 ms 要跑一次。

底下是 hid-data的 usbFunctionSetup():

程式的邏輯是透過 bRequestRequest 判斷是不是 class request,假如是,再依 bRequest 判斷是哪一種 class request (Get Report, Set Report, Get Idle, Set Idle, Get Protocol 或 Set Protocol)。hid-data 只處 Get Report 和 Set Report 兩個 requests。在這個範例中,Get Report 是傳回 feature report 給 Host,而 Set Report 則是接收來自 host 端的 feature report。因為只有一個 feature report,所以 Get/Set Reports 沒有進一步判斷 ReportType (wValue high byte) 和 Report ID (wValue low byte)。

當收到 Get Report 或 Set Report 的 request 時,usbFunctionSet() 並沒有馬上把資料傳給 Host,而是回傳 USB_NO_MSG 讓 V-USB Driver 呼叫 usbFunctionRead() 和 usbFunctionWrite() 來處理。

usbFunctionRead() 的實作如下:

只是單純從 eeprom 讀取一塊資料 (data chunk) 並放到 buffer 給 Driver 處理。

而 usbFunctionWrite() 的實作如下:

也只是單純把從 host 收到的一塊資料 (data chunk) 寫到 eeprom。

HID Report  Descriptor

底下是 hid-data 所定義的 HID Report Descriptor:

上列定義一個 Feature Report,資料長度為 128 bytes。

指令列工具 (commandline)

指令列工具包含 hiddata.c 和 hidtool.c。hid-data 把開啟 USB device 以及 Get Report 和 Set Report 的功能集中到 hiddata.c。

主程式 hidtool.c 只是間接呼叫 hiddata.c 中的 usbhidGetReport() 和 usbhidSetReport(),假如是 usbhidGetReport() 會將收到的資料以 hex format 印出,除此之外,沒有值得一提的地方。

hid-data 利用 usb_control_msg() 發送 control message,usb_control_msg() 的原型為:

int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout);

以 Get Feature Report 為例,呼叫方法為:

其中 USB_TYPE_CLASS 指定 Class request,USB_RECIP_DEVICE 指定接收者為 Device,而 USB_ENDPOINT_IN 則是指定 Control-IN transfer。USBRQ_HID_GET_REPORT 表示 Get Report 的 request,而 wValue 高位元組為 USB_HID_REPORT_TYPE_FEATURE 表示要取 Feature Report,而低元組是 report number,在此為 0。

而 Set Feature Report 的呼叫方法則為:

其中 USB_ENDPOINT_OUT 指定 Control-OUT transfer。

延伸閱讀

2011年10月20日 星期四

V-USB hid-custom-rq 範例解說

承上篇,這篇將摘要說明 V-USB hid-custom-rq 範例程式。

hid-customer-rq 分成兩個部份:韌體和 PC 端的指令列工具 (commandline)。

hid-custom-rq 的功能跟 custom-class 範例一樣,因此底下的內容大部份都跟 custom-class 雷同。hid-custom-rq 跟 custom-class 不一樣的地方,在於 hid-custom-rq 是宣告成 HID device。

韌體

usbconfig.h

底下是 hid-custom-rq 對 usbconfig.h 所做的調整:

  • USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT 與 USB_CFG_DPLUS_BIT

這些設定 USB bus D+ 和 D- 所用的接腳。預設是:

#define USB_CFG_IOPORTNAME      D
#define USB_CFG_DMINUS_BIT      4
#define USB_CFG_DPLUS_BIT       2

  • #define USB_CFG_HAVE_INTRIN_ENDPOINT    1

這個設定 interrupt-in endpoint 1,這是 HID device 的必要選項。

  • #define USB_CFG_INTR_POLL_INTERVAL      100

這個設定 interrupt-in endpoint 1 的 poll interval,單位為 miliseconds,不能小於 10 ms。

  • USB_CFG_VENDOR_ID 與 USB_CFG_DEVICE_ID

這些設定 VID 和 PID。預設是:

#define  USB_CFG_VENDOR_ID       0xc0, 0x16
#define  USB_CFG_DEVICE_ID       0xdf, 0x05

資料表示方式是 low byte first,VID 0x16c0 和 PID 0x05df 是 obdev 提供的共享 VID/PID。

  • USB_CFG_DEVICE_NAME and USB_CFG_DEVICE_NAME_LEN

這些設定 Device Name 和資料長度,hid-custom-rq 把 Device Name 設成 "LEDCtlHID",資料長度是 9:

#define USB_CFG_DEVICE_NAME     'L', 'E', 'D', 'C', 't', 'l', 'H', 'I', 'D'
#define USB_CFG_DEVICE_NAME_LEN 9

  • USB_CFG_DEVICE_CLASS 與 USB_CFG_INTERFACE_CLASS

這些設定 Device Class 和 Interface Class。hid-custom-rq 的設定為:

#define USB_CFG_DEVICE_CLASS        0
#define USB_CFG_INTERFACE_CLASS     3

USB 有定義一些常用的 device class,可在 USB Class Codes 這個頁面中找到,0 代表由 interface 指定。而 interface class 定義 3 代表這個是 HID Class。

  • #define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH    22

這個設定 HID report descriptor 的資料長度。你必須在程式裏定義一個叫 usbHidReportDescriptor 的陣列,用來存放 report descriptor,而且陣列 size 要跟這個設定一致為 22 bytes 才行。

V-USB hid-mouse 範例解說

承上篇,這篇將摘說明 V-USB hid-mouse 範例程式。

usbconfig.h

底下是 hid-mouse 對 usbconfig.h 所做的調整:

  • USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT 與 USB_CFG_DPLUS_BIT

這些設定 USB bus D+ 和 D- 所用的接腳。預設是:

#define USB_CFG_IOPORTNAME      D
#define USB_CFG_DMINUS_BIT      4
#define USB_CFG_DPLUS_BIT       2

  • #define USB_CFG_HAVE_INTRIN_ENDPOINT    1

這個設定 interrupt-in endpoint 1,這是 HID device 的必要選項。

  • #define USB_CFG_INTR_POLL_INTERVAL      100

這個設定 interrupt-in endpoint 1 的 poll interval,單位為 miliseconds,不能小於 10 ms。

  • USB_CFG_VENDOR_ID 與 USB_CFG_DEVICE_ID

這些設定 VID 和 PID。預設是:

#define  USB_CFG_VENDOR_ID       0xc0, 0x16
#define  USB_CFG_DEVICE_ID       0xe8, 0x03

資料表示方式是 low byte first,VID 0x16c0 和 PID 0x03e8 是 obdev 提供的共享 VID/PID。

  • USB_CFG_DEVICE_NAME and USB_CFG_DEVICE_NAME_LEN

這些設定 Device Name 和資料長度,hid-mouse 把 Device Name 設成 "Mouse",資料長度是 5:

#define USB_CFG_DEVICE_NAME     'M', 'o', 'u', 's', 'e'
#define USB_CFG_DEVICE_NAME_LEN 5

  • USB_CFG_DEVICE_CLASS 與 USB_CFG_INTERFACE_CLASS

這些設定 Device Class 和 Interface Class。hid-mouse 的設定為:

#define USB_CFG_DEVICE_CLASS        0
#define USB_CFG_INTERFACE_CLASS     3

USB 有定義一些常用的 device class,你可以在 USB Class Codes 這個頁面中找到,0 代表由 interface 指定。而 interface class 定義成 3 代表這個是 HID Class。

  • #define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH    52

這個設定 HID report descriptor 的資料長度。你必須在程式裏定義一個叫 usbHidReportDescriptor 的陣列,用來存放 report descriptor,而且陣列 size 要跟這個設定一致為 52 bytes 才行。

main.c

主程式分成 main() 和 usbFunctionSetup() 兩個函式。關於 main() 和 usbFunctionSetup() 兩個函式的說明,請參考「V-USB custom-class 範例解說」一文。

在這個範例程式中,main loop 利用 usbInterruptIsReady() 檢查 Interrupt-In endpoint 1 的 buffer 是否可用,假如可以,便呼叫 advanceCircleByFixedAngle() 計算新的滑鼠座標,接著再呼叫 usbSetInterrupt() 把 reportBuffer 傳給 Host:

底下是 hid-mouse 的 usbFunctionSetup():

程式的邏輯是透過 bRequestType 判斷是不是 class request,假如是就依 bRequest 判斷是哪一種 class request (Get Report, Set Report, Get Idle, Set Idle, Get Protocol 或 Set Protocol)。hid-mouse 只處理 Get Report, Get Idle 和 Set Idle 這三個 requests。除了 Get Report 是必要的外,其它兩個 requests 可以省略不寫。事實上因為 Host 端的 HID Driver 已經知道 report 的格式,所以其實 host 也不會發出這些 requests。

HID Report  Descriptor

底下是 hid-mouse 所定義的 HID Report Descriptor:

上列定義一個標準滑鼠,有三個按鈕,X 和 Y 軸的相對座標,以及一個滾輪 (wheel)。而 report 的資料結構如下:

底下簡單說明這個 Report Descriptor 的結構:

首先,必須先定義 Buttons,總共有 3 個 Button:

每個 Button 狀態不是 0 就是 1:

3 個 Button 總共是 3 個位元:

這 3 個位元是 INPUT report:

其它 5 個位元是填充位元 (padding bits):

最後定義 X, Y 和滾輪:

把它們全當成 1 byte 的 signed integer,值域為 -127  到 +127:

每個 8 位元,總共 3 個:

把它們宣告成 INPUT report:

最後告訴電腦這是一個滑鼠:

就這樣。關於 HID Report Descriptor,你也可以參考「HID Report Descriptor 教學」這幾篇文章。

延伸閱讀

2011年10月1日 星期六

Arduino 1.0 RC 簡報上線

應 Openlab Taipei 社群發起人鴻旗的邀請,今天下午 (10/1) 到寶藏巖分享玩 Arduino 的心得,主題是「Openlab Taipei 共玩 Co-Play #12 Arduino 1.0 分享」,很榮幸可以跟與會的朋友介紹 Arduino 1.0 的新特色,這次聚會認識了幾位朋友,Ben, David, 達達, rick, 阿航還有一位不知名的正妹等。非常感謝鴻旗的邀請。

簡報已上線,可以在底下取得:

2011年9月27日 星期二

V-USB custom-class 範例解說

這篇將摘要說明 V-USB custom-class 範例的程式碼。要讀這篇,讀者必須對 USB 有足夠的認識。

customer-class 分成兩個部份:韌體和 PC 端的指令列工具 (commandline)

韌體

usbconfig.h

usbconfig.h 是 V-USB 的設定檔,每個 V-USB 的程式都會從 V-USB 的 usbconfig-prototype.h 複製過來並改名為 usbconfig.h 然後根據自己的硬體調整設定。

底下是 custom-class 對 usbconfig.h 所做的調整:

  • USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT and USB_CFG_DPLUS_BIT

這些設定 USB bus D+ 和 D- 所用的接腳。預設是:

#define USB_CFG_IOPORTNAME      D
#define USB_CFG_DMINUS_BIT      4
#define USB_CFG_DPLUS_BIT       2

  • USB_CFG_VENDOR_ID and USB_CFG_DEVICE_ID

這些設定 VID 和 PID。預設是:

#define  USB_CFG_VENDOR_ID       0xc0, 0x16
#define  USB_CFG_DEVICE_ID       0xdc, 0x05

資料表示方式是 low byte first,VID 0x16c0 和 PID 0x05dc 是 obdev 提供的共享 VID/PID。

  • USB_CFG_DEVICE_NAME and USB_CFG_DEVICE_NAME_LEN

這些設定 Device Name 和資料長度,custom-class 把 Device Name 設成 "LEDControl",資料長度是 10:

#define USB_CFG_DEVICE_NAME     'L', 'E', 'D', 'C', 'o', 'n', 't', 'r', 'o', 'l'
#define USB_CFG_DEVICE_NAME_LEN 10

  • USB_CFG_DEVICE_CLASS = 0xff

這個設定 Device Class。USB 定義了一些常用的 device class,你可以在 USB Class Codes 這個頁面中找到。0xff 代表的是 "Vendor Specific",也就是廠商自行定義的 function。

2011年9月21日 星期三

Arduino 1.0 RC 嚐鮮

Arduino 1.0 RC 已在 17 日開放下載,有興趣嚐鮮的人,可以在底下的網址取得:

http://code.google.com/p/arduino/wiki/Arduino1

讓我們來看看新版 IDE 做了哪些改變:

新的啟動畫面:

image

操作介面換了新的顏色風格、工具列的圖示 (Icon) 也除舊佈新了:

image

比較值得注意的是,Arduino sketch 副檔名原先使用 .pde (沿用自 Processing),現在已經全面改成 .ino。

編輯器下方的狀態列 (status line) 現在會顯示所用的 Board name 與 serial port:

image

編譯 (Verify) 與上傳 (upload) 會有進度顯示 (Progress bar):

2011年9月20日 星期二

Arduino 早餐來了!

image

Arduino 原創者 Massimo Banzi 本月 18 日在 Maker Faire New York 揭露了數個新款 Arduino 板子。前一天,Arduino 官方 blog 率先公佈了這則消息。根據官網的說明,這次 Arduino 有令人驚喜的新產品:

Arduino 1.0

image

在經過數年的發展後,Arduino API, IDE 以及 boards 的設計終於底定,本月 18 日將釋出 Arduino 1.0 RC 版,到時你可以在這裏下載,而之後再經過 1 個月的壓力測試後,官網就會正式公佈 Arduino 1.0 的版本。

2011年9月16日 星期五

V-USB hid-data

hid-data 是 V-USB 所附的一個範例,它示範如何透過 HID feature report 傳送固定大小的資料區塊 (blocks of data) 以讀取或寫入 eeprom 裏的內容。由於 Windows 內建 HID driver,因此 Windows 不會要求安裝驅動程式。這個範例同時也示範如何用 usbFunctionWrite() 和 usbFunctionRead() 傳送資料。

下載

hid-data 包在 V-USB 套件裏:

http://www.obdev.at/products/vusb/download.html

韌體調整

hid-data 需要調整的地方跟 hid-custom-rq 一樣:

● usbconfig.h:


定義所用的 D+ 和 D- data lines 腳位。必須根據你的硬體調整 USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT 和 USB_CFG_DPLUS_BIT。

● Makefile:


定義所用的 MCU 以及時脈頻率,必須根據你的硬體調整 DEVICE 和 F_CPU。

編譯韌體

下指令編譯韌體,你會需要 WinAVR:

cd hid-data/firmware 
make hex

接著把韌體燒錄到板子上,讓裝置重新上電,然後,「裝置管理員」視窗裏就會出現剛剛安裝的裝置,不用安裝驅動程式:

image_thumb2
▲ Windows 會將新裝置當成「HID-compliant device」

編譯 PC 端指令列工具 (commandline)

下指令編譯 PC 端指令列工具,你會需要 MingGW 和 MSYS:

cd hid-custom-rq/commandline 
make -f Makefile.windows

這會產生 hid-tool.exe。

使用 hid-tool

底下示範 hid-tool 的用法:

讀取 eeprom:

image

寫資料到 eeprom:

image 

hid-data 所用的資料區塊大小為 128 bytes。

延伸閱讀