micro:bit Makecodeでレーザ距離センサ(VL53L0X)の動作テスト

2021.7.25 Coskx Lab  

1 はじめに

micro:bitにレーザ距離センサ(VL53L0X)を接続して周囲の対象物までの距離を測定します。



レーザ距離センサ(VL53L0X)を使うと,光の往復時間を測定し,1.2m程度までの距離を測定することができます。(カタログ値は2mとなっています。)
micro:bitにはI2Cでデータを転送します。
VL53L0Xを基板上に取り付けた製品は多数ありますが,ここでは秋月電子で販売されているAE-VL53L0Xを使用します。

2 使用環境

3 端子の割り付け

AE-VL53L0Xは測定結果をI2C通信で送ってくるので,I2C用の端子として,P19とP20を使います。

4 接続

AE-VL53L0XのI2CのSCL信号線とSDA信号線をmicro:bitにつなげます。
micro:bitのSCLとSDAはそれぞれ端子P19とP20です。
その他には電源3.3V,GNDは当然必要です。micro:bitの3Vの端子にはUSB電源供給時に3.25Vが出力されていました。
そのため,次のようにつなげることを目指せばよいことになります。

参考 micro:bit端子一覧



端子に直接はんだ付けしてしまってもよいのですが,そのようなことはしたくないため,micro:bitの端子を引き出して扱いやすくなっているブレイクアウトボードなどを使います。細工が必要な場合もあります。
接続端子はんだ付け例1
接続端子はんだ付け例2
はんだ付け+熱収縮チューブにて保護

注意 I2C信号はノイズに弱いため,モータを使うシステムでは, モータへのノイズ対策 をしておかないと正常に動作できないことがあります。

(1) ブレイクアウトボード KITRONIK-5601Bの場合
P19とP20のところには,ピンヘッダがついていなかったので,ピンヘッダをはんだ付けする必要がありました。
ピンヘッダのはんだ付け
3VとGNDは他の場所にも引き出されているので,そちらを使用することもできます。


実際の様子 ブレイクアウトボード KITRONIK-5601Bの場合
AE-VL53L0X付属のケーブルの先には何もついていないので,メスコネクタを取り付けています。
(このように自分でメスコネクタをかしめ取り付けしても,メスコネクタ付きのジャンプワイヤを切ってはんだ付けでつないでもOKです。)



(2) モータドライバボード KITRONIK-5698の場合
P19とP20のところには,ピンヘッダがついていなかったので,ピンヘッダをはんだ付けする必要がありました。
ピンヘッダのはんだ付け
3VとGNDは他の場所にも引き出されているので,そちらを使用することもできます。



(3) モータドライバボード KITRONIK-5698の場合
micro:bit差し込み口の裏側に,19,20 端子が出ているように番号が書いてありますが,これは使えません。micro:bitを逆向きに挿すと使えます。(とシルク印刷に書いてありました。)しかしそれではモータドライバの機能が使えません。
micro:bit差し込み口のモータドライバ側に,19,20 端子がつながっている端子がありました。これを捜して無理やりはんだ付けして,19,20 端子を使えるようにしました。はんだ付けが,難しいので,自信のある方以外にはお勧めしません。



(4) Sparkfun ブレイクアウトボードの場合
Sparkfun ブレイクアウトボードでは,引き出されている端子に名前がシルク印刷されているので接続が簡単です。P19,P20もそのまま使えるようになっています。




5 テストプログラム

MakeCodeを使います。
MakeCode画面で「拡張機能」を開き, 拡張機能の一覧の見えているところの検索ボックスで,「https://github.com/zobclub/vl53l0x-microbit」のURLで検索すると「vl53l0x-microbit」が見つかるので,これを取り込ます。
(「VL53L0X」で検索すると「range-vl5310x」が見つかりますが,これは動作しません。)



使える拡張機能が取得出来たら,あとは,組み立てるだけです。
「最初だけ」のところで,VL53L0Xの初期化(initialization)を行います。
「ずっと」のところで取得できた距離をコンソールに表示します。

  VL53L0Xの動作テスト用プログラム



コピペする場合は,「vl53l0x-microbit」を拡張機能に取り込んでから,次のソースコードをPythonソースとして貼り付ければ完了です。

serial.write_line("Hello")
VL53L0X.init()

def on_forever():
    serial.write_line(VL53L0X.string_distance())
basic.forever(on_forever)

6 まとめ

レーザ距離センサ(VL53L0X)を使用して,1.2m程度までの距離測定ができました。


補足1 I2C通信

I2Cは本当はI2Cと表記され,Inter-Integrated Circuitを表しています。SCLとSDAの2本の信号線で双方向通信を行っています。
ここではmicro:bitとVL53L0Xに1対1での通信ですが,I2C信号線を複数のセンサなどが共用して,Masterとなるmicro:bitと通信するような使い方ができます。一本の糸電話を複数人で共用している状態です。
複数のセンサなど(Slave)が勝手に取得データを送信し始めると,通信データが混信してしまうため,必ずMasterが指定したSlaveだけが通信を許されます。
一本の糸電話を複数人で共用している状態でも1人が仕切り役になって,話す人を指示するのと同じです。
特定のSlaveだけに通信を許す仕組みとして,各Slaveは自分だけの背番号を持っています。 Masterはこの背番号を全Slaveに聞こえるように指示します。指示されたSlaveだけが反応します。この背番号はアドレスと呼ばれます。
1つのI2C通信路につながっているSlaveでは同じアドレスのものは存在してはいけません。

I2C通信では,SCL(クロック)とSDA(データ)の2本の通信線を用いています。SCLはMasterが,通信したいときに発する,0101...の信号で,SCLの0101...に合わせて,SDAで意味のあるデータを送信します。送信の先頭はアドレスです。その後SCLに合わせてデータを送ったり,送られたりします。データの最後には受け取った側が「了解」が送ります。


補足2 I2C通信の信号

I2Cの信号をオシロスコープで観察しました。
オシロスコープ画面の緑線がSCL(クロック),黄線がSDA(データ)です。




SCL(クロック)の立ち上がりに合わせて,縦線(青)を引くと,それに合わせてSDA(データ)を読むことができます。
SCLはMaster(micro:bit)が送信していますが,SDAは双方がタイミングを合わせてデータを送りあっています。
Master(micro:bit)が最初に送っている0x29は,VL53L0XのI2Cアドレスです。
VL53L0Xは応答してACK(0)を返信しています。
その後,Master(micro:bit)は2回8bitのデータを送信していますが,それぞれ,送信直後に,VL53L0Xは応答してACK(0)を返信しています。
ここに見えている通信は,micro:bitがVL53L0Xに対して測距を要求する一連の流れの最初のものです。この後も何回かデータを送信し,最後はVL53L0Xがmicro:bitに測距結果を送信して1回の測距手続きが終わります。