hiro yamamoto works

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

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

2023-07-30 12:46:44 | マイコンハードウェア

RaspberryPi 4Bを使ってArduinoIDE動かしています。
ESP32の起動失敗やSDのファイルオープン失敗など不安定な現象が発生していました。
USB延長ケーブルとブレットボード接触甘めで電源電圧低下していたようです。

ブレットボード用ジャンパーワイヤをやめてブレッドボードにピンヘッダを挿してはんだ付け
さらにセルフパワーのUSBハブを導入しました。
不安定な挙動は全くなくなりました。


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

2023-07-15 14:27:40 | マイコンソフトウェア

受信側スケッチです。改善の余地あり(ちょっと直しました。)
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 = mcp.parsePacket();
if (packetSize) {
if (mcp.packetId() == 0x11) {
Serial.print(mcp.packetId(), HEX); Serial.print(" ");
id1_value = 0;
while (mcp.available()) { //8byte固定 このスケッチは受信側Receiver(read)
for (int i = 0; i <= 7; i++) {
          receivedData[i] = mcp.read();
        }
/*receivedData[0] = mcp.read();
receivedData[1] = mcp.read();
receivedData[2] = mcp.read();
receivedData[3] = mcp.read();
receivedData[4] = mcp.read();
receivedData[5] = mcp.read();
receivedData[6] = mcp.read();
receivedData[7] = mcp.read();*/
}
for (int i = 0; i <= 7; i++) {
id1_value |= (uint32_t)(receivedData[i] << (7 * i));
}
Serial.print("timeValue0 "); Serial.println(id1_value);
}else if (mcp.packetId() == 0x12) {
Serial.print(mcp.packetId(), HEX); Serial.print(" ");
id2_value = 0;
while (mcp.available()) {
for (int i = 0; i <= 7; i++) {
          receivedData[i] = mcp.read();
        }/*
receivedData[0] = mcp.read();
receivedData[1] = mcp.read();
receivedData[2] = mcp.read();
receivedData[3] = mcp.read();
receivedData[4] = mcp.read();
receivedData[5] = mcp.read();
receivedData[6] = mcp.read();
receivedData[7] = mcp.read();*/
}
for (int i = 0; i <= 7; i++) {
id2_value |= (uint32_t)(receivedData[i] << (7 * i));
}
Serial.print("timeValue1 ");
Serial.println(id2_value);
}else if (mcp.packetId() == 0x13) {
Serial.print(mcp.packetId(), HEX); Serial.print(" ");
id3_value = 0;
while (mcp.available()) {
for (int i = 0; i <= 7; i++) {
          receivedData[i] = mcp.read();
        }/*receivedData[0] = mcp.read();
receivedData[1] = mcp.read();
receivedData[2] = mcp.read();
receivedData[3] = mcp.read();
receivedData[4] = mcp.read();
receivedData[5] = mcp.read();
receivedData[6] = mcp.read();
receivedData[7] = mcp.read();*/
}
for (int i = 0; i <= 7; i++) {
id3_value |= (uint32_t)(receivedData[i] << (7 * i));
}
Serial.print("timeValue2 ");
Serial.println(id3_value);
}
}
}


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

2023-07-15 09:32:20 | マイコンソフトウェア

数台の機器からデータを送って、受信したデータをまとめて保存するようなものを作るため、
スケッチを書いてテストしています。続編
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番号を割り当てて
送信側:数値をばらしてバイト配列に入れて送る。
受信側:バイト配列を組み立ててもとの数値へ戻す。
準備できたら送信、受信スケッチを紹介したいと思います。

送信側スケッチ
変化する送信データサンプルとしてmillis()を読んで使っています。
3つのID(0x11,0x12,0x13)を使っています。
(0x14は使えなかった。0x21〜0x23使えた。)
ID毎に1つのデータを送っています。

/*Adafruit MCP2515_CAN_Sender Exampleを改変しています。
一部省略 転記ミスや表示されてない記号があるかも <は半角に直して*/
#include<Adafruit_MCP2515.h>
#define CS_PIN    20
// Set CAN bus baud rate
#define CAN_BAUDRATE (250000)
Adafruit_MCP2515 mcp(CS_PIN);

byte time0[8];
byte time1[8];
byte time2[8];
byte packetId0 = 0x11;
byte packetId1 = 0x12;
byte packetId2 = 0x13;//0x14は使えなかった
void setup() {
  Serial.begin(115200);
  while (!Serial);
  delay(10);
  Serial.println("MCP2515 Sender test!");
  if (!mcp.begin(CAN_BAUDRATE)) {
    Serial.println("Error initializing MCP2515.");
    while (1);
    delay(10);
  }
  Serial.println("MCP2515 chip found");
}

//送信側Sender(write)
void loop() {
  // send packet: id is 11 bits, packet can contain up to 8 bytes of data
  // パケットを送信:IDは11ビット、パケットには最大8バイトのデータを含むことができる
   //Serial.print("Sending packet ... ");
   uint32_t timeValue0 = millis();
   uint32_t timeValue1 = millis();
   uint32_t timeValue2 = millis();
   Serial.print(packetId0 , HEX);
   Serial.print(" send data ");
   Serial.println(timeValue0);
   Serial.print(packetId1, HEX);
   Serial.print(" send data ");
   Serial.println(timeValue1);
   Serial.print(packetId2, HEX);
   Serial.print(" send data ");
   Serial.println(timeValue2);
   mcp.beginPacket(packetId0);//送信側Sender(write)
  for (int i = 0; i <= 7; i++) {//最上位bit使えない0x7F B1111111を超えるとNG
     time0[i] = (byte)(timeValue0 >> (i * 7)) & 0x7F;
     //time0[i] = (byte)(timeValue0 >> (i * 8)) & 0xFF;//最上位bitまで使える時
     //sendData
     mcp.write(time0[i]);
  }
   mcp.endPacket();
//送信側Sender(write)
mcp.beginPacket(packetId1);
for (int i = 0; i <= 7; i++) {//最上位bit使えない0x7F B1111111までOK
     time1[i] = (byte)(timeValue1 >> (i * 7)) & 0x7F;//最上位bit使えないとき
     //time1[i] = (byte)(timeValue1 >> (i * 8)) & 0xFF;//最上位bit使えるとき
     //sendData
     mcp.write(time1[i]);//送信側Sender(write)
   }
   mcp.endPacket();//送信側Sender(write)
    //送信側Sender(write)
mcp.beginPacket(packetId2);
for (int i = 0; i <= 7; i++) {//最上位bit使えない0x7F B1111111までOK
     time2[i] = (byte)(timeValue2 >> (i * 7)) & 0x7F;//最上位bit使えないとき
     //time2[i] = (byte)(timeValue2 >> (i * 8)) & 0xFF;//最上位bit使えるとき
     //sendData
     mcp.write(time2[i]);//送信側Sender(write)
   }
   mcp.endPacket();//送信側Sender(write)
   delay(1000);
}


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

2023-07-09 09:57:42 | マイコンハードウェア

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


楽に配線できたと思ったら、やらかしていました。

2023-07-01 14:23:00 | マイコンハードウェア

今回も全く面白くない投稿です。<br />面白くない投稿に追記 またまた誤配線発覚<br />今度こそ間違いないと、記録データを確認してみたら違うんです。<br />失敗を糧にもう少し頑張りましょう。やり直すほうがもっと面倒くさかった。
以前配線がめんどくさいと投稿した基板間配線ですが
こんなに楽に配線できる方法をなぜ思いつかなかったのか
調子に乗って配線終了。ところが
動作チェックでミスが発覚 誤配線やらかしていました。
結局手直しで時間ロス発生
…気をつけます。