2026年3月28日土曜日

LiDARを使った距離計(その3)

 実際にソフトを組むにあたって最初に問題となったのは通信速度だ。当初データシートの記述を頼りに 460800bps と考えていたが、本当にそうなのか?Copilotは違う値(115200bps)を第一候補として答えてくるが・・・?

TSD-10に電源を入れると基板面で微小なLEDが点滅を繰り返していた。どうも電源ONと同時に連続測定をスタートしているようだ。こういったセンサーはスタートコマンドを送るまで測定を始めないかと思っていたが違ったようだ。それなら測定データをUARTで連続送信しているだろうから、その信号で通信速度を確認すればよい。

オシロスコープでTSD-10のUARTの波形を観測すると1ビットが約2μsに相当するようで、デフォルトの通信速度は 460800bps で間違いないようだ(計算上は1ビットが2.17μsになる)。

そこでPIC16F15325の内蔵UARTを使って近い速度の信号を作ってみたが上手く行かない。内蔵の16MHzや32MHzのクロックを分周して合わせてみても速度誤差が8.5%出てしまう。UARTは多少の誤差は許容できるはずだが、ここまで違うと無理のようだ。そこで内蔵UARTを使わず、ソフトで直接ポートを駆動してUART信号を作る事にした。送信するデータの1ビットずつを取出し、それに従ってポートをON/OFFるする。この方法で作った実際の波形を観測すると、オーバーヘッドが大きく1ビットに最低3μsほどかかり2.17μs迄は下がらなかった。そこで最後の手段として、プログラム中にビット出力命令を直接並べて(ハンドエンコードして)実行する事とした。試しに1/0を交互に出力させて観測するとビット出力命令の実行時間は0.124μs程度(Fosc/4に相当)なので2μs程度の遅延を挟めば丁度良い信号を生成できる。そうやって出来上がったプログラムの1バイト送信分が次のようなものである。

     // 1 - 0x5A
    LATAbits.LATA4  = 0;   _delay3(5);  // Start bit 
        LATAbits.LATA4  = 0;   _delay3(5);  // b0        
        LATAbits.LATA4  = 1;   _delay3(5);  // b1      
        LATAbits.LATA4  = 0;   _delay3(5);  // b2      
        LATAbits.LATA4  = 1;   _delay3(5);  // b3      
        LATAbits.LATA4  = 1;   _delay3(5);  // b4      
        LATAbits.LATA4  = 0;   _delay3(5);  // b5      
        LATAbits.LATA4  = 1;   _delay3(5);  // b6      
        LATAbits.LATA4  = 0;   _delay3(5);  // b7      
    LATAbits.LATA4  = 1;   _delay3(10);  // Stop bit     
 

Stop bitを長めにとっているのは次のバイトのStart bitまでの時間に余裕を持たせ多少の同期ずれを回復できるようにするためである。 このプログラムは上手く機能した。これで測定の停止(Stop)とボーレートの変更は出来るようになった。ビットレートを一旦9600bpsまで落とせば後はPIC内蔵UARTでも余裕をもってコマンドを送信できる。

もう1つ問題になったのはTSD10からのデータが全く受信出来なかった事である。色々テストした結果判明した原因は、受信に使ったPICのA5ポートが全く機能しなかった事である。以前同様なトラブルが別のPICであり、解決策も以前書いたが今回はそれでも上手く行かなかった。色々試したが結局諦めて代わりに基板を改造してC5ポートを受信に使う事で解決した。 

TSD10の仕様によると測定データは毎秒50回(20ms毎に)送られてきて、精度は±5cm、ブラインドゾーン(無感距離)が5cmある。また分解能(測定結果)がmm単位なので使いづらい。そこで複数回(とりあえず10回)の測定の平均をとり、最下桁を丸めてcm単位を結果とするようにした。

実際に周囲の対象物の距離を測定してみるとブラインドゾーンはほとんど無く、測定値には10cm位のオフセットがあるがほぼ直線に乗っている(ただ30cmところだけ原因不明のずれがある)。

オフセットについてはTDS10の個体毎に異なると推察されるのでコマンドで設定できるようにした。またデータシートによると反射の無い状態(測定範囲外)では65535mmが送られてくるよう記載されているが、実際にTSD10を空に向けてみると最大探知距離である10000mmが送られてきてデータシートと異なる。

超音波センサーとLiDARを比べてみると、 超音波センサーは測定値に少しのふらつきが見られることもあるがLiDARは比較的安定しているようだ。これは統計処理の違いに起因するかも知れなく、これが問題になる場合は更なる検証が必要だろう。

TSD10は指向性が鋭いうえに赤外線は目に見えないので、どこの距離を測定しているか分かり辛い。レーザーポインタを併用すれば分かり易くなるが、逆にレーザーポインタが明るすぎて目に辛い。幸いレーザポインタの消費電流は多くないのでPICで直接駆動できる。レーザーポインタをソフト的にON/OFF出来るようにすればもっと使い易くなるだろう。

さて、これを何に使おうか? 

(終り) 

 

2026年3月8日日曜日

LiDARを使った距離計(その2)

 

 修正した基板は次の通り。パスコンはSMD(表面実装部品)として基板の裏面へ移した。LiDARの赤外ペンシルビームはどこを指しているか分かりにくいので、J3としてレーザポインタを追加するための+5Vの分岐を追加した。

発注して1週間も経たずに修正版の基板が届いた。昨年まではSHENZHEN(深圳)から関空へ送られ国内配送されていたが、今年になって(理由は不明だが)SHENZHEN⇒香港⇒羽田という配送ルートに変わったようだ。到着が少し早くなったような気もする。

これを組み立てて、次の写真の様になった。左がLiDARインターフェイス、右が超音波測距センサーインターフェイスだ。超音波測距センサーの動作も確認できた。


ここからLiDARインターフェイスのソフトの制作について検討する。TSD-10のインターフェイスはRS-232Cだが交換するコードは文字ベースではなくバイナリーでNULL(0x00)を含む。転送速度がデフォルトの460,800bpsだと毎秒46,080バイト、22μs毎に1バイト転送され、これを処理する必要がある。結構シビアだ。転送速度の変更はコマンドで可能なので、初期化の段階で9600bpsまで速度を落としてみる事とした。

 ソフトの製作には時間がかかりそうなので、今回はとりあえずここまでで、次回へ続く。

(続く)