pdf-icon

Arduino入門

2. デバイス&サンプル

6. アプリケーション

Atomic CAN Base Arduino 使用チュートリアル

1. 準備作業

2. CAN 通信概要

  • CAN(Controller Area Network)は、多ホスト型で高信頼性のシリアル通信プロトコルであり、自動車電子機器や産業オートメーションなど、リアルタイム性と信頼性が求められる分野に広く利用されています。CANネットワークは複数ノードの平等なアクセスをサポートし、優れたエラー検出と仲裁メカニズムを備えています。

  • 1. 核心定義:

    • Controller Area Network(CAN)は、多ホスト型で主従関係のないシリアル通信プロトコルであり、物理層およびデータリンク層の標準を定義しています。
    • 多ホスト通信をサポートし、全てのノードは平等で任意にデータ送信を開始でき、中央仲裁装置は不要です。
  • 2. 主な特性:

    • 通信距離:1Mbpsでは最大40m、速度を低下(例:10Kbps)させることで最長10kmまで対応可能。
    • 伝送速度:標準CANは10Kbps~1Mbpsをサポートし、速度は距離と反比例します。
    • ノード容量:理論上は単一バスで最大110ノード接続可能、実用では数十ノードが一般的です。
    • 耐ノイズ性:差動伝送方式(信号線 CAN_H/CAN_L)を採用し、強力な耐電磁ノイズ性能と信頼性を備えています。
  • 3. 動作原理:

    • 電圧レベル定義:優勢レベル(Dominant、論理「0」)では CAN_H ≈ 3.5V、CAN_L ≈ 1.5V;劣勢レベル(Recessive、論理「1」)では両線とも約2.5V。
    • 送信側:データを差動信号に変換し、CAN_H および CAN_L 線で伝送。
    • 受信側:CAN_HとCAN_L間の電圧差を検出して元のデータを復元し、全ノードがバス上のデータを受信可能。
    • インターフェース形式:二線式(CAN_H、CAN_L)を採用。一般的には端子接続やDB9(9ピン)コネクタを使用。バス両端に120Ω終端抵抗を並列接続して信号の完全性を確保します。

3. サンプルプログラム

  • 本チュートリアルで使用するメインコントローラは AtomS3R と Atomic CAN Base の組み合わせです。本モジュールはシリアル通信を使用し、回路接続に応じてプログラム内のピン定義を変更してください。接続後のシリアルピンは G5 (RX)G6 (TX) です。

  • 本モジュール内部には120Ω終端抵抗が含まれていません。下画像の位置を参考に、CANバスの両端に120Ω抵抗を並列接続してください。

cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
#include <M5Unified.h>
#include <M5GFX.h>
#include "driver/twai.h"

const gpio_num_t MCU_CAN_TXD = GPIO_NUM_5;
const gpio_num_t MCU_CAN_RXD = GPIO_NUM_6;

void setup() {
  M5.begin();
  M5.Display.clear();
  M5.Display.setFont(&fonts::FreeMonoBold12pt7b);
  Serial.begin(115200);

  twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT(MCU_CAN_TXD, MCU_CAN_RXD, TWAI_MODE_NORMAL);
  twai_timing_config_t t_config = TWAI_TIMING_CONFIG_500KBITS();
  twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL();

  if (twai_driver_install(&g_config, &t_config, &f_config) == ESP_OK && twai_start() == ESP_OK) {
    Serial.println("\nCAN ready. ");
  } else {
    Serial.println("\nCAN init failed. ");
    while (1) delay(1000);
  }
  
  M5.Display.drawCenterString("CAN", 64, 50);
}

void loop() {
  // transmit
  twai_message_t tx_msg = {};
  tx_msg.extd = 0;            // 0 = standard frame, 1 = extended frame
  tx_msg.identifier = 0x123;  // 11-bit standard ID, change it on another device
  tx_msg.data_length_code = 2;
  tx_msg.data[0] = 0xAA;  // change it on another device
  tx_msg.data[1] = 0xBB;  // change it on another device

  if (twai_transmit(&tx_msg, pdMS_TO_TICKS(100)) == ESP_OK) {
    Serial.println("TX OK");
  } else {
    Serial.println("TX failed");
  }

  // receive (non-blocking)
  twai_message_t rx_msg;
  if (twai_receive(&rx_msg, pdMS_TO_TICKS(10)) == ESP_OK) {
    Serial.print("RX: ");
    for (int i = 0; i < rx_msg.data_length_code; i++) Serial.printf("%02X ", rx_msg.data[i]);
    Serial.printf("(ext=%d, id=0x%X, dlc=%d)", rx_msg.extd, rx_msg.identifier, rx_msg.data_length_code);
    Serial.println();
  }

  delay(2000);
} 

4. コンパイルと書き込み

  • 1. ダウンロードモード:デバイスにプログラムを書き込む前にダウンロードモードに切り替える必要があります。メインコントローラによって手順が異なります。詳細はArduino IDE 入門チュートリアルページ下部のデバイス別書き込み方法一覧をご参照ください。

  • AtomS3R の場合、リセットボタンを約2秒間長押しし、内部の緑色LEDが点灯したら放します。これでデバイスはダウンロードモードに入り、書き込み待機状態になります。

  • 2. デバイスのポートを選択し、Arduino IDE 左上のコンパイル&書き込みボタンをクリックしてプログラムがコンパイルされ、デバイスに書き込まれるまで待ちます。

5. 実行結果

  • デバイス起動後、シリアルモニタに CAN バスの送受信情報が表示されます。接続構成は下図の通りです。
  • シリアル出力例:
    送信側:TX OK
    受信側:RX: AA BB (ext=0, id=0x123, dlc=2)
On This Page