2023/07/17

CANトランシーバーを使わずにCAN通信をする

 CANバスの物理層は差動通信で、RS485の様にマルチドロップ接続が可能。
 自動車におけるノイズ環境でも通信が成立するように、トランシーバICには様々な対策が施されている。

 一方で、基板にマイコンを複数載せて、例えばブロードキャストメッセージを含んだ通信をさせたいとなったとき、ハードウェアとしてデータリンク層にあたるコントローラが実装されていて、メッセージフィルタ等が可能なCANバスは魅力的だ。しかし、長くても1m未満の配線長で差動ドライバのバスを駆動するのは電力的なペナルティが大きい。

CANバスの構成

 トランシーバーには5Vレベルと3.3Vレベルの製品があり、車載以外だと省電力化のために3.3Vバスを採用する例があるらしい。(電圧が低いほうがドミナント時の電流は下がるので)製品によってはフォールトトレラントのための様々な機能が付加されている。

 
 トランシーバーをつかわず、UARTの様に単純に接続することもできる。過去にはこのようなアプリケーションノートがあった。

On-Board Communication via CAN without Transceiver

https://www.mikrocontroller.net/attachment/28831/siemens_AP2921.pdf

CANコントローラの入出力を1線式マルチドロップバスとしてつなぐことで、トランシーバーが無くても通信が可能になる。規格外の使い方ではあるけれど、大幅に単純、かつ省電力になる。

コントローラのみでの接続


R4 MinimaにはCANコントローラーが内蔵されているため、上記アプリケーションノートの様に接続してみた。ダイオード2個と数kΩのプルアップ抵抗だけでサンプルコードの通信ができた。https://docs.arduino.cc/tutorials/uno-r4-minima/can

 とりあえず1Mbpsでも通信できていたけれど、Lowレベルの電位が下がり切っていないので、OD出力のバッファをTXに挟むとよいかもしれない。 

R4 Minimaのコントローラのみで通信させている様子(250kbps)


https://github.com/sandeepmistry/arduino-CAN/blob/master/API.md
ライブラリの実装は以下で確認できる。

CANと呼ばずTWAIという名称のため気づきにくいけれど、CANコントローラ内蔵で安価なマイコンとしてはESP32がある。
二つだけではマルチドロップの利点があまりないので、複数繋いでテストしてみたい。

UNO R4 Minimaの仕様を眺める

CANバス内蔵Classicボードたち。 しかし割高になってしまった…

Uno R4 Minimaを入手したので遊びつつ、どのような実装になっているのか、仕様を眺めてみた。

UNOは現在のArduino製品の中ではClassic Familyというカテゴリに入っており、歴史的なフォームファクタを継承している。ルネサス製MCUの採用で話題だけれど、5V単電源動作可能なARMマイコンとしては高機能だ。

要点としては、初学者向けのClassicファミリにCortex-M4が降りてきて、内蔵RTC、DAC出力、CANバスといった機能にもAPIレベルで対応しているという点になる。

 スペックだけ見ると、反射的に3.3Vで動いてほしいとかいろいろ要望が湧いてくるが、ターゲットはあくまで初心者なのを忘れないようにする。 (いい感じの互換ボードに期待)

ボードとピンマップを眺める

公式サイトのボード紹介ページでは、回路図と基板図をAltium365ビューワーで見ることができるようになっていた。回路図で抵抗を選択すると詳細が表示されるし、基板図上の実装と連携して位置をハイライトできたりする。

Minimaの実際の基板には16MHzの水晶は空きパターンとなっている。内蔵オシレーターで動いているようだ。

Minima 回路図
https://docs.arduino.cc/resources/schematics/ABX00080-schematics.pdf

Wifi R4回路図
https://docs.arduino.cc/resources/schematics/ABX00087-schematics.pdf

MinimaとWifi R4ではソケットに引き出されたSPIバスのマッピングが異なっている。これに伴いCANで使うピンも位置が変わっている。APIが用意されてるのにピンマップ表で表記していないのはボード依存のためかもしれない。 CANを使いたければシールド設計で対処するしかなさそう。

 他にも、Minimaのソケットの3.3V出力は、Minimaのデータシートに書いてある通りMCUの内部電圧を生成しているLDOの出力を引き出している。そこまでやるのかというくらい割り切っている。
 内部レギュレータから引き出せる電流量はArduinoとしては表向き載っていないけれど、ルネサスのデータシート(REN_r01ds0355ej0100_ra4m1_DST_20191008-1999414.pdf P.86 Table2.41)を見る限り100mAが限度となっており注意が必要。プロトタイピング用のボードとしてはちょっと心配になる。

ちなみにWifiR4はESP32があるため、さすがに外付けのレギュレータがある。

Minimaはコストダウンのためか、抵抗についても値をなるだけ共通化していて興味深い。プルアップ抵抗についても、USB-TypeCのCCに使う5.1kΩにそろえているようだ。

Pins_Arduino.hを眺める

Arduinoボード毎のペリフェラルの差異を記述するPins_Arduino.hを見ると、このボード設計の差異をどう吸収しているかが見えてくる。これはArduinoCore-renesas/variants/各ボード名/直下に置いてある。

WifiモデルとMinimaでPins_Arduino.hを見比べると、UARTの数が異なっている。

USB ポートはCDCなので、ハードウェアUARTは4ポート存在する。ただし、Minimaでは1chのみが定義され、Uno WifiではESP32との通信に2chが追加されている。

Minimaでは残り二つが使えないかというと、SPIバスのピンと被るものが1ch、ハーフピッチのSWD用ピンヘッダの片隅に1ch引き出してあった。

謎の5V分圧抵抗 二つのボードで共通して実装されている5Vを分圧する謎の入力。ADCに繋いでいる?ぽいので調べてみると怪しい定義を見つけた。

https://github.com/arduino/ArduinoCore-renesas/blob/149f78b6490ccbafeb420f68919c381a5bdb6e21/variants/MINIMA/pins_arduino.h#L134

ここを見るとAVCC_MEASURE_PINが、計算用の係数とともに定義されている。

ADC入力関係っぽいなと思ってAPI関連のanalog.cppを見に行くとデフォルトの電圧リファレンスを計算する値として使っており。分圧抵抗もDCDCの設定抵抗を流用しているので係数で補正しているのだろうか。

https://github.com/arduino/ArduinoCore-renesas/blob/149f78b6490ccbafeb420f68919c381a5bdb6e21/cores/arduino/analog.cpp#L558

ただ、代入された20という数値がADC番号だとすると、謎分圧入力はADC16につながっているので合わない。(裏でマッピングしてたりする?)

互換性と利便性の狭間

 5V対応自体は互換性のためだけど、今日日センサ系は3.3Vがデファクトになっているので、初学者はいきなり分圧回路に直面する。 
 それも必要な過程かもしれない。UARTの入出力における視座の獲得と共に…。

 UNO Wifi R4はLEDのドットマトリクスに目が行きがちだけど、よく見るとSparkfunのQuiic互換コネクタが生えている。Classicファミリユーザーの大半はプロトタイピングでの接続先はジャンパ線とブレッドボードだとおもうし、シールド基板で拡張するという概念に囚われずにいろいろなセンサをつないで遊ぶのであれば正しい。
 

 3.3V駆動は可能か

 電圧範囲的には3.3Vでも問題なく動作するはず。
そう思ってUSBを接続せず、電源装置で3.3Vを給電してみると、ギリギリ動いているが電流値が増えて挙動が安定していない。BOR設定などが働いているのだろうか。

 回路的に電源部の電圧を弄ろうとしたら、USB5VをDCDCの入力側にダイオードORで繋ぎ、データシートを見ながら、電圧設定の抵抗値を変更すれば実現できる。 若干改造が必要なのと、USBの挙動に関して5V入力の整理と、電圧範囲をソフトウェア的にどう扱っているのか調べる必要がある。

 5Vのままであれば、既存のモーター系シールドなどが使えそうなので、CANバスを有効化してみようと思う。

2023/04/22

Saleae Logic pro8

(1年前に書いていて投稿を忘れていたので放流)

 ゼロ年代後半 個人的にオシロも持っておらず、プロトコルアナライザもデバッガの概念もなかったころ、デバッグ中の基板にはAMモードにした広帯域受信機(DJ-X11)を近づけて動作検証していた。
  一昔前の5V動作の16bitマイコンはクロックの放射ノイズも大きく(周波数拡散クロックなんて無かった)、ループ処理の過程でピーとかザーとか激しく主張していた。UARTもRS232レベルシフタを通していたので、文字送信があるたびに  チ、チ、チ、 とリズムを奏でていた。書き込まれたプログラムが止まってしまうとそうした喧噪も止まり、ユニバーサル基板の切れ端とUEW線とリード抵抗の足の切れ端だらけの机はホワイトノイズに包まれた。
 機器間通信が増え、処理性能とソフトウェア規模が肥大化し、無料版の純正ツールやフレームワークに落とし穴があることが前提な昨今、ハードウェアの挙動をリアルタイムで把握することは問題の早期解決に役立つ。

 4年前に https://www.saleae.com/ja/ のロジックアナライザ を導入して使っているが、早くから導入していればと思ったデバイスの一つ。現在はソフトウェアがLogic 2.xになり大幅に更新されている。昨今の半導体不足の流れで一度仕様変更があり、いつの間にか市販価格が倍近いお値段になっている…。

収録動作

 理論上USB3.0帯域をフルで使う信号キャプチャ機器なので、レコード長はPCのメモリ容量に依存する。なのでRAM容量が許すかぎり設定したサンプルレートで連続したキャプチャを続けることができる。 ロジックの場合変化が無い区間はデータは増加しない。

負荷テストということでわざとアナログ多チャンネルの高速キャプチャを行ってみると、数秒でGB単位の信号がRAMに保存される。
 

 開発PCのメインメモリを64GBにしたので、限界まで収録できるか実験してみたが、クラッシュせずちゃんと記録できた。
 サンプルレートの最高値はUSB3.0の帯域を上限に、同時に取得するch数で割ることになる
 パラレルバスや多数の信号を同時にデバッグするなら、値段を気にせずLogic Pro16を買っておくのが良さそう。
 
とはいえ、シリアルバスのモニターであれば、プロトコルトリガーをかけることができる。観測対象が明確なら膨大なメモリは必須ではなく、一般的なロジアナと似たような使い方になる。
 本家でも解説されているけど、例えばUARTの出力は全部ログに残るので、デバッグモニター用のUARTラインを繋いでおけば特定メッセージの検索などができて便利。モニターchとして徒にUSBSerialを多数繋げる必要はない。

Raspberry Pi picoをMicroPythonで動かし、プロトコルトリガーをかけながらI2Cデバイスのレジスタ設定を試してるの図

最初からプロトコル対応数も豊富で、最近のバージョンは拡張機能としてデコーダーを書くことができ、様々なプロトコルや計測法を選べる。

 時折USB絡みで動作停止することがある。動作の安定性はUSB3.0の帯域に依存するため、ハブ構成、他のポートでの抜き差しや、合計のケーブル長などには注意が必要。USB3.0接続で安定しない環境では、あえてmicroB端子のケーブルでつなぎ、USB2.0接続で動かすということができる。 

アナログ観測

 Proモデルは最大50Mspsでアナログ電圧測定(-10~10Vまで)が可能になっている。
 ロジックを観測している端子で同時にアナログ電圧も取り込むことができる。デジタルバスで時たま通信不良が…といったシナリオや、そもそもロジック電圧として見えるかといったところを検証可能。
短期間の事象であれば、最高分解能で数分取り込み続け、あとから眺めるみたいな時系列の検証に便利だ。ただアナログchではトリガーができないので、あくまで収録後の解析手段となる。50Mspsだと1chで100MB/1秒のレートでRAMを消費する。
オシロ並みのサンプルレートを持ったデータロガーみたいな存在として使うことになる。とはいえ50Mspsなのでオシロの完全な代替とはならない。

  逆にものすごく低レートにすることで長時間ロギングが可能。Ver1のソフトウェアでは10bpsが選べた。V2も2.3.7から50bpsの低速サンプリングが可能になった。数十mVステップで数秒~数時間単位の電圧変化を見るだけなら、本格的な長時間向けデータロガーが無くても代用できそう。 非安定な電圧で動作する回路の挙動確認に便利かもしれない。

  波形の操作も軽快で、数十GB単位の膨大なキャプチャデータであっても、スムーズにズームとスクロール、タグ付けを行えるようになっている。 時系列で稀に起こるランダム事象の発見では強力なツールだ。Saleaeで流してグリッジの存在を探索し、特定してデジタルオシロを引っ張りだすのが効率的かもしれない。

RFパワーメータの出力を観測してみる

 AD8318は1~8000MHzの範囲のRFパワーをダイレクトに検出できる対数アンプで、RSSI計測や方向性結合器を介した送信機の出力計測などに使われる。
RF系の仕事も増えてきたので、出力確認のための簡易パワーメーターを作ろうと考えた。
マイコンなどで換算する例が多いけど、電圧値を取得して換算すれば出力値を得ることができる。


定期的な送信電波のVOUTモニタ例(横は分単位)

 電源を供給して、信号源の代わりに直接アンテナを繋いでオシロで観測していたとき、スマートフォンの電波などを拾って反応していることに気づいた。

わざと入力にダミーロードを付けて、近傍電波しか拾えないようにした。卓上のiPhone以外の信号は捉えにくくなったはずなので、その電波発信をモニターしてみる。
 

細かいピークは定期的にあるが、たまに高出力のピークが出ているのがわかる。

強いピークだけを拡大した所

 応答時間が10nSということで、パルス状の携帯電波等も細かくとらえることができる。適切なフィルタ回路とLNAを通せば、CWレーダーも作れそう。
(結局 、8GHzまで測れるRFパワープローブを買ってしまったので試みだけで終わった)