2026年7月18日土曜日

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

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

#define TX_OUT      LATAbits.LATA4

#define DLY_9600BPS __delay_us(100)     //Bit width shall be 104us 

static void send_byte_9600(byte data){

    TX_OUT      = 0;   DLY_9600BPS;  // Start bit
    byte cnt = 8;
    while(cnt-- > 0){
        TX_OUT  = data & 0x01;
        DLY_9600BPS;                // Data Bit
        data >>= 1;
    }
    TX_OUT      = 1; DLY_9600BPS; DLY_9600BPS;  // Stop bit  
}

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

である(同期ずれを防ぐため2StopBitsとしている)。また9600bpsに相当するビット幅は104μsだがオーバーヘッドを考慮して100μsの遅延を入れて試したら動いたので、そのまま使っている。なおこのプログラムを呼び出す前段階として出力ポートの設定や、同期ずれを防ぐための割り込み禁止措置が必要である。受信はサポートしていないので正確には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信号を送っても無視されるので実用上はこれで特に問題はない。

 (続く)

 

 

0 件のコメント:

コメントを投稿