hiro yamamoto works

マイコンハード、ソフトを作ったりしています。
お家や現場のお困りごと解決に!
内容利用は自己責任でお願いします。

Arduino UNO MINIMAでCAN通信(接点伝送してみる)

2025-03-07 21:24:12 | CAN通信

CAN通信の活用方法を考えています。
今回テーマは「接点伝送」です。
CANバスを経由で機器を制御するようなことができると思います。
備忘記なんですが、参考に紹介します。


準備
ESP32とArduino UNO R4ボードマネージャ、
"Adafruit MCP23017 Arduino library"をインストールしておく。
動作確認のときはPCが2台あると便利です。

・CAN受信側(出力)

 

 

出力側スケッチ
サンプルスケッチTWAIreceive.inoへMCP23x17用を組み合わせただけです。
追加する部分だけ
実際の使用にはもう少し検討が必要と思います。

 

#include <Adafruit_MCP23X17.h>//"<"を半角に修正して
// only used for SPI
#define CS_PIN 5
//中略

Adafruit_MCP23X17 mcp;

//setupの中追加
//if (!mcp.begin_I2C()) {//I2C使う時はこちら
  if (!mcp.begin_SPI(CS_PIN)) {
    Serial.println("SPI Error.");
    while (1);
  }
  // configure pin for output
  // IODIRA,IODIRBレジスタでの設定はまだ調べていません
    for (int i = 0; i <16; i++) {//修正 "<"を半角に修正
    //mode INPUT, OUTPUT, or INPUT_PULLUPとあり
    mcp.pinMode(i, OUTPUT);
    }

//中略

//関数handle_rx_message(twai_message_t &message)の中に追加
Serial.println(message.data[0], BIN);//シリアルモニタへ表示してみる
Serial.println(message.data[1], BIN);
mcp.writeGPIOA(message.data[0]);//port A 参考 mcp.writeGPIOAB()で全ポート
mcp.writeGPIOB(message.data[1]);//port B
//以降省略

・CAN送信側(入力)

 

入力側スケッチ(Arduino UNO R4 MINIMA)
サンプルスケッチCANWrite.inoへMCP23x17用を組み合わせただけです。
追加する部分だけ
実際の使用にはもう少し検討が必要と思います。

 

#include <Adafruit_MCP23X17.h>//"<"を半角に
static uint16_t button = 0;//mcp23017 input
Adafruit_MCP23X17 mcp;
//setupの中へ
if (!mcp.begin_I2C()) {
Serial.println("SPI Error.");
while (1);
}

// configure pin for output
for (int i = 0; i <16; i++) {//修正 "<"を半角に
mcp.pinMode(i, INPUT_PULLUP);
}
//loopの中の変更と追加

button = mcp.readGPIOAB();
//中略
//uint8_t const msg_data[] = {0xCA,0xFE,0,0,0,0,0,0};//コメントアウトする
uint8_t const msg_data[] = {0,0,0,0,0,0,0,0};
memcpy((void *)(msg_data), &button, sizeof(button));


こんな感じ