因應Arduino Software 0017已大幅修正Example內的範例程式
未來新版的教學內容,將開始修正,採用新版之範例檔案路徑
但原2009交大教學課程之範例路徑將維持不變(即範例程式標有File > Sketchbooks > Example > ... 之類的路徑),程將保持為更新前的範例路徑,未來會於原教學課程標明新版之對應檔案。
2009年10月9日 星期五
2009年5月18日 星期一
邁向互動達人的第五堂課. 大雜匯
Melody
學了那麼多,來讓Arduino發個聲

程式檔:make_sound.pde
#Make a Light Theremin
利用光敏來做個Theremin的小雛形

程式檔:Theremin.pde
那怎麼讓它能夠發出節奏或音階勒?再來個小練習

程式檔:PlayMelody.pde
不小心答應要教的東西:LED Matrix
這個案例請有心理準備,接線有點繁複
我們使用5x7的LED矩陣,這顆LED矩陣是5pin負,7pin正
可以看到,這種市售的LED的pin腳都比較雜亂,不像我們之前用的LED單純就只分兩邊
所以開始我們的接線地獄:

接好後,我們用個小程式來測試測試,看看接的有沒有問題,這個程式會依序一個一個亮燈
程式檔:LEDmatrix_test.pde
那怎麼像我們之前一樣可以顯示圖形勒?
我們回過頭來講一下LED矩陣的概念,我們透過一個正pin接一個負pin可以精準地讓一個點亮燈,然而,若同時用一個正pin五個負pin,會發生什麼是勒?試試看
接下來,讓我們來實作小"紅"人!!
程式檔:LEDmatrix_5x7.pde
2009年5月11日 星期一
邁向互動達人的第四堂課. Motor
Motors
在我們生活的周遭,馬達的應用可說是無所不在:
震動:PS2手把. 手機. 按摩器.
轉動:鐵捲門. 歐拖拜. 電風扇
生電:發電機
#DC motor
DC馬達的接法其實很簡單,就是知道吃多少電,然後把電池接上去就會轉,而反接就反轉
然而,這樣的話我們就不用在這裡教了,當然要用Arduino去控制,還需要多做些什麼...
大家可以先試試看,直接用Arduino的Digital out去控制馬達,看看會發生什麼事?

程式檔:director_motor.pde
當然,我們使用小馬達時,這樣做是沒什麼問題(但有時馬達會把Arduino的電給吃了),但若我們開始要控制更大的馬達,例如9V或12V,甚至更大顆的,就不可能直接用arduino提供電力,因為Arduino最多也只能提供5V的電力,我們該怎麼做勒?
我們需要用電晶體來幫助我們做更多事情...

這裡使用NPN型TIP120這顆電晶體,電晶體的三隻腳分基極(base).集極(collector).射極(emitter),電晶體最常被拿來做電路控制的開關使用,可以看到電路是由集極->射極,平常是斷路的,而經由基極給的訊號來決定開關,LOW就斷路,HIGH就開通,就是這麼簡單。
這樣就可以應用在電路上作為使用
左邊的是小電流電路(即Arduino自我供電用),而右邊的則是大電流電路使用(即需外部供電的馬達所使用的電路)

然而,之前也講過,馬達是可以被當來做發電使用,將轉動的能量透過磁力轉化成電力,越大的馬達在轉動時,越有可能產生電能,會有電流逆流的問題產生,使得我們的控制電路會有短路的可能,所以我們得加上個二極體,讓有可能產生的電力回去給馬達使用。

# 中場練習
利用可變電阻,用Arduino讀取變動值,來控制馬達轉動

更進一步,可以用Serial port來控制
程式檔:SerialMotorSpeed.pde
來看看用馬達做的小東西:
#Sevor motor
伺服馬達跟DC馬達比較不同,DC馬達是供電就不停地轉動,而伺服馬達是透過PWM訊號供給的時間長短來決定,而伺服馬達有分兩種:
(1) 360度不停轉的,會依照PWM時間長短,決定轉動快慢與轉動方向
(2) 定角度的,會依照PWM時間長短,在0~180度角間,精準地控制要擺到那個角度
這裡我們用定角度的,來簡單說明原理:

可以看見,根據你送的時間就可以決定你要轉到那個地方,而這就是伺服馬達誘人的地方,不需太多額外的機構,可以輕鬆處理你想做的效果。
[接線]
喔,這裡得提一下,坊間買得到的伺服馬達會有兩種顏色配對的接線:
(紅.黑.白)~ 對應 V+. GND . 訊號pin
(紅.棕.橘)~ 對應 V+. GND . 訊號pin
理解了,我們就可以來運用一下,把V+.GND先接上,訊號pin接到Arduino pin 9
程式檔:File > Sketchbooks > Example > Library-Servo > Sweep
這個範例的控制細節,Servo.h這個Library都幫你把麻煩的部份處理好了,只需作事先呼叫Servo類別的變數,例如myservo,再attach(pin)指定用那個pin(注意,這個lib只供給9跟10兩個PWM輸出pin的使用),然後作myservo.write(角度),就可以控制啦。
然而,我們課堂使用的servo馬達,這顆GWServo S35/STD 的360度轉的,會有部分電流逆衝的問題,需要增加一顆二極體於pin9->訊號pin之間,讓電流只能由單向通過,來減少板子因逆衝而暫停的可能。

在學習完基本的馬達控制後,可以到flying-pig的網站裡(首頁右下角有個Mechanisms的連結,或直接點上面圖片link過去),裡面整理了各種機構設計的基本觀念,可以用在你的裝置實作上面。
2009年5月4日 星期一
邁向互動達人的第三堂課. Communication
之前的課程都是僅僅透過Arduino與電路做操作,今天我們要開始嘗試把Arduino跟電腦連起來,把電腦當做Arduino的擴充裝備,可以做更多的應用。
#ex1. Arduino ➝ Computer

程式檔:ardrino2computer.pde
我們可以先用Arduino Software提供的Serial Monitor來先測試Arduino板子端是否運作正確。

那我們現在試著用Processing來串串看Arduino,先試著下面這個最簡單的processing範例~
程式檔: 「Processing」SimpleRead.pde
p.s. 在Arduino中的print指令送到其他介面時,需要注意一下~
print:
Prints data to the serial port.
單純的你寫什麼就送什麼...
println:
Prints a data to the serial port, followed by a carriage return character(ASCII 13, or '\r') and a newline character (ASCII 10, or '\n'). This command takes the same forms as Serial.print().
就是在你要送出的資料(字串或數字)後,自動再加上ASCII 13(return)與10(換行)。
所以隨之就有該注意的地方產生,若在接收端的處理是必須有個結束字元時,就得注意該用哪種方法。
#ex2. Computer ➝ Arduino
接下來,我們來嘗試由電腦端來控制Arduino做事情

程式檔:computer2arduino.pde
先試試由Arduino Software的Serial Monitor中,直接輸入H/L,來控制看看
再試著用Processing來串串看Arduino,先試著下面這個最簡單的processing範例~
程式檔: 「Processing」Control_LED.pde
#中場練習
問題來啦!! 試著用電腦來控制三個LED燈,可以做到 全亮.1號燈.2號燈.3號燈.全暗,讓自己學會掌握硬體端的電路跟接收程式,以及軟體端的控制程式
---
參考解答範例
程式檔:
「Arduino 端」Serial_3LED.pde | 「Processing 端」Control_3LED.pde
提供的Processing範例是利用滑鼠由左到右,控制「無」.「1」.「2」.「3」.「全亮」
[小提醒] Serial 訊號最好要隔一段時間送,別讓他瘋狂傳送,不然有時會錯亂...
Arduino v.s. Computer
#ex1. Arduino ➝ Computer
程式檔:ardrino2computer.pde
我們可以先用Arduino Software提供的Serial Monitor來先測試Arduino板子端是否運作正確。
語法~ Serial.begin(speed) Serial.println(val)
#How about Processing?
那我們現在試著用Processing來串串看Arduino,先試著下面這個最簡單的processing範例~
程式檔: 「Processing」SimpleRead.pde
p.s. 在Arduino中的print指令送到其他介面時,需要注意一下~
print:
Prints data to the serial port.
單純的你寫什麼就送什麼...
println:
Prints a data to the serial port, followed by a carriage return character(ASCII 13, or '\r') and a newline character (ASCII 10, or '\n'). This command takes the same forms as Serial.print().
就是在你要送出的資料(字串或數字)後,自動再加上ASCII 13(return)與10(換行)。
所以隨之就有該注意的地方產生,若在接收端的處理是必須有個結束字元時,就得注意該用哪種方法。
#ex2. Computer ➝ Arduino
接下來,我們來嘗試由電腦端來控制Arduino做事情
程式檔:computer2arduino.pde
語法~ Serial.available() Serial.read()
先試試由Arduino Software的Serial Monitor中,直接輸入H/L,來控制看看
#How about Processing?
再試著用Processing來串串看Arduino,先試著下面這個最簡單的processing範例~
程式檔: 「Processing」Control_LED.pde
#中場練習
問題來啦!! 試著用電腦來控制三個LED燈,可以做到 全亮.1號燈.2號燈.3號燈.全暗,讓自己學會掌握硬體端的電路跟接收程式,以及軟體端的控制程式
---
參考解答範例
程式檔:
「Arduino 端」Serial_3LED.pde | 「Processing 端」Control_3LED.pde
提供的Processing範例是利用滑鼠由左到右,控制「無」.「1」.「2」.「3」.「全亮」
[小提醒] Serial 訊號最好要隔一段時間送,別讓他瘋狂傳送,不然有時會錯亂...
2009年4月27日 星期一
邁向互動達人的第二堂課. Sensing
上次我們講解了如何利用Arduino輸出,來控制LED的亮暗,做些資訊的顯示,但僅僅只能單向地做操作,怎麼去告訴Arduino什麼時候要做不一樣的動作?
各式各樣的sensor可以幫助我們取得環境周遭的資訊,轉換成訊號來送給Arduino知道
Digital In
#ex1. Button

然而,一定要記得使用開關時,在線路中一定要加上電阻,防止短路。
程式檔:Arduino Software的File > Sketchbooks > Example > Digital > Button
可以看見,按下按鈕LED會亮,而放開則不亮
語法~ pinMode(inputPin, INPUT)
digitalRead(pin)
digitalRead(pin)
#ex2. Debounce
程式檔:Arduino Software的File > Sketchbooks > Example > Digital > Debounce
語法~ millis()
在ex1中,會發現有時候按鈕按下時會不精準,那是因為在那短短的時間內,因為手按不穩或電路雜訊,會形同快速的ON/OFF.ON/OFF,會影響到我們對按下次數的判斷,故最好讓按鈕暫時的失效,在ex2中,我們除了排除這樣的問題,更進一步讓按鈕按一次亮燈,下次按熄燈。
millis()的使用在未來相當重要的,一定要搞懂。另外請記得,暫存time的變數型態,若太小,可能會有點問題。
Analog In
之前我們所練習的,都是單純的 有/沒有,給電/不給電,然而,真實世界不是那麼簡單的,生活周遭常常有許多只有些許差異的變化,例如:聲音的大小.光的亮度.水的高低.

>Arduino中的類比其實是透過數位的方式,在單位時間內取值
當然可以當做類比輸入的sensor有很多,先介紹基本練習的例如:
[可變電阻]

[光敏電阻]

在接下來的範例,我們用光敏來做些簡單的練習
#ex3. Analog in/ Digital out
程式檔:analog_input.pde
語法~ analogRead(pin)
Arduino的Analog In,對應操作電壓的 0V~5V,為 0~1023
#PWM (Pulse Width Modulation)
電腦與微處理器是不可能實際輸出類比的電壓,但我們可以假造出類似的效果。
若快速在兩個電壓中做切換,我們可以得到一個平均值:
Output Voltage = High_time(%) * Max_Voltage
#ex4. Analog in/ Analog out
程式檔:analog_output.pde
語法~ analogWrite(pin)
Arduino的Analog out,對應操作電壓的 0V~5V,為 0~255
吃補的綜合練習~Color Mix (待補)
光的三原色是R(紅光).G(綠光).B(藍光),世界上所有可以看見的顏色都是由這三種顏色所組合出的,Violet (red & blue), Turquoise (blue & green) and yellow (green & red),三種光一樣強時,也可組合出白色(理論上)。
我們使用共陰三色LED來實作這個練習,所謂共陰,即可視為R.G.B三顆LED的負極都接在同一支腳上,所以我們只需要4隻pin腳就可以控制三顆LED所作出的效果


程式:RGB_3switch.pde
此程式運用我們上課中途提出的小練習:「利用單一按鈕切換三個LED燈的亮暗」,作為延伸,進一步去控制RGB三色的切換。
參考
2009年4月25日 星期六
[公告] 第一次作業小叮嚀
很快的,一個禮拜又快過完了,不知道大家上完第一次課感想如何?
應該不會太操啦,若有不清楚的可以私下問我
但因人通常不在新竹,故若有問題,我會盡可能透過線上或其他方式努力回答,也可以先寄信到我的信箱:rainage@mail.nctu.edu.tw,我會第一時間想辦法回答。
在此提醒大家,因應老師要求每次都要作業,但盡可能別太無聊,我們第一次physical computing作業為
可以利用上課的幾個範例做修改patten,或是自己想個更有趣的方式來玩,當然...因為現在只有教輸出,還沒有教大家如何"抓"環境資料,下週二,我們就會學到了,建議先好好練習思考如何做個有趣的輸出效果,之後的作業也能更進一步來運用!!
應該不會太操啦,若有不清楚的可以私下問我
但因人通常不在新竹,故若有問題,我會盡可能透過線上或其他方式努力回答,也可以先寄信到我的信箱:rainage@mail.nctu.edu.tw,我會第一時間想辦法回答。
在此提醒大家,因應老師要求每次都要作業,但盡可能別太無聊,我們第一次physical computing作業為
「善用digital output的方式,設計個有趣的互動顯示」
可以利用上課的幾個範例做修改patten,或是自己想個更有趣的方式來玩,當然...因為現在只有教輸出,還沒有教大家如何"抓"環境資料,下週二,我們就會學到了,建議先好好練習思考如何做個有趣的輸出效果,之後的作業也能更進一步來運用!!
2009年4月20日 星期一
邁向互動達人的第一堂課. Digital Out
什麼是電路?
電路就像如同我們身體的循環一樣,是一個封閉的系統
一個電路可視為一個迴圈,若要停止,則只要將電路形成斷路即可。
任何的LED線路都是由此延伸的:電源、LED、電流限制元件(此為電阻)。
給更大的電阻,讓經過LED的電流變小,則亮度也會減小;反之,電阻較小,則亮度變大。
同樣的道理,給的電越大,LED也會越亮(前提是不燒掉)。
Digital Out
接下來,我們來讓Arduino「動起來」!
#ex1. Blink

程式檔:Arduino Software的File > Sketchbooks > Example > Digital > Blink
語法~
pinMode(pin, Mode)
digitalWrite(pin, value)
delay(ms)
永遠記得在使用digital pin時,要記得宣告pinMode,是編輯時常常犯錯的地方
pinMode(pin, Mode)
digitalWrite(pin, value)
delay(ms)
永遠記得在使用digital pin時,要記得宣告pinMode,是編輯時常常犯錯的地方
#數位是啥?
>只有HIGH跟LOW (0/1, On/Off)
所以ex1.的程式,就是很單純的作pin腳給電/不給電的動作,來控制LED的亮暗。
#ex2. Loop
讓我們再多複製幾組ex1.的線路,加到6組吧!
製作「霹靂遊俠李麥克」的伙計燈

程式檔:Arduino Software的File > Sketchbooks > Example > Digital > Loop
#ex3. Light Talk
讓我們玩點比較好玩的吧,延伸控制每個pin腳的概念
Light Talk是一個透過手搖動單排的LED,透過了「視覺暫留」(Resistance of Vision)的原理,來顯示圖案或文字。所謂的「視覺暫留」是一種生理現象,乃是指在眼前景物快速消失的瞬間,視覺卻仍保留該物體的形像。一般來說,視覺暫留的最大應用就是電影與電視節目,而 Lightalk 亦如是。
跟ex2.一樣的線路,所以不用再另外接,但請把線路接牢一點!

程式檔:Light_Talk.pde
int timer = 100; // The higher the number, the slower the timing.
int pins[] = { 2, 3, 4, 5, 6, 7 }; // an array of pin numbers
int pattens = 10; // how many pattens
int lights = 6; // how many LED light
byte graphy[10][6] = { {0,1,1,1,0,0},
{1,1,1,1,0,0},
{1,1,1,1,1,0},
{0,1,1,1,1,0},
{0,0,1,1,1,1},
{0,0,1,1,1,1},
{0,1,1,1,1,0},
{1,1,1,1,1,0},
{1,1,1,1,0,0},
{0,1,1,1,0,0} }; //patten array
void setup()
{
for (int i = 0; i < lights; i++) // the array elements are numbered from 0 to num_pins - 1 pinMode(pins[i], OUTPUT); // set each pin as an output } void loop() { for(int k = 0; k < lights; k++) { //for breakspace digitalWrite(pins[k], LOW); } delay(40); for (int i = 0; i < pattens; i++) { // loop through each pin... for(int j = 0; j < lights; j++) { if(graphy[i][j]==1) { digitalWrite(pins[j], HIGH); // turning it on, }else { digitalWrite(pins[j], LOW); // turning it off. } } delay(1); // pausing, } for(int k = 0; k < lights; k++) { //for breakspace digitalWrite(pins[k], LOW); } delay(40); }
int pins[] = { 2, 3, 4, 5, 6, 7 }; // an array of pin numbers
int pattens = 10; // how many pattens
int lights = 6; // how many LED light
byte graphy[10][6] = { {0,1,1,1,0,0},
{1,1,1,1,0,0},
{1,1,1,1,1,0},
{0,1,1,1,1,0},
{0,0,1,1,1,1},
{0,0,1,1,1,1},
{0,1,1,1,1,0},
{1,1,1,1,1,0},
{1,1,1,1,0,0},
{0,1,1,1,0,0} }; //patten array
void setup()
{
for (int i = 0; i < lights; i++) // the array elements are numbered from 0 to num_pins - 1 pinMode(pins[i], OUTPUT); // set each pin as an output } void loop() { for(int k = 0; k < lights; k++) { //for breakspace digitalWrite(pins[k], LOW); } delay(40); for (int i = 0; i < pattens; i++) { // loop through each pin... for(int j = 0; j < lights; j++) { if(graphy[i][j]==1) { digitalWrite(pins[j], HIGH); // turning it on, }else { digitalWrite(pins[j], LOW); // turning it off. } } delay(1); // pausing, } for(int k = 0; k < lights; k++) { //for breakspace digitalWrite(pins[k], LOW); } delay(40); }
程式上傳好後,就隨自己看的清楚的速度快速左右晃動,就可以看見可愛的愛心
程式中 patten[10][6] = { .. } 中,每六個唯一列,共10行,所繪製的圖形為:
所以當然也可以自己做喜歡的圖案,例如:
這裡附贈一個空白的,可以自己填

這堂課所教的延伸應用: 互動燈具
(可隨音樂舞動的變色燈,這個之後我們會教一點)
(類似上面的東西,可變化模式的)
(Tengu)
(3D LED矩陣Cube)
Get to start
開始體驗Arduino,你需要準備好以下項目:
Arduino board
我們這裡使用 Arduino Duemilanov,目前台灣由飆-機器人代理,或由國外線上訂
購。
USB 2.0 (普通USB頭<->稍微正方的那種頭)
各大電料行或電腦材料行均有售。
麵包板
用來快速連接電子元件用的,怎麼使用接下來會教,一樣在電料行有賣喔。
單心線
拿來串接連結各個元件,建議使用專門插麵包板的那種,雖然比較貴,但真的較好用。
此外,還是要一些普通的單心線,比較好理線。
各種雜七雜八的電子零件
接下來的課程會陸陸續續介紹,等要用到再增添即可,不過可以建議先準備幾個LED、
電阻表。
讓我們來跟這張板子認識一下:

p.s.
(1) 當Digital I/O不敷使用時,可用Analog In pin另外代用,宣告為pin 14~19
(2) 一般不建議使用Digital I/O pin 0,1,因為常作為Serialport傳輸用
跟著一起做吧!!
也可以參考這裡(Win, MAC)
Hardware
讓我們來跟這張板子認識一下:

Digital I/O | 共13,數位輸出/輸入端(pin 13作為LED指示用) |
Analog Out | 共6,在Digital I/O中的pin 3,5,6,9,10,11 可做類比輸出使用 |
Analog In | 共6,類比輸入端pin 0~5 |
Tx/Rx | 支援Tx/Rx訊號輸入輸出(若使用時,Digital I/O pin 0,1不可 作為數位輸出入/使用) |
USB傳輸與供電 | 支援USB直接供電,以及USB接頭資料傳輸 |
輸入電壓 | 可選擇USB直接供電或外部供電(建議7V~12V),用JUMP切換 (Duemilanove版本改用自動切換) |
輸出電壓 | 有5V、3.3V與Vin三種電壓輸出 |
支援線上燒錄功能 | 免去燒入經片需要重複拔插晶片的痛苦 |
LED 13 | pin 13內建一個LED |
p.s.
(1) 當Digital I/O不敷使用時,可用Analog In pin另外代用,宣告為pin 14~19
(2) 一般不建議使用Digital I/O pin 0,1,因為常作為Serialport傳輸用
Setup!!
跟著一起做吧!!
也可以參考這裡(Win, MAC)
Arduino跟Processing語法的不同處
Arduino | Proccessing |
---|---|
void setup() { ... } void loop() { ... } | void setup() { ... } void draw() { ... } |
Arduino | Proccessing |
---|---|
int bar[8]; bar[0] = 1; | int[] bar = new int[8]; bar[0] = 1; |
int foo[] = { 0, 1, 2 }; | int foo[] = { 0, 1, 2 }; or int[] foo = { 0, 1, 2 }; |
Arduino | Proccessing |
---|---|
int i; for (i = 0; i < 5; i++) { ... } (但測試後也可以用 for (int i = 0; i < 5; i++) { ... }) | for (int i = 0; i < 5; i++) { ... } |
Arduino | Proccessing |
---|---|
Serial.println("hello world"); | println("hello world"); |
int i = 5; Serial.println(i); | int i = 5; println(i); |
int i = 5; Serial.print("i = "); Serial.print(i); Serial.println(); | int i = 5; println("i = " + i); |
訂閱:
文章 (Atom)