ArduinoからProcessingに複数のint型データを送る
はじめに
最近、Arduinoを使って複数の曲げセンサの値をProcessingに送り、ある値になると音を出すというものを作りました。このときArduinoで取得したint型のデータをProcessingに送信することに苦戦したのでその対処法をまとめました。
いつも洗濯物たたむのつまらないので、Arduinoと洋服たたみボードを使って、服をたたみと音がなる「TaTaMusic」というデバイスを作ってみました pic.twitter.com/AQkC3pY1xB
— Yuki Aizawa (@Zawa_works) 2018年4月17日
そもそもなんで上手くint型のデータを送れないの?
ArduinoからProcessingへint型のデータを送る - Imaginable Realityによると実際にArduinoから送っているデータは2バイトですが、シリアル通信では1バイトずつ送っているため2バイト以上のデータの処理に工夫がいるようです。
対処法
今回はString型として受信して処理する方法を書きます。 以下のコードは3つのint型の値をProcessingに送るコードです。
void setup() { Serial.begin(9600); // シリアル通信速度 } void loop() { Serial.print(777); Serial.print(","); Serial.print(888); Serial.print(","); Serial.print(999); Serial.print("\n"); } // 1秒待機 delay(1000); }
そして、Arduinoから受け取った値を取得するProcessingのコードです。
import processing.serial.*; Serial myPort; int []data = new int [3]; void setup() { myPort = new Serial(this, Serial.list()[0], 9600); } void draw(){} //送られてきたデータを処理する関数 void serialEvent(Serial p) { String inString = myPort.readStringUntil('\n'); if (inString != null) { inString = trim(inString); data = int(split(inString, ',')); println(data);//受信したデータ配列を参照 } }
命令の解説
注目するのは以下の関数です。
void serialEvent(Serial p) { String inString = myPort.readStringUntil('\n'); if (inString != null) { inString = trim(inString); data = int(split(inString, ',')); println(data);//受信したデータ配列を参照 } }
ステップ①
String inString = myPort.readStringUntil('\n');
は送られたデータの \n
までを受け取ります。
受信したデータ(isString)
"777,888,999\n"
ステップ②
そして、trim()
を使うことで文字列から改行(\n
)を削除します。
受信したデータ(isString)
"777,888,999"
ステップ③
次にsplit()
を使って,
で区切られた文字列を配列として抜き出します。
受信したデータを文字列配列にする
{"777", "888", "999"}
ステップ④
最後にint()
を使ってint型の配列にします。
int型の配列にする
{777, 888, 999}
こうしてArduinoからProcessingに3つのint型のデータを送ることができました。
おわりに
Arduinoからint型を受け取るには送られてきたバイトのデータからint型に復元するというやり方がありましたが、こっちのほうが初心者でも理解しやすいし、覚えやすいような気がしました。
参考資料
d.hatena.ne.jp [Arduino->Processing]ArduinoからProcessingへ複数のデータを送信テスト①m0rya.wordpress.com ch.nicovideo.jp