みなさん,こんにちは
おかしょです.
以前,ProcessingでArduinoから送られてきたデータを受け取る方法を解説しました.
その記事ではセンサーなどのデータをArduinoで処理をして,Processingで表示することを目的としていました.
今回はArduinoからProcessingではなく,ProcessingからArduinoへデータを送る方法を解説します.
これができるようになると,Arduinoのプログラムをわざわざ書き換えなくてもProcessingで簡単なパラメータの変更ができるようになります.
この記事を読むと以下のようなことがわかる・できるようになります.
- ArduinoとProcessingを双方向で通信する方法
- Arduinoのプログラムの書き方
- Processingのプログラムの書き方
この記事を読む前に
この記事は以下の記事の応用となります.
プログラムに関しては以下の記事で詳細に解説しているので,以下の記事を先に読んでおくことをおすすめします.
作製するプログラムの概要
まずは,今回作成するプログラムについて先に説明しておきます.
今回はProcessingからArduinoへとデータを送信します.
なので,Arduinoはデータを受け取るのですが,そのデータをちゃんと受け取ることができたのか確認しなければなりません.
通常はArduinoのデータを確認するのはシリアルモニタを使えばできます.
(シリアルモニタが何かわからない方はこちらの記事を読んでください)
しかし,今回はProcessingと通信するためにシリアルモニタに表示するために必要なポートを使用しなければなりません.
そのため,シリアルモニタは使用できません.
そこで,データの確認はProcessingで行います.
ProcessingからArduinoへとデータを送信し,Arduinoはデータを受け取ったら再び,Processingに受け取ったデータを送ります.
こうすることで,ArduinoがProcessingからデータを受け取れたのかを確認します.
Arduino側のプログラム
まずはArduino側のプログラムは以下になります.
void setup() {
Serial.begin(9600);
}
void loop() {
recvData();
}
void sendData(int data)
{
// ダミーデータの送信
Serial.write(200);
Serial.write(1);
if(data>=0)
{
Serial.write(0);
}
else
{
data = data*(-1);
Serial.write(1);
}
Serial.write((byte)(data>>8));
Serial.write((byte)(data));
}
void recvData()
{
int data[3];
if(Serial.available()>5)
{
if(Serial.read()==200)
{
if(Serial.read()==1)
{
data[0] = Serial.read();
data[1] = Serial.read();
data[2] = Serial.read();
if(data[0]==0)
{
data[0] = data[1]*256+data[2];
}
else if(data[0]==1)
{
data[0] = -1*(data[1]*256+data[2]);
}
sendData(data[0]);
}
}
}
}
このプログラムでは2 byteのデータを送信できるsendData()という関数と,同じく2 byteのデータを受け取るrecvData()という関数を使用しています.
この関数の詳しい解説はこちらで行っているので参照してください.
このプログラムではloop関数の中にデータを受け取るrecvData()関数を置いているので,常にデータが受信できないか確認するようになっています.
また,recvData()にはsendData()が含まれているので,データを受信したらすぐに受信したデータを送り返すようになっています.
Processing側のプログラム
次はProcessing側のプログラムを以下に示します.
import processing.serial.*;
Serial port;
void setup() {
port = new Serial(this, Serial.list()[0], 9600);
}
void draw() {
sendData(-255);
}
void sendData(int data) {
// ダミーデータの送信
port.write(200);
port.write(1);
if(data>=0)
{
port.write(0);
}
else
{
port.write(1);
data = data*(-1);
}
port.write((byte)(data>>8));
port.write((byte)(data));
}
void serialEvent(Serial port) {
int[] data = new int[3];
if ( port.available() > 5 )
{
if(port.read()==200)
{
if(port.read()==1)
{
data[0] = port.read();
data[1] = port.read();
data[2] = port.read();
if(data[0]==0)
{
data[0] = data[1]*256+data[2];
println("data =", data[0]);
}
else if(data[0]==1)
{
data[0] = -1*(data[1]*256+data[2]);
println("data =", data[0]);
}
}
}
}
}
こちらのプログラムも先程と同じように,2 byteのデータを送信するsendData()関数が使用されています.
データを受け取るのはserialEvent関数を使用しています.
Processingのプログラムでは最初にArduinoにデータを送るので,sendData()がdraw関数の中にあります.
これによって,常にデータを送り続けるようになっています.ここでは,例として-255を送信しています.
そして,Arduinoからデータが送られてくるとSerialEventが起動して,データを受信します.
今回はprintlnコマンドを使用して,Processingのコンソールに表示するようにしています.
実行結果
それでは,上記のプログラムを実行してみます.
最初に,Arduinoに先程のプログラムを書きこみます.その後に,Arduinoはパソコンとつないだ状態でProcessingのプログラムを実行すると”data = -255″と表示されれば成功です.
これができれば,どのような値でもProcessingからArduinoへ送信することが可能となります.
Processingのプログラムの9行目の-255を好きな数字に書き換えてみてください.
例えば,150と書き換えると”data = 155″と表示されます.
ここで,今回プログラムに書いてある関数は2 byteのデータを送受信することを想定して作成しています.そのため,2 byte以上の通信を行う場合は関数を適宜変える必要があるので注意してください.
まとめ
この記事ではProcessingからArduinoにデータを送る方法・双方向通信を行うプログラムを公開しました.
続けて読む
この記事のプログラムを応用すれば,モーターの回転制御をキーボードの操作でできるようになります.
それができれば,自分で作った車をキーボードで操作するラジコンカーにすることも可能です.
キーボードをつかったProcessingのプログラムについては以下で解説しているので,そちらを参照してください.
Twitterでは記事の更新情報や活動の進捗などをつぶやいているので気が向いたらフォローしてください.
それでは最後まで読んでいただきありがとうございました.
コメント