| 作者/攝影 |
曾吉弘 |
| 時間 |
1小時 |
| 難度 |
★★★☆☆
|
| 材料表 |
|
這學年我在臺北科大互動設計系上課,上學期使用 LinkIt 7697 來上互動物聯網專題,這學期則是 Processing 與 Python 各半學期。班上人數居然有79人,4個人一組也是有20組,期中看大家的 demo 真的很累啊… 一組5分鐘就兩個小時過去了。有興趣的朋友歡迎參考我的上課講義以及 CAVEDU blog
Processing 一直是我很喜歡的一個主題,使用相對簡易的語法就可以設計出豐富有趣的介面,加上執行在電腦上就很容易透過 USB 來與 Arduino 這類裝置溝通。所以也很高興看到這組同學有不錯的結合:使用 Processing 讀取裝在 LinkIt 7697 的超音波感測器與三軸感測器,超音波用來控制球的移動速度,三軸則是控制方向。
影片
本文範例與影片,感謝班上鄭同學與朱同學協助整理。
https://www.facebook.com/allelujahnissin/videos/10219045492821694/
功能說明
引用這組的期中報告,專題名稱為 [rit.]。就是樂曲上漸慢的意思
我們從電影「出神入化」中一幕控制雨水暫留於空中甚至向上漂浮的畫面獲得靈感,想要將這樣具戲劇張力的畫面實現,讓平凡人也可以擁有控制地心引力或甚至是時間的超能力。我們的功能主要是透過超音波感測器偵測手部,靠近時,畫面中的雨滴會漸慢停止,而遠離時,雨滴會回流向上,手離開感測器則雨滴恢復原行進狀態。
流程圖

程式架構說明
7697端透過 Serial.write(); 語法不斷把超音波與加速度感測器的 Y 軸送出,
Processing 則是語法 serial.read(); 語法把資料讀進來之後控制雨點的速度與方向,
一般人常碰到的問題是 Processing 抓不到 Arduino 而程式閃退,解決方法要讓 Arduino 的程式先跑起來,且不要開 Arduino Serial Monitor 否則會被占住而無法連線(除非你又開一個 SerialX 來顯示資料但不建議這麼做) ,語法: serial = new Serial(this, Arduino.list()[0], 9600); 這裡的 Arduino.list()[0] 是指電腦上抓到的第一片 Arduino,也可以直接用 COMX 來指定。 以這樣的概念來說,PC 上要接多片 7697 / Arduino 當然是可行的,就能讓專題更豐富。
設計背景的同學在進入互動裝置時不一定需要寫很複雜的程式,但通常都會以”場域”的概念來思考專題,例如用很多感測器感測人在一個區域中的動作。這與資電背景同學(通常是做一個裝置) 相比各有其趣。
rit 程式說明 – Processing端程式
[pastacode lang=”cpp” manual=”Spot%5B%5D%20spots%3B%20%2F%2F%20Declare%20array%0A%0Aimport%20processing.serial.*%3B%0Aimport%20cc.arduino.*%3B%0ASerial%20serial%3B%20%0AArduino%20arduino%3B%0A%0Aint%20a1%3D0%3B%0Aint%20a2%3D0%3B%0Aint%20sensorValue%3B%0A%0Avoid%20setup()%20%7B%0A%20%20size(700%2C%20700)%3B%0A%20%20serial%20%3D%20new%20Serial(this%2C%20Arduino.list()%5B1%5D%2C%209600)%3B%20%20%2F%2F%E6%8C%87%E5%AE%9A%20Arduino%20%E4%BD%8D%E7%BD%AE%0A%20%20int%20numSpots%20%3D%20100%3B%20%2F%2F%20Number%20of%20objects%0A%20%20int%20dia%20%3D%2015%3B%20%2F%2F%20Calculate%20diameter%0A%20%20spots%20%3D%20new%20Spot%5BnumSpots%5D%3B%20%2F%2F%20Create%20array%0A%20%20for%20(int%20i%20%3D%200%3B%20i%20%3C%20100%3B%20i%2B%2B)%20%7B%0A%20%20%20%20float%20x%20%3D%2020*random(0%2C%2035)%3B%20%2F%2F%E6%B1%BA%E5%AE%9A%E7%90%83%E5%9C%93%E5%BF%83%E4%BD%8D%E7%BD%AE%0A%20%20%20%20float%20rate%20%3D%20random(-1.0%2C%201.0)%3B%0A%0A%20%20%20%20for%20(int%20i1%20%3D%200%3B%20i1%20%3C%20100%3B%20i1%2B%2B)%20%7B%0A%20%20%20%20%20%20float%20y%20%3D%2020*random(0%2C%2035)%3B%20%2F%2F%E6%B1%BA%E5%AE%9A%E7%90%83%E5%9C%93%E5%BF%83%E4%BD%8D%E7%BD%AE%0A%0A%20%20%20%20%20%20%2F%2F%20Create%20each%20object%0A%20%20%20%20%20%20spots%5Bi%5D%20%3D%20new%20Spot(x%2C%20y%2C%20dia%2C%20rate)%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20noStroke()%3B%0A%7D%0A%0Avoid%20draw()%20%7B%0A%20%20fill(0%2C%2015)%3B%0A%20%20rect(0%2C%200%2C%20width%2C%20height)%3B%0A%20%20fill(255)%3B%0A%0A%20%20for%20(int%20i%3D0%3B%20i%20%3C%20100%3B%20i%2B%2B)%20%7B%0A%20%20%20%20spots%5Bi%5D.move()%3B%20%2F%2F%20Move%20each%20object%0A%20%20%20%20spots%5Bi%5D.display()%3B%20%2F%2F%20Display%20each%20object%0A%20%20%7D%0A%7D%0A%0Aclass%20Spot%20%7B%20%20%20%2F%2F%E8%87%AA%E5%AE%9A%E7%BE%A9%E9%9B%A8%E6%BB%B4%0A%20%20float%20x%2C%20y%3B%20%20%20%20%20%20%20%20%20%2F%2F%20X-coordinate%2C%20y-coordinate%0A%20%20float%20diameter%3B%20%20%20%20%20%2F%2F%20Diameter%20of%20the%20circle%0A%20%20float%20speed%3B%20%20%20%20%20%20%20%20%2F%2F%20Distance%20moved%20each%20frame%0A%20%20int%20direction%20%3D%205%3B%20%20%2F%2F%20Direction%20of%20motion%20(1%20is%20down%2C%20-1%20is%20up)%0A%20%20float%20diameter1%3B%20%20%20%20%20%2F%2F%20Diameter%20of%20the%20circle%0A%20%20float%20speed1%3B%20%20%20%20%20%20%20%20%2F%2F%20Distance%20moved%20each%20frame%0A%20%20int%20direction1%20%3D%205%3B%0A%20%20%2F%2F%20Constructor%0A%20%20Spot(float%20xpos%2C%20float%20ypos%2C%20float%20dia%2C%20float%20sp)%20%7B%0A%20%20%20%20x%20%3D%20xpos%3B%0A%20%20%20%20y%20%3D%20ypos%3B%0A%20%20%20%20diameter%20%3D%20dia%3B%0A%20%20%20%20speed%20%3D%20sp%3B%0A%20%20%7D%0A%0A%20%20void%20move()%20%7B%20%20%20%20%20%2F%2F%E6%A0%B9%E6%93%9AArduino%20%E4%B8%9F%E9%81%8E%E4%BE%86%E7%9A%84%E5%80%BC%E6%B1%BA%E5%AE%9A%E9%9B%A8%E6%BB%B4%E5%8B%95%E4%BD%9C%0A%20%20%20%20if%20(%20serial.available()%20%3E%200)%20%7B%0A%20%20%20%20%20%20sensorValue%20%3D%20serial.read()%3B%0A%0A%20%20%20%20%20%20a1%3DsensorValue%2F10%3B%0A%20%20%20%20%20%20a2%3DsensorValue%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20(a1%3C5)%20%7B%0A%0A%20%20%20%20%20%20if%20(a1%3D%3D0)%20%7B%0A%20%20%20%20%20%20%20%20println(%22a2%22%2Ba2)%3B%0A%20%20%20%20%20%20%20%20if%20(a2%3D%3D2)%20%7B%0A%20%20%20%20%20%20%20%20%20%20a2%3D-1%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20x%20%2B%3D%20a2*(speed%20*%20direction1)%3B%20%0A%20%20%20%20%20%20%20%20if%20((x%20%3E%20(width%20-%20diameter1%2F2))%20%7C%7C%20(x%20%3C%20diameter1%2F2))%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20direction1%20*%3D%20-1%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20%7B%20%20%0A%20%20%20%20%20%20%20%20y%20%2B%3D%200.1*a1*(speed%20*%20direction)%3B%20%0A%20%20%20%20%20%20%20%20if%20((y%20%3E%20(height%20-%20diameter%2F2))%20%7C%7C%20(y%20%3C%20diameter%2F2))%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20direction%20*%3D%20-1%3B%0A%20%20%20%20%20%20%20%20%7D%20%0A%20%20%20%20%20%20%20%20x%20%2B%3D%200.1*a1*(speed%20*%20direction1)%3B%20%0A%20%20%20%20%20%20%20%20if%20((x%20%3E%20(width%20-%20diameter1%2F2))%20%7C%7C%20(x%20%3C%20diameter1%2F2))%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20direction%20*%3D%20-1%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20if%20(a1%3D%3D5)%20%7B%0A%20%20%20%20%20%20y%20%2B%3D%20(speed%20*%20direction)%3B%20%0A%20%20%20%20%20%20if%20((y%20%3E%20(height%20-%20diameter%2F2))%20%7C%7C%20(y%20%3C%20diameter%2F2))%20%7B%20%0A%20%20%20%20%20%20%20%20direction%20*%3D%20-1%3B%0A%20%20%20%20%20%20%7D%20%0A%20%20%20%20%20%20x%20%2B%3D%20(speed%20*%20direction1)%3B%20%0A%20%20%20%20%20%20if%20((x%20%3E%20(width%20-%20diameter1%2F2))%20%7C%7C%20(x%20%3C%20diameter1%2F2))%20%7B%20%0A%20%20%20%20%20%20%20%20direction1%20*%3D%20-1%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20void%20display()%20%7B%20%20%20%2F%2F%E9%A1%AF%E7%A4%BA%E9%9B%A8%E6%BB%B4%0A%20%20%20%20ellipse(x%2C%20y%2C%20diameter%2C%20diameter)%3B%0A%20%20%7D%0A%7D%0A” message=”” highlight=”” provider=”manual”/]
rit 程式說明 – Arduino端(7697)程式
[pastacode lang=”cpp” manual=”%23define%20Y_PIN%20A1%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%E5%8A%A0%E9%80%9F%E5%BA%A6%20Y%E8%BB%B8%0Aint%20trigPin%20%3D%2012%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%E8%B6%85%E9%9F%B3%E6%B3%A2%20Trig%20Pin%0Aint%20echoPin%20%3D%2011%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%E8%B6%85%E9%9F%B3%E6%B3%A2%20Echo%20Pin%0Along%20duration%2C%20cm%2C%20inches%3B%0Aint%20a%20%3D%200%3B%0A%0Afloat%20toG(float%20v)%20%7B%0A%20%20return%20v%20*%206%20%2F%201023%20-%203%3B%20%20%20%20%20%20%20%0A%7D%0A%0Avoid%20setup()%20%7B%0A%20%20Serial.begin%20(9600)%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Serial%20Port%20begin%0A%20%20pinMode(trigPin%2C%20OUTPUT)%3B%20%20%20%20%20%20%20%20%2F%2FDefine%20inputs%20and%20outputs%0A%20%20pinMode(echoPin%2C%20INPUT)%3B%0A%7D%0A%0Avoid%20loop()%0A%7B%0A%20%20int%20y%20%20%3D%20analogRead(Y_PIN)%3B%0A%20%20digitalWrite(trigPin%2C%20LOW)%3B%0A%20%20delayMicroseconds(5)%3B%0A%20%20digitalWrite(trigPin%2C%20HIGH)%3B%20%20%20%20%20%2F%2F%20%E7%B5%A6%20Trig%20%E9%AB%98%E9%9B%BB%E4%BD%8D%EF%BC%8C%E6%8C%81%E7%BA%8C%2010%E5%BE%AE%E7%A7%92%0A%20%20delayMicroseconds(10)%3B%0A%20%20digitalWrite(trigPin%2C%20LOW)%3B%0A%0A%20%20pinMode(echoPin%2C%20INPUT)%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E8%AE%80%E5%8F%96%20echo%20%E7%9A%84%E9%9B%BB%E4%BD%8D%0A%20%20duration%20%3D%20pulseIn(echoPin%2C%20HIGH)%3B%20%20%20%2F%2F%20%E6%94%B6%E5%88%B0%E9%AB%98%E9%9B%BB%E4%BD%8D%E6%99%82%E7%9A%84%E6%99%82%E9%96%93%0A%0A%20%20cm%20%3D%20(duration%20%2F%202)%20%2F%2029.1%3B%0A%20%20a%20%3D%20cm%20%2F%208%3B%0A%0A%20%20if%20(a%20%3C%205)%20%7B%0A%20%20%20%20if%20(a%20%3D%3D%200)%20%7B%0A%20%20%20%20%20%20if%20(y%20%3E%20360)%20%7B%0A%20%20%20%20%20%20%20%20a%20%3D%20a%20*%2010%20%2B%202%3B%0A%20%20%20%20%20%20%20%20Serial.write(a)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20else%20if%20(y%20%3C%20300)%20%7B%0A%20%20%20%20%20%20%20%20a%20%3D%20a%20*%2010%20%2B%201%3B%0A%20%20%20%20%20%20%20%20Serial.write(a)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20a%20%3D%200%3B%0A%20%20%20%20%20%20%20%20Serial.write(a)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20else%20%7B%0A%20%20%20%20%20%20a%20%3D%20a%20*%2010%3B%0A%20%20%20%20%20%20Serial.write(a)%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20else%20%7B%0A%20%20%20%20a%20%3D%2050%3B%0A%20%20%20%20Serial.write(a)%3B%0A%20%20%7D%0A%20%20delay(100)%3B%0A%7D%0A” message=”” highlight=”” provider=”manual”/]
Post Views: 601