Arduinoと超音波センサーとProcessingで簡易モニター 検証
検証備忘録
仕事でAftereffecstのモーショングラフィック作業してるとき
ふと「キーで気持ち良いボヨヨンとかの動きをさっと作りたいので、PysicalUI作りたい。USB繋げてすぐセンシングして、テキストファイル書き出しして、AEにコピペして」みたいな完全オリジナルPUI作りたいと思って
帰ってから検証して見たのメモ。
実験
Arduino UNO + 超音波センサー
Processing + 可視化グラフ(まずは)
で
手を自由に動かしてインタラクティブにグラフ確認と、テキスト出力までしたい
結果
全然ダメ
超音波センサーは手のひらでセンシングすると20〜30cmくらいでもうノイズ目立ってくる。
まぁノイズなら調整で正せるかもだけど、反応性が悪い気がする。ついてこない。
(スケッチの問題だと思われる。時間かかるのでまた今度)
次のチャレンジ
MIDIコントローラのスライダーと
Processingを繋げてインタラクティブなUIとテキスト出力
したい!
➡️ここを参考にしてやりたい
とりあえず、今回試したスケッチはこちら。
Arduino
//********************************************************************
//*超音波センサを使って距離を表示するプログラム
//********************************************************************
//********************************************************************
//*超音波センサを使って距離を表示するプログラム
//********************************************************************
#define echoPin 3 // Echo Pin
#define trigPin 5 // Trigger Pin
double Duration = 0; //受信した間隔
double Distance = 0; //距離
void setup() {
Serial.begin( 9600 );
pinMode( echoPin, INPUT );
pinMode( trigPin, OUTPUT );
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite( trigPin, HIGH ); //超音波を出力
delayMicroseconds( 10 ); //
digitalWrite( trigPin, LOW );
Duration = pulseIn( echoPin, HIGH ); //センサからの入力
if (Duration > 0) {
Duration = Duration/2; //往復距離を半分にする
Distance = Duration*340*100/1000000; // 音速を340m/sに設定
Serial.print(Distance);
Serial.write("\n");
}
delay(1); //シリアルモニタで確認するときは100
}
Processing
/*
* Arduino - Processingシリアル通信
* センサーの値をグラフにプロット
* Processing側サンプル
*/
import processing.serial.*;
int NUM = 1; //センサー個数。今回は1個。「ショックセンサーの例」では2個
Serial myPort; // シリアルポート
float sensors = 2; //センサーの値を格納する配列
int cnt; //カウンター
// グラフの線の色を格納
color[] col = new color[6];
int pSize = 2; //異なる2つのプロットサイズで
void setup() {
//画面設定
size(1600, 400);
frameRate(240);
// シリアルポートのリスト取得
//println(Serial.list());
// ポート番号とスピードを指定してシリアルポートをオープン
String portName = Serial.list()[1];
// myPort = new Serial(this, portName, 9600); //Win
myPort = new Serial(this,"/dev/cu.usbmodem1421",9600); //Mac
// 改行コード(\n)が受信されるまで、シリアルメッセージを受けつづける
myPort.bufferUntil('\n');
//グラフ初期化
initGraph();
}
void draw() {
// センサーの数だけ、グラフをプロット 。今回は1個。複数個のときは「ショックセンサーのプログラム参照」
fill(col[1]);
float tx = map(cnt, 0, width, 10, width); //左に余白10
float ty = map(sensors, 0, 100,height-10,10); //上端がy=0のため、下端をベースに描画するにはこのリマップ← ※上下余白 100
ellipse(tx, ty, pSize, pSize);
if (cnt > width) {
initGraph();
}
//カウンタアップ
cnt++;
}
//グラフの初期化
void initGraph() {
background(47);
noStroke();
cnt = 0;
// グラフ描画の線の色を定義
col[0] = color(255, 127, 31);
col[1] = color(31, 255, 127);
col[2] = color(127, 31, 255);
col[3] = color(31, 127, 255);
col[4] = color(127, 255, 31);
col[5] = color(127);
}
void serialEvent(Serial myPort) {
// シリアルバッファーを読込み
String myString = myPort.readStringUntil('\n');
// 読み込んだ文字列を 小数(数字)に変換して、関数に代入
sensors = float(myString);
}
-----------
参考サイト
今後「Arduinoからのシリアル通信結果をProcessingでテキスト出力」はこれまんま
https://kenyu-life.com/2018/11/24/pulsesensortxtdata/
0 コメント:
コメントを投稿