少し前から取り組んでいたUIAPduinoのUSB機能をrv003usbを通してArduinoから使うという試みが,ようやく一部は動くようになったので,それについて説明したい. 今回,これまでに構築してきたUIAPduino用のArduino環境に対して,rv003usbを組み込むことによって, USBの機能として最も有用であろうUSB serialを,Arduinoから動かすことに成功した. 動きそうなコードを書くのは,それほど苦労はしないのだが,それがArduino上で動くようにするまでには,いくつものバグを取り除く必要があり,かなり時間がかかってしまった.
まず行ったのが,USBを使うオプションを追加するために,boards.txtにメニューを加えることである. Suzuduinoなどのコードを参考にして,usb_flagsのパラメータを変更できるようにした. rv003usbのファイルは,cores/arduino/rv003usbに配置し,usb_config.hもここに入れた. rv003usbが参照している USBのライブラリは, cores/arduino/libに置いた. この段階で,rv003usb.Sをコンパイルする時にエラーが出たが,platform.txtでSファイルに対するオプションをうまく設定したら,このエラーは解決したが,次のエラーが出た. rb003usbのファイルは変更したくなかったが, rv003usb.hについては, _Static_assertがうまく動かなかったので,それを含む二行をコメントアウトして, 外部のコードから呼び出す三つの関数 usb_handle_user_in_requestとusb_handle_other_control_messageとusb_handle_user_dataの宣言の前にexternを加える という二つの変更が必要だった.
ch32funやrv003usbは主にC言語で書かれている. そのため,C++のArduinoにそれらの定義をincludeするときには,extern “C”{ }で囲んでおく必要がある. その辺りを誤魔化しながらクリアしていたのだが,改めてC言語のソースとC++のソースを意識して,必要な部分に宣言を加えたら,なんとかコンパイルが通るようになった.
megaavrなどを参考にして,CDC.hとCDC.cppを定義して,上で触れたrv003usbの三つの関数を呼び出すことにより,ようやくUSBでのserialを実現することができた. 通常のserialとUSB serialはArduino.hで判断して切り替えている. Serial1で通常のserialも使えるようにしたので,同時にも使えるはずである.
通常のserialとADCを使ったプログラムのbinファイルが4.4kバイトなのに対して, USB serialとADCを使ったプログラムのbinファイルは4.9kバイトと, それほど変らないので,十分実用に耐えるだろう. ただ,残念なのがWindowsからはrv003usbのCDCが使えないことである.
ArduinoからUSBが使えるようになったことで,私の目指していたUIAPduinoの環境は,完成にかなり近付いたと言えるだろう. 今後に改良したい点としては, 公式ページを参考にして,リセットで書き込みモードになるようにすることと, HIDでのデバッグを可能にすることかな. SPIもまだバグが残っているし.
[2025/3/26追記] ソースコードもいろいろと手を加えたので,チェックしてみたら,rv003usb.hの内容を変更しないでもUSBが使えるようになっていた. ArduinoとC言語とC++の関係は,難しい.