しばらく放置していたら、自分の書いたスケッチがわからなくなったので、
ブログ投稿しながら復習することにしました。
送信側 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++) {//配列を順に呼んで
id11_value |= (uint32_t)(receivedData[i] << (7 * i));//1byteの1〜7bitを使う時
//配列内データを7bitビットずつシフトして、ビット単位のOR演算する
//forループを8回(i=0から7)繰り返すと56bit復元される。
//送信元データサイズに合わせてループ回数を決めれば良いと思う。
//id11_value |= (uint32_t)(receivedData[i] << (8 * i));//1byteの1〜8bitを使う時
}
Serial.print("Value11 ");
Serial.println(id11_value);
}
これで使えるかと思いますが、もっとシンプルなスケッチに出来るかもしれません。
間違いがあるかもしれませんのでご注意を
復習完了か?