CANは1つのバスを複数の装置で共有し通信を行います。ノイズに強くどの端末も任意のタイミングでデータの送信を開始できるプロトコルになっています。
Intelligent Edge KiloにおいてCANBusが搭載されております。
初期設定
外部トランシーバーと接続されている2つのピン(tx, rx)を指定します。
それ以外には以下のパラメーターの指定が可能です。
| Parameter | Type | 意味 |
|---|---|---|
| mode | string | 'normal' 'noack' 'listen' の3つから選択できます。 normalは送信後にackを必要とします。noackはackを要求しません。 listenは送信せず飛び交うパケットを受信するモードです |
| kbps | number | 通信速度をbpsで指定します。 |
| filter_code | number | 4 Byteのコード指定で、maskした結果、このcodeとマッチしたものを受信します。ESP32のCANBus Filter準拠です。 |
| filter_mask | number | 4 Bytesのマスクで、0を指定するとmaskなし。 ESP32のCANBus Filter準拠です。 |
開始時には以下のように各パラメーターを指定します。最も標準的な'normal'モードで全パケットの送受信は以下となります。
// Javascript Example
// Intelligent Edge Kilo
obniz.components!.prepare();
obniz.components!.powerOnInterface(KiloInterface.CANBus_On);
obniz.canbus0!.start({
tx: 5,
rx: 6,
mode: 'normal',
kbps: 500,
filter_code: 0,
filter_mask: 0
});
送受信
データを受信した場合はonreceiveに指定した関数が呼び出されます。
送信はsend()関数での送信が可能です。
送信時のパラメーターは以下のとおりです
| Parameter | Type | 意味 |
|---|---|---|
| obj.extended | boolean | 拡張IDを利用するかどうかを指定します。 |
| obj.rtr | boolean | Remote Frameかどうかを指定します |
| obj.single_shot | boolean | メッセージがシングルショットかどうかを指定します。 |
| obj.self_reception | boolean | メッセージがSelf Reception要求かどうかを指定します。 |
| id | number | メッセージのIdentifier |
| data | number[] | メッセージのデータ |
// Javascript Example
// Intelligent Edge Kilo
obniz.components!.prepare();
obniz.components!.powerOnInterface(KiloInterface.CANBus_On);
obniz.canbus0!.start({
tx: 5,
rx: 6,
mode: 'normal',
kbps: 500,
filter_code: 0,
filter_mask: 0
});
obniz.canbus0!.onreceive = async (isExtended: boolean, isRTR: boolean, id: number, data: number[]) => {
console.log(obniz.id, isExtended, isRTR, id, data);
}
const ext_id = 0x01;
// await obniz.wait(1000);
obniz.canbus0!.send({
extended: false,
rtr: false,
single_shot: false,
self_reception: false
}, ext_id, [0x01, 0x02]);