實驗目的
練習透過序列通訊把 Processing 與 Arduino 連接起來。使用可變電阻 (potentiometer) 來控制 Processing 畫面上的矩形的水平移動。
材料與接線
- 麵包板 x 1
- Arduino 板子 x 1
- 可變電阻 x 1
- 單心線 x N
接線很簡單,參考下圖,把可變電阻中間腳位接到類比輸入(Analog Input) pin 0,剩下的兩支腳位,一支接到 5V,另外一支接到 GND:
Arduino 程式
Arduino 程式(potentiometer.pde) 非常簡單,只是單純讀取接在 pin 0 上的可變電阻,並將讀值列印到 Serial Port 而已:
有件事要注意,因為 L9 這行把 Serial port 通訊速度設成 9600 bps,所以你 Processing 端的程式在開啟 Serial port 時,記得也要把通訊速率設成 9600 bps,這樣 Arduino 跟 Processing 兩邊才能溝通。
Processing 程式
Processing 程式如下(Rect_Serial.pde),程式的邏輯是讀取從 Serial Port 傳進來的 Sensor 讀值,然後利用 Sensor 的讀值控制矩形的水平移動:
可變電阻的讀值會存放在 sensorValue 裏。rect(sensorValue, 80, 50, 50); 這一行會在 (x, y) 座標為 (sensorValue, 80) 的位置畫出一個 50 x 50 的矩形。因為是水平移動,所以我們把 sensorValue 當作是 x 軸的位置變數,而 y 軸固定在 80 的位置。
範例照片/影片
先把 Arduino 程式(potentiometer.pde) 上傳到 Arduino 板子上,接著執行 Processing 程式(Rect_Serial.pde),然後你就會看到一個「背景為白色,視窗中有一個紅色的矩形」的視窗,如下:
因為 Processing 程式裏有 println(sensorValue); 這一行指令,所以當你旋轉可變電阻時 Processing IDE 下方的狀態視窗也會即時顯示可變電阻的讀值:
如果需要同時讀取兩個電阻顯顯示在Lcd上,該怎樣做?
回覆刪除#include
#define analogInPin 0
int sensorValue = 0;
LiquidCrystal lcd(3, 4, 5, 8, 9, 10, 11); //初始化LCD
void setup()
{
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(analogInPin);
Serial.print("Value = " );
Serial.println(sensorValue);
lcd.begin(16, 2); //設定LCD大小
lcd.print(sensorValue); //輸出字串
delay(100);
}
Hi,
回覆刪除你已經學會了幾件事:
1. 你會讀取一個可變電阻:
sensorValue = analogRead(analogInPin); // analogInPin 為 0
要讀第二個可變電阻很簡單啊,只要依樣畫葫蘆便可以:
#define analogInPin2 1
sensorValue2 = analogRead(analogInPin2); // analogInPin2 為 1
2. 你知道怎麼把一個電阻值顯示在 LCD 上:
lcd.print(sensorValue); //輸出字串
現在你的問題是「要怎麼把兩個電阻值顯示上?」對嗎?
OK, 我想應該很簡單,你只要想辦法把 sensorValue 和 sensorValue2 結合成一個字串然後再丟給 lcd.print() 去輸出,這樣就行了。Try It!
你好
回覆刪除我用arduino寫好程式後
轉動可變電阻可正常顯示變化0~255
用其他終端機軟體也正常
但用processing讀取serial port的數據就會一直亂跳
不知道是甚麼原因呢
謝謝
自問自答
回覆刪除Serial.print(sensorValue/4, BYTE);
改成
Serial.write(sensorValue/4);
咦?
回覆刪除在 Arduino 內部,Serial.print(sensorValue/4, BYTE) 最後也是會呼叫 write(),照道理 Serial.print(sensorValue/4, BYTE) 跟 Serial.write(sensorValue/4) 作用是一樣的
我當時是用 Arduino-0022 測的,還挺正常的
As of Arduino 1.0, the 'BYTE' keyword is no longer supported.
回覆刪除Please use Serial.write() instead.
原來是 Arduino 1.0 把 BYTE keyword 拿掉了,難怪,Release Note 上有提到:
回覆刪除http://arduino.cc/en/Main/ReleaseNotes
好,我從善如流,把 Serial.println(SensorValue/4) 這行改成 Serial.write(SensorValue/4)
感謝你的回饋
C大~你好
回覆刪除我最近剛碰arduino這套軟體
裡面有內建按鈕控制輸入腳是2按鈕
輸出是13紅燈
而我在processing畫了一個圓
我如何使用processing
讀到13號腳是高電位還是低電位
使我的圓改變顏色呢@@?
hi, 你的困難是什麼? 是 Arduino 讀取 pin 13 狀態的程式,或是 Processing 畫圓或者是改變圓的顏色,你在哪一部份卡關?
回覆刪除C大是這樣的我在Processing畫了一個圓它可以換色,但是我不知道如何使它讀到Arduino的腳位來做變換顏色@@!
回覆刪除你可以考慮用 Firmata,參考一下這篇的介紹:
回覆刪除http://coopermaa2nd.blogspot.tw/2011/03/firmata-processing-arduino.html
用 Firmata 的話,可以用 arduino.analogRead(), arduino.digitalRead(), arduino.digitalWrite() ... 等像在寫 Arduino 程式一樣寫 Processing 的程式
Processing 提供的 Firmata 範例也有 digitalRead() 的範例可以參考