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)




#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作業為

「善用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,是編輯時常常犯錯的地方


#數位是啥?

>只有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); }




程式上傳好後,就隨自己看的清楚的速度快速左右晃動,就可以看見可愛的愛心


程式中 patten[10][6] = { .. } 中,每六個唯一列,共10行,所繪製的圖形為:

所以當然也可以自己做喜歡的圖案,例如:

這裡附贈一個空白的,可以自己填



這堂課所教的延伸應用: 互動燈具

(可隨音樂舞動的變色燈,這個之後我們會教一點)


(類似上面的東西,可變化模式的)


(Tengu)


(3D LED矩陣Cube)

Get to start

開始體驗Arduino,你需要準備好以下項目:
  • Arduino board
 我們這裡使用 Arduino Duemilanov,目前台灣由飆-機器人代理,或由國外線上訂
購。

  • USB 2.0 (普通USB頭<->稍微正方的那種頭)
 各大電料行或電腦材料行均有售。

  • 麵包板
 用來快速連接電子元件用的,怎麼使用接下來會教,一樣在電料行有賣喔。

  • 單心線
 拿來串接連結各個元件,建議使用專門插麵包板的那種,雖然比較貴,但真的較好用。 
 此外,還是要一些普通的單心線,比較好理線。

  • 各種雜七雜八的電子零件
 接下來的課程會陸陸續續介紹,等要用到再增添即可,不過可以建議先準備幾個LED、
電阻表。



  • 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() { ... }

    Array
    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 };

    Loop
    Arduino Proccessing
    int i;
    for (i = 0; i < 5; i++) { ... }
    (但測試後也可以用
    for (int i = 0; i < 5; i++) { ... })
    for (int i = 0; i < 5; i++) { ... }

    Print
    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);