hiro yamamoto works

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

ESP32でCAN通信(RTR frameとextended format設定)

2025-03-20 17:11:47 | CAN通信

RTR frameとextended formatはデフォルトで有効となっています。
CAN送信のスケッチを書く時は気をつけましょう。
"twai_types.h"で指定されているようです。
必要に応じて、CAN IDを指定する"message.identifier =・・・"の前辺りに、
次のコードを書いて設定しましょう。
message.extd = 0;//0:Standard(11bit ID) 無指定:extended format(29bit ID)
message.rtr = 0; // 0:Data frame 無指定:RTR frame

忘れてた
CAN ID"0xF6"で送っているつもりが、受信側"80000F6"と表示され、
しばらく悩んだので備忘記投稿しました。


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

2025-03-14 10:59:37 | CAN通信

CAN通信の活用方法を考えています。
今回テーマも「接点伝送」です。
CANバスを経由で機器を制御するようなことができると思います。
備忘記なんですが、参考に紹介します。
前回「接点伝送」の出力IOエキスパンダを
I2CインターフェースのMCP23017に変更しています。

スケッチ変更したところだけ
// Pins used to connect to CAN bus transceiver:
#define RX_PIN 17 //接続ピンをGPIO21から17へ変更
#define TX_PIN 16 //接続ピンをGPIO22から16へ変更
//中略
  // uncomment appropriate mcp.begin
  if (!mcp.begin_I2C()) { //アンコメントする
  //if (!mcp.begin_SPI(CS_PIN)) { //こちらをコメントアウトする
    Serial.println("SPI Error.");
    while (1);
  }
//省略

スケッチは少しの変更だけで使えます。


Arduino UNO R4 MINIMAを使ってみる(解決Raspi OS&ArduinoIDE 1.8.19でuploadできない)

2025-03-11 21:26:31 | マイコンソフト&ハードウェア

RaspiOS(64bit bookworm)でなぜなのか、Arduino UNO R4 MINIMAの書き込みができない。


エラーメッセージは
"dfu-util: No DFU capable USB device available
Failed uploading: uploading error: exit status 74"
日本語訳では、
”dfu-util:DFU対応USBデバイスはありません
アップロード失敗: アップロードエラー:終了ステータス 74”

解決策が見つかりました。

Arduino.ccで"Fix udev rules on Linux "キーワード検索してみてください。
出てきたページの、表の下の方に、
UNO R4 WiFi UNO R4 Minima Portenta C33 ボードの所があり、
前述のエラーメッセージと、対応方法へのリンクあります。

対応内容をざっくり言うと、
GitHubで"post_install.sh"というファイルをダウンロードして、
インストールすると改善されるとのことです。
GitHubへのリンクもありました。

インストールで少し悩んだので、備忘記として書いておきます。
1.GitHubで"post_install.sh"をダウンロードする。
2.ファイルマネージャーで"ダウンロード"を開く。
3."post_install.sh"ファイルを右クリックし、メニューから
  プロパティを表示して、パーミッションタブを選んで、
  実行(E):のところを"なし"から
  "所有者のみ"とか"すべて"にしておく。

4.ファイルマネージャーの"ツール"→"現在のフォルダを端末で開く"と
  "LXTerminal"が開く。
  sudo "/home/pi/ダウンロード/post_install.sh"と入力し"Enter"
  "Reload rules..."表示されて消えたら完了。

5.Arduino IDEを起動してMINIMAに"blink"とか書き込んでみる

間違いがあったらごめんなさい。ヒントにはなると思います。


ちなみにRaspiOS(32bit bookworm)ではコンパイルエラー(...exit status 127)となります。
これは以前確認した時と変わらないようです。まだ調べてません。


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

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

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

(更に書き足しました)
送信側(入力側)オリジナルスケッチ"CANWrite.ino"の最後の方に
"delay(1000)"(1秒)入っています。
これは、1秒間止まって待っているということですから、もったいないと思います。
かといって、入力が変わらないのに高速に送り続けるのもどうかと思います。
変化したときだけ送るとか、実際に機器に使うときは考えましょう。
(少し書き足しました。)
入出力デバイスはIOエキスパンダを使ってみました。
入力はI2CインターフェースのMCP23017、
出力はSPIインターフェースのMCP23S17です。

なんでインターフェースが違うデバイスを使ったの?
ピンリストでI2Cの端子と思われるGPIO21ーWIRE_SCL,
GPIO22ーWIRE_SDAが、CAN_TX、CAN_RXが割り当てられていたので、
I2Cは使えないと思い込んで、SPIインターフェースを選択した経緯あり。

ESP32の"IO MUXとGPIOマトリックス"機能があって、GPIOピンに割り当てる
機能を変えられる(合ってる?)、ピンリストに表示されているのは、
デフォルトで接続されるGPIOピンかな?

CANトランシーバの接続を、GPIO16,17に変えても動くようなので、
GPIO21ーWIRE_SCL,GPIO22ーWIRE_SDAにI2Cインターフェースの
MCP23017を接続してもよいのではないかと思います。
SCL、SDAのGPIOピンを変えることもできると思うが、
CAN_TX、CAN_RXを変えるほうが簡単。

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

・CAN受信側(出力)MCP23S17を使用した接続

 

 

出力側スケッチ
サンプルスケッチ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送信側(入力)MCP23017を使用した接続

 

入力側スケッチ(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));//オリジナルのmemcpyの前後におく
buttonは16bit(2byte)ですので、配列msg_data[0]とmsg_data[1]に入ります。
//以降CANwrite.inoオリジナルのまま変更なし


こんな感じ


Arduino UNO MINIMAでCAN通信(4byteデータを2つ送るには)

2025-02-27 10:38:14 | CAN通信

CAN通信の活用方法を考えています。
今回テーマは「4byteデータを2つ送るには」です。
2byteを4つ送るとか応用もできます。

備忘記なんですが、参考に紹介します。

Arduino UNO R4 MINIMA CANWrite.inoサンプルスケッチの改変部分

static uint32_t value1 = 0;//millis()を入れてみます
static uint32_t value2 = 0;//サンプルスケッチのmsg_cntを入れてみます
//中略
value1 = millis();
// 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), &value1, sizeof(value1));
  memcpy((void *)(msg_data + 4), &msg_cnt, sizeof(msg_cnt));//オリジナルそのまま使う
  CanMsg const msg(CanStandardId(CAN_ID), sizeof(msg_data), msg_data);
//中略



ESP32 TWAIreceive.inoスケッチの改変部分ほか

//中略
    //4byteデータ、2個の数値が送られてくる
    uint32_t value1 = 0;
    uint32_t value2 = 0;
    while (twai_receive(&message, 0) == ESP_OK) {
        Serial.printf("\nID: %lx\n", message.identifier);//改行してID:xx 表示して改行
        //"\n"は改行 書式指定文字 %lx 倍精度整数?を16進で出力する
        if (!(message.rtr)) {//リモートフレームじゃないとき
          //for (int i = 0; i < message.data_length_code; i++) {
          for (int i = 0; i <= 7; i++) {
            if (i <= 3) {
              value1 |= (uint32_t)( message.data[i] << (8 * i));
            } else if (i >= 4) {
              value2 |= (uint32_t)( message.data[i] << (8 * (i - 4)));
            }
            Serial.printf(" %d = %02x,", i, message.data[i]);
          }
          Serial.printf("\nvalue1:%lu", value1);//\nは改行(ニューライン)
          Serial.printf("\nvalue2:%lu\n\n", value2);
        }
        }//if (!(message.rtr))
}//while
//中略

CAN通信活用備忘記 続く