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

ちなみにファームウェアの書き込みは書き込み機が必要だと思っていたんだけど、実はこのマイコンはUSB書き込みのBootloarderがもともと入っているっぽいのでそのままUSB接続してdfu-utilで書き込めるらしい。なのでBootモードに入れればUSB経由でファームウェア書き換え放題っぽい。
なお、純正状態だとDFUモードが封じられていて、激安ST-LINK/V2のReset対応改造済みでもConnect Under Resetで接続できなかったのでおそらくRead Out Protection Level2に設定されていてマイコンを張り替える以外の選択肢がなさそう…

PCAN-USB化ファームウェアはgithubにpcan_cantactとして公開されていたファームウェアをビルドして使用させてもらった。
16MHzの外部クロックを追加してUSB2CANをCANtact化したのはいいんだけど、LEDが繋がってるピンが違うので、TXをPB2に、RXをPB10に変更して、更にLINK LEDがPB11につながってるのでこれをLED_STATとして動くように少し修正した。(CANポートを開くと点滅する)
Windows環境でビルドするために、GNU Arm Embedded Toolchainを使用した。GnuWin32はmakeに、BusyBox for Windowsはtrに必要だった。
Armのツールチェインはインストールするだけで環境変数が登録されるけど、GunWin32とBusyBoxは自分で環境変数のPathに追加する必要がある。BusyBoxに含まれるmakeではビルドできなかったので、環境変数を登録するときはBusyBoxのほうが下になるように注意が必要。あとスペースとカッコが含まれるパスはうまく動かないらしいのでインストールパスもProgram Filesじゃないところにインストールしないといけないのは注意が必要かも。

ファームウェアの書き込みは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コマンドだけで使うことができるようになった。

5 件のコメント:

  1. 始めまして、こちらを参考にさせていただき、CANable互換のUSB CANアダプタをPCAN-USB互換のCANアダプタとして使用したいと考えております。
    具体的にはDSD TECHのSH-C30Gという商品のファームウェアをこちらで紹介されているpcan_cantactに書き換えたいと思っております。
    しかしながらSH-C30Gでは24MHzのクリスタルがあらかじめ実装されておるようで、当方16MHzに変更する技量を持ち合わせておりません。
    なんとかソフトウェアの書き換えのみでPCAN-USB化が可能な方法をご存知ありませんでしょうか?
    記事の公開より時間が経っており恐縮ですが、なにかご存知でしたらお力をお貸し頂けないかと思っております。
    よろしくお願いいたします。

    返信削除
    返信
    1. コメントありがとうございます!
      pcan_cantactは一部を変更してビルドすれば外付け24MHzに対応できそうです。
      main.cの
      #if ( HSE_VALUE == 16000000 )
      __HAL_RCC_PLL_CONFIG( RCC_PLLSOURCE_HSE, RCC_PREDIV_DIV1, RCC_PLL_MUL3 );
      というところを
      #if ( HSE_VALUE == 24000000 )
      __HAL_RCC_PLL_CONFIG( RCC_PLLSOURCE_HSE, RCC_PREDIV_DIV1, RCC_PLL_MUL2 );
      に変更し、Makefileのcantact_16のところを
      -DHSE_VALUE=16000000から-DHSE_VALUE=24000000
      に変更。
      あとはmakeして出来上がったpcan_cantact_16_hw.binをDFUで書き込んでやれば使えるかもしれないです。公開されている回路図を見た限りはLEDもcantact_16と同じピン配置のようです。
      USB2CANも昔は2800円ぐらいで購入できたのですが、いま値上がりしているようなので無改造で外付けクロックがついてるSH-C30Gはコスパ高いかもしれないですね。

      削除
    2. お世話になっております。
      早速の返信の方ありがとうございます。
      24MHz対応化のためにご提示いただいたとおりに2つのファイルを変更し、makeコマンドの実行を試みたのですが
      Interrupt/Exception caught (code=0xc0000fd, addr=0x4227d3)
      というエラーが出てしまい、build-cantact_16というフォルダが作成されるだけで止まってしまいます。
      なにかファイルの変更方法等間違っている可能性はあるでしょうか?すみませんがもし手順で間違っていそうなところがありましたらご指摘いただければ幸いです。
      以上、よろしくお願いいたします。

      削除
    3. Make for Windowsをインストールした際にProgram Filesにインストールしていないでしょうか?また、BusyBoxも同様にスペースやカッコが含まれるようなディレクトリにインストールするとうまく動かないようです。
      また、SH-C30Gですが調べてみるとGNDのパターンがCAN出力端子側とUSB側で絶縁DCコンバータの裏のところでパターンがつながってしまっているようです。
      (https://amzn.to/3C5xoSb のレビュー参照)
      絶縁タイプのCANアダプタとして使用する場合は裏面の相当箇所のパターンをカットする必要あると思うので、もし本体を入手済みのようでしたら現物確認してみると良いと思います。(基板にスリットが入っているところの先あたりです。)

      削除
    4. お世話になっております。早速のご回答ありがとうございました。
      ご指摘の通り、makeのインストールディレクトリを変更いたしましたところ無事コンパイルの方完了できました。
      SH-C30Gの方に早速DFUで書き込み、無事PCAN-Viewで動作することを確認できました。大変有難うございました。
      また、グラウンドの件ご指摘ありがとうございます。せっかくSH-C30Gを購入したのにSH-C30A相当になってしまうところでした。現物を確認したところたしかに不自然にグラウンドがつながってるパターンが有りましたのでカットいたしました。動作も問題なく、テスターで確認しても絶縁されているようです。
      いろいろとサポートいただきありがとうございました。

      削除