micro:bit 応用編 サーボモータとレーザ距離センサでスキャン

2021.10.8 Coskx Lab  

1 はじめに

サーボモータにレーザ距離センサを載せてスキャンすると,周囲の様子をある程度知ることができます。実際にスキャンして,どの程度の実力か検討してみます。


2 使用環境

3 端子の割り付け

サーボモータはPWM信号のみで制御するのでmicro:bitの端子を1つだけ使用します。 ここではP2を使うことにします。これ以外でも他のセンサなどに使用されていない端子であればどこでもよい(例えばP1など)です。この段階でどの端子を使うか決めておき,ケーブル接続においても,プログラムにおいてもP1を使うことで一貫している必要があります。
レーザ距離センサはI2C通信を使用するのでSCL,SDAのP19,P20を使用します。

参考 micro:bit端子一覧

4 接続

サーボモータおよびレーザ距離センサの接続は別途解説されているので,そちらを参照してください。
 レーザー距離センサVL53L1X 
 RCサーボSG92R 
 RCサーボFT90B 

5 プログラム

MakeCodeを使います。
P2でサーボモータ用のPWM信号を発生します。 サーボモータは,1度ずつ角度が変化する動きをします。 (80度から120度まで変化します。)
サーボモータに角度指令を送ってから,サーボモータが動作を止めるまで50ms待ってからレーザ距離センサで測距します。

  動作テスト用プログラム



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

def on_button_pressed_a():
    global angle, distance
    for count in range(41):
        angle = count + 80
        pins.servo_write_pin(AnalogPin.P2, angle)
        basic.pause(50)
        distance = VL53L1X.read_single()
        serial.write_line("" + str(angle) + ", " + str(distance))
input.on_button_pressed(Button.A, on_button_pressed_a)

distance = 0
angle = 0
serial.write_line("distance scan")
VL53L1X.init()

6 測定方法

レーザ距離センサは,センサ正面付近の物体までの距離を測定します。
センサ前方に物体があると,その方向では短い距離が,それ以外の場所では遠くの距離が測定され,図のような結果が想定されます。



センサ前方に,幅12cmの矩形の箱をおいてレーザ距離センサでスキャンしてみました。
矩形箱までの距離は50cmと1mで測定しています。



7 測定結果

図のような測定範囲で測定し,次のような結果が得られました。

(1)矩形箱までの距離50cmのとき



(2)矩形箱までの距離1mのとき



矩形箱までの距離はおおむね正しく測定されています。
2つの測定ではどちらも実際より幅が大きく測定されています。
矩形箱までの距離50cmのとき,14度の大きさに見えるはずですが,26度に見えています。
矩形箱までの距離1mのとき,7度の大きさに見えるはずですが,16度に見えています。
レーザ距離センサは前方にレーザ光を照射して,それが戻ってくるまでの時間から距離を推定しています。しかし,照射光は広がっていて,広がりの範囲内に何かがあるとそこまでの距離を測定してしまうと考えられます。

サーボモータが80度から120度まで変化するとき,レーザ距離センサは70度から110度までスキャンしています。これはサーボモータとセンサの取り付けオフセットが10度あるためです。

8 まとめ

RCサーボにレーザ距離センサを載せて,前方の矩形箱の測定をしました。
矩形箱までの距離はほぼ正しく測定できますが,箱の幅は大きく膨らんで見えています。
距離によってどれくらい膨らんで見えるかの測定をしておけば,実際の幅を推定することができると思います。
また膨らんで見える幅の中心が矩形箱の中心であることは判ると思います。