2011年3月11日 星期五

透過序列通訊把 Processing 與 Arduino 連接起來

實驗目的

練習透過序列通訊把 Processing 與 Arduino 連接起來。使用可變電阻 (potentiometer) 來控制 Processing 畫面上的矩形的水平移動。

image

材料與接線
  • 麵包板 x 1
  • Arduino 板子 x 1
  • 可變電阻 x 1
  • 單心線 x N

接線很簡單,參考下圖,把可變電阻中間腳位接到類比輸入(Analog Input) pin 0,剩下的兩支腳位,一支接到 5V,另外一支接到 GND:

image

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),然後你就會看到一個「背景為白色,視窗中有一個紅色的矩形」的視窗,如下:

image
▲ 旋轉可變電阻可以讓矩形水平移動

因為 Processing 程式裏有 println(sensorValue); 這一行指令,所以當你旋轉可變電阻時 Processing IDE 下方的狀態視窗也會即時顯示可變電阻的讀值:

image

延伸閱讀

11 意見:

蕭亦祥 提到...

如果需要同時讀取兩個電阻顯顯示在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);
}

Cooper Maa 提到...

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!

Unknown 提到...

你好
我用arduino寫好程式後
轉動可變電阻可正常顯示變化0~255
用其他終端機軟體也正常

但用processing讀取serial port的數據就會一直亂跳

不知道是甚麼原因呢

謝謝

Unknown 提到...

自問自答

Serial.print(sensorValue/4, BYTE);
改成
Serial.write(sensorValue/4);

Cooper Maa 提到...

咦?
在 Arduino 內部,Serial.print(sensorValue/4, BYTE) 最後也是會呼叫 write(),照道理 Serial.print(sensorValue/4, BYTE) 跟 Serial.write(sensorValue/4) 作用是一樣的

我當時是用 Arduino-0022 測的,還挺正常的

Unknown 提到...

As of Arduino 1.0, the 'BYTE' keyword is no longer supported.
Please use Serial.write() instead.

Cooper Maa 提到...

原來是 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號腳是高電位還是低電位
使我的圓改變顏色呢@@?

Cooper Maa 提到...

hi, 你的困難是什麼? 是 Arduino 讀取 pin 13 狀態的程式,或是 Processing 畫圓或者是改變圓的顏色,你在哪一部份卡關?

小柯 提到...

C大是這樣的我在Processing畫了一個圓它可以換色,但是我不知道如何使它讀到Arduino的腳位來做變換顏色@@!

Cooper Maa 提到...

你可以考慮用 Firmata,參考一下這篇的介紹:

http://coopermaa2nd.blogspot.tw/2011/03/firmata-processing-arduino.html

用 Firmata 的話,可以用 arduino.analogRead(), arduino.digitalRead(), arduino.digitalWrite() ... 等像在寫 Arduino 程式一樣寫 Processing 的程式

Processing 提供的 Firmata 範例也有 digitalRead() 的範例可以參考