2017年3月17日金曜日

Raspberry Pi と Arduino で楽器作り(16) - 救世主シリアルプロッタ

Arduino IDEのシリアルプロッタを使って不具合の原因究明をします。

1. リアルタイムの大事さ

前回の投稿の後、だいぶ行きづまっていました。シリアルモニタには数字の羅列がものすごい勢いで流れているだけなので、閾値をとるにも一苦労だったからです。なのでCSVファイルとして保存して Excel でグラフ化、という手順を踏んでいたのですが、面倒なのでプログラム化しなきゃなあと思っていたところで、Arduino IDE の標準機能、シリアルプロッタを発見しました。シリアル通信にprint した数値をグラフとして出力してくれる上、複数出力対応、軸の上限下限も自動でとってくれる優れものです。これのおかげでだいぶ作業が楽になりました。Arduino IDEのツール>シリアルプロッタを選択するか、Ctrl + Shift + Lで画面を開けます。

2. 反応閾値を入力に応じて決定する

Arduino のセンサが、ノートパソコン接続時と Raspberry Pi 接続時で入力がだいぶん違うので、閾値を入力に応じて変えなければなりません。なるべく簡単にしたかったので、角速度の最大値と最小値を保持しておいて、それをもとに閾値を決定します。
見やすい
 それぞれ 1.8/3 を掛けることにしました。シリアルプロッタはこんな感じで表示してくれるので、デバッグがとても楽です。角速度(緑線)赤線を下回ると黄線がONになり、青線を上回ると黄線がOFFになっていることがわかると思います。
なお、角度をもとにしたON/OFFは安定しなかったため角速度をもとにON/OFFするようにしています。

3. バウンドを消す

入力が異なることと、もう一つの問題点として、バウンド(想定外の方向への角速度が出てしまう)がありました。上の図の一番左でも、負の角速度を発生させているのに正の方向に行ってしまっているところがあります。試験の結果、早く動かすほどこのバウンドが大きくなってしまうことがわかりました。原因はわかりませんが、閾値を越えてバウンドすることもあるため、何か対策をしなければなりません。
原因不明のため、強引に角速度を改変するプログラムにしました。
#test.ino
if(pre_gv1 < 0 && gv1 > 0) {
  gv1 -= 1000;
}
if(pre_gv1 > 0 && gv1 < 0) {
  gv1 += 1000;
}
if(pre_gv2 < 0 && gv2 > 0) {
  gv2 -= 1000;
}
if(pre_gv2 > 0 && gv2 < 0) {
  gv2 += 1000;
}
直前の角速度と現在の角速度をみて、正負が食い違った場合、直前の角速度の方向に1000動かすというものです。
 入力が多すぎて見づらいですが上のようなグラフになりました。特に負方向に、わざとバウンドするような勢いで角速度を加えました。紫の角速度が、0付近でギザギザ~となっているのがわかると思います。これによってバウンドがなくなるわけです。
強引に値を変えているので、これに起因する別の不具合がきっと起こると思います。もっとスマートな解決法が思いつけばよいのですが……。
まだあんまり試験していませんが、以上の変更で初めて Raspberry Pi 上でも角度に応じた0/1出力が安定するようになりました。さらに試験を重ねて、Python プログラミングに移れればなあと思います。

0 件のコメント:

コメントを投稿