CANBus

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]);