ZawaWorks’s diary

プログラミング技術メモ

ArduinoからProcessingに複数のint型データを送る

はじめに

最近、Arduinoを使って複数の曲げセンサの値をProcessingに送り、ある値になると音を出すというものを作りました。このときArduinoで取得したint型のデータをProcessingに送信することに苦戦したのでその対処法をまとめました。

そもそもなんで上手く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