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インターフェイスへの切り替えは次のようなコマンドを生成している。


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

 (続く)

 

 

0 件のコメント:

コメントを投稿