本篇主要介紹如何由Arduino傳輸資料去Processing軟件,從而令Processing畫出來的動畫能與Arduino互動。
Arduino與Processing之間可以透過Serial串口溝通,以下為Arduino傳送資料到Processing和Processing傳至Arduino的基礎程式結構。
Arduino以文字格式傳送三個數值給Processing,Processing讀取後,再分別放入陣列之中,然後列印出來。
x1void setup(){
2 Serial.begin(115200);
3}
4
5void loop(){
6 int random_number_1 = random(0, 512);
7 int random_number_2 = random(0, 512);
8
9 Serial.print(random_number_1);
10 Serial.print(',');
11 Serial.println(random_number_2);
12 delay(1000);
13}
xxxxxxxxxx
301import processing.serial.*;
2Serial myPort;
3
4int x_position, y_position;
5
6void setup() {
7 size(512, 512);
8 println(Serial.list());
9 myPort = new Serial(this, Serial.list()[0], 115200);
10 myPort.bufferUntil('\n');
11}
12
13void draw() {
14 //此處為空
15}
16
17void serialEvent(Serial myPort){
18 String myString = myPort.readStringUntil('\n');
19 myString = trim(myString);
20
21 int data[] = int(split(myString, ','));
22
23 for (int i = 0; i < data.length; i++) {
24 print(data[i] + " ");
25 }
26 println();
27
28 x_position = data[0];
29 y_position = data[1];
30}
上載完Arduino的程式後,開啟Arduino的serial監測器。確定Arduino每1秒鐘會出兩個數值,中間以逗號分隔(沒有空格)。
之後再運行Processing程式碼(運行前請先關閉Arduino的serial監測器,否則Processing會告訴你接口被佔用),一開始按run鍵時,通常會告訴你這句有錯:
xxxxxxxxxx
11myPort = new Serial(this, Serial.list()[0], 115200);
這句是告訴Processing,哪個serial串口是接Arduino的,Processing上面的println(Serial.list());
會列出所有的串口,如果是window電腦的話,會列出COMxx
, COMxx
等,確定哪一個是Arduino(去Arduino IDE看看上傳的序列埠就知道)。例如Processing列出的是:COM3
COM8
COM9
,而你確定COM9
是Arduino,那就將Serial.list()[0]
改為Serial.list()[2]
。
xxxxxxxxxx
141void serialEvent(Serial myPort){
2 String myString = myPort.readStringUntil('\n');
3 myString = trim(myString);
4
5 int data[] = int(split(myString, ','));
6
7 for (int i = 0; i < data.length; i++) {
8 print(data[i] + " ");
9 }
10 println();
11
12 x_position = data[0];
13 y_position = data[1];
14}
整段SerialEvent
函數中,每次Serial
串口收到資訊就會運行,用一String
字串去紀錄收到的字串,例如現在收到的是127,242
。
int data[] = int(split(myString, ','));
: split
是把剛才收到的字串以逗記分隔開,再分別放入data[ ]
這個陣列,所以現在data[0]
是127
,data[1]
是242
。
xxxxxxxxxx
41for (int i = 0; i < data.length; i++) {
2 print(data[i] + " ");
3 }
4println();
之後再把再個data[ ]
列印出來。