投稿

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

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バスモジュールを使ってデータ送受信する。(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...