2017年12月10日日曜日

デジタル積雪計を作る③ -距離センサVL53L0Xを動かす-

前回:デジタル積雪計を作る②

12月になりました。
ブログの更新が滞っているせいで進捗が無いように思えますが、ブログが遅いだけで進捗は出まくってます。


今回はESP32を使って距離センサVL53L0Xを動かします。

VL53L0XはマイコンとI2Cを使って通信するので、ケーブルは電源、GND、SDA、SCLの4本あれば動きます。すぐ出来そうな気がします。



センサは前回スイッチサイエンスにてESP32と一緒に購入しています。
センサの入っている袋にはまっすぐなピンヘッダとL字型のピンヘッダが入っていますが、今回はL字型を使うことにして、センサをテープなどで固定しながらハンダ付けします。

そうしたら、下の画像のようにつなぎます。

[VL53L0X] - [ESP32]
VIN - 3V3 (VOUTが5.5V以下でればVOUTでも良い)
GND - GND (ESP32はいっぱいあるけどどこでも良い)
SDA - 21ピン
SCL - 22ピン
下の画像ではESP32とVL53L0XがぶつかりそうだったのでESP32を逆向きに挿していますが、USBコネクタがブレッドボードの外側になるように配置しても大丈夫でした。
むしろ、画像のようにやるとVIN-3V3間が遠くなるのでアレです。



ハードが終わったら次はソフトです。
VL53L0Xはレジスタが公開されていないらしくかなり大変な作業になる予感がしていましたが、幸いにしてArduino用にはセンサモジュールの発売元がらライブラリが公開されています。
ということで、GitHub - pololu/vl53l0x-arduino: Pololu Arduino library for VL53L0X time-of-flight distance sensor にアクセスし、緑色の[Clone or download]ボタン内にあるDownload ZIPからZIPをダウンロードします。
その後、解凍せずに、プログラムを書き込むArduinoIDEを起動して[スケッチ]->[ZIP形式のライブラリをインストール]でライブラリをインストールします。


また、同じく[スケッチ]->[ライブラリを管理]でライブラリマネージャを開き、[検索をフィルタ...]で「VL53L0X」と入力して出てきたPolulu製ライブラリをインストールしても同様のことができるはずです。

ライブラリをインストールしたら、
C:\Users\(ユーザ名)\Documents\Arduino\libraries\VL53L0X\examples\Continuous
あたりにあるContinuous.inoを開きます。

コードに何も手を加えることなく右矢印ボタンで書き込み、書き込み終了後シリアルモニタを開きます。
ボーレート(ビットレート)を9600に設定すると、センサの値がうじゃーっと表示されていく光景を見ることが出来ます。



ここで、値が8160だったかそれくらいになっている場合は、測定可能距離をオーバーしているので、センサから対象物までの距離が約1200ミリ以内になるようにしてください。
また、値が65535の場合はセンサの通信に失敗している可能性があるので、電源がしっかり供給されているか、SDAとSCLの接続ピンを間違っていないかなどを確かめてみてください。

詳しく検証していませんが、このサンプルプログラムだと初めは正常に距離を取得できていても数十秒経過すると65535になることがあります。
この問題の原因はおそらくコードに対してシリアル出力が間に合っていないことにあるので、loop()関数の最初か最後あたりにdelay(100);でも突っ込んで、コードのループをゆっくりにしてあげると65535にならずちゃんと動いてくれると思います。



今回はContinuousのサンプルプログラムを使いましたが、Singleのプログラムも同様に使用することが出来ます。

Singleのほうでは距離測定範囲の設定などの項目が色々入っていて一見難しそうですが、内容はシンプルです。
SingleにあるコードをいくつかContinuousに移植してみます。
コードの詳しい説明はGitHubのreadmeに載っています。

sensor.setSignalRateLimit(0.1);
setSignalRateLimit関数では距離測定に使用する赤外線信号の最小振幅を設定します。
デフォルトでは0.25に設定されています。目安として、0.25で1200ミリ、0.1で2000ミリ程度まで測れるということだと思います。
ただ値を小さくすると太陽光などのノイズを拾いやすくなるので測定精度が落ちる場合があります。

sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);

setVcselPulsePeriod関数では、赤外線レーザーのパルス周期を設定します。
readmeいわく、値を大きくするほど長距離まで測れるとのことです。
Pre:12~18(偶数のみ、デフォルト14)
Final:8~14(偶数のみ、デフォルト10)

sensor.setMeasurementTimingBudget(20000);
距離測定時間(マイクロ秒)を設定します。デフォルト200000。
よく検証していませんが、こちらの環境ではこの関数を使うとGuruエラーが発生するので使用していません。

以上の関数を使ってContinuousをアレンジすると以下のようになります。

#include <wire.h>
#include <vl53l0x.h>

VL53L0X sensor;

void setup()
{
  Serial.begin(9600);
  Wire.begin();

  sensor.init();
  sensor.setTimeout(500);
  sensor.setSignalRateLimit(0.1);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
  sensor.startContinuous();
}

void loop()
{
  Serial.print(sensor.readRangeContinuousMillimeters());
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

  Serial.println();

  delay(100);
}


これを書き込んで動かせば、おそらく2000ミリあたりまではちゃんと出ると思います。


測ってみた感想としては、ミリ単位だから当然といえば当然ですがデータのバラ付きが大きいのでどうにかしたいなってのがあります。
これは、setMeasurementTimingBudget関数を使ったり、データを集めて統計値を出したりして精度を高くしていけば解決しそうです。




さて、これで距離センサVL53L0Xを使うことが出来ました。
次回は積雪計としてのプログラムを書いていきましょう。

2017年11月14日火曜日

デジタル積雪計を作る② -マイコンESP32を動かす-

前回:距離センサを使って積雪計を作る①

若干モチベーションの低下を感じますが、製作は続きます。


前回、マイコンにmbed LPC1768を使ってPCと有線接続でデータを拾うという説明をしました。
が、いざブログを投稿したら「無線便利だよ」という声を頂きまして、人の意見にすぐ流される自分は「うんすぐ無線やるかー」って感じになりました。
したがって、計画はマイコンにESP-WROOM-32を使って無線接続でデータを拾う形に変更になりました。





改めて、マイコンをmbed LPC1768からESP-WROOM-32に変更しました。
ESP-WROOM-32、通称ESP32は今年のはじめに開発ボードがわらわら出てきたばっかりのもうそれはそれは最新型の無線(Wifi + Bluetooth)モジュールです。

開発ボードは、スイッチサイエンスから発売されているESPr® Developer 32を使うことにしました。
秋月電子などから発売されているESP32-DevKitCのほうが500円以上安いのですが、こちらは突入電流の対策が取られてないらしいのと、若干ボードの幅が広くて一般的なブレッドボードに指すとジャンパワイヤを挿せるスペースが無いということで、余計な不安とかストレスを抱えたくないので止めました。そもそも突入電流の影響がどれくらいなのかについては全然分かってないのですが。


購入前に色々このボードのこと調べてたら思ってた1000倍くらい簡単に無線接続できそうな気がして、もしかして2017年凄いのではないか?と思っています。


んで、月曜日に買ったら火曜日にネコポスで届きました。
翌日に届くって関東ならまだしも本州最北端の青森県でそれは早い。
どうせ木曜日くらいなんだろうなと思っていたのでなおさら早い。


さて、開封の儀です。


次にESPr® Developer 32のはんだ付けをします。
ESPr® Developer 32にはピンヘッダが付属してないので細ピンヘッダを別途購入しましたが、ボードの基板が厚いのもあってピンヘッダが顔を出してくれません。これでは上手くはんだ付けできないので、1ピンずつ丁寧丁寧に樹脂部分の位置をずらして高さ調節をしました。おかげさまで顔を出してくれました。



さらに、ESP32(ESP-WROOM-32)でLチカ (WindowsでArduino IDE使用) - Qiitaを参考にしてArduino IDEとESP32を使うためのファイルを色々ダウンロードしてインストールします。

そのあと、ESP32をパソコンにつなぐと勝手にドライバをインストールしてくれるので、完了まで数分待ちます。
完了したらESP32のCOMポートがArduino IDEの[ツール]タブの[シリアルポート]内に追加されてるので選択して、IDEの→マークでESP32に書き込みます。
ちなみLチカに際してのコードも上のQiita記事のそのままを使わせてもらいました。

書き込み中はESP32というかESPr® Developer 32のシリアル通信を示すTX/RXのLEDランプが元気に光ってくれて、もうすぐLチカできるぞー!!っていうワクワク感を高めてくれます。


そして書き込みが終わると、LEDが産声をあげます。
はんだ付けがめっっっっっっっっちゃ汚いですが年に数回しかしない作業だから許してください。



これで無事Arduinoデビューを果たせたのではないでしょうか。


弘前市はあさって木曜日頃に初雪を迎え、週末以降はずーっと雪と雨を繰り返す予報ですが、果たして根雪までに間に合うのでしょうか。製作はまだまだ続きます。


2017年11月9日木曜日

デジタル積雪計を作る① -計画-

11月ですが今年はじめての更新です。

気づけば立冬を過ぎ季節は冬を迎え、初雪を待ち望む声が少しずつ出てきた気がします。

そんな今日、急に「そういや数年前に積雪計を作ろうなんて言ってたな―」ということを思い出したので、モチベーションが下がらないうちに製作に取り掛かろうと思います。


おととし作った温度計同様、いちいち外に出て目盛りの振ってある棒を見て「あーきょうは20cmですね」なんてやるのは小中学生のうちに済ませたので、家から出ずに、勝手に積雪深を測ってもらいます。

とりあえずざっくりと部品を決めます。
まず必要なのは積雪深を測る部品で、これは距離センサと呼ばれるものを使おうと思います。
距離センサには赤外線だったり超音波だったりレーザーだったり色々なパターンがあります。
気象庁のアメダスでは、超音波とレーザーの2種類が採用されています。

今回は、(赤外線)レーザーを使ったVL53L0Xというセンサを使おうと思います。
このセンサは去年発売されたばかりで、分解能1mmという凄いやつです。ただ積雪深を測るのに1mm単位の精度は必要なく、ただレーザーが格好いいから使うだけです。

次にセンサを操るマイコンを決めますが、これはいつもどおりmbed LPC1768を使います。



さて、次にこの部品たちをどうやって外に置くかを決めます。
何となく今ホットなのは無線通信なので、
・パソコン側マイコンとセンサ側マイコンをXbeeとかで無線通信する
・センサ側のマイコンにWifiモジュールをつけて夢の無線LAN通信!
なんて方法が考えられるのですが、
残念ながら今の私にはWifiモジュールを使える技量が無いし、何となくハードルが高そうで手が出ないので、昔ながらの有線接続でいきます。昔ながらって素敵ですよね。


ということで、おそらく

[PC(地上5mくらい)]---|窓|---(この間10mくらい)----[マイコン・センサ(地上1.8mくらい)]

みたいな感じになると思います。
自分の部屋が2階なのが惜しまれます。



さてこんな雑な計画で作れるんでしょうか、おそらく次回に続きます。