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の実装とテストに思いのほか手間がかかった。しかし動き始めればこっちのものである。
あとは上位アプリをどう作って行こうか?
 
(続く) 
 
 

2026年5月12日火曜日

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

 今回の速度計で一番問題となるのはTM1637のI2Cモドキの2線インターフェイスだ(以降「TM-I2C」インターフェイスとする)。最初はPICのI2Cインターフェイスが流用できるかもしれないと考えたが仕様を検討して諦めた。TM-I2CもI2Cのようにクロックとデータの2線構成だが転送する最初のバイトがI2Cのアドレス+R/WではなくTM-I2Cはコマンドだ。またビットの並びも逆になっている(これはソフト的に解決可能だが)。従ってTM-I2Cはソフト的に実装する事とした。TM-I2Cの通信速度に下限規定は無いので実装は楽だろう。

TM-I2Cでデータ線は双方向通信を行う必要があるが、これはWired-OR接続で解決できる(注1)。Wired-OR接続の設定は例えばC1ポートでは次の様に設定した。 

    // 15: RC1 - DSPDAT
        LATCbits.LATC1   = 1;       // normal H
        TRISCbits.TRISC1 = 0;       // Output Enable
        ANSELCbits.ANSC1 = 0;       // Digital
        ODCONCbits.ODCC1 = 1;       // Open Drain
        WPUCbits.WPUC1   = 1;       // Weak Pull-Up

プログラム中ではデータ線、クロック線については次の様にマクロ定義している。また適当に遅延を入れてタイミングを調整している。

    #define CLK_OUT     LATCbits.LATC0
    #define CLK_IN      PORTCbits.RC0
    #define DAT_OUT     LATCbits.LATC1
    #define DAT_IN      PORTCbits.RC1

    #define DLY_4US     __delay_us(4)
    #define DLY_10US    __delay_us(10)
    #define DLY_50US    __delay_us(50)


 クロックが1の間データ線は変化してはならない(スタート・ストップ時を除く)から、1ビットの送信は、

    static void tm_send_bit(boolean d){
        DAT_OUT     = d;
        DLY_10US;
        CLK_OUT     = 1;
        DLY_50US;
        CLK_OUT     = 0;
        DLY_50US;
    }
で良いだろう。逆に1ビットの受信は、

    static boolean tm_rcv_bit(){
        boolean dat;
        DAT_OUT     = 1;
        DLY_50US;
        CLK_OUT     = 1;
        dat     = DAT_IN;
        DLY_50US;
        return dat;
    }
 スタートビット、ストップビットについては、

    static void tm_start_bit(){
        DAT_OUT     = 0;
        DLY_50US;
        CLK_OUT     = 0;
        DLY_50US;
    }

    static void tm_stop_bit(){
        DAT_OUT     = 0;
        DLY_10US;
        CLK_OUT     = 1;
        DLY_50US;
        DAT_OUT     = 1;
        DLY_50US;
        DLY_50US;
    }


としている。そして出来上がったTM-I2Cの波形をpulseviewで見ると、例えば次の様になった。ちなみにデコーダにはI2Cの物を使っているのでデコード結果は不正確だがデバッグには十分である。

(続く)

  〔注1〕この接続法はWikipediaを見るとWired-AND接続と書かれているが、初期の8ビットのコンピュータ時代、カードエッジコネクタを通して負論理バスで接続していた頃はWired-OR接続と呼んでいた。今回は信号は正論理だが動作はOR的なのでどちらの呼称が適切だろうか?これはIC-R6のCI-Vバスでも同じ事が言えるのだが。

2026年4月30日木曜日

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

 以前米国を走っているトラック野郎USAの動画を見ていたら、自車の車速に加えて前車の車速を測る機械が付いていて、あれは便利そうだなと思った。またAquaを運転し赤信号で止まっている時、前車が発車した後自車が発車せずにいるとピッと警告で知らせてくれる。これも便利だ。

そこで同じ様な機能が作れないかと考えてみた。超音波センサーは車外に出すセンサー部の防水が面倒なので除外する。前車の速度を測るにはミリ波レーダが良さそうだが距離を安価に測れるものは秋月では売ってない。 一方PONO社のLiDARは最大50mまで計れるし安全基準はCLASS1となっているのでこれを使うのが良かろう。とりあえず前に使っていた10mまで計れるTSD10を使ってみる事にする。上手く行ったら50mまで計れるTSD50も試してみよう。なおTSD20は電圧仕様が異なるため今回は除外する。

TSD10は10mまで、TSD50は50mまで計れるから4桁の表示器が欲しい。秋月で色々物色した結果4桁の緑色の7セグLEDを使う事とした(当初は4桁2色の7セグLEDを使うことも考えたが全幅が3cmと思いのほか小さかったため諦めた)。ドライバーには TM1637というアノードコモン用のドライバーを使う事とする。TM1637は外付け部品無しで直接6桁までの7セグLEDを扱うことが出来る(このICがある事は超音波距離計を作っている時は気付かなかった。知ってたらもっとコンパクトに出来たかもしれない)。またTM1637はI2Cに似た仕様の2線インターフェイスで接続するのでPICの足を無駄に消費せず便利だ。

以上を踏まえて早速基板を設計・発注した。回路図上はPICに20ピンの16F18346を使うように書いているが実際はそれとほぼ同じ内容で14ピンの16F18326を使うつもりだ。J5は汎用入出力用としており特に役目は決めていない。

 

ケースの高さを抑えるため基板は2つにカットし、L型に仕上げて使うようにしている。

(続く)

2026年4月20日月曜日

Windowsのショートカットとリンクの違い

 前の投稿で、Windowsのショートカットとリンクは違うようだと書いたが、その違いを実際に試してみた。

まず、実際に同一フォルダ(E:\CAR)のショートカットとリンクを作成してみた。リンクの作成は管理者権限のcmdで次のコマンドを実行した。

C:\work>mklink /D .\CAR-ln E:\CAR
.\CAR-ln <<===>> E:\CAR のシンボリック リンクが作成されました 

リンクの実体はシンボリックリンク、それならショートカットと同じはずだと考えたがエクスプローラの表示は異なっている。

 明らかな違いは、ショートカットには1KBと表示される実体(ファイル)が見えているがリンクにはそれが無く、あたかもそこにリンク先の実体(フォルダ)があるように表示されており、見かけ上UNIX(Linux)のリンクのように機能している。UNIXのシンボリックリンクならショートカットと同じく実体がある筈だが、Windowsではそれは隠されているか別のカラクリで実装されているのだろう。

各々のプロパティを見てみると、

となっている。やはり上で述べたようにリンクはシンボリックリンクではなくUNIXのリンクのように見えている。

リンクではリンク先のファイルが読み取り専用のように見えるがこれは変更できた。

 Windowsでショートカットとリンクは同じように見えてシステム上の扱いは別物だという事がわかった。Windowsには別のカラクリとしてジャンクションもあるようだしショートカットとリンクの細かい話もあるが、それらはCopilotにでも相談して欲しい。

 

〔参考〕UNIX(Linux)の リンクとシンボリックリンク

UNIXのファイルの実体は i-nodeというデータに1:1で紐づけられている。 i-nodeは i-node番号というユニークな番号を持っている。UNIXのディレクトリはファイル名と i-node番号の対応表にすぎない。従って1つの i-nodeに対応したファイル名を複数作ることができ、これがリンクである。各i-nodeにはこの実体がいくつの名前と紐づけられているかを表すリンク数というパラメータがあり、これが0になるとその実体は消去される。

UNIXのファイルはファイルシステムという単位で管理されている。UNIXのファイルシステムは、ストレージ内の管理構造という意味ではWindowsのドライブに相当するものと考えられるが、UNIXにドライブの概念は無く、UNIXのファイル全体は1本の木構造をしている。複数のファイルシステムを扱う場合、根元(root)から立ち上がった木の何処かの枝に他の木を接ぎ木(mount)する。

i-nodeはファイルシステム毎に独立しているため、ファイルシステムが異なるとリンクは出来ない。これを可能にするのがUNIXのシンボリックリンクであり、Windowsのショートカットと同様にパスを示してファイルやディレクトリ(フォルダ)を指定する。

 一方、私はWindowsのファイルについてFat32とかNTFSという名前は知っているが 内部構造は全く理解していない。

2026年4月10日金曜日

C:ドライブが満杯

 家族のPCの C: ドライブ(500GB)がほぼ満杯で動きが悪い(これ以上写真を保存できない)との相談を受けた。

どうせ写真や動画を撮りまくってるんだろうと思いながら内容を確認すると、C: ドライブの大部分は iTunes が作成した iPhone のバックアップファイルで、何と計286GB もあった。そのほか iTunes が使っていた一時ファイルが約32GB あり、 iTunes の無駄使いが過ぎる。デスクトップにも 50GB 近く使っていてその合計が 368GB にもなる。つまりC:ドライブの半分以上が本来の目的意外に食われている事になる。

iPhone/iPad のバックアップファイルは機種毎に作成されるようで、それらを買い替える度に巨大なファイルが残り、意識的に掃除しない限り残り C: ドライブを圧迫する。iPhoneの バックアップファイルはユーザデータ(写真と動画がメイン)をバックアップしているようだが、最近の大容量化した iPhone を使う上では盲点だろう。1TBの iPhone を買うならそのために PC に 1TB 近いストレージを用意する必要がある。こんなバックアップファイルは少なくともC: ドライブからは追い出す必要があると思う。C: ドライブはパフォーマンス向上のため SSD 化しているし、その大部分をほぼ使う可能性が無いバックアップに提供するのは勿体ない。

Copilot に相談したら、iTunes にはバックアップファイルの場所を変更するメニューは無いので(これは明らかに欠陥で、Apple に何とかして欲しい)リンクを使えとの事。ちなみにiTunes が作るバックアップファイルの格納場所には2種類あるようだが私の場合は次の場所だった(ちなみに MobileSync は隠しフォルダなのでフォルダーオプションを変更しないと表示されない)。

 C:\Users\ユーザー名\Apple\MobileSync\Backup\

そこでバックアップファイルを D: ドライブの中に作った次のフォルダへコピーし、

 D:\Apple\ios-backup\Backup\ 

そのフォルダのショートカットを作って元のフォルダに入れた(このとき元の Backup フォルダは消して(または別の名前にリネームして)使われないようにした)。これで上手く行くはずだ。

iTunesを立ち上げ「編集」->「環境設定」->「デバイス」を確認するとコピーしたバックアップファイルは認識されていない。iPhone を接続してバックアップを行うとC:ドライブにはBackupというショートカットに加えて消したはずの Backup という同名のフォルダが作られ、その中に新しいバックアップファイルが作られている。これを何度か繰り返して、埒が明かない。

なぜショートカットが認識されないんだ?ネットで成功事例を見ると、皆さんリンクはコマンドで作成していて、ショートカットを作成&コピーしてはいない。結果に違いはないように思うがこの方法を試しにやってみるか、と次のコマンドを管理者権限で cmd に与えた(ちなみに、この mklink は cmd の内部コマンドなので PowerShell ではエラーとなる)。

mklink /D "C:\Users\ユーザー名\Apple\MobileSync\Backup"  "D:\Apple\ios-backup\Backup"

iTunes を立ち上げると何故か過去のバックアップファイルをちゃんと認識してる。そしてバックアップも正しく D: ドライブの方へ格納される。理由は不明だがこれで上手く行ったようだ。

(終り)

追伸:Windows のショートカットとリンクの違いについては次の投稿「Windows のショートカットとリンクの違い」を参考に。