ProcessingでArduinoとシリアル通信

ProcessingとArduinoでシリアルデータ通信
ProcessingとArduinoでシリアルデータ通信

この記事では、ProcessingでArduinoとシリアル通信を行い、データを表示させたり図形を回転させたりしていく。

具体的には、Arduinoと加速度センサを使って計算した角度をProcessingで表示させたり、モデル図形を回転させたりする方法を解説していく。

Processingとは

Processingとは、グラフィックやアニメーションを簡単にプログラミングすることができるオープンソースのプログラミング言語でありIDEである。ProcessingはJavaベースのようであるが、Java言語のような冗長な書き方ではなく、Arduinoと似た感じでプログラミングできるため初心者の方でも非常にとっつきやすくなっている。

Wikipediaによれば、ProcessingはMITメディアラボで開発されたもので、電子アートやビジュアルデザインのアーティストによるコンテンツ制作作業のために特化した言語のようである。そのため、ProcessingではArduinoとシリアル通信を簡単に行える機能が備わっているようだ。

とにかくProcessingでシリアルデータを表示してみよう!

ProcessingでArduinoのシリアルデータ表示
ProcessingでArduinoのシリアルデータ表示

この画像は、ArduinoのSerial.printで送信したデータをProcessingでテキスト表示させているものである。こちらがProcessingのプログラム内容となる。

import processing.serial.*;

Serial serial;
String v = "";
int lf = 10;

void setup() 
{
  println(Serial.list()[3]);
  
  size(200, 150);
  frameRate(30);
  
  serial = new Serial(this, Serial.list()[3], 9600);
  serial.bufferUntil(lf);
}

void draw()
{
  background(255, 255, 255);
  
  if(v != null) {
    fill(0, 0, 255);
    textSize(28);
    textAlign(CENTER);
    text(v, 100, 75);
  }
}

void serialEvent(Serial p) {
  if (serial.available() >= 2) 
  {
     v = p.readString();    
  }
}

Serial.list()にはUSB接続された機器のポートが格納されているので、Arduinoのポートを探して選択する。また、ポートの通信速度9600bpsはArduinoと同じに設定する。

シリアルデータからLine Feed(改行)が送られてくると、serialEventが呼び出されるようになっている。

なお、加速度センサの使い方などは、これらの記事を御覧ください。

Processingで加速度センサの角度をシンクロさせてみよう!

ArduinoとProcessingのオブジェクトをシンクロ
ArduinoとProcessingのオブジェクトをシンクロ

次にProcessingで長方形のオブジェクトを作り、Arduinoから送られてきた角度に合わせてオブジェクトを回転させてみよう。▼こちらの動画のようにArduinoと同期してオブジェクトが回転するプログラムを書いてみた。

import processing.serial.*;

Serial serial;
int lf = 10;
float ra = 0;
int w = 100;
int h = 40;

void setup() 
{
  println(Serial.list()[3]);
  
  size(300, 300);
  frameRate(30);
  
  serial = new Serial(this, Serial.list()[3], 9600);
  serial.bufferUntil(lf);
}


void draw()
{
  background(255, 255, 255);
  
  fill(77, 77, 77);
  translate(width/2, height/2);
  rotate(ra + PI);
  
  rect(-w/2, -h/2, w, h);
}

void serialEvent(Serial p) {
  if (serial.available() >= 2) 
  {
     ra = float(p.readString());    
  }
}

四角形を中心で回転させるためにrect(-w/2, -h/2, w, h)のようにして、起点をずらしているところがポイント。Arduinoからは角度をラジアンで送るようにした。

記事に関するご質問などがあればTwitterへお返事ください。
この記事で紹介した商品
人気のArduino互換機
Arduinoで人気の周辺パーツ
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容となっています。ほかのArduino書籍と比べて図や説明がとてもていねいで、読みやすかったです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事