投稿

10月, 2023の投稿を表示しています

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の消失”で悩まされる。 作業が進んだら投稿します。