2020年6月6日土曜日

STM32duinoでCAN-BUSを使ってみた。

BluePillにはCAN(Control Area Network)が内蔵されていて、ESP32みたいにCANトランシーバを取り付けるだけでCAN-BUSが使えるっぽい。ArduinoだとMCP2515とSPI通信してCANバスに対応させるような環境が多いけど、CAN機能が内蔵されていると小型化できて良さそう。ただしライブラリとか情報が少ない…
このマイコンボードのCAN機能はArdupilotとかでUAVCANでは使われてたりしてたようなんだけど、手軽に使えるようなライブラリがなかなかな見つからなかったんだけど、STM32Duinoでも使いやすそうなライブラリが出ていたので使ってみた。

今回試してみたのはeXoCANっているライブラリ。いまのところSTM32duinoの中ではSTM32F103に対応しているライブラリっぽい。

BluepillのCANポートはCAN1のみの対応で、デフォルトでPA11(CAN RX)とPA12(CAN TX)、remapでPB8(CAN RX)とPB9(CAN TX)になっている。ここにCANトランシーバを接続してCAN BUS対応にできる。今回は3.3V対応のCANトランシーバIC、SN65HVD232Dを使用してみた。
bluepill canbus
デフォルトのPA11とPA12だとUSBとおなじピンになってるのでremapのPB8とPB9を使用することに。なのでcan.beginのBusTypeはPORTB_8_9_XCVRを選択。といってもSTM32F103はSTM32F072みたいにUSBとCANは同時に使えないのでUSB CDCが使えない。(CANを有効にするとUSBに繋いでも不明なデバイスになってしまう)
なのでSTM32DuinoではUSBサポートは無効にして、書き込みのときは手動でブートローダーモードに入れないといけないのが少し面倒。(Boot1ジャンパを1に変更してUSB指し直して書き込み中に0に戻したりしてる)
STM32CubeProgrammerをインストールしてればBoot0で純正Serialブートローダ使ってもいいんだけどね…

CANトランシーバとはPB8(CAN RX)をR(RX)に、PB9(CAN TX)をD(TX)に接続した。
スケッチの方はbpCanBlinkInterrupt.inoを使用して、"PORTA_11_12_WIRE_PULLUP"のところを、"PORTB_8_9_XCVR"に変更しただけ。

とりあえず通信できているかどうかはラズパイに接続して確認してみた。
5000msごとにデータが送られてきてるのを確認できた。なぜかbpCanBlink.inoをおなじ変更で書き込んでもデータが送られてこない…
でもまぁとりあえず受信データ割り込みのほうが便利そうな気がするのでこのまま使ってみることに。

ちなみにBluepill用のSLCANファームウェアを使うとBluepillをPCやラズパイでCANアダプタとして使うこともできるらしい。ただし、STM32F103はCANとUSBの同時使用ができないためUSB→シリアル変換アダプタが必要だけど。(SLCANはシリアルポートとCANの変換)

一応USBのブートローダでも書き込みできるんだけど、CANを有効にした瞬間にUSBデバイスとして認識できなくなってしまうので、STM32F103に元々入っているシリアルブートローダを使ったほうが便利かも。これだとシリアルコンソールもそのまま使えるし、リセット後にシリアルコンソールを開き直さなくて良いのでデバッグもしやすい。

今のところはArduinoで扱えるマイコンではCANが内蔵されているのはSTM32duinoとESP32ぐらいなのかな。MCP2515は情報も豊富で超便利だけどやっぱりコスト的にはCANトランシーバは結構安く売っているので内蔵されてる方が有利そう。

0 件のコメント:

コメントを投稿