2026年5月23日土曜日

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

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


LiDARは毎秒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を使うつもりだ。

 

ケースの高さを抑えるため基板は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 のショートカットとリンクの違い」を参考に。

2026年4月3日金曜日

携帯内に混在する2つのPontaポイントの統合

 私の携帯(iPhone)内には10年以上前にLawsonで作ったカードをそのまま携帯アプリに移行したPontaポイントと、

AU Payアプリに紐づけられたPontaポイントが混在していた。

最初はこの違いに気づかなかったがポイントの数が違うことから2つが独立していることに気づいた。

Pontaのホームページ(PontaWeb)を見るとこれらを1つに纏める方法も書いてあるが、Pontaにも色々あるようで私がどれに該当するのか、或いは場合分けが多く、私の場合にどうすればよいのか分かりずらかった。じっさいLawsonで作ったPontaカードを携帯アプリに移行したものは今はRecruit IDに関連付けられていることを後に認識した。AU Payアプリに紐づけられたPontaは意識しないまま、いつの間にか登録されていた。

AU Pay ではPonta IDの切り替えも出来るようだが、これをやると統合は出来ず片方のPontaポイントを失う事になる。 

実際に手続きを進めると上手く行きそうなのに最後はエラーで駄目になる。手続きの途中でエラーで「失敗しました」と言われても何が悪かったのか原因も分からない。これまで時々挑戦しては失敗を繰り返してきたが、やっと成功したのでメモとして残す。

携帯アプリのPontaカードはRecruit IDに紐づけられていて、これをPonta-1とする。AU Pay に紐づけられたPontaカードをPonta-2とする。それぞれのカードは独立したPonta ID及びそれに対応して独立したPontaポイントを持っている。

〔Step-1〕 2つのカードの会員情報を合わせる(同じにする)。氏名や生年月日、電話番号等で、これが違っているとStep-2の手続きがエラーになる。私の場合、古いPonta-1は固定電話で登録していたので携帯に合わせた。
〔Step-2〕PontaWebにログインしてPonta-2のポイントをPonta-1に統合する。この手続きが済むとPonta-2は使えなくなる。
〔Step-3〕AU Pay でPonta-2との連携を解除する。Step-2の時点でAU Pay からPonta-2へはアクセスできなくなっているが、この解除を行わないとStep-4がエラーになる。
〔Step-4〕 AU Pay でRecruit IDを使ってPonta-1と連携させる。

これで携帯内の2つのPontaポイントは1つに統合された。 

メデタシ、メデタシ 

(上の記述の中に何点か誤りがあったので訂正しました)