投稿

ラベル(CAN)が付いた投稿を表示しています

Arduino UNO MINIMAでCAN通信(デジタル タコメーターを模索する)

イメージ
応用編が始まります。 CANバスへリクエストしない方法でやってみます。 車両はN-BOXです。   エンジン回転数、車速、水温(クーラント温度)、アクセル開度など取れそうですが、 ぼちぼちやっていきます。

R7FA4M1のCANReadFilterMask設定について備忘記

イメージ
標準フォーマット 11ビット長IDの範囲は0x0~0x7FF 2048種類の識別が可能だと説明あったがスケッチ例"CANReadFilter.ino"で・・・MASK_STANDARD = 0x1FFC0000とあり、全一致ではこのように記述するようだ。0x7FFではなく0x1FFCでもない。よって注意しなければならない。 参考:拡張フォーマット 29ビット長IDの範囲は0x0~0x1FFFFFFF で536870912種類 static uint32_t const CAN_FILTER_MASK_STANDARD = 0x1FFC0000;//11bit全一致 static uint32_t const CAN_FILTER_MASK_EXTENDED = 0x1FFFFFFF;//29bit全一致 

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

イメージ
 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出力)

イメージ
 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できない)

イメージ
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..."表示されて...

Arduino UNO MINIMAで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用を組み合わせただけです。 追加する部分だけ 実際の...

Arduino UNO MINIMAでCAN通信(MINIMA >> UNO R4 Wi-Fi 受信データを配列に入れる)

イメージ
参考になる情報を見つけたので、備忘記録として投稿します。 情報公開してくださっている方に感謝します。 笑って許してくれる方だけ見てくださいね! 本来目的のESP32受信で問題点があり、原因切り分け調査のための、 UNO R4 WIFI受信調査となっています。 送信 Arduino UNO R4 MINIMA(CANWrite.ino)+CANトランシーバ:SN65HVD230 受信 Arduino UNO R4 WIFI(CANRead.ino)+CANトランシーバ:SN65HVD230 これでやっています。                 サンプルスケッチ"CANRead.ino"は決められた書式でのシリアルモニタ表示はできますが、   if (CAN.available()) {     CanMsg const msg = CAN.read();     Serial.println(msg);   }                 データのみを使いたい時どうしたら良いか疑問が湧いて調べたら、次のようなコードをみつけました。 これで解決できます。   if (CAN.available())  {     CanMsg const msg = CAN.read(); //sizeof(msg.data)は"msg.data"メモリサイズをバイト単位で返す     uint8_t rx_data[20]; //メモリ領域msg.dataの先頭からmsg.dataのメモリサイズバイトをメモリ領域rx_dataにコピーする     memcpy(rx_data, &msg.data, sizeof(msg.data)); // rx_data配列へコピー     uint32_t rxId = msg.id;     uint8_t rxLen = msg.data_length;     Serial....

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

イメージ
 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進で出力する       ...

Arduino UNO MINIMAでCAN通信(ESP32 TWAIreceive.ino受信時変更点)

イメージ
 以前の投稿で解決策を追記しましたが、わかりにくくなっていたので新たに投稿しておきます。 変更点書き忘れもありました。 笑って許してくれる方だけ見てくださいね・・・                 送信 Arduino UNO R4 (CANWrite.ino)+CANトランシーバ:SN65HVD230 受信 ESP32-WROOM-32E(TWAIreceive.ino)+CANトランシーバ:SN65HVD230 発生する問題点 ・MINIMA側(送信)シリアルモニタにエラー表示 CAN.write(...) failed with error code -60003 ・ESP32側(受信)シリアルモニタに高速出力 ・変化データを送信しても、受信(ESP32)データが更新されない。 ESP32 TWAIreceive.inoの変更するところ  setup関数の中 "TWAI_MODE_LISTN_ONLY"を"TWAI_MODE_NORMAL"へ変更 TWAI_TIMING_CONFIG_500KBITS()をTWAI_TIMING_CONFIG_250KBITS()へ変更 //TWAIreceive.ino //setup関数の中にある //Initialize configuration structures using macro initializers //twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)TX_PIN, (gpio_num_t)RX_PIN, TWAI_MODE_LISTEN_ONLY);//変更前 //twai_timing_config_t t_config = TWAI_TIMING_CONFIG_500KBITS();//変更前 twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)TX_PIN, (gpio_num_t)RX_PIN, TWAI_MODE_NORMAL);//変更後 twai_timing_config_t t_config = ...

解決Arduino UNO MINIMAでCAN通信(MINIMA >> ESP32twaireceiveで受信できたが)

イメージ
少し前に進みました? 笑って許してくれる方だけ見てくださいね! 送信 Arduino UNO R4 (CANWrite.ino)+CANトランシーバ:SN65HVD230 受信 ESP32-WROOM-32E(TWAIreceive.ino)+CANトランシーバ:SN65HVD230 これでやっています。 最終的に送信側をXIAO RA4M1にしたいと目論んでいます。 困りごと・・・☆解決☆(2025/02/03) ・1秒毎の送信なのに、受信側はシリアルモニタに高速出力?☆解決☆ ・変化データ送信で、受信データが更新されない。☆解決☆ 変更点 TWAIreceive.ino setup関数の中 "TWAI_MODE_LISTN_ONLY"を"TWAI_MODE_NORMAL"へ変更   //TWAIreceive.ino //setup関数の中にある   //Initialize configuration structures using macro initializers //twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)TX_PIN, (gpio_num_t)RX_PIN, TWAI_MODE_LISTEN_ONLY);//変更前   twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)TX_PIN, (gpio_num_t)RX_PIN, TWAI_MODE_NORMAL);//変更後 新たに確認できたこと(2025/01/21) ESP32同士なら問題なさそう?な雰囲気、まだ変化データは未確認だった。 つまり"マイコンの組み合わせ"? でもXIAO RA4M1を使いたいので、打開策調べます。 ESP32同士の受信シリアルモニタ表示 1sec毎表示されます。 (送信側をUNO R4からESP32に変えたということです。) (TWAIreceive.ino-->TWAItransmit.ino) なんで"Extended Format"になってるんだろう?           ...

Arduino UNO MINIMAでCAN通信(ESP32 > twaireceive.inoで受信できたが)

イメージ
この投稿には、役立つ情報はなにも載っていません。 ESP32側には"available( )"みたいなやつが見つからないんです。 何か方法がないか調べています。 ESP32側 別のライブラリという方法もありそうですが、 こちらも少々問題があり、TWAI(CAN類似)を使うことにしたのですが うまくいかないのでした。 構成は 送信 Arduino UNO R4 (CANWrite.ino)+CANトランシーバ:SN65HVD230 受信 ESP32-WROOM-32E(twaireceive.ino)+CANトランシーバ:SN65HVD230 通信ができただけ、まだ進んでいません。                  受信側(ESP32)のシリアルモニタ出力 延々と出力されます。                つづくと思います。

Arduino UNO MINIMAでCAN通信(写真と・・・)

イメージ
 この投稿は、写真を見ていただくだけで、役立つ情報は載っていません。 接続しただけで、まだなにも進んでいません。                 ESP32が側がまだわからんのです。 調べます。 つづく

CANバスモジュールを使ってデータ送受信する(受信側復習)

イメージ
 しばらく放置していたら、自分の書いたスケッチがわからなくなったので、 ブログ投稿しながら復習することにしました。 送信側 SAMD XIAOとMCP2515 受信側 Arduino MKRZERO(SAMD)とMCP2515の組み合わせです。 私が使うための最低限の情報だけなので、もっと掘り下げたい方は詳しいサイトを探して下さい。 ※テストしてわかったこと※  理由はわからないが、送信側で、1byteの中で7bitしか使えない事がわかった。 受信側は送信側の7bitに合わせるしかありません。 Amazonで購入したCANバスモジュール CANコントローラ(MCP2515)とトランシーバ(TJA1050)のICが載っています。 loop()関数中スケッチ抜粋 int packetSize = mcp.parsePacket();   if (packetSize) {     if (mcp.packetId() == packetId11) { //送信側IDと一致(packetId11)       id11_value = 0;       byte receivedData[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};       while (mcp.available()) {         for (int i = 0; i <= 7; i++) {//受信した0~8byteを配列に入れていく           receivedData[i] = (byte)mcp.read();         }//for       }//while       //receivedData[0]~[8]配列内のデータを処理して送信元データへ復元する       for (int i = 0; i <= 7; i++) {//配列を順に呼んで       ...

CANバスモジュールを使ってデータ送受信する(送信側復習)

イメージ
 しばらく放置していたら、自分の書いたスケッチがわからなくなったので、 ブログ投稿しながら復習することにしました。 送信側 SAMD XIAOとMCP2515 受信側 Arduino MKRZERO(SAMD)とMCP2515の組み合わせです。 私が使うための最低限の情報だけなので、もっと掘り下げたい方は詳しいサイトを探して下さい。 ※テストしてわかったこと※  理由はわからないが、1byteの中で7bitしか使えない事がわかった Amazonで購入したCANバスモジュール CANコントローラ(MCP2515)とトランシーバ(TJA1050)のICが載っています。   MCP2515 CANコントローラについて マイクロコントローラとの接続インターフェース:SPI(10MHz) 1秒間に送受信可能なデータ量(Mb/s):1Mb/s (Mbyte/秒(メガバイト/秒)1byteは8bit 1Mb/sは8Mbpsに相当  Mbpsとは、1秒間でのデータの転送速度 bit/秒) CAN通信について(かんたんに) データの中に”ID(識別子)を付加して送信する” データ受信側は、IDにより「どのようなデータなのか?」判断できる。 IDは通信調停の優先順位決定にも使われる。 標準フォーマット:11ビット長でIDを構成、IDの範囲0x0~0x7FF 2048種類の識別可能 (拡張フォーマット:ID(ベースID)と拡張IDの18ビット長で構成) 1回に送信できるデータ量が最大8byte ひとつのIDで8byte送れる。(と思っていたが実際は1byte(8bit)の中で7bitしか使えなかった) 8byteのデータを送れるということは、つまり64bitのデータを送れるということになる。 (前述の通り7bitなので7x8=56bitと思われる) 6個のデータを送りたい データごとにIDをつける。 1個のデータは32bit(0〜4294967295)4byteぐらいの数値を送れるようにしておく。 32bit(4byte)のデータを、8bit(1byte)7bit毎に分割して、 送信データへ入れていく\ mcp.beginPacket(packetid);//packetidは任意のID   for (int i = 0; i <= 7; i++) { ...

CANバスモジュールを使ってデータ送受信する(RP2040使用を断念)

イメージ
 RP2040マイコンを使ってCANバスでデータの送受信テストをしてきましたが、 不可解な現象に悩まされていました。残念ながら私のスキルでは解決できず、 XIAO SAMDへ変更することにしました。                  こんなことが起こります。 ID毎に1つのデータを割り当てて、6個のデータ(6個のID)を送った時、 特定の1個のIDが消失してしまう。 うまくいかなかったやつの 構成・仕様(参考) SPI接続CANバスモジュール(送信、受信各1個) (コントローラ:MCP2515、トランシーバ:TJA1050) マイクロコントローラ:AE-RP2040(送信、受信各1個) 送受信データ:6個(データ毎に1つづつIDを割り当て) データログ&HTTPサーバ:ESP32 動作概要 複数のデータそれぞれにID番号を割り当てて 送信側:数値をばらしてバイト配列に入れて送る。 受信側:バイト配列を組み立ててもとの数値へ戻す。 難点(RP2040が悪いわけではありません!) ・ArduinoUNO、ESP32で動いていたライブラリがRP2040で動かない。 ・RP2040マイコンに完全対応したCANコントローラのライブラリが見つからなかった。 (2023年9月時点) ・Adafruitの MCP2515ライブラリで制約があるが動く( RP2040非対応を自己責任で使う)  制約について  送信データの1バイトに入る数値  0x00〜0xFF(B11111111)のはずが、最上位bitが使えず0x00〜0x7F(B1111111)  送信8バイトをフルに使うことはないので使えると判断した。  ところがさらに進めていくと、不可解現象”特定IDの消失”で悩まされる。 作業が進んだら投稿します。

CAN通信開発中RaspberryPiではセルフパワーUSBハブで安定

イメージ
 RaspberryPi 4Bを使ってArduinoIDE動かしています。 ESP32の起動失敗やSDのファイルオープン失敗など不安定な現象が発生していました。 USB延長ケーブルとブレットボード接触甘めで電源電圧低下していたようです。 ブレットボード用ジャンパーワイヤをやめてブレッドボードにピンヘッダを挿してはんだ付け さらにセルフパワーのUSBハブを導入しました。 不安定な挙動は全くなくなりました。

CANバスモジュールを使ってデータ送受信する。(RP2040 受信)

イメージ
 受信側スケッチです。改善の余地あり(ちょっと直しました。) ChatGPT先生にいっぱいヒントを頂きました。 参考:コンパイル途中に次のようなメッセージ表示されていました。 警告:ライブラリAdafruit_CANはアーキテクチャsamdに対応したものであり、 アーキテクチャrp2040で動作するこのボードとは互換性がないかもしれません。 AdafruitのMCP2515ライブラリからのメッセージと思われます。               /*   Adafruit MCP2515_CAN_Receiver_Exampleを改変しています。 一部省略 転記ミスや表示されてない記号があるかも <は半角に直して */ #include<Adafruit_MCP2515.h> #define CS_PIN    20 // Set CAN bus baud rate #define CAN_BAUDRATE (250000) Adafruit_MCP2515 mcp(CS_PIN); byte receivedData[8]; uint32_t id1_value = 0; uint32_t id2_value = 0; uint32_t id3_value = 0; void setup() {   Serial.begin(115200);   while (!Serial) delay(10);   Serial.println("MCP2515 Receiver test!");   if (!mcp.begin(CAN_BAUDRATE)) {     Serial.println("Error initializing MCP2515.");     while (1) delay(10);   }   Serial.println("MCP2515 chip found"); } void loop() { // try to parse packet //このスケッチは受信側Receiver(read) int packetSize ...

CANバスモジュールを使ってデータ送受信する。(RP2040 送信)

イメージ
 数台の機器からデータを送って、受信したデータをまとめて保存するようなものを作るため、 スケッチを書いてテストしています。続編 SPI接続CANバスモジュール(コントローラ:MCP2515、トランシーバ:TJA1050)と 送信AE-RP2040、受信AE-RP2040、送信Arduino-UNO 1台 millis()をそのまま送ってAE-RP2040で受信しています。 ライブラリがRP2040非対応か ArduinoUNO、ESP32で動いていたライブラリがRP2040で動かない Arduino IDEのライブラリマネージャでMCP2515を検索しAdafruit MCP2515をインストール こちらは対応している(?)ようです。 送信データの1バイトに入る数値に制限がある? 0x00〜0xFF(B11111111)のはずが、最上位bitが使えず0x00〜0x7F(B1111111)となっています。 使い方に間違いがあるかもしれません。 送信8バイトをフルに使うことはないのでこれでも目的は 達成できそうです。 ChatGPT先生にいっぱいヒントを頂きました。 動作概要 複数のデータそれぞれにID番号を割り当てて 送信側:数値をばらしてバイト配列に入れて送る。 受信側:バイト配列を組み立ててもとの数値へ戻す。 準備できたら送信、受信スケッチを紹介したいと思います。  2023-07-15 09:32:20#CAN #AE-RP2040 #MCP2515 #TWAI                             送信側スケッチ 変化する送信データサンプルとしてmillis()を読んで使っています。 3つのID(0x11,0x12,0x13)を使っています。 (0x14は使えなかった。0x21〜0x23使えた。) ID毎に1つのデータを送っています。 /*Adafruit MCP2515_CAN_Sender Exampleを改変しています。 一部省略 転記ミスや表示されてない記号があるかも <は半角に直して*/ #include<Adafruit_MCP2515.h> #define CS_PI...

CANバスモジュールを使ってデータ送受信する。(ATmega Arduino)

イメージ
 数台の機器からデータを送って、受信したデータをまとめて保存するようなものを作るため、 スケッチを書いてテストしています。 SPI接続CANバスモジュール(コントローラ:MCP2515、トランシーバ:TJA1050)と Arduino-UNO 2台、AE-ESP32 1台 analogRead値やmillis()をそのまま送ってESP32で受信しています。 ESP32受信で問題発生 約5秒毎に正常データと異常データ(全部0XFF)が受信される問題発生します。 chatGPT先生に色々聞いてみましたが解決に至らず、 送信と受信のマイコンを入れ替えてみると現象が発生しなくなりました。 最終的にはAE-RP2040を使う予定なので交換してテストします。 複数のデータそれぞれにID番号を割り当てて 送信側:数値をばらしてバイト配列に入れて送る。 受信側:バイト配列を組み立ててもとの数値へ戻す。 準備できたら送信、受信スケッチを紹介したいと思います。