測距センサ VL53L0X を用いた身長測定器

お父ちゃん  2016.9.17 
Home > 電子工作 > 測距センサ VL53L0X を用いた身長測定器
すき 0
うんこ 0

子供って長時間じっとできないので身長をはかるのってなかなか大変。。。
そこで低価格で高精度のセンサを見つけたので場所と時間を取らない身長測定器をつくりました。

構成

heightmeasure01_%e3%83%96%e3%83%ac%e3%83%83%e3%83%89%e3%83%9c%e3%83%bc%e3%83%89

  • 距離センサ VL53L0X

凄い広範囲なのに分解能1mmのセンサです!Arduino用ライブラリは以下にあります。
 https://github.com/pololu/vl53l0x-arduino

  • 6軸モーションセンサ MPU6050

    3軸ジャイロスコープと3軸加速度センサで姿勢情報をセンシングできます。今回は水平方向のx軸、y軸の加速度のみ使用して測定器の水平度を計測してます。しかしメチャクチャ安い!Arduino用ライブラリは以下にあります(MPU6050とI2Cdevを使用)。
     https://github.com/jrowberg/i2cdevlib/tree/master/Arduino

  • LED(Neopixel)
    測定器が非水平の時は赤く、水平の時は緑に光ります。
  • LCDディスプレイ
    梅沢無線で¥400!山積みにされてるのを購入。以下が参考になります。
     https://www.arduino.cc/en/Tutorial/HelloWorld

  • マイコンArduino Nano互換品
    激安の互換品を使用してます 🙂 

  • 測定ボタン(タクトスイッチ)
    押すことで動作モードを変更します。

測定器

1

センサ VL53L0Xを木箱の底に配置し距離を測定します。距離はLCDディスプレイに表示されます。
木箱内部にマイコンArduino Nanoと6軸モーションセンサMPU6050に配置し、電源には9V電池を使用しました。2

MPU6050の水平方向の(重力)加速度を検出して測定器の水平具合を計測し、水平時にLEDが緑色になります。

使い方

ディスプレイ表示

3

通常モード

電源スイッチを入れると起動し通常モードで動作します。通常モード時は常に距離を測定しディスプレイに表示されます。測定器が水平時にはLEDは緑に光り、非水平時は赤く光ります。

測定モード

測定ボタン(タクトスイッチ)を押している間は測定モードとなります。測定器を頭に乗せて測定モードにしてから水平状態で距離が検出されるとLEDが青くひかり測定値が保持され身長が計測できます。

再度測定ボタンを押すと通常モードに戻ります。

Arduino IDE用コード

距離センサ VL53L0XはLONG_RANGEモードとHIGH_ACCURACYモードで使用。
距離は単位をcmにしてセンサ位置分補正してます(1mm)。

 

比較的高速で測定でき精度も高いので、これで落ち着きのない長男くんicon-babyの身長でも簡単に測ることができます♪

追記(16/9/23)

hackaday.com様にて紹介いただきました!

170cmくらいまではそれなりの精度で測れてます。180cm超えると誤差大きくなりますね。。。水平度測るセンサMPU6050の値平均化してノイズ除去とか まだまだ詰めれそうです。

追記(16/9/26)

Adafruit様のブログで取り上げていただきました。

追記(16/9/28)

各所で取り上げていただき感謝です 😛 !

なんと本家Arduino様やAtmel様もTweetくださいました!!

「測距センサ VL53L0X を用いた身長測定器」への11件のフィードバック

  1. こんばんわ
    検索で辿りつきました。
    精度はどのくらいでしょうか?
    大体でも教えて頂けると、有り難いです。

    1. コメントありがとうございます!
      VL53L0X自体の精度はかなり高いです。分解能1mmで180cmくらいまでいけてます。

      この身長計の精度としましては加速度センサの誤差(というか使い方の問題)が
      支配的で現状 真値±2cmくらいです。。。

  2. こんばんわ
    コメント後、最近やっとモジュールを入手し、実験してみました。
    仰るように精度良いですね。
    使えそうです。
    相談なのですが、埃防止に透明カバーをつけようと思っています。
    英語のデータシートをざっと読んでみたところ、offsetあるいはcross-talkで設定っぽいのは
    分かったのですが、これはどっちをいじればいいのか、自信がありません。
    この資料をみて、こんな感じでやればいい程度のアドバイスを頂けると有り難いです。
    宜しくお願いします。

  3. 度々済みません。
    悩み所は、デフォルトで透明カバーというか、透明なガラスが検出されてしまうので、
    そいつを検出しないようにできるのか?ってところです。

    1. 自レスです。
      板を汚して済みません。
      調べた限りですが、赤外線レーザーが反射しているので、IRコーティングされたガラス、カバーでないとダメだと分かりました。
      相変わらず、offsetの設定をどうやるかは分かっていません。

      1. コメントありがとうございます。 
        データシート
          データシートのp.12によりますと オフセット補正は距離に依存しない誤差を
          クロストーク補正は距離に依存する誤差を補正するとのことです。

         カバーに関するアプリケーションノート
          この資料ではおっしゃるようにIRコーティング推奨されていますね。
          クロストーク補正の詳細はVL53L0X API User Manualに詳細記載とのことですが見つけれません。。。

        オフセットやクロストーク補償はpololuのライブラリでは用意されていないようですがadafruitのライブラリでは使用できそうです。調査は必要ですが。。。。

  4. こんにちは。
    このセンサーを調べていて辿り着きました。
    質問なのですが、このセンサーは無限遠、もしくは測定範囲外の遠距離を測ろうとしたときどのような値を返すのでしょうか?
    ご教示お願いします。

    1. コメントありがとうございます!

      この測定器ではLONG_RANGEモードとHIGH_ACCURACYモードで使用してるのですが、
      190cm以上で精度が悪くなっていって217cm以上になると測定値が低下して全く測定できない状態になります

      1. 返信どうもです。
        全く測定できないとのことですが、arduino側からは具体的にどういう数値が見えるのでしょう?
        データーシートはざっと眺めましたが、そういった点に関しては良く分かりませんでした。
        よろしくお願いします。

        1. 217〜218cmを超えたあたりで130cm〜70cmなどの誤った値を返してきます。

          ここではpololuのライブラリ https://github.com/pololu/vl53l0x-arduino
          をつかって
          readRangeSingleMillimeters()
          で測定しています。mm単位の値を返してきます。

          以下でcmにしてモジュールの高さ分補正しています。
          height = sensor.readRangeSingleMillimeters()/10.0 + 0.1;

コメントはこちらから

メールアドレスが公開されることはありません。コメントのみでもOKです。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください