2020年8月2日日曜日

USB2CANをPCAN-USB化してみた

USB2CANモジュールをPCAN-USB化して、Windows上のPythonで使えるようにしてみた。
USB2CANをWindowsで使う場合はmicrobusが使えるので特に機能的には問題がなかったんだけど、Pythonでpython-canモジュールを使ってCAN-BUSを使おうとするとUSB2CANのgsusbだとうまく動かなかったので…(No backend availableとか出てfilterとかインストールしてみたけどデバイスが切断されたりして使えなかった…)

USB2CANに現在入ってるファームウェアはSWDとかで吸い出せそうになかったので、だめだったらもとに戻せるようにマイコンをSTM32F042C6Tに交換してみた。ついでに16Mhzのクリスタルと負荷コンデンサとして4.7pFも実装した。(C3、C5)あとI2C接続のEEPROMは外した。外部クロックに変更したのは今回使用させてもらったPCAN-USB化ファームウェアはCANtact用だったため、仕様をCANtactに合わせた感じ。(I2Cのプルアップ抵抗も外してよかったかも)

もともとSTM32F072が乗っていたんだけど、PCAN-USB化ファームウェアは16kbあれば行けるっぽいのでSTM32F042でも十分。もともと外部クロックついてないので内蔵クロック使うように変更してファームウェアをビルドすれば外部クロックつけなくても行けるかも。

ちなみにファームウェアの書き込みは書き込み機が必要だと思っていたんだけど、実はこのマイコンはUSB書き込みのBootloarderがもともと入っているっぽいのでそのままUSB接続してdfu-utilで書き込めるらしい。なのでBootモードに入れればUSB経由でファームウェア書き換え放題っぽい。
なお、純正状態だとDFUモードが封じられているっぽいのでDFUモードでファームを書き換えるなら今回みたいにマイコンを新品に交換しないとだめかも。マイコン交換しないならJ-linkとかST-Linkで書き換えられるのかな?(未検証)

PCAN-USB化ファームウェアはgithubにpcan_cantactとして公開されていたファームウェアをビルドして使用させてもらった。ハードウェアをCANtact仕様に改造したのでほぼそのまま使わせてもらった感じ。
Windows環境でビルドするために、MinGW、Cygwin64、GNU Arm Embedded Toolchainを使用した。MinGWはmakeに、Cygwin64はtrに必要だった。
16MHzの外部クロックを追加してUSB2CANをCANtact化したのはいいんだけど、LEDが繋がってるピンが違うので、TXをPB2に、RXをPB10に変更して、LEDが正常に動くように修正してビルドした。USB2CANはLEDが3つついているけどこのfirmwareだと2つしか使えなさそう。全部赤色だったのでTX LEDだけ青に変えておこうかな…

ファームウェアの書き込みはboot用のピンヘッダをピンセットでショートした状態でPCに接続するとDFUモードで起動する。一旦DFUモードでPCに認識されたらピンセットは外してもOK。

DFUモードでUSBに接続するとSTM32 BOOTLOADERとして認識されるけど、ドライバがないのでZadigを使用してlibusbKドライバをインストールする。

ドライバをインストールしたらdfu-utilを使用して書き込みできるようになる。
dfu-utilと先ほどビルドしたファームウェアのbinファイルを同じフォルダに入れてコマンドプロンプトでそのディレクトリまで移動したら
dfu-util -a0 -d 0x0483:0xdf11 -s 0x08000000 -D pcan_cantact_hw.bin
で書き込むことができる。

あとはBoot用のピンヘッダをショートしない状態でUSBケーブルを抜き差ししたらPCAN-USBとして認識されるのでPCAN-USBのドライバをインストールしてPCAN-Viewとかから使えるようになる。
Pythonからpython-canモジュールを使用してアクセスする場合はPCAN-BasicのDLLをpython.exeと同じディレクトリに突っ込むか、環境変数でパスを通しておく必要があるっぽい。ドライバインストーラでPCAN-Basicをインストールしてる場合はそのまま使えそう。

PCAN-USB化してWindowsで使う場合はドライバのインストールが必要になった(USB2CAN純正ファームではドライバインストール不要だった)けどPythonから使う分にはPCAN-BasicのDLL経由で扱えるようになったので結構便利になった。microbusとPCAN-Viewの機能はあまり変わらないような気がしているのでWindows上のPythonでUSB2CANを扱いたい人にはPCAN-USB化はおすすめだけど、microbusで事足りてるならわざわざ書き換える必要はないかもしれない。車載とかいじるならPCAN-OBD-2 Viewerを使えたりするのは便利かも。Windows対応のCANユーティリティーだとPCAN-USB指定だったりすることもあるし。PCAN-USB自体も中古も含めて入手性あんまり良くなさそう…

ちなみにこのファームウェアはcandleLight gsusb系の同じシリーズのマイコンが乗ってるボードなら色んなボードで使えそう。
ということはbootジャンパでDFUモードで起動してgsusbファームウェアを書き込めばもとに戻せるのかもしれない?ラズパイとかのLinux系で使う場合はSocketCANが便利。ラズパイにもともとpeak_usbが入っていたのでgsusb同様ipコマンドだけで使うことができるようになった。

0 件のコメント:

コメントを投稿