PR

距離センサーの誤検知を平均値で補う -Scratch

コラム
スポンサーリンク

学校で習ったことってなんの役に立つのか、と子供の頃に考えたことがある人は多いと思います。
私の子供が電子工作を通して、「学校で習ったことってこう役立つんだ」と言っていたエピソードがあるので紹介します。

娘が小学5年のとき、夏休みの自由工作でマイコン仕掛けのお掃除ロボットの制作に挑戦したときのこと。
超音波センサーを使って、壁との距離が近くなったら旋回するように設計したのですが、距離センサーの誤検知に困っていました。
何回に一回、まったく壁に関係ないところで方向転換をしていました。

学校で習ったことを役立てる

計測値を見てみると、時々とんでもなく大きな外れ値が出ていました。
「センサーがこれじゃどうしようもない」と相談をされた時、結論から言ってしまえば、平均値を使う助言をしました。平均値で”薄めて”みる訳です。

この平均値をきっかけに、学校で習うことが何の役に立つのかを実感したようです。
※本当は、大きな偏りデータに引っ張られる平均値よりも中央値の方がよかったのですが、それは小学校では習っていないので

ソースコード

kyori変数

kyori1, 2, 3, 4の4つの変数に値を格納し、平均値を出しています。
これでうまくいったようです。

  1. 0.1秒間隔でkyori1, kyori2, kyori3, kyori4に距離センサーの値を入れる
  2. その平均が6よりも小さい時、壁を検知したとみなして旋回処理をする
    そうでなければ前進する
  3. kyori1, kyori2, kyori3, kyori4を初期化(=100する
  4. 1に戻って繰り返す

交互の旋回を制御する

今回のテーマに直接関係はないですが、migi変数もまた相談を受けて助言したので紹介します。

100均で売っているモップを引いて走るお掃除ロボットとしては、右旋回の次は左旋回、左旋回の次は右旋回、と交互に旋回方向を変更する必要があり、この点に困っていました。

  • 100回旋回をするとしたら、100文を作らなくてはいけないのか
  • そもそも何回旋回をしたらよいのかは部屋によるので決められない

フラグを立てることを助言しました。どちらに旋回をしたかをおぼえさせておくということです。

  1. 壁を検知した、かつmigi変数が0ならば左旋回をする
    → mgi変数のフラグを1にする。次回は右旋回であることを覚えさせておく。
  2. 壁を検知した、かつmigi変数が1ならば右旋回をする
    → migi変数のフラグを0にする。
  3. 1に戻って繰り返す

超音波センサーによる壁の検知と交互旋回の動き

壁の検知と旋回は次の通りです。これを右旋回、左旋回用の2揃い作成します。

  1. 壁を検知したらちょっとバック
    バックせずに旋回できる距離では壁の近くが掃除できないから、というこだわりです
  2. 90度回転してちょっと前進 (右回転と左回転の両方を作成する)
  3. さらに90度回転。これで旋回終わり(右回転と左回転の両方を作成する)

床が滑ってちょっと思うようにいってませんが(笑)
ただ右旋回の次に左旋回、左旋回の次に右旋回、という動き自体はうまくいっています。

外観・部品構成

外観

部品構成

  • マイコン Studuino
  • プログラミング環境 Scratch(マイコンに付属)
  • 超音波距離センサー
  • 田宮 楽しい工作基本セット タンク工作基本セット
  • その他、電池ボックスやプラスチックの構造体(ヨドバシカメラのプラモデルコーナーにて)
  • クリップ、100均で購入した小型モップ

コメント

タイトルとURLをコピーしました