しばらく放置していたら、自分の書いたスケッチがわからなくなったので、
ブログ投稿しながら復習することにしました。
送信側 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++) { // data1の配列を順に切り替えていくため
//Value1は分割する前のデータ(bit単位で取り扱う)
//8とiを積を求めてその分のbit右シフトをする
//iが増加する毎に、bit単位のValue1を1byteづつ取り出せるようにする
//0xFFとbit単位のAND演算をして1byte取り出す
//配列に入れる
//data1[i] = (byte)(Value1 >> (i * 8)) & 0xFF;//1byteの8bit使用
data[i] = (byte)(Value1 >> (i * 7)) & 0x7F;//1byteの7bitを使用
mcp.write(data1[i]);//データを組み立てていく感じ?
}//for文の閉じ括弧
mcp.endPaket();//準備したデータを送る感じ?
今日はここまで
補足
前述のスケッチはloop関数中の記述抜粋です。
beginPacketのIDを変えて複数記述すれば、複数のデータを送ることが出来ます。(たぶん)
6個のデータは正常に送ることが出来ました。
実は正しく送れないデータ範囲がありました。スケッチ修正箇所あります。
1byte(8bit)の7bitしか使えなかったのはSAMDマイコンとRP2040でしたので注意して下さい。
最新の画像[もっと見る]
- クロスオーバーネットワークXEC−700(SONY) 2週間前
- 夕景 4週間前
- 夕景 4週間前
- Arduino UNO MINIMAでCAN通信(写真と・・・) 4週間前
- Arduino UNO MINIMAでCAN通信(写真と・・・) 4週間前
- Arduino UNO R4 MINIMAを使ってみる(bookworm RasPiOSで書き込みできない) 1ヶ月前
- bluetoothで音声を送る(リモートスピーカーとして使ってみる) 1ヶ月前
- bluetoothで音声を送る(リモートスピーカーとして使ってみる) 1ヶ月前
- bluetoothで音声を送る(リモートスピーカーとして使ってみる) 1ヶ月前
- bluetoothで音声を送る(ごめんなさい OBS-Studioで配信してgo2rtcで受信) 2ヶ月前
※コメント投稿者のブログIDはブログ作成者のみに通知されます