こちらはSeeed UG Advent Calendar 2020の8日目のエントリーとなります。
今年はどんなネタにしようかなと悩んでいたのですが、たまたま購入していたGroveモジュールが日本ではあまり使われている様子だったので
使用してエントリー化したいと思います。本家のWikiページも英語ではありますが、わかりやすく書かれているのでそれほど難しくないです。
TF Mini LiDARは赤外線レーザーの照射を行って、その反射した光を計測し、時間差および位相差を算出して距離を測定するものになります。超音波距離センサモジュール(Ultrasonic Ranger)という超音波式の距離センサーがありますが、それの赤外線版がこちらのモジュールになります。
両方とも距離を計測するものにはなるのですが、TF Mini LiDARはSerialデバイス、Ultrasonic RangerはPWMデバイスとなっています。
あと、動作電圧は5Vになっているので注意したほうが良さそうです。Ultrasonic Rangerは3.3Vでも5Vでも動作するようです。
購入ページ
TF Mini LiDARのスペックシート
| 項目 | 値 |
|---|---|
| Product Name | TFmini |
| Operating range | 0.3m-12m |
| Maximum operating range at 10% reflectivity | 5m |
| Average power consumption | 0.6W |
| Applicable voltage range | 4.5V-6V |
| Acceptance angle | 2.3° |
| Minimum resolution ratio | 1cm |
| Frequency | 100Hz |
| Accuracy | 1% (less than 6m), 2% (6m-12m) |
| Distance detection unit | cm |
| Wavelength | 850nm |
| Size | 42mm×15mm×16mm |
| Operating temperature | -20℃-60℃ |
| Light sensitivity | 70,000lux |
| Weight | 4.7g |
| Communication interface | UART 115200 |
| LED peak current | 800ma |
| Serial port TTL voltage level | 3.3V |
| Electromagnetic Compatibility(EMC) | EN 55032 Class B |
【ページ参考】
TF Mini LiDAR wiki.seeedstudio.com
Ultrasonic Ranger wiki.seeedstudio.com
Wikiの情報そのままはちょっと嫌かも
商品ページのWikiの情報そのままだと以下のものが必要になります。
- Seeeduino V4.2
- Base Shield
- Grove-TF Mini LiDAR
このGroveモジュールはシリアルデバイスですが、それをソフトウエアシリアルデバイスとして使用するだけなので、Base Shieldを使うのは勿体ないかなと思います。ということで使用しないで動作させてみようと思います。(縛りプレイ)
ということで、今回は以下の2つだけを使用した手順をまとめると以下のようになります。
ステップ1
以下のハードウエアを準備する
- Seeeduino V4.2
- Grove-TF Mini LiDAR
ステップ2
Grove-TF-Mini-LiDARをSeeeduino V4.2のI2Cポートに接続する
ステップ3
GitHubからデモコードをダウンロードして、Arduino IDE libraryに取り込む
上記のリンクからでも、下記のリンクからダウンロードしても大丈夫です
こちらからダウンロードする際は以下の様に操作してダウンロードを行います。

Zipファイルのダウンロードができたら

Adruino IDEを使用してZipファイルをライブラリとして取り込みます。操作はツールバーから【スケッチ】→【ライブラリをインクルード】→【Zip形式のライブラリをインストール…】と選択します。

先程ダウンロードしたライブラリファイルを選択して、IDEにライブラリが追加されたというメッセージが表示されれば成功です。

ではライブラリをインクルードしてみます。ツールバーから【スケッチ】→【ライブラリをインクルード】→【Seeed_Arduino_TFlidar】を選択します。

すると、ライブラリがインクルードされます。
#include <TFBase.h> #include <TFLidar.h> void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: }

あとはデータを酒取得するコードを書いていくことになります。最低限のコードは以下のようになるでしょうか。 今回は距離(Distance)のみを表示するようにしてみました。 信号強度も計測できるようなのですが、赤外線レーザーで距離を測っていることもあり、計測信号が光ということもあり直線性が高いであろうと予測するのであれば計測しなくてもいいのかな?なんて思っています。
以下のコードで距離の計測をします。

#include "TFLidar.h" #define USETFMINI #define SERIAL Serial SoftwareSerial uart(SCL, SDA);//I2Cポートでソフトウエアシリアルを使用 #ifdef USETFMINI TFMini SeeedTFMini; TFLidar SeeedTFLidar(&SeeedTFMini); #endif void setup() { SERIAL.begin(9600); while (!Serial); SeeedTFLidar.begin(&uart, 115200); } void loop() { while (!SeeedTFLidar.get_frame_data()) { delay(1); } SERIAL.print(SeeedTFLidar.get_distance()); SERIAL.println(); // 以下は受信したrawデータの表示する場合 /* for (int i = 0 ; i < 9 ; i++) { SERIAL.print(String(uart.read(),HEX)); SERIAL.print(" "); } SERIAL.println(); */ delay(100);//適宜ウエイトを入れないとデータがバグる事があるようです。 }
Base Shieldを使用しないための工夫として以下のようにソフトウエアシリアルの設定を以下のようにして、
物理的な接続もSeeeduino V4.2のI2Cポートに接続をしています。
SoftwareSerial uart(SCL, SDA);//I2Cポートでソフトウエアシリアルを使用
Groveのシリアルポート使用しているTXとRXをGroveのI2CポートのSCLとSDAにしているのがポイントになります。
以前MP3のモジュールでも同じように接続をしていましたが問題なく動作しています。
参考
ちなみにSeeedTFLidarクラスのメソッドを使わずにrawデータとしてデータを取り出すこともできます。
その場合には、ソフトウエアシリアルから直接データを抜き取るのがよいと思います。
実行結果を確認するとデータ計測をwaitなく行うとデータが化けてしまうこともあるようでした。可能であればWaitを入れたほうがいいかなと思います。 このソースでは100msecいれていますが、スペックシートのFrequencyが100Hzとなっていたので、10msec程度くらいまでは行けそうな気がします。
実行してみる
コードが完成したらSeeeduino V4.2にダウンロードして実行します。計測結果はシリアルポート(USB側)へ出力しているので
ツールバーの【ツール】→【シリアルモニタ】として実行することもできますし、

出力結果

ツールバーの【ツール】→【シリアルプロッタ】として実行することでグラフ化をすることも可能です。

出力結果


誤記?
ちなみに参考にしているWikiでのResource情報の部分ですが、
ファイルのリンク先のURLが入れ替わっているので注意してください。

おわりに
日本で使用している例をあまりみないGroveモジュールTF Mini LiDARですが、動作電圧と価格面でUltrasonic Rangerよりも劣るような気がします(この表現でいいのかな?)。計測の正確性や反応はわりと優秀ではないかと個人的には思います。加えて12mまで使用できるのも魅力でしょうか(Ultrasonic Rangerは3.5mまで)。ただ、実験してはいないのですが、太陽光下での動作に関してはどうなるかなという不安はあります。
Seeedさんの販売サイトには以下のような動画があるので
#Newproduct: Seeedstudio Grove - TF Mini LiDAR
屋外でも意外とつかえるのかなと期待しています。どこかで試してみたいです。