投稿

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

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番号を割り当てて 送信側:数値をばらしてバイト配列に入れて送る。 受信側:バイト配列を組み立ててもとの数値へ戻す。 準備できたら送信、受信スケッチを紹介したいと思います。