About虛擬&實際

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

2013年1月31日 星期四

Sensors & Actuators-Tilt sensor

前言:
在Arduino project 8裡面有用到tilt switch (也稱為tilt sensor,早期的tilt sensor是使用水銀,所以又被稱為Mercury tilt switch)。可以使用在位置的判斷,這意思是它可以有“方向性”,簡單的方向性。

我在Adafruit裡面的介紹有看到以下的圖很有趣:
這應該是蠻基本款的tilt sensor了,從透明的管壁可以看到裡面的結構,真是簡潔明瞭。當金屬球體(or mercury)接觸到底部時可以導通線路,而離開時則是斷路,依照tilt sensor的外體形狀就可以製作出特別的設計,例如在平衡的平面上放置tilt sensor且先設置成不導通,若傾斜到某個角度的時候則會導通,這可以從tilt sensor的手冊看出。
後記:
Tilt sensor就是個簡單的 on/off 開關,只是在設計上的巧思使得tilt sensor可以變成判斷物體是否傾斜的簡易方式。一定有更多的應用等待去發掘,真是有趣呀!

參考:

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月22日 星期二

[學習資料] Raspberry Pi

前言:
隔了幾天的瞎忙,終於有空將一些資訊整理整理。目前參考的資訊非常豐富,除了來自原基金會網站外,也有Wiki部落,還有一些論壇;在台灣也有不少人有分享很棒的資訊給大家。實在是佛心來的。

另外由於是Linux系統,所以也希望藉此學習幾年前沒學習到的遺憾(Red Hat)。想學的很多,時間有限是事實也是必須體認的,翻了幾頁”學徒模式“有提到,選定一個語言,學好它。我想就是打好基礎的一種,當一種基礎好了,學其它的就可以延伸出去。


網站:

RPi Community
Raspberry Pi Wiki
Raspberry Pi. Org
Raspbian (Paspberry Pi + Debian)
葉難
鳥哥的Linux私房菜
學徒模式
Dr. Monk's DIY Electronics Blog
ㄆㄜ ㄊㄧㄡ ㄙˋ
Owen's

Book:

1. Raspberry Pi: Getting Started Guide
2. Raspberry Pi: Quick start
2. Raspberry Pi: User Guide, Eben Upton
3. The MagPi: A Magazine for Raspberry Pi Users (這個算是網頁版的,不過我印下來,習慣看紙本的)
4. Make: Magazine (網頁版與台灣中文版紙本)

後記:

暫時整理這些資訊,會陸續更新自己的資訊近來。感想是真的學無止境,尤其是自己想要學習的事情會更開心。


後記:
2013-01-2
稍微瞭解了一些資訊後,終於搞懂系統是建構在Debian上,而且內含了Scratch & Python兩種Scripting language(命令稿語言!?)。雖然有些資訊是建議從更基本的Linux系統學起,不過也有些建議是選好一個語言(系統?)好好學即可。所以我想會先摸熟了Raspberry Pi的Raspbian吧,畢竟手邊已經有這個系統了,在以網上都能找尋到的軟硬體資訊來輔助學習,我想是個很好的開始。

2013年1月21日 星期一

Raspberry Pi 安裝系統與開機

前言:
週末去購買了相關器材外,也順便研究了Raspberry Pi(RPi)的歷史與網路上相關的文件,對於RPi有較稍微深入了解後,開始將系統安裝置SD卡上面。

配備:

Raspberry Pi B (512MB)
電源供應器,5V2A
SDHC 16G, Class 10(SanDisk)

圖片:


系統安裝:

我參考了台灣有在研究RPi的玩家提供的一些系統安裝方式。因為我有Window & MAC OS兩種,原本是想簡單用Window安裝就好,用了Win32DiskImager來進行“燒入”2012-12-16-wheezy-raspbian。(官方建議初心者使用^^)。結果在Win32DiskImager裡面卻看不到我的SD卡,從RPi的WiKi建議要使用“Flashnul software”,真是多了幾個步驟。

因此就改用MPB來做燒入的動作。燒入的動作是使用終端機用指令,也是熟悉一下文字指令的感覺。而且還好有再把建議都給讀完,發現unmount跟平常在HD裡面按的是不一樣的(一開始還真不知道在哪裡找,是之前有看過一些評語是針對Apple的繁體化翻譯沒這麼順暢)。經過指令的下達,我也終於將Raspbian燒入記憶卡了。接著就是開機與設定一些開機的資訊。


一開始登入後,就發現解析度與螢幕超出畫面,趕緊查詢相關資訊後。大概跟幾個解析度設定可能有關。

一開始找到這篇(這裡這裡),設定後都還是超出畫面,後來在“sudo nano /boot/config.txt”裡面的“overscan"部分看了才發現我在RPi第一次開機的時候設定成Disable,所以才沒有自動地調整畫面邊界。最後順利地將其設定完成,也順便瞭解如何調整HDMI輸出的解析度^^~


~合體~折騰了昨夜搞SD card setup!!
手邊沒有HDMI的螢幕,還好家裡有電視先借用來測試!哈哈~


前置作業
明顯超出拉~一開始還以為是特色~不過連下面的字都超出那就GG啦
進入圖像系統後就成功調整好了


超~級~Q~的Logo啦


我也將RPi與一起購買的外殼合體了~棒

後記:

後來覺得以這種指令式的系統,也許不用進入圖形使用者界面應該也可以直接在command line也可以進行才對,下次再多試試幾組解析度,多多增加程式的感覺。

感覺進入圖形使用者界面(X-window!?)很熟悉,不過就又回到圖形化思考了,接著就是學習Linux以及裡面建議的Phython了,不過應該會先上網多多收集些資料。


真是太有趣了啦!Arduino project都被擱置了好幾天了...哈哈。另外因為若要開啟RPi就要到客廳使用,實在是不方便,所以有參考到可以使用SSH的網路連線登入就可以不使用螢幕鍵盤等等,這就是我所需要的!這樣放在工作桌上插條網路線與電源一樣可以做很多事情了~酷斃了~


參考:

Raspberry Pi B 學習資料
Raspberry Pi B 的到來
葉難
Raspberry Pi的奇幻飄流
e絡盟互動社區
Raspberry Pi 官網
RPi Easy SD Card Setup
2012-12-16-wheezy-raspbian

備份:HDMI設定
Setting up HDMI output
Raspberry HDMI Problem
Read my posts on: http://www.element14.com/community/thread/18205?tstart=0 This fixed my problem and might fix yours.

All fixed (audio + resolution)
Instuctions for others who may be experiencing the same issue with a TV and the Raspberry Pi:
1. Install a fresh image (optional)
2. start-up the Raspberry Pi and let it set itself up (normal set-up) - only on first boot
3. After you have gone through normal set-up:
a. Log-in as a normal user (debian image: pi)
b. Type the command: "sudo nano /boot/config.txt "
c. Press enter
d. Type in: "hdmi_drive=2 " [exactly as it is here]
e. Then press crtl + o
f. Press Enter
g. then press crtl + x
4. Restart using the command: " sudo shutdown -r now "

That gets the Raspberry Pi to register the TV as a HDMI device. You now have sound! For different resolution:
5. After you have gone through normal set-up:
a. Log-in as a normal user (debian image: pi)
b. Type the command: "sudo nano /boot/config.txt "
c. Press enter
d. Type in: "hdmi_group=1 " [exactly as it is here]
Press Enter
Type : "hdmi_mode=x " where x = corresponding number of resolution mode. See: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=26&t=5851
e. Then press crtl + o
f. Press Enter
g. then press crtl + x
6. Restart using the command: " sudo shutdown -r now "

Now you have desired resolution and Sound!!!

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囉。