概要
pio-usb-hoboNicolaアダプターにファームウェアを書き込むためには、ソースファイルをコンパイルしファームウェアをビルドする必要がある。
今回、Arduino関連のソフトウェアを導入していない Windows11 PCでhoboNicolaのビルドを行えるようにしたので、その手順とtips的なことをまとめた。
必要なもの
hoboNicolaのビルドとファームウェアの書き込みには以下のソフトウェアを用いる。
- hoboNicola ライブラリ
各種ハードウェアに対応したArduino用のhoboNicolaプログラムで、最新版は GitHub のリポジトリから入手できる。 - Arduino IDE 1.8.19
クラシックなArduino IDE。各種マイコンボード用のコアパッケージやArduino用ライブラリをバージョン指定してインストールするときに便利である。
Arduino IDE の主流は高速でコード補完機能などをもつ2.3版だが、 個人的にはVSCodeの補完用と考えているので 1.8版を選択した。 - Visual Studio Code (VSCode)
コーディング、ビルド、ボードへの書込み、Gitを使ったバージョン管理などに使える、さまざまな言語やターゲットに対応した開発用ソフトウェア。
Arduino IDE 1.8から ステップアップするなら、VSCodeがよい - vscode-arduino
VSCodeの拡張機能の一つで、Arduino開発機能を追加してくれる。 - arduino-cli
GUIベースだったArduinoのビルド作業をコマンドラインで行うためのツール。vscode-arduino と組み合わせて使う。Arduino IDE 1.8に比べてビルド時間が格段に短縮する (個人の感想)。
今回は、クラシックなArduino IDEでビルドができるところまで。
開発環境の用意
Arduino IDE 1.8.19
Arduino のサイトにある レガシーArduino IDE 用のリンクから取得する。Windows10/11ならば、 https://downloads.arduino.cc/arduino-1.8.19-windows.exe をダウンロードして実行する。導入時に USB Driver を入れるかどうかのオプションがあるが、チェックボックスはオフでいいだろう。
Arduino IDEは JavaのGUIアプリケーションなので、プログラムを最初に開いたとき、Javaにネットワークへのアクセスを許しますか? といった問い合わせがあるので、問題なければ許可しておく。Aboutメニューを開くと以下のように表示される。

Arduino のディレクトリ構成
Arduino IDEでの初期のディレクトリ構成は以下のようになっている。
C:\Users\<ユーザー名>\
└─ Documents\
└─ Arduino\
├─ <スケッチ名>\
│ └─ <スケッチ名>.ino
├─ libraries\
│ └─ <追加ライブラリ群>
(追加ファイル、設定ファイル関係)
C:\Users\<ユーザー名>\AppData\Local\Arduino15\
├─ preferences.txt (Arduino IDEの設定ファイル)
├─ packages\
│ └─ <各ボード用コアパッケージ>
└─ cache\
Arduinoプログラム (スケッチ) はベースディレクトリ ( C:\Users\<ユーザー名>\Documents\Arduino\ ) の中にスケッチと同じ名前のディレクトリが作られ格納される。
スケッチ用ほど頻繁に見る必要はないが、設定関係のファイルは Arduino15 ディレクトリにある。コアパッケージの中身を見るようなときは、%LOCALAPPDATA%\Arduino15 をWindows Explorer のアドレスバーに入力するとよいだろう。
ベースディレクトリは C:\Arduino に
ベースディレクトリの変更は、Arduino IDEのファイルメニュー/環境設定 を選択して開く 環境設定ダイアログで行う。

ダイアログ内の スケッチブックの保存場所 がベースディレクトリなので、これを変更すればよい。
ほぼ自分自身しか使わないPCでわざわざ深いディレクトリを使う必要もないので、ここでは、C:\Arduino を基本ディレクトリとする。まあこのあたりは個人の好みで。
なお、ビルドに用いるライブラリを格納するディレクトリ ( libraries ) の位置もベースディレクトリの変更に伴って変化する。ただし、変更の時点で libraries に入っていたファイルは移動されない。
環境設定 での追加設定
環境設定ダイアログでは、以下の項目も設定しておくのがよい。
- より詳細な情報を表示する :
コンパイル、書き込み のいずれもチェックを付けておく。
こうしておくことで、ビルドの進行状況がIDE下側の出力パネルに表示される。 - コンパイラの警告:
初期設定では、「なし」となっているので、「より多く」または「全て」にしておく。「全て」にすると、無視してもよい警告が表示されて少々うるさいかもしれない。 - 行番号を表示する :
お好みだが、コードエディタは行番号表示してほしい。 - その他
フォントの種類やサイズなどもお好みで
RP2040用コアパッケージ (arduino-pico) の導入

Arduino IDEを導入した時点で、AVR用のツールチェーンや基本的なライブラリは導入されているのだが、今回のターゲットであるRP2040については何も入っていないので、hoboNicolaで用いているコアパッケージの arduino-pico を以下の手順で導入する。
コアパッケージとは、いろいろなマイコンやボードに対応したコンパイラツールチェーン、ライブラリ、設定ファイルなどから構成されたArduino用の開発パッケージのこと。
追加のボードマネージャのURL
まず、Arduino IDEが標準ではサポートしていない RP2040やESP32といったマイコンを使ったボード用のコアパッケージを取得するためのURLを設定する。
環境設定ダイアログを開き、追加のボードマネージャのURL : の右となりにあるボタンをクリックする。

上図のように追加のURLを1行ずつ入力するためのフィールドをもつダイアログが開くので、ここに以下のURLを入力する。
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
コアパッケージの ダウンロードやPCへの配置は、ボードマネージャ に指示することで行われる。
ボードマネージャでコアパッケージをインストール
ツールメニューで ボード/ボードマネージャ を選択すると以下のようなボードマネージャダイアログ が開く。

ダイアログ上部の検索フィールドに RP2040 と入力すると、おそらく以下のように Raspberry Pi Pico/RP2040/RP2350 という目的の項目が表示される。これが arduino-pico である。

少しばかり下にスクロールすると、以下のようにバージョンを選択するためのリストが現れる。

現時点での PIO-USB-hoboNicolaが対応しているバージョン 3.9.5 を選択し、インストールをクリックする。pico-sdkやARM用gccなど、合計約690MBytesがダウンロードされる。
ダウンロードとインストールが終わると、以下のように バージョン番号 INSTALLED と表示される。

コアパッケージやライブラリのバージョンをGUIで選択して導入できるのが、Arduino IDEのメリットの一つだろう。
バージョンアップ時の注意
コアパッケージをバージョンアップしようとすると、バージョンアップの過程で実行されるコマンドが失敗することが(よく)ある。そういうときは、古いバージョンを根本から削除してやり直すのがよい。
このコアパッケージは、%LOCALAPPDATA%\Arduino15\packages\RP2040 内に格納されているので RP2040 以下を削除してから、新しいバージョンをインストールするのがよいだろう。
Pico-PIO-USBライブラリの導入
次に、pio-usb-hoboNicolaの動作に必要な Pico-PIO-USBライブラリを導入する。Arduino IDEの スケッチメニューから ライブラリをインクルード/ライブラリマネージャ を選択し ライブラリマネージャダイアログ を開く。
ダイアログ上部の検索フィールドに Pico-PIO-USB と入力すると、対象となるライブラリが一つしかないので以下のように表示される。

現在の rp_hobo_nicolaで動作確認がとれているのは 0.6.1版なので、バージョン 0.6.1 を選択してインストールをクリックする。すると以下のような問い合わせが現れる。

これは、Pico PIO USBが依存しているか関係しているライブラリである。hoboNicola では TinyUSB のみ使用し他の Adafruit ライブラリは不要なので、今回は中央にある Install Pico PIO USB only をクリックし、その他のライブラリはインストールしないようにする。
インストールが完了した時点で、基本ディレクトリの C:\Arduino\libraries 内に Pico_PIO_USB というディレクトリが作成されファイルが格納されたことを確認できる。
Adafruit_TinyUSBライブラリの導入
次に同様の手順で Adafruit_TinyUSB for Arduino ライブラリを導入する。
ライブラリマネージャダイアログ上部の検索フィールドにAdafruit_TinyUSB と入力すると、対象となるライブラリが検索され以下のように表示される。

バージョン 3.2.0 を選択しインストールする。やはり、Adafruit関係のほかのライブラリもインストールするかどうかを問われるが、TinyUSBライブラリのみをインストールする。
完了すると、以下のように表示される。

ここまでで、ビルドの準備がひとまずは整ったので、hoboNicolaライブラリをダウンロードしてディレクトリに展開する。
この時点で、Arduino IDEを一度終わらせてから、開き直す。
hoboNicolaの入手とビルド
GitHubからリリース版をダウンロード
ブラウザで https://github.com/okiraku-camera/hoboNicolaLibrary/releases を開くと、今までリリースされたhoboNicolaライブラリを閲覧できる。現時点での最新の 1.7.9 版を取得する。
Assets の下に、ソースコードをまとめた2つのアーカイブファイルが見えるはずなので、Source code (.zip) を選択してダウンロードする。ダウンロードにより、hoboNicolaLibrary-179.zip が得られる。
アーカイブの展開とコピー
hoboNicolaLibrary-179.zip 内には hoboNicolaライブラリのすべてのソースコードをもつ hoboNicolaLibrary-179 というディレクトリが含まれているので、このディレクトリごとArduinoのライブラリ用ディレクトリ ( C:\Arduino\libraries ) の中にコピー(展開)する。
この hoboNicolaLibrary-179 内には、ライブラリファイルとしてpio-usb-hoboNicolaで使うスケッチの原型がスケッチ例として含まれている。
スケッチ例を開く
Arduino IDEの ファイルメニュー/スケッチ例 を選択すると、導入済のコアパッケージやライブラリがもつ数多くのスケッチ例 (examples) がカスケードメニューとしてずらずら表示される。カスケードメニューの一番下のあたりに hoboNicola Library という項目があるはず。これを選択すると以下のように hoboNicolaライブラリがもつスケッチ例のリストが見える。

rp_hobo_nicola を選択すると以下のようにメインスケッチ ( rp_hobo_nicola.ino ) が編集領域に表示される。

スケッチの保存
スケッチ例はライブラリの一部なので、そのまま上書き保存することはできない。たとえばスケッチに書かれているキー定義の変更などをしたい場合は、いったん別の場所に保存してから行う必要がある。
Arduino では、安全のためにスケッチ例として開いたファイルを上書き保存しようとすると以下のようなメッセージが表示される。

ここで OK をクリックすれば、スケッチ用のベースディレクトリの下に保存をうながすファイルダイアログが表示される。そのままの名前で保存したり、別名で保存しておく。
ここでは、ベースディレクトリ下に、rp_hobo_nicola という名前で保存しておく。
ビルドの準備と実行
pio-usb-hoboNicola のための ビルドパラメータの設定、ビルド、そしてファームウェアの書込みを行う。
ボードのビルドパラメータの設定
ツールメニューで ボード を選択するとインストール済のコアパッケージの一覧がカスケード表示される。さらに、対象のパッケージ (Raspberry Pi RP2040 Boards …) を選択すると、そのパッケージが含んでいるボードの一覧がずらっと表示される。この中から、pio-usb-hoboNicola が使う Seeed Studio XIAO RP2040 を選択する。

arduino-pico は対応しているボード数が多く、おおむねアルファベット順に並んでいるが探すのが面倒である。

ボード一覧の下のほうにある Seeed XIAO RP2040 を選択する。
ビルドのためのパラメータの設定
対象ボードを選択すると、ツールメニュー にはそのボードのためのビルド用パラメータが表示される。

以下のように設定する。初期値から変更する必要があるのは、背景色を変更した2項目のみである。
- Flash Size:
2MB (no FS) - CPU Speed:
120MHz - Optimize:
Small (-Os) (standard) - RTTI:
Disabled - Stack Protection:
Disabled - C++ Exceptions:
Disabled - Debug Port:
Disabled - Debug Level:
なし - USB Stack:
Adafruit TinyUSB - IP/Bluetooth Stack:
IPv4 Only - Upload Method:
Default (UF2)
ビルドの実行
ビルド(コンパイルとリンク)は、スケッチメニューの 検証・コンパイル を選択することで実行する。

ビルドを開始すると、環境設定での情報表示オプションに応じて、出力パネル にビルド経過が表示される。情報量を多くしている場合、ビルドが完了した時点で以下のように表示されるだろう。
... C:\Users\arduino\AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\3.9.5\libraries\SPI 次のフォルダのライブラリhoboNicolaLibrary-179バージョン1.7.9を使用中:C:\Arduino\libraries\hoboNicolaLibrary-179 次のフォルダのライブラリPico_PIO_USBバージョン0.6.1を使用中:C:\Arduino\libraries\Pico_PIO_USB 次のフォルダのライブラリAdafruit_TinyUSB_Libraryバージョン3.2.0を使用中:C:\Arduino\libraries\Adafruit_TinyUSB_Library 次のフォルダのライブラリEEPROMバージョン1.0を使用中:C:\Users\arduino\AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\3.9.5\libraries\EEPROM "C:\\Users\\arduino\\AppData\\Local\\Arduino15\\packages\\rp2040\\tools\\pqt-gcc\\2.2.0-d04e724/bin/arm-none-eabi-size" -A "C:\\Users\\arduino\\AppData\\Local\\Temp\\arduino_build_568306/rp_hobo_nicola.ino.elf" 最大2093056バイトのフラッシュメモリのうち、スケッチが92148バイト(4%)を使っています。 最大262144バイトのRAMのうち、グローバル変数が35892バイト(13%)を使っていて、ローカル変数で226252バイト使うことができます。
ビルド時に生成される中間ファイルや最終的な UF2ファイルは、%Temp%\arduino_build_xxxxxx というディレクトリ ( ビルドディレクトリ ) に格納されている。Arduino IDE 1.8 の場合、 スケッチごとにビルドディレクトリを指定できないので、もしもこの中のファイルを残しておく必要があるならば、ビルド直後にコピーしておくのがよい。
ファームウェアの書込み
ターゲット (XIAO) のシリアルポートの選択
まずは、ビルドに使っているPCと、pio-usb-hoboNicola (または、ファームウェアを書き込む対象の Seeed XIAO RP2040 ) をUSBケーブルで接続する。これにより、PCに仮想シリアルポートが追加される。
ツールメニュー/シリアルポート を選択する。

このPCの場合、もともとシリアルポートが存在しないので、ここに表示されている COM5 がXIAOとの接続で現れた仮想シリアルポートということになる。このシリアルポートを選択する。
シリアルポートが複数あって見分けが付かないようなときは、XIAOとのケーブルを抜き差しすることで特定する。

ターゲットのシリアルポートが選択されていると、メニュー内の シリアルポート: の隣にCOMポートが表示される。
ファームウェアの書込み
スケッチメニュー/マイコンボードに書き込む を選択する。

すると、さきほどの 検証・コンパイル のときと同様にスケッチのコンパイルやリンクが開始し、すべて成功すると最後にターゲットへの書込みが行われる。
出力パネルの最後のあたりは以下のようになる。
...
最大2093056バイトのフラッシュメモリのうち、スケッチが92148バイト(4%)を使っています。
最大262144バイトのRAMのうち、グローバル変数が35892バイト(13%)を使っていて、ローカル変数で226252バイト使うことができます。
C:\Users\arduino\AppData\Local\Arduino15\packages\rp2040\tools\pqt-python3\1.0.1-base-3a57aed/python3 -I C:\Users\arduino\AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\3.9.5/tools/uf2conv.py --serial COM5 --family RP2040 --deploy C:\Users\arduino\AppData\Local\Temp\arduino_build_280579/rp_hobo_nicola.ino.uf2
Resetting COM5
Converting to uf2, output size: 245248, start address: 0x2000
Scanning for RP2040 devices
Flashing D: (RPI-RP2)
Wrote 245248 bytes to D:/NEW.UF2
RP2040というマイコンは、ブートローダーモードとすることでファームウェア (.uf2ファイル) 書き込み専用のUSBドライブとしてふるまう。Arduino IDEに組み込まれたコアパッケージ内のツールによって書込み先の ドライブ D: が作成され、そこに NEW.UF2 というファイル ( rp_hobo_nicola.ino.uf2と同じもの ) を転送し、書込みを完了している。
まとめ
Arduino IDE 1.8.x は、もはやレガシーとして維持されているが、今回のようなコアパッケージやライブラリの導入を伴うビルド作業は問題なく行える。ただ、コーディングに使う気にはならないので、今回の話の続きとして VSCodeとarduino-cliを使った開発環境の話も投稿する予定。
pio-usb-hoboNicola アダプターに書き込んだファームウェアの動作検証を行う際には、まずUSBキーボードをアダプターに接続し、その後アダプターと PC をUSBケーブルで接続するようにする。その時点でふつうのキーボードとして使えれば、ハードウェアやファームウェアは問題ないはず。hoboNicolaとしての動作については、こちらのページなどを参照のこと。