やること
Arduino系(特にTeensy3.2)で読み取ったシリアルの値をProcessing3に渡し、画面で描画される図形を変化させます。それだけです。
今回は距離センサ2Y0A21を使います(アナログ出力ならセンサはなんでもよいです。)
なるべく最小限の要素にして、成功しやすくしています。
準備物・実施環境
- Arduino系のもの(今回の狙いはTeensy3.2)
- Processing3
- アナログセンサ(距離センサ、照度センサなど)
- 手元の環境はMac
接続
-センサの電源線を必要電圧に応じてArduino系の5v(or3V)、GNDに接続。
-センサのアナログ出力線をArduino系のA0ピンに接続。
プログラム
Arduino系側のスケッチ
int sensorPin = 0; //analog入力に使うセンサ用のピン番号。0ならA0ピン
int val; //センサの値
void setup(){
Serial.begin(9600); //シリアルを9600bpsで開始
}
void loop(){
//センサのアナログ値(0~1024を読み取って0-255の1バイトに変換)
val = map(analogRead(sensorPin),0,1023,0,255);
Serial.write(val);//1バイト(0-255)にしたセンサ値をシリアル送信
delay(10); //0.01秒止める
}
Arduinoに書き込む。ArduinoのSDKはここで閉じてもよい。
一旦Processing3でシリアルポートを調べる
Processing3を開いて下記のスクリプトを実行する。
import processing.serial.*;
Serial myPort;
printArray(Serial.list());
すると、Processing3のスクリプト画面の下段にシリアル通信のコンソール画面が現れ、下記のような結果が表示されます。(コンソール画面が出ない場合には、画面右下の三角印を押すと出ます。)
結果例>
[0] /dev/cu.ほにゃらら/ほにゃらら
[1] /dev/tty.ほにゃらら/ほにゃらら
[2] /dev/ほにゃらら/ほにゃらら
ここで、Arduino系で使っているシリアルポートと同じものの番号を調べておきます。
Arduinoで使用中のポートはArduinoSDKのメニューから「ツール」→「シリアルポート」
Proessing3側のスケッチ
import processing.serial.*; // シリアルライブラリをインポート
Serial myPort; //シリアルポートのインスタンス
int available_serialport = 2; // シリアル検索プログラムで調べたシリアルポートの番号に変更
String arduinoPort = Serial.list()[available_serialport]; //
int x; //シリアルから読み取った値を入れる
void setup(){
size(300, 300); // キャンバスサイズ
myPort = new Serial(this, arduinoPort, 9600); // シリアルポートの設定
}
void draw(){
background(251,252,239); //背景色をやわらかい色に
noFill(); //図形をぬりつぶさない
stroke(153,0,0) ;//線を赤っぽく
strokeWeight(3);//線をちょっと太く
ellipse(width/2,height/2,x,x); //キャンバスの中心に円を描画。サイズはシリアルの値(0-255)
}
void serialEvent(Serial p){
x = p.read(); //xにシリアルの値を入れる
println(x); //processingのシリアルモニタに数値を表示
}
実行
Processingを実行します。
センサが繋がっていれば、センサから出るアナログ電圧に応じて画面の丸がおおきくなったり小さくなったりします。
(↑実行例)
トラブルシュート
うまくいかない場合、問題がまずプログラム側なのかセンサ側なのかを特定します。
A0をArduinoのGNDに接続してアナログ入力の電圧を0にしてみたり、同じく3.3v(場合により5v)に接続して電圧を最大にした場合に、Processing3側の図形に反映されるか調べます。(GDNに繋いだ場合には円は点に、3.3or5Vに接続した場合には円の大きさが最大になります。)
この表示がうまくいっている場合、問題はセンサ側ということになります。
Teensyduinoだとシリアルポートの都合からうまくいかないかもしれないと危惧しましたが、このシンプルなプログラムの場合には無事に動きました。I2Cのデータなど少し長いデータも試してみようと思います。
次回記事
6軸センサー(MPU6050/GY-521)の値をArduino系で読み取ります。