ArduinoからProcessingに複数のint型データを送る
https://cdn.instructables.com/FIT/1BAE/HBFFJ2Z9/FIT1BAEHBFFJ2Z9.MEDIUM.jpg
はじめに
最近、Arduinoを使って複数の曲げセンサの値をProcessingに送り、ある値になると音を出すというものを作りました。このときArduinoで取得したint型のデータをProcessingに送信することに苦戦したのでその対処法をまとめました。
曲げセンサで作ってみたもの
https://www.youtube.com/watch?v=2QyvK4mJOW4
そもそもなんで上手くint型のデータを送れないの?
このサイトによると実際にArduinoから送っているデータは2バイトですが、シリアル通信では1バイトずつ送っているため2バイト以上のデータの処理に工夫がいるようです。 対処法
今回はString型として受信して処理する方法を書きます。
以下のコードは3つのint型の値をProcessingに送るコードです。
Arduino側
code:send.ino
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のコードです。
Processing側
code:receive.pde
import processing.serial.*;
Serial myPort;
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);//受信したデータ配列を参照
}
}
命令の解説
注目するのは以下の関数です。
code:receive.pde
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までを受け取ります。
code:受信したデータ(isString)
"777,888,999\n"
ステップ②
そして、trim()を使うことで文字列から改行(\n)を削除します。
code:受信したデータ(isString)
"777,888,999"
ステップ③
次にsplit()を使って,で区切られた文字列を配列として抜き出します。
code:受信したデータを文字列配列にする
{"777", "888", "999"}
ステップ④
最後にint()を使ってint型の配列にします。
code:int型の配列にする
{777, 888, 999}
こうしてArduinoからProcessingに3つのint型のデータを送ることができました。
おわりに
Arduinoからint型を受け取るには送られてきたバイトのデータからint型に復元するというやり方があった
そっちの方がデータ転送するのが早いらしい
それが難しいという人はこっちでも試してみては
参考資料