CAN通信

Arduino-DUEでCANを使う


Arduino-DUEはAtmel SAM3X8Eを搭載した、Arduinoで初めてのARM Cortex-M3 CPUコアのマイコンボードです。
あまり人気がないボードですが、標準でCAN-Interfaceを2CH内蔵しています。
CANTX1/CANRX1のピン位置が分かりずらいですが、こ ちらを見ればわかります。

MCP2551の様なCAN Transceiverさえあれば、CAN通信を行うことができます。
こちらにDUE用のCANライブラリが 公開されています。
このライブラリは下位のライブラリとして、同じ作者のこちらのライブラリを使っていま す。
この2つのライブラリが必要です。

今回、UNOとの間でCAN通信を試してみました。
結線は以下の様になります。
UNO側はこちらで紹介しているCAN通信モジュールを使いました。





Arduino Dueには2つのUSBポートがあります。
・ネイティブUSBポート(RESETに近いほう)
・プログラミングポート(RESETから遠いほう)

どちらを使ってもスケッチを書き込むことができますが、Serialポートとスケッチ書き込み後の扱いが変わります。

・ネイティブUSBポートを使ってスケッチを書き込む場合
ツール→ボード→Native USB Portを選びます。
スケッチの中で以下の1行が必要になります。
#define Serial SerialUSB
スケッチ書き込み完了後に、リセットは不要です。

・プログラミングポートを使ってスケッチを書き込む場合
ツール→ボード→Programming Portを選びます。
ケッチの中で以下の1行が有ると動きません。
#define Serial SerialUSB
スケッチ書き込み完了後に、リセットが必要です。

プログラミングポートを使ってスケッチを書き込むと、スケッチ書き込み完了後に、リセットが必要なので、
少し戸惑います。

ネイティブUSBポートとプログラミングポートの違いは、こちらに詳しく書かれていま す。




こ ちらのサンプルをDUEに書き込んでみました。
このサンプルは受信したCANデータを表示します。
サンプルはネイティブUSBポートを使うようになっています。

こちらがDUE側のモニター表示で、受信データを表示しています。





次にこ ちらのサンプルを書き込んでみました。
こちらはUNO(受信)側のモニター表示です。
サンプルコードに不具合が有り、パケット長が設定されていないので、データが表示されません。


サンプルコードを一部変更し、赤字の1行を追加します。
void sendData()
{
    CAN_FRAME outgoing;
    outgoing.id = 0x400;
    outgoing.extended = false;
    outgoing.priority = 4; //0-15 lower is higher priority
    outgoing.length = 8;
 

    outgoing.data.s0 = 0xFEED;
    outgoing.data.byte[2] = 0xDD;
    outgoing.data.byte[3] = 0x55;
    outgoing.data.high = 0xDEADBEEF;
    Can0.sendFrame(outgoing);
}

8バイトのパケットがUNO(受信)側に表示されます。



続く...