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 則留言:

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

    回覆刪除
  2. 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!

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

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

    不知道是甚麼原因呢

    謝謝

    回覆刪除
  4. 自問自答

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

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

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

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

    回覆刪除
  7. 原來是 Arduino 1.0 把 BYTE keyword 拿掉了,難怪,Release Note 上有提到:
    http://arduino.cc/en/Main/ReleaseNotes

    好,我從善如流,把 Serial.println(SensorValue/4) 這行改成 Serial.write(SensorValue/4)

    感謝你的回饋

    回覆刪除
  8. C大~你好
    我最近剛碰arduino這套軟體

    裡面有內建按鈕控制輸入腳是2按鈕
    輸出是13紅燈
    而我在processing畫了一個圓
    我如何使用processing
    讀到13號腳是高電位還是低電位
    使我的圓改變顏色呢@@?

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

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

    回覆刪除
  11. 你可以考慮用 Firmata,參考一下這篇的介紹:

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

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

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

    回覆刪除

注意:只有此網誌的成員可以留言。