About虛擬&實際

@分享虛擬與實際的世界中所遊玩的心得紀錄,從物理化學到生命科學、從人文藝術到現代科技、從虛擬介面到實際生命體。享受的只是一種學習與體驗。若文章內容有誤,歡迎提出以供修改,對文章的回饋,歡迎寄信給我!一起分享,互相學習成長的環境。
@個人簡介在『關於韃靼』
@我是韃靼~我的信箱:chenyuquan at gmail dot com
顯示具有 Arduino 標籤的文章。 顯示所有文章
顯示具有 Arduino 標籤的文章。 顯示所有文章

2013年12月21日 星期六

Arduino Wi-Fi Shield Test with LabVIEW

前言:
因為嘗試接案,接觸到使用LabVIEW擷取Wi-Fi感測器的數據(TCP/ IP, DataSocket...etc),不過還是有些問題存在。因為Wi-Fi Module已經還人,為了測試是否正確,於是還是買了遲疑已久的Arduino Wi-Fi Shield。

昨天熱騰騰的剛入手,這兩天先簡易測試了Example中的Connect Network AP, WiFi web Client, WiFi web Server三種測試。使用的Arduino版本是1.0.2 (NOTE: 使用1.0.5在測試Web會有問題,必須將wifi韌體更新)



後來有簡易測試了LabVIEW的部分,不過如預期的沒有抓取到正確的資料,合理的推測必須先在Arduino的部分定義利用Wi-Fi shield送出資料的一些設定(例如IP, Port, Data byte等等)。看起來還是得先搞懂TCP/ IP, UDP, DataSocket等等,還有以上提到的如何在Arduino中寫出符合的程式。

2013年7月13日 星期六

Arduino- RH/ Temp sensor with LCD display

前言:
最近一直很想測室內的二氧化碳,自從上次使用Lab的二氧化碳儀器測過一次後就沒機會了。有在詢問二氧化碳感測器的價錢,沒想到還頗貴的,像一氧化碳或硫化物相關的還比較便宜!!我想這跟二氧化碳分子結構有關(所以才需要使用紅外光譜才能偵測)
偏離主題了,之前就有打算將RH/Temp sensor組裝在Arduino上面,趁這次颱風天沒機會出去溜搭,來拼裝一夏。

硬體:
RH/ Temp sensor (HMZ-435CHS1)
LiquidCrystal (16*2 matrix), 
potentiometer
電容(10 uf)
電阻(220 & 50k ohm)

程式:
這個部分結合了Arduino project 3 & 11的部分,修改一些參數以及顯示的模式。
然後再將之前在使用LabVIEW project所使用的RH/ Temp 電壓校正曲線即可。
溫度校正曲線:
  y = 1.709x2 + 11.428x - 14.54
  R2 = 0.9986
濕度校正曲線:
  y = 2.164x2 + 26.166x - 13.068
  R2 = 0.997

Code:
因為在LCD內要顯示兩個數據,又遇上了數字小數點的顯示問題花了一點時間解決。
目前小數點還沒有更加的解決方式,就暫時以"int"以整數顯示。而LCD顯示部分如下:

  lcd.setCursor(0, 0);
  lcd.print("RH % / Temp deg.");
  lcd.setCursor(0, 1);
  lcd.print(RH);
  lcd.setCursor(8, 1);

  lcd.print(Temp);

其中lcd.setCursor(m, n),m是每列(row)的位置,n是指哪一行(column)。

圖片:


後記:
參考Cookbook有提到字串問題,也許可以將數字定義成字串,然後限制字串的長度。而Arduino網頁以及手邊的書籍好像都沒提到顯示數字位數的資訊,可能我還沒找到!!
再來真正期待的是CO2感測器的加入!!而程式部分則希望加入可以存檔功能(log到電腦內或其他)。

20130714補充
實際的在主臥房測試如下:

修正一些Code計算上的Bug,實際測試,主臥房的溼度果然較工作室低。不過也是預料中,因為開了冷氣!

參考:
Arduino_Project03_Love-o-meter
Arduino_Project11_Crystal Ball
溫濕度感測器_RH & Temperature Sensor
Arduino Cookbook
Arduino Projects Book
Arduino.cc

2013年7月6日 星期六

Arduino_Project13_Touchy-feely Lamp

前言:
太久沒持續的更新Project了,這一陣子忙了太多雜事,讓自己差點失去方向,接著持續學習Arduino以及Python還有不能荒廢的LabVIEW是一定要跟上的。當然還有更重要的事情在默默的規劃和努力中。

這個專題是針對"電容"特性而改成的電容感測器(Capacitive sensor),使用現成的library來讀取累積在金屬薄片上的電量而觸發Led。

硬體:
LED, 電阻(220 & 1M), metal foil (我用鋁箔紙)

程式:
一開始要先呼叫現成的程式庫,然後設定觸發數值以及LED燈位置。然後讀取Sensor的數值,這邊使用了內建的程式庫指令:capSensor.capacitiveSensor(30)其中30是讀取sensor的數值數量,若設定太少,會出現太多變化的可能,若設定太高,則可能會導致讀取同一數值太多次。

CODE:
CapacitiveSensor capSensor = CapacitiveSensor(4, 2)
(4, 2)定義為:(傳送資料到金屬薄片,讀取資料),資料就是從pin4輸出的電壓。

圖影:
乍看下非常的簡陋~><~

後記:
設定了合適的觸發值後,可以更加精確的控制在哪種接觸下可以開啟LED燈,不過還是屬於0/1的設定,若能搭配類比輸出電壓,也許可以進一步的控制LED燈亮度的改變。

參考:
Arduino Projects Book

2013年4月27日 星期六

(轉帖) Arduino Uno vs BeagleBone vs Raspberry Pi

前言:
Make網站提供了一篇好文章在介紹Arduino, BeagleBone以及Raspberry Pi的性能比較,提供想入手的新手(或欲增加新夥伴的老手)一些建議與資訊。最直接有趣的當然是表格的呈現如下:
(資料來源:Makezine.com)



三個產品照片:(來源:RS component, Arduino.cc, BeagleBoard.org)








參考網站:
中文:Arduino Uno、BeagleBone與Raspberry Pi之比較
原文:Arduino Uno vs BeagleBone vs Raspberry Pi
另外自己也備份網頁為PDF檔案,以避免網站失聯。

2013年3月17日 星期日

Arduino_Project12_Knock Lock

前言:
這次的專題計劃是設計可以上鎖的箱子(同樣地,也是先順利完成專題為主)。利用piezo可以反向的作為感測器(震動),敲打震動的次數來解開鎖定(servo motor)。

硬體:

servo motor, piezo, capacity, LED, resistor...etc

程式:

一開始也要先呼叫servo的函數庫(Servo.h),在sketch裡面設定敲打的次數(knock number),以及加入自定義函數來作初始的判斷,判斷piezo是否處在不正確的狀態(例如振動頻率過高或過低)。

Code:

boolean name = true (or false_ 定義"name"的布林參數。

圖片:


後記:

越到後面的專題,難度就越來越高,真是有很多有趣的挑戰性,不過code中的邏輯就更需要去思考為什麼這樣了。也瞭解與學到了如何自定義函數(記錄在後面的補充),雖然好像在之前也有看過的樣子!?~下個專題想必又是令人心動的學習過程。

參考:

Arduino reference

補充:(2013/3/17) 自定義函數(custom function),在這個專題裡面是先出現後,在完成void loop()後才進行“定義”,但是依然會運行在loop裡面!?(這裡還沒搞清楚)!

自定義函數可以有兩種結果:(1)不回傳數值(Value),則宣告此函數為void,類似loop()和setup()函數。(2)回傳數值(Value),則必須宣告數值的形態(int, long, float, etc.),但在這個case裡面是宣告成boolean type(布林形態)  
boolean checkForKnock(int value){....:這個自定義函數中的value是輸入數值,在主要函數內則是以knockVal輸入此位置(但是knockVal其實就是等同於analogRead(piezo)所得到的數值)。

目前測試下,ㄧ開始按下按鈕後,會變成locked然後在serial monitor會一直出現還需要knock的次數,但是敲得很大力會亮黃燈,但是還需敲打次數依然會減少!?然後滿足敲打數(knock number)後會變成unlocked(開鎖),此時再次按下按鈕,會變成locked(亮紅燈)後馬上就再次變回unlocked(亮綠燈),再按幾次都是如此,是只能進行一次嗎??怪哉!

解決方案:(2013/3/18)

在比較瞭解程式的邏輯後,我發現原本的code本來就只能執行一次,因為在 "numberOfKnocks" 增加後就不會回到起始點(雖然在“setup”有初始化int numberOfKnocks = 0),所以必須在"loop"的結束後加上以下的code就可以重復的使用此程式囉。

Code:


if(numberOfKnocks >=3){
  numberOfKnocks = 0;
  }

2013年3月6日 星期三

程式語言的"開始"-by Arduino

前言:
若說LabVIEW是我第一個正式學的程式語言(Programming Languages),MATLAB是第二個(但只剛上手),那麼正式的文字敘述型程式語言大概可以將Arduino的Wiring (Based on C)算是一個吧。不過這幾天又持續的將幾個”程式語言“看了一些新的資訊,例如Ruby, Python...還是在思考到底以哪一個為“開端”,這實在是有點頭大,或許我不應該思考太過複雜才對!
    扯遠了的是,通常程式語言好像很喜歡以"Hello, World"為開始作為與電腦互動的起始!?利用Arduino的Wiring也不例外的可以這樣使用,因此我利用了Project 11有用到的LCD顯示器作一個測試,來達到這個小小的卻有象徵意義的程式碼。

硬體:

跟Projectㄧ模一樣,只是改變程式的部分。

程式:

將亂數的部分刪除,只增加很簡單的開始文字敘述與搖晃後的文字敘述而已。

Code:(截取片段)


void loop() {

  switchstate = digitalRead(switchPin);
  if (switchstate != preswitchstate) {
    if (switchstate == LOW) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("My dream will");
      lcd.setCursor(0, 1);
      lcd.print("come true!");
      delay (5000);
    }
    else {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("I fucking love");
      lcd.setCursor(0, 1);
      lcd.print("our world !!");
    }
  }


圖片:
後記:
我想我會持續的很努力去喜愛這個世界,否則若什麼都不學,什麼都不做的話,實在是活得太無聊了。另外,有關LabVIEW & MATLAB的"Hello World"表示方式說真的挺無趣的,也許現在電腦的人機界面做得太棒了,導致我對於當下所顯示出的資訊還沒有太深入的感動吧!!

參考:

The Hello World Collection
Arduino_Project11_Crystal Ball

2013年3月4日 星期一

Arduino_Project11_Crystal Ball

前言:
經過二月的空窗期後,又繼續我的Projects計劃了。以往使用Arduino,若要顯示資訊都是經由Serial monitor,而這次借由LCD顯示器,就可以直接將資訊顯示在實體世界(指除了電腦螢幕以外的顯示元件)。

硬體:

LiquidCrystal (16*2 matrix), potentiometer, tilt switch.

程式:

已經有封包好的LCD library可以使用,只需要呼叫對應的command即可。另外自行建立八種預設答案,每次搖晃tilt switch則使用亂數功能(random)選擇答案。

Code:

    random(number)_ selected from number randomly.
    LCD library_ control lcd monitor.
    switch (case)_ case<use int number>, 傳回所選擇的數字,在此project內,顯示其中之一的答案(文字)(程式碼中建立八種預設答案)

圖片:


後記:

使用了LCD顯示器,則可以直接在實體世界顯示出資訊,例如使用溫濕度感測器,則可以將數值顯示在LCD上面,就不需要透過電腦來達到直覺的方式啊!真是方便,改天就將溫度感測器接上試試看。
另外,LCD的產品說明書是台灣的公司所提供的,真是有趣,還以為都是大陸制的!!

補充:

(2013/03/10) "switch"的這個指令很有趣,為什麼呢?因為之前都常常會打類似的指令-switchPin, switchState...etc,打完前面的switch都會顯示橘紅色(表示為內建指令),還在想為什麼指令會用到switch(那時候不認真,只想快速地先瞭解當下的project內容,所以沒查)。到了今天才瞭解到這個"switch"可以作”任務“的設定,就是先定義"switch(數值)",然後"case x"下一行則是內容,最後加上"break"表示case結束。大致地表示法如下:

    switch(number){
        case x:
        "reply content/ command"
        break;
        "new case"
        ....

其中的reply content/ command在project 11裡是輸出string到LCD上面<lcd.print ("text")>。

參考:

Switch(case) statement_ serial input 
LCD library
alphanumeric LCD (16X2)

2013年2月19日 星期二

Wiring-"not equal" & "inversion operator"

前言:
在進行project 10的時候,出現了之前好像也有見到的“x != y"跟新看到的”x = !x“,議開始以為是一樣的,查了資訊後才知道是完全不一樣的含義。

Code:

x != y_ x is not equal to y;
x = !x_ 後面的x是前面x的反相數(inversion operator),看範例的感覺是針對true與false。

討論:

這點是因為要判斷motor何時要切換與何時要啓動的參考,因此加入了inversion operator。對於習慣眼見為憑的我來說,不實際測試實在是不瞭解呢!!所以寫了ㄧ個簡易的程式來跑跑看,如下:

int x = 0;
void setup(){  Serial.begin(9600);}
void loop(){  x = !x;  Serial.println(x);  delay(500);}
然後接上Arduino且upload後就可以打開Serial monitor觀看數值,恩,的確如預料中的結果。哈哈~

後記:
摸了Arduino也有快兩個月了,對於Wiring的編輯平台而言,覺得真的挺棒且有趣的。覺得挺棒的是因為簡化了機器語言的複雜,對於還沒辦法非常深入機器語言領域的我來說,是很好的起點。另外有趣的是與同樣是指令式語言的MATLAB比較,很多指令都可以直接在MATLAB內顯示結果,但是Arduino都必須先接上電腦後才能利用Serial Monitor來看運算結果,我想這是因為兩個程式語言根本上就不一樣吧~(哈)

2013年2月17日 星期日

Arduino_Project10_Zoetrope

前言:
Zoetrope是延續前一專題衍生的“強化版”,利用眼睛的視覺暫留(Persistence of Vision, POV),對一連串的圖片產生動畫錯覺,是早期動畫(animation)的開始模式。使用H-bridge可以用來控制馬達的正轉與逆轉,搭配可變電阻來控制zoetrope的旋轉速度。

硬體:

馬達,H-bridge,電阻,可變電阻,9V電池,按鈕等等

程式:

利用button來控制zoetrope是否運轉,以及是否改變旋轉方向。旋轉方向的按鈕邏輯可以控制H-bridge的動作模式,藉此使

Code:
    x != y_ x not equal to y
    a =!a_ inversion operator, x一開始是0的話,在此條件下會變成1(邏輯運算子)

圖片&影片:



後記:

運轉的有點不是很順暢,尤其是在低轉速下。不過很好奇到底轉速如何,因此我在程式中多加了Serial.begin(9600), Serial.println(value) 從serial monitor即時讀取可變電阻改變時所讀取到的電壓數值,發現低於60的讀數,馬達就有點轉不太動了,是上面的旋轉盤太重了嗎??這就令我費解了,可能改天換個電池再試試看。

參考:

視覺暫留

2013年2月2日 星期六

Arduino Cookbook

前言:
(原文章名稱) Arduino Cookbook error content...keep updating
這邊記載了閱讀Arduino cookbook發現的錯誤與有疑惑的地方,給自己做點記錄。

內容:

20130202
p19---圖1-9說有放小型揚聲器卻沒有
p20---code最後的"digitalWrite(ledPin, LOW)應該是“outputPin”,想必也是copy/paste的筆誤。


還不懂不瞭解的地方:

20130203
p26---code: return fabs((a-b) / max(fabs(a), fabs(b))) <= DELTA;......


解決的地方:


2013年2月1日 星期五

Arduino_Project09_Motorized Pinwheel

前言:
此專題是使用簡易的方式控制馬達(不是伺服器馬達),由於馬達需要更大的電流控制,因此需要外接電源而且需要設計簡單的電路來避免大電流回傳到Arduino而損壞了。

硬體:

Motor, MOSFET, Diode, 10k Ohm, Push button(switch), 9V battery.

程式:

利用MOSFET作為控制9V電源是否可以通過motor的控制,並判斷按下push button時開通MOSFET。

Code:
沒有新的

圖片:

後記:
設計美學的部分跳過,目前以學習所有專題基礎為主,也來到的第九個專題,還有六個專題可以學習。當這十五個專題結束後,就可以進行Arduino Cookbook的研究了(20130201- 已經同時開始研讀cookbook了)。現在的想法應該是不會將Arduino cookbook全部跑過一次,因為內容非常的精彩又多,我應該會先以之前有的想法做一些實際的應用與設計。

Cookbook會成為我的工具書之一,另外Raspberry Pi也延宕好幾天了,希望趕快抽出空擋先將ssh開通並連上,另外關於時間的部分,有人建議可以外接時間電路,可以自己拼裝也可以買現成(少於兩三張國父即可購入)。可以免除每次開機都要重新設定。(不過若成功接上網路,每次開機連網就可以自行校正時間了。也是可以省錢的方式之一。

2013年1月27日 星期日

Arduino_Project08_Digital Hourglass

前言:
時間沙漏(!?),可以計時的數位沙漏,設定好每個LED的間隔時間後,會持續的亮燈。可以搖晃Tilt switch重新計時。

硬體:

六個LED,六個220 Ohm resistor,tilt switch。

程式:

一開始設定初始時間,然後利用millis()的計時功能與設定的interval做判斷,若超過interval則開啟一顆LED且在LED的計數上自動加一以作為下次開啓的基準。另外是設定currentTime & previousTime,所以當超過interval的時候就將previousTime改變成currentTime,這樣再來的currentTime就繼續與新的previousTime作比較了。(應該就是累進計算比較的方式)。
    另外比較意外的小錯誤是我原本想將紅色LED作為時間的最後一個階段,但是卻順序顛倒,因為code的設計是從pin 2開始,所以修改了code中的順序,就改用了"x--"。

Code:
    long _32 bit number (include negative & positive number).
    unsigned long _ 32 bit number only include positive number.
    != _not equal to
    x++/++x _x增加1且傳回舊的x/x增加1且傳回新的x. 

圖片與影片:



後記:

比較有點混淆的command是++x/x++的傳回新與舊的數值,如果x++是傳回舊的數值,那第一次是(loop 1)x=2, x++ -> (loop 2) x=3, x++....(第二回圈傳回的是新的數值,也就是加過後的),不過網頁範例用的是如下:

x = 2;
y = ++x;      // x now contains 3, y contains 3
y = x--;      // x contains 2 again, y still contains 3

仔細思考後,在本project的code中,是如下:

if(switchState != prevSwitchState){
    for(int x = 2;x<8;x++){
        digitalWrite(x, LOW);
    }
    led = 2;
    previousTime = currentTime;
}

所以傳回舊的x是指新的switchState改變後又從2開始,而不是新的數值!?開始,而不是新的數值!?上面的command都是在if()一個新的判斷所加入的,都在粗體紅字的時候就執行完了,所以跟範例給的應該是不同意思。(範例中就直接在digitalWrite內執行了2~7的數值)還在思考這些小問題........

參考:
Tilt switch information 
Command

2013年1月25日 星期五

用Arduino延伸“偽鋼琴鍵盤”

前言:
在project07學習到了使用按鍵與resistor ladder組合創造出keyboard instrument的樂趣,在想使用更多的組合可以組出基本的音階。

硬體:

switch *8, resistor 數個

程式:

使用if...else, 加上else if 擴充邏輯判斷到八種組合,使用array指令增加輸出的聲音頻率。

電阻與聲音頻率對照表:


其中:Resistor是取用的電阻大小,接地的參考電阻為21600 Ohm(21.6K Ohm),Voltage read是估計值,Real A0是實際上Arduino A0所讀到的區間數值(最後兩格),music frequency是聲音頻率的對照。

圖片&影片

八個按鍵很壯觀,若有更多當然更酷,不過那就更花時間了!!


後記:
雖然可以很明顯地聽出不同音階,不過木耳的我還是分辨不出來其實際的差異。記得app有可以簡易判斷樂器音階(!?)的軟體!?改天下載來玩玩看。

參考:

Arduino_Project07_Keyboard Instrument
Physical Music note

2013年1月24日 星期四

Arduino_Project07_Keyboard Instrument

前言:
經過了上一次的project學到了如何使用光敏電阻與piezo搭配成Theremin,這次緊接著又學到使用”Resistor Ladder“的方式來模擬鍵盤樂器(Keyboard Instrument)。利用resistor ladder可以在類比輸入端模擬出數位輸入的效果。

硬體:
電阻:220, 10K, 1M ohm.
按鈕, Piezo, 還可以自己製作鋼琴鍵盤般的紙板。

程式:
利用resistor ladder的設計,當按下不同位置的按鈕時,通過的電壓也不同。藉由程式設定不同讀取電壓分類來傳出不同的頻率(數位輸出)。這個project模擬了middle C, D, E 以及F(262, 294, 330 and 349 Hz.),也利用了新的指令來宣告一串數列,不需要在每個都設定增加編寫程式的麻煩。

Command:
    name[] = {1, 2, 3, 4..., n}_ 定義數列的內容
    if()...else==if...else if..else if..else if...else_ 在if...else之間可以插入許多個else if以增加判斷邏輯的數量,可以設定許多種條件。
    noTone_ 根據文中的建議是因為一直進行判斷,所以當所有邏輯都不成立的時候,需要將tone()的功能關閉。

圖片&影片:
若有足夠的按鈕以及計算好的電阻,可以排出更多階層的電子樂器按鍵喲

    
結論:
利用參考資料實際算了一下resistor ladder的電壓分流(因為Uno只有1023的input),若增加恰當與足夠的電阻是可以排出更有豐富的聲音階層。另外tone的功能則可以送出不同頻率來搭配輸入,當然也可以類似project06的模式,改用其他更多不同的感測器(類比輸入,例如搭配超音波_倒車雷達的聲響!)來”玩“聲音。不過這有提到一點就是當使用tone功能時,analogWrite()在pin 3 &11會有被干擾的現象。應該是硬體設計上的問題吧!?再找資料來瞭解瞭解。^^期待下一個project可以學到的東西了。

Arduino Project Books

2013年1月19日 星期六

Wiring-"millis()"

前言:
在Arduino Project06中有用到millis的指令,官網介紹的也蠻詳細的不過給了範例有誤,無法執行。

硬體:

無

程式:

程式碼有少一些command,所以執行會錯誤,少的部分是一些宣告。

Code:

    int time = 0;
void setup(){
  Serial.begin(9600);
}
void loop(){
  Serial.print("Time: ");
  time = millis();
  //prints time since program started
  Serial.println(time);
  // wait a second so as not to send massive amounts of data
  delay(20);
}

底線的部分就是少的部分,缺了一開始的宣告就會整個有問題,所以真是編寫程式要很注意與細心呢!

後記:

還在思考怎麼怎麼將所學到的Code整理成資訊。最近額外的也在構思我的記帳程式,不過這個部分應該是使用LabVIEW囉。

2013年1月18日 星期五

Arduino_Project06_Light Theremin

前言:
這次的計劃是使用簡單的元件製作出<“光”特雷門>電子樂器,一個光電阻與一個壓電元件(就是可以用來製作麥克風的東西)就可以表演不同的音樂囉。

硬體:

光敏電阻,壓電晶體,電阻

程式:

一樣的先如同計劃書的設計將原件放在應該的位置後,定義數位I/O的位置(用類似PWM的方式產生聲音頻率)。一開始先作個光敏電阻的校正,然後等待五秒結束後開始感應光敏電阻(類比I/O)讀取的電壓變化而從數位I/O輸出不同的頻率。

Command:

    int/ const int:定義整數與常數(整數形態)
    while(expression):當expression不成立時,迴圈將會停止,否則則一直運行下去。
    millis():傳回當“Arduino電源開啓”或者“重置”後的時間(微秒)
    tone(pin, value, duration):類似PWM,但是duty cycle都是50% high level以及 50% low level,但是彼此之間的頻率是不同的。

圖片:

Raspberry Pi B"不小心"也入鏡了啊!

結論:

在upload code後要快速的在光敏電阻表面上下移動來做光強度的校正,否則就只會吱吱吱吱叫了....不過聲音單調了些,而且頗刺耳,對於輕度聽力障礙的話,高頻聽起來很不悅耳就是了!但是有趣的是利用光能轉換成聲能,是個很棒,簡易的物理觀念學習呢!類似的狀況例如倒車雷達,當快靠近的時候就會急速的尖叫也是同樣的原理。

參考:

Theremin
tone()

2013年1月12日 星期六

Arduino_Project05_Mood Cue

前言:
拖了幾天才將資訊整理上網,這次的計劃是很有趣的名稱-Mood Cue,若用中文理解大概就是情緒暗示器,不過就很像辦公室外的“請進”,“外出”之類的指示牌吧!另外也是第一次使用伺服器馬達(servo motor)跟一般馬達不一樣的地方式使用PWM去控制(類似Project04所提到)。

元件:

使用了伺服器馬達(Servo Motor),可變電阻(Potentiometer)還有電容(Capacitor, 100 uF)。

程式:

這個Project簡單的地方是因為Servo motor已經有寫好的Library可供使用,只要先呼叫library即可,然後使用內建的指令即可以驅動Servo Motor。

Code:

    #include<library name.h>...不需要加“;”(半引號)
    library name instance name...定義Object name(物件名稱)
    object name.attach(pin#)...定義位置(類比輸出)
    object name.write(angle)...
    map(value, from low, from high, to low, to high)...有點像是比例換算,從取得的value經過原本的比例(from)轉到另ㄧ個比例(to)

圖片:


結論:
利用現成的Library可以快速地得到控制伺服器馬達的功能,搭配更多馬達則可以做更多的事情,例如機械人,控制裝置等等。另外也想找個時間學學如何不用Library來撰寫控制馬達的程式。

參考:

Servo library website
Arduino Project Book

2013年1月5日 星期六

Arduino_Project04_Color Mixing Lamp

前言:
2013年開始了五天,終於又有空閒可以進行projects囉!今天所做的是Project04-Color Mixing Lamp,這是個非常有趣的實驗,藉由控制給予感測器不同顏色的光,就給予LED相對應的發光顏色。

硬體:

光敏電阻_Photoresistor
三色LED_LED
電阻_220 and 10K ohm

電路實際圖如下:
圖中紅綠藍(RGB)是顏色濾片

Code:
在此Project新學到的指令有:
\t : 等同於keyboard上的tab按鍵
analogWrite : (pin, value), 
    value-0 (always off)~255(always on)

其中有將analogRead讀取到的數值除以”4“以縮減到可以輸入analogWrite裡面。(這樣算起來表示analogWrite是8 bit)。而根據手冊有談到是使用PWM(Pulse Width Modulation)來輸出Duty cycle。而有關Duty clcle則是利用數位輸出”模擬“類比輸出電壓的方式而達成,但是另一款版本(DUE)則已經搭配了類比輸出電壓的位置。Duty cycle可以參考Arduino.cc的介紹,描述的簡潔有力。網址


原本我以為會按什麼就遮掉什麼顏色,不過實際上好像不太是(或者還沒有加上書中所介紹的乒乓球嗎?)。用手遮住藍色,LED燈會變得更藍;遮住紅色會變得更紅;但是綠色的變化比較不明顯!而用小型手電筒照光的話,照藍色感測器會使得LED變得更紅,類似遮住的反應。整理以上的描述如下:

光敏電阻____LED
遮住藍色____變更藍色
照光藍色區域__變紅色

另外下面的影片是實際操作圖:


而身為一個不專業的玩家,當然會有三用電表這種玩意,就測量了下當遮住光敏電阻時,相對應PWM輸出的電壓變化,整理如下:


遮住顏色_原本電壓_遮住電壓

綠色___2.55V__1.33V
藍色___2.89V__1.07V
紅色___3.54V__2.40V

從以上資訊來推測看看,當遮住藍色而輸出PWM電壓減少,相對的就是指藍色的Duty cycle是比較小的(小於50% or less)這樣說起來應該LED要變得更不藍(或者說紅色或綠色),跟理論上好像有點不搭。


再次的檢查電路以及程式碼,終於發現書中(P57)提供的有小錯誤:


const int greenLEDPin = 9;
const int redLEDPin = 11;  --->10
const int blueLEDPin = 10;  --->11

修改後再次測試,成功!!遮住藍色變紅色發光,藍色區域照光變得更藍!!其它以此類推~圓滿達成!

後記:這個Project是使用光敏電阻,不過也有其他更高階的例如“顏色感測器”已經可以直接針對不同顏色的光做反應,而不需要像此專題還需要使用顏色濾片,當然顏色感測器好像也是針對單色光為主(例如紅藍綠三色)!下次的專題任務就是“MOOD CUE”真是令人期待!!

2012年12月27日 星期四

Arduino_Project03_Love-o-meter

前言:
進入了Project03,內容是使用溫度感測器搭配LED製作一項可以表示您有多熱情!!其實就是設定好溫度的間距,當溫度不斷上升後,LED也亮的更多了。

硬體:
使用的溫度感測器是TMP(36GZ),有趣的是輸出的電壓會正比於溫度(攝氏),所以在使用上還蠻方便的,不像之前使用Thermocouple還需拼電路與做校正曲線轉換。
計算的方式如:
voltage=(reads[0~1023]/1024)*5V[supply power]
temperature=(voltage-0.5)*100
ex:reads=150; ->volt=0.7324; ->temp=23.24

Code:
在此Project新學到的指令有:
const int- 指定常數項
const float-指定浮點數
Serial.begin-設定傳輸速度(baud rate), bit/second
for ()- for (初始數字; 狀態(比較); 增加量++)
Serial.print(number or "text")-在serial monitor列印出數據或文字
Serial.println()-意義如同上述但是會增加新的一行(類似enter)
analogRead()-讀取類比輸入端的讀數(0~1023/10 bit)

學習到的指令越來越多,真是有趣。
一般上書籍都不會附上全部的指令(可能太多了吧!而且其實都有在更新的樣子)。Arduino的官網有放上指令全集,是學習時可以參考的資訊。雖然不擔心網頁會突然消失,但是有時間的話我還是會收集並整理到自己的網頁做個備份。
Language Reference

另外隨著Project的複雜度增加,Sketch的頁面也越來越長,抓圖備份好像不再是個好方法,所以我想程式碼的部分就可以省略,直接以檔案備份或者上傳(txt format),這樣可能是比較節省文章撰寫與排版的好方式之一。

拼裝好的電路圖如下,可能是我手太冰冷了,抓了很久都只有兩個燈啊~!!~真是虛弱~~Orz.....


參考資訊:

TMP36 - Temperature Sensor-Sparkfun提供的資訊


2012年12月24日 星期一

Arduino_Project02_Spaceship Interface

前言:
今天完成了Project02,spaceship interface是模擬太空梭界面,例如飛彈發射器!?真是有趣。

硬體:
電路部分就用到的數位輸出入(Digital I/O)的部分囉,而硬體部分只用到LED,幾個匹配的電阻跟一個開關即可。

程式:

撰寫了簡單的語法邏輯,除了基本的int, void setup, void loop外,還有設定接腳位置-pinMode; 數位訊號讀取&寫入-digitalRead/ digitalWrite, 最後還有控制loop的迴圈運行速度-delay.

Code: 

int 初始狀態名稱命名
pinMode(number, OUTPUT / INPUT)
digitalRead/Write(number, HIGH / LOW)
delay(millisecond)

程式縮圖如下:


完成後將程式upload到Arduino就可以看到綠色LED燈亮了,然後就可以按住開關,紅色與黃色的LED就會交替閃爍。

另外學習了如何閱讀電阻表,話說從開始碰電子電路後,也有六七年了,我都還不會,今天也總算是成功地認識電阻表。

後記:

今天學了基本的幾個指令,這些都可以另用LabVIEW模擬狀況。也許改天可以搭配LabVIEW來作相似的工作,順便瞭解兩種語言之間的程式“邏輯”互換。