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の制御は、
- ソフトウェアUARTで460,800bpsを9600bpsへ落とす。
- ソフトウェアUARTでインターフェイスをI2Cへ変更。
- 以降I2CインターフェイスでLiDARと通信。
とする。2.のI2Cインターフェイスへの切り替えは次のようなコマンドをソフトウェアUARTで生成している。
LiDARは一旦I2Cへ切り替えると以降はUARTへ戻すコマンドをを実行しない限りI2Cのままとなるが、I2C通信時にUART信号を送っても無視されるので実用上は特に問題はない。
(続く)














