2026年7月18日土曜日

LiDARを使った相対速度計(その9)

 PICを16F18326に変えることで、LiDARとの間の通信はI2Cに限定された。しかし新品のLiDARのインターフェイスはデフォルトでUART(460,800bps)に設定されているのでこの矛盾を何とか整合させたい。以前、ポートを直接ソフトウェアでON/OFFしてUART信号を作り、460,800bpsを9600bpsに落とすことが出来たが、その応用として9600bpsのソフトウェアUARTを作りたい。とりあえず送信だけ出来れば何とかなるので作ってみた。そのコア部分は、

 static void send_byte_9600(byte data){
    LATAbits.LATA4  = 0;   __delay_us(100);  // Start bit
    byte cnt = 8;
    while(cnt-- > 0){
        LATAbits.LATA4  = data & 0x01;  // bit0..bit7
        __delay_us(100);                // Bit width shall be 104us
        data >>= 1;
    }
    LATAbits.LATA4  = 1;   __delay_us(200);  // Stop bit
}

void u2raw_send_cmd(byte *data, byte len){
    for(byte n=0; n<len; n++){
        send_byte_9600(*data++);
    }
}

である(同期ずれを防ぐため2StopBitsとしている)。なおこのプログラムを呼び出す前段階として出力ポートの設定や、同期ずれを防ぐための割り込み禁止措置が必要である。受信はサポートしていないので正確にはUAT(Universal Asynchronous Transmitter)だ。

これを使えばUARTでLiDARの一通りのコマンドを実行できる。完全なソフトウェアUARTを作る事もできるが、それは後回しにしよう。

とりあえず、ドライバーの立ち上がり時のLiDARの制御は、

  1. ソフトウェアUARTで460,800bpsを9600bpsへ落とす。
  2.  ソフトウェアUARTでインターフェイスをI2Cへ変更。
  3. 以降I2CインターフェイスでLiDARと通信。 

とする。2.のI2Cインターフェイスへの切り替えは次のようなコマンドをソフトウェアUARTで生成している。


LiDARは一旦I2Cへ切り替えると以降はUARTへ戻すコマンドをを実行しない限りI2Cのままとなるが、I2C通信時にUART信号を送っても無視されるので実用上は特に問題はない。

 (続く)

 

 

2026年7月14日火曜日

LiDARを使った相対速度計(その8)

 さて、PIC上で動かすI2Cのドライバー(プログラム)であるが、以前、見様見真似で納得しないまま作ったものを再利用してみたが上手く行かない。最初は何とか動いたように見えたが、ソフトを弄っているうちにLiDARが全く応答しなくなり、不正なデータを送って内部状態が異常になったか壊れたと思ってLiDARをもう1個買い足したりしたが結果は変わらなかった。

仕方が無いので改めてI2Cドライバーを作り直した。今回はハード/ソフトに関する理解が進んだのか意外とすんなりと動き、LiDARも正常な応答を返すようになった。

I2CでLiDARを扱う場合は先ずIDを読んでみて、IDを正しく読めているかを確認する。 I2Cの場合、データの書き込みより読み出しの方が少しややこしいのいで、読み出しが成功すれば一安心だ。実際のI2Cのトレースを取得してみると、

LiDARのIDの取得、 

 測距データの取得、

ソフトウェアバージョンの取得、
シリアル番号の取得、

レーザーON、

なおTSD20でレーザーをOFFにすると測距データは20,000mmに固定される。

 (続く)

 

2026年7月13日月曜日

LiDARを使った相対速度計(その7)

 TSD20は思いのほか小さかった。コネクタも小さいので抜き差しすると壊しそうだ。接続線も簡単に切れそうに細い。

TSD20では測定頻度を毎秒50回を含む他の頻度に変更するのも上手く行った。

 TSD20を空に向けると測定値は20000mmとなり、マニュアルにあるような50000mmでは無い。これはTSD50のマニュアル記述の使い回しで修正を失念したのかな。

LiDARにUARTでSTOPコマンドを送ると1秒1回程度の頻度で次のデータを自発的に送ってくる(6番目の0xf0はチェックサムだ)。 

5a 0f 02 ff ff f0

 これが何を意味しているのかマニュアルに記述が無く、ネット情報も無く皆目分からない。たぶん Keep Alive 的な性格を持っているものと推察する。

 

さて、TSD10やTSD20ではUARTインターフェイスで上手く行ったが、一方TSD50では毎秒500回という固定した測定頻度の関係で9600bpsではデータを送りきれない。そこでI2Cインターフェイスに挑戦する事にした。併せてPICを容量の大きいPIC16F18326に変えるが、このPICには2個目のUARTが搭載されていないのでI2C専用、或いはソフトでUARTを実現する必要がある。

PICとのインターフェイスでLiDARでデフォルトのUARTを選んだ場合、UARTは全二重通信なのでデータはLiDAR主導で測定頻度に従って勝手に送られてくる。またLiDARへのコマンドの送信とレスポンスの受信も送信側の勝手なタイミングで行われる。一方、I2Cの場合はポーリング方式なのでマスター(PIC)側主導でデータを転送する必要がある。

従ってUARTではPICはLiDARから勝手に送られてくるデータを受信し処理すればよいが、一方I2Cを使う場合はPIC主導で定期的にデータを取得し、その結果を処理する必要がある。つまりUARTとI2Cではソフトの造りが違ってくる。

I2Cを使ったデータ転送は具体的にはLiDARの内部レジスタのデータの読み出し/書込みという操作である。I2Cを使う場合は、LiDARの内部レジスタの書き換えは500Hzの測定毎に行われると思われるが、それとデータ取得の関係(タイミング)についてデータシートには何も説明が無く、やってみないと結果は分からない。

LiDARのI2Cアドレスについてもマニュアルの説明では0x52と書いてあるが説明図では0x54(0b010101xx)みたいに見える。これも試してみないと分らないが、後のチェックで0x52が正解であることが分った。

(続く)

  

2026年6月12日金曜日

LiDARを使った相対速度計(その6)

前にLiDAR距離計で作った基板では TSD20やTSD50に対応できないので、新しく基板を起こすことにした。TSD20は電源電圧が3.3Vであり、TSD20やTSD50ではUARTの代わりにI2Cインタ-フェイスを使うことができるので、それらを加味して次の回路を設計した。なおPICには16F15325を使っているがメモリー容量が足りないは場合はピンコンパチで2倍のメモリー容量を持つ16F18326を使う。ただし16F18326にはUARTは1つしか搭載していないのでLiDARインターフェイスはI2Cに限定される。

そして次の基板を発注した。部品点数は増えたがSMDを裏面にも配置して基板のサイズは前のままである。

1週間を待たず基板が届き、早速組立てた。

センサーにはTSD50を試したい所であるが、高価なうえに上手く行くとも限らないので、とりあえずより安価なTSD20で試す事とした。

(続く) 

 

2026年5月29日金曜日

LiDARを使った相対速度計(その5)

 出来上がった相対速度計を室内(廊下)でテストしてみたが、測定距離が4~5m位になると測定値が安定しなくなるというよりランダムな値が出るようになる。その原因はS/Nの悪化か、空中の埃やエアロゾルの影響か、或いは測定原理に起因するものか分からない。

そもそも赤外線が1nsで進む距離は30cmである。これを使ってmm単位の距離を測るためには数ps単位の時間分解能が必要であり、そのため初歩的な方法では100GHz以上のクロックが必要で現実的ではない。 またLEDやフォトダイオードの応答速度なども大きく影響しまともな測定は出来ないだろう。

この点をCopilotに相談すると波形の相関処理を行う事でサンプリング周期の100倍以上の分解能を得る事が出来るようだ。逆に考えると、何らかの要因で波形が乱れて相関処理が上手く行かなくなると極端に精度が悪くなるのだろう。これ以上測定範囲を伸ばしたいなら上位のLiDARセンサーを買う必要があろう。いずれにしても距離を正確に計れなければ相対速度もヘッタクレモ無い。

 さて、相対速度計を実際の車に持ち込んで動かしてみた。赤外線がガラス窓に直交するようにLiDARを向けるとガラス窓の反射を拾って窓までの距離を測った。一方、赤外線がガラス窓に直交しないように置くと数十cm~数mの範囲の出鱈目な数字を表示した。ガラスの赤外線の減衰が大きいのかガラスを通しては正しく測定できないように見える。そこでLiDARを車外に出してみたが結果は変わらない。外光の影響が大きいのかな。とにかくこのままでは上手く行かない。

 上位のLiDARを使ってみる必要があるようだ。上位のLiDARには距離を20mまで計れるTSD20と50mまで計れるTSD50がある。どちらを使うにしてもTSD10と互換では無いので一工夫が必要だ。例えばTSD20は電源電圧が3.3Vだし、測定頻度が200回/秒だ。TSD50では電源は5Vでよいが測定頻度が500回/秒なので9600bpsではデータの転送が間に合わない。


何処をどうトレードオフしようか?

(続く)

 

2026年5月23日土曜日

LiDARを使った相対速度計(その4)

 とりあえず基板を百均のクリアトレー(ミニ)を加工した箱に入れた。


LiDAR(TSD10)は反射物までの距離の測定を毎秒50回行う。前出のセンサー部はこの10回分を平均して、即ち0.2秒毎に距離をcm単位で報告してくる。

相対速度はこの0.2妙毎の距離の変化(差分)から算出すればよい。具体的には差分(m/0.2sec)を18000倍(=5×60×60)して100000で割ることで時速(Km/h)に変換できる。

7セグLEDの表示はこの相対速度(Km/h)と距離(cm)をスイッチで切り替えられるようにした。 またセンサー部からの入力が無い場合は全桁ドット(.)を、センサーの探知範囲外は全桁ダッシュ(-)を表示する。

左端の緑、黄、赤のLEDは次の様に点灯させる。緑は相対速度が正の場合に点灯、 赤は相対速度が負の場合に点灯、赤と緑の点灯には閾値を設定している。黄色は相対速度が0の状態が3秒以上続いた場合に静止状態と判断し点灯する。黄色から緑へ点灯が変化する場合、即ち信号待ちで停車中に前車が発射した場合にブザーをピッと鳴動させる。ブザーは当初は市販の小型電子ブザーを使ったが音がプアーだったのでタイマーで作った約2KHzの方形波でスピーカを鳴らすようにした。


次の写真で赤丸は 追加した相対速度と距離の切り替えスイッチ、橙丸は追加したダイナミックスピーカ。スピーカはPICの出力からコンデンサーで直流分を切って直接駆動している。


これで予定した基本的な機能は実装できたはずである。

(続く) 

 

2026年5月19日火曜日

LiDARを使った相対速度計(その3)

 ソフトの制作と並行して基板を組み立てた。

そしてPICにソフトを書き込んでデータを表示させてみた。
実際にはTM-I2Cの実装とテストに思いのほか手間がかかった。しかし動き始めればこっちのものである。
あとは上位アプリをどう作って行こうか?
 
(続く)