micro:bit Makecodeで2つのレーザ距離センサ(VL53L1X)の同時動作

2021.8.31 Coskx Lab  

1 はじめに

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

レーザ距離センサ(VL53L1X)を使うと,光の往復時間を測定し,1.2m程度までの距離を測定することができます。(カタログ値は2mとなっています。)
micro:bitにはI2Cでデータを転送します。
I2C通信を行う機器は,同じI2Cの通信範囲ではそれぞれ独自のアドレスを持っていなければなりません。
レーザ距離センサ(VL53L1X)を2つ同時に使うためには,それぞれに異なるアドレスが必要です。
VL53L1Xは,アドレス書き換えの機能を持っていますが,MakeCodeの環境で配布されているライブラリはこの機能は使えません。
そこで,マルチプレクサ・デマルチプレクサを用いて,I2CのSCL・SDA信号を動的に2つのVL53L1Xに振り分けて,同じアドレスを持ったまま,2つのVL53L1Xを使えるようにします。
VL53L1Xを基板上に取り付けた製品は多数ありますが,ここでは秋月電子で販売されているAE-VL53L1Xを使用します。

2 使用環境

3 端子の割り付け

AE-VL53L1Xは測定結果をI2C通信で送ってくるので,I2C用の端子として,P19とP20を使います。
また2つのAE-VL53L1Xを切り替えるためにP1を使うことにします。

4 マルチプレクサ・デマルチプレクサ

74HC4052はマルチプレクサ・デマルチプレクサとして働きます。 マルチプレクサ・デマルチプレクサは,1つの信号線を,複数の信号線の内の1つだけに接続する切替器です。
例えばCD74HC4052は,ここでの使い方では1つの信号線Xを信号線Y0,Y1,Y2,Y3の内の1つに接続します。どこに接続するかは選択信号S0,S1で決まり,
S1,S0がL,Lのとき,Y0へ
S1,S0がL,Hのとき,Y1へ
S1,S0がH,Lのとき,Y2へ
S1,S0がH,Hのとき,Y3へ
接続するようになっています。 (L,Hというのは信号レベルHigh,Lowを表します。電圧でいうとHは約3.3V,Lは約0Vです。)
(この機能はA,Bの2つのグループで使えます。)

もうすこし具体的にすると
EがLで,かつS1,S0がL,Lのとき,入力信号COM AをA0に,入力信号COM BをB0に
EがLで,かつS1,S0がL,Hのとき,入力信号COM AをA1に,入力信号COM BをB1に
EがLで,かつS1,S0がH,Lのとき,入力信号COM AをA2に,入力信号COM BをB2に
EがLで,かつS1,S0がH,Hのとき,入力信号COM AをA3に,入力信号COM BをB3に
接続します。
グループAだけの動作を図にすると次のようになります。


信号が左から右に伝わるだけの機能はデマルチプレクサ,右から左に伝わるだけの機能はマルチプレクサと呼ばれます。
74HC4052は両方の機能を持っているので,マルチプレクサ・デマルチプレクサと称しています。

レーザ距離センサ(VL53L1X)を2つ接続する方法では,上記の機能をA,B2つのグループで使います。 実際に使うのは次の2つの組み合わせです。
EがLで,かつS1,S0がL,Lのとき,入力信号COM AをA0に,入力信号COM BをB0に
EがLで,かつS1,S0がL,Hのとき,入力信号COM AをA1に,入力信号COM BをB1に
接続します。

5 接続

電源3.3V,GND,I2CのSCL(P19)とSDA(P20)と,切替信号としてmicro:bitのP1を74HC4052のS0に接続して使います。
(P1である必要はないので,別の端子も使用可能です。その時はプログラムも変更してください。)
具体的な信号名を与えると次のようになります。
74HC4052のE,S1には常時Lを与えます。

74HC4052では,P1によって,I2CのSCL信号線とSDA信号線をどちらか片方のレーザ距離センサ(VL53L1X)に接続します。
プルアップ抵抗の目的は2つあり,接続以外の信号線をHに保つためと,浮遊容量による信号波形のなまりへの対処です。
74HC4052の電源の近くに誤動作防止のために0.1μFの積層セラミックコンデンサを入れておきます。(これがないとうまく動作しない場合があります。)

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

6 テストプログラム

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



このプログラムでは,取得できた2つの距離をコンソールに表示します。
VL53L1Xへの命令を行う直前には,必ずP1へのデジタル出力を行い,どちらのVL53L1Xに対する操作なのかを決めます。
P1に0(Low, 0V)を出力した場合は,micro:bitのSDAとSCLが1番目のVL53L1XにSCLが与えられ,1番目のVL53L1Xが有効になります。
P1に1(High, 3.3V)を出力した場合は,2番目のVL53L1Xが有効になります。

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


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

range2 = 0
range1 = 0
pins.digital_write_pin(DigitalPin.P1, 0)
VL53L1X.init()
pins.digital_write_pin(DigitalPin.P1, 1)
VL53L1X.init()
basic.pause(100)

def on_forever():
    global range1, range2
    pins.digital_write_pin(DigitalPin.P1, 0)
    range1 = VL53L1X.read_single_distance()
    pins.digital_write_pin(DigitalPin.P1, 1)
    range2 = VL53L1X.read_single_distance()
    serial.write_line("range1,2 = " + convert_to_text(range1) + ", " + convert_to_text(range2))
basic.forever(on_forever)

7 まとめ

2つのレーザ距離センサ(VL53L1X)を使用して,同時に2方向,2.5m程度までの距離測定ができました。




補足 VL53L1Xを3つ使用する場合

配線
デマルチプレクサの選択ピンS0,S1を使い(micro:bit端子もP1,P2を使います),3方向にSCL,SDAを振り分けます。
実際試してみますと,デカップリングコンデンサ無しでは正常に動作できませんでした。


プログラム
VL53L1Xを操作する直前で,目的のVL53L1XにつながるようにP1,P2を出力します。

  VL53L1X 3個同時動作テスト用プログラム


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

range1 = 2999
range2 = 2999
range3 = 2999
pins.digital_write_pin(DigitalPin.P1, 0)
pins.digital_write_pin(DigitalPin.P2, 0)
VL53L1X.init()
pins.digital_write_pin(DigitalPin.P1, 1)
pins.digital_write_pin(DigitalPin.P2, 0)
VL53L1X.init()
pins.digital_write_pin(DigitalPin.P1, 0)
pins.digital_write_pin(DigitalPin.P2, 1)
VL53L1X.init()
serial.write_line("Hello")

def on_forever():
    global range1, range2, range3
    pins.digital_write_pin(DigitalPin.P1, 0)
    pins.digital_write_pin(DigitalPin.P2, 0)
    range1 = VL53L1X.read_single_distance()
    pins.digital_write_pin(DigitalPin.P1, 1)
    pins.digital_write_pin(DigitalPin.P2, 0)
    range2 = VL53L1X.read_single_distance()
    pins.digital_write_pin(DigitalPin.P1, 0)
    pins.digital_write_pin(DigitalPin.P2, 1)
    range3 = VL53L1X.read_single_distance()
    serial.write_line("range1,2,3 = " + convert_to_text(range1) + ", " + convert_to_text(range2) + ", " + convert_to_text(range3))
basic.forever(on_forever)

試作結果
3つのレーザ距離センサ(VL53L1X)を使用して,同時に3方向,2.5m程度までの距離測定ができました。