しばらく放置していたら、自分の書いたスケッチがわからなくなったので、
ブログ投稿しながら復習することにしました。
送信側 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でしたので注意して下さい。
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の消失”で悩まされる。
作業が進んだら投稿します。
12Vのロードロップレギュレータってあるの?無いのかな?
在庫している部品で作ってみることにしました。
部品リスト(秋月電子通商)
【I-11298】 低損失表面実装型三端子レギュレータ 5V800mA NJM2845DL1-05
【I-16173】 3mm赤色LED 640nm OSDR3133A (100個入)
【I-17082】 定電圧ダイオード(ツェナーダイオード) 5.6V1W RD5.6F (20本入)
【P-09075】 TO-252変換基板
チップコンデンサ1μF(入力側)、10μF(出力側)
※TO-252変換基板GNDパターンのカットが必要です。(真ん中のパターンです)
5V出力のレギュレータと追加回路で11.5Vぐらいの出力になりました。
チップコンデンサも取り付けてモジュール化しました。
電圧変更方法について
レギュレータのGND端子と電源マイナス間にツェナーダイオードとLED(VFの大きなダイオードとして採用)
あとで図を入れときますね
空中配線の部分はホットボンドで固定しています。
動作確認は想定範囲内で、ま、OKでしよう。12〜17V入力して11.5〜11.8V出力 下の写真
基板へ取り付けます。(取り付け前)下の写真
レギュレータの配線引き出し方向を変えて
手前側左から5番目(GND)6番目(基板の12V入力)のランド穴へはんだ付けします。
レギュレータの入力端子は外部電源入力配線を接続しますので基板へ接続しません。
下の写真
はんだ付けするとこんな感じになります。 下の写真
いらんかもしれんけど写真を撮ったので載せておきます。下の写真5枚
動作テストの様子 下の写真
メーターの代わりに12VのLEDモジュールをつないでチェック
パルス入力を変えると、PWMのデューティ比が変わり明るさが変化する。
ワーニングLEDも点灯しました。下の写真
基板の裏には、追加した電源レギュレータモジュールのLEDが光っています。(無駄ですが) 下の写真
さて、これでプロジェクトがクローズ出来るのでしょうか?
信頼性評価はどうしましょうか?相談します。
完?
返品されてきました。
結論 設計ミス +12V電源とGND間に入れたツェナーダイオードのショート
対策 ロードロップ3端子レギュレータへの変更(案)
<br />故障原因を調査するためにケースを開けます。
防水するため自己融着テープを巻いてもらっています。配線出口部は今後の課題になります。
カッターでテープとケースを切って開けました。(ケースは廃物を利用したものでした)
基板の振動防止の為基板に直接融着テープ巻いています。
下の写真 基板のテープを取り除く
基板の配線面 機械的損傷は見当たらない。配線間の放電跡はなさそうに見える。
基板の部品面 機械的損傷は見当たらない。配線間の放電跡はなさそうに見える。
下の写真 回路の調査
エンジンがストールしたことから、イグニッションコイル1次側に接続されたパルス入力と、
GND間回路が故障(ショート又はリーク)していると推定したが違いました。
下の写真 パルス入力と+12V間の絶縁も確認・・・ショートやリークはありません。
下の写真 +12V入力とGND間抵抗値・・・ショートしています。
下の写真 原因はツェナーダイオードのショート不良でした。
つまり設計ミスです。供給電源は+12V超える(〜14V?)可能性を見落としていました。<br />ツェナーダイオードと直列に抵抗を入れていないので、電圧が上がると壊れます。
ツェナーダイオード以外は壊れていませんでいた。
改善案 ロードロップタイプの3端子レギュレータに交換します。(調べ中)<br /><br />つづく