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));
こんな感じ