概要
ISP1807Microボードとmini USB Host Shieldを組み合わせて使えるようにした話。
追記 スイッチサイエンス社のnRF52 Arduinoボードサポートパッケージ(BSP)の0.1.9版が公開され、本文(boards.txtや#ifdefに関するくだり)を書き直しました。
- Nordic nRF52840ベースのISP1807 Microボード(スイッチサイエンス)に、mini USB Host Shield (以下、miniUHS)を接続する。
- 8MHz/3.3V版のSparkFun ProMicro(互換品)と接続したときのように、写真のような2階建て仕立てにする(1階がminiUHSで2階がISP1807 Micro)。2階部分のマイコンボードを差し替えるだけで済ませる。
- Arduinoライブラリとして提供されている USB Host Shield Library (1.6版) にパッチをあてて、ISP1807 Microから利用できるようにする。
ふつうのUSBキーボードをほぼNICOLAキーボード(親指シフトキーボード)のように使うためのhoboNicolaライブラリをISP1807に移植するにあたって、まずはUSBキーボードの入力を受け取るための USB Host機能を追加した話。
miniUHSの加工など
miniUHSの概要や加工方法については、ProMicroに接続したときとまったく同じなので、以下の投稿を参照のこと。
miniUHSについて忘れていることや、読み返してみて足りない部分もあるので、もうちょっと書き足しておく。
miniUHSの回路の概略
aliexpressやamazonで売っているminiUHS にはいくつかのバリエーションがあるが、おおむね以下のようなシンプルな外観で、USB Aのレセプタクルにキーボードやマウス、あるいはゲームパッドなどの周辺機器のケーブルを接続し、それをArduinoのようなマイコンボードで利用するために用いる。
miniUHSには、Maxim社のSPI付きUSBペリフェラル/ホストコントローラのMAX3421Eというデバイスが載っており、だいたい以下のような回路構成になっている。
この図面の配線のうち、実線はminiUHSの基板上の配線で、点線は改造したあとの配線になる。バッテンを付けてある箇所でパターンカットする。外部接続ピンの 23/GNDとか 12/D9 という表記はProMicro (今回はISP1807Micro) のピン番号(以下の回路図参照)とProMicroでのArduino風のデジタルピン名を示したもの。
以下がパッチの施工例になる。
もともとの回路のひと目でわかる問題点として、USBのVBUSがVCC(+3.3V)に接続されている。VBUS電圧はUSB2.0の規程では4.75〜5.25Vなので、3.3Vではキーボードなどの周辺機器がちゃんと機能するとは思えない(試していませんが)。
その他、Arduino ProMiniとSparkFun ProMicroのピン配置の違いがあったり、裏面のシルクにワナがあったりといろいろ問題はあるが、MAX3421Eを手軽に利用するには都合がいい基板と思う。
なお、現在MAX3421E単体は1000個買って@750円くらいのようだが、数年前にこのminiUHSを5枚ほど買ったときの値段は送料込みで@550円くらいだった。
ISP1807Microとの接続
上記のような加工を行ったminiUHSとISP1807Microの接続は以下のようになる。以前、miniUHSと組み合わせていたProMicroをソケットから抜き、代わりにISP1807Microを差しただけである。
ISP1807Microのピン名称として、D9 / P0_26 といった書き方になっているのは、D9がArduino流のデジタルピン名で、P0_26 がnRF52840のGPIOポート番号になる。GPIOポート番号とArduinoのDxxとの関係は、スイッチサイエンス社が公開しているこのボードの variant.h や回路図でわかる。
ISP1807MicroにはオンボードのLEDが1つしかないので、スケッチのテストや実験用にブレッドボードの隙間にLEDを3つ増設した。
USB Host Shield Library 2.0 の修正
miniUHSをAVRのArduinoやESP32ベースのいろいろといった、ソフトの開発にArduino IDEを使える各種マイコンボードにつないで使うときは、USB Host Shield Library 2.0 (以下、UHS Library2.0) を使うのが定番だと思う。しかしながら、このライブラリはISP1807 Microボードに対応していないので、ライブラリの一部(ほんの一部)を修正して利用できるようにした。現在のところ、Arduino IDEの ツール/ライブラリを管理 で開くライブラリマネージャ を使ってインストールできるバージョンは1.6.0なのでこれを対象とした。
USB Host Shield Library2.0 のライセンスはGPLである。したがって、今回のパッチを適用したライブラリやライブラリを利用したプログラムにも同様にGPLが適用される。追加部分については本文中に記載し、修正したライブラリ全体は当サイトからダウンロードできるようにした。
UHS Library2.0の多機種対応とISP1807Microボードへの対応
このライブラリは、いろいろなボードの外部ピン接続やマイコンごとの相違を吸収するために #ifdef xxx や #if defined(xxx) といった条件ディレクティブで切り分けられている。特に、avrpins.h と usbhost.h の2つのヘッダファイル内で、CPUコアの種類だったりSPIラインに接続されているGPIOポートの操作方法やGPIOピン番号の相違だったりを吸収し、さまざまなボードへの対応が図られている。同じようにISP1807Micro ボードへの対応を追加することにした。
avrpins.hへの追加
UHS Library2.0 のnRF52840そのものへの対応は2021年3月の1.5版で追加されていたようで、1.6版にも以下のようなブロックがある。
1 |
... #elif defined(ARDUINO_NRF52840_FEATHER) ... |
この ARDUINO_NRF52840_FEATHER というマクロは、Adafruitのnrf52のboards.txtにある、 feather52840.build.board=NRF52840_FEATHER に由来していて Adafruit社の Bluefruit Feather nRF52840 Express というボードの識別子になっている。Arduinoのboards.txtやplatform.txtとビルドツールのオプションやマクロの関係については、https://arduino.github.io/arduino-cli/latest/platform-specification/ を参照。
ISP1807 Microボードのboards.txtを見ると、
1 |
isp1807microboard.build.board=SSCI_ISP1807_MICRO_BOARD |
と書いてあるので、ビルド時にはマクロ ARDUINO_SSCI_ISP1807_MICRO_BOARD が定義済みとなる。なお、このマクロはBSP 0.1.9版から有効で、それ以前の版のBSPをつかっている場合、自分でboards.txt を編集するなりしてユニークなマクロを定義しておく必要がある。
ARDUINO_SSCI_ISP1807_MICRO_BOARD をつかってavrpins.hに以下のような断片を追加した。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#elif defined(ARDUINO_SSCI_ISP1807_MICRO_BOARD) // ISP1807 MB #define MAKE_PIN(className, pin) \ class className { \ public: \ static void Set() { \ nrf_gpio_pin_set(pin); \ } \ static void Clear() { \ nrf_gpio_pin_clear(pin); \ } \ static void SetDirRead() { \ nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL); \ } \ static void SetDirWrite() { \ nrf_gpio_cfg_output(pin); \ } \ static uint8_t IsSet() { \ return (uint8_t)nrf_gpio_pin_read(pin); \ } \ }; MAKE_PIN(P15, (6)); // SCK MAKE_PIN(P14, (8)); // MISO MAKE_PIN(P9, (26)); // INT(D9) MAKE_PIN(P10, (17)); // SS(D10) MAKE_PIN(P16, (10)); // MOSI #undef MAKE_PIN |
この断片を以下の位置に挿入した。
1 2 3 4 5 6 7 |
#elif defined(ARDUINO_NRF52840_FEATHER) ... #undef MAKE_PIN (ここに挿入) #else #error "Please define board in avrpins.h" ... |
MAKE_PIN()マクロの最初の引数 Pnn の nn はArduino流のデジタルピン番号とし、2番目の引数はnRF52840のGPIOポート番号を指定している。その他のポートはSPIには関係ないので指定していない。
usbhost.hへの追加
usbhost.hではSPI通信に用いるポートピンの定義を追加する。avrpins.hと同様に、ARDUINO_NRF52840_FEATHER のブロックの直下に以下の2行を追加。
1 2 |
#elif defined(ARDUINO_SSCI_ISP1807_MICRO_BOARD) typedef SPi< P15, P16, P14, P10 > spi; |
このテンプレートクラス SPiは、以下のように定義されている。
1 |
template< typename SPI_CLK, typename SPI_MOSI, typename SPI_MISO, typename SPI_SS > class SPi { ... |
これにしたがって、SCK、MOSI、MISO、SSの順に、avrpins.hで定義したクラス名( Pxx )を並べた。
UsbCore.hの確認
このファイルは修正は不要。avrpins.h に追加した定義により、ISP1807Microについても下に抜粋した Arduino標準と同じ SS とINT の接続でオーケーなことを確認した。
1 2 3 4 |
... #else typedef MAX3421e<P10, P9> MAX3421E; // Official Arduinos (UNO, Duemilanove, Mega, 2560, Leonardo, Due etc.), Intel Edison, Intel Galileo 2 or Teensy 2.0 and 3.x #endif |
動作確認
ビルドや動作の確認は、UHS Library2.0 に付属のHIDスケッチサンプル(examples/HID/USBHIDBootKbd) を用いて行った。ビルドしてエラーが出ないこと、シリアルモニタにキーボードで叩いた文字に相当する出力が表示されることを確認。
特に工夫もないのだが、シリアルモニタには打鍵したキーのHID Usage IDや修飾キーの名前が表示されたから、ISP1807 Microへの対応はうまくいっていると判断した。
きょうのまとめ
修正したライブラリ一式のダウンロードはこちらからお願いします。ライセンスはオリジナルを継承してGPLです。
このブログを書いてまもなく、あるいは同じタイミングでスイッチサイエンス社がnRF52 Arduinoボードサポートパッケージ (BSP) を更新してくれた。おかげで、boards.txtを書き換えてユニークなボード名にしてからライブラリを編集するなんてことをする必要がなくなり、この投稿やUHS Library2.0 の修正を行った。まだ新しいボードやライブラリなので、今後も更新があるのだろう。
UHS Library2.0 プロジェクトの開発は、https://github.com/felis/USB_Host_Shield_2.0 で現在も続いている。できればISP1807Microへの対応もライブラリに取り込んでもらいたいところなので、どなたかプルしてもらってくれませんかね。
UHS Library2.0 のISP1807 Micro対応ができたので、hoboNicolaライブラリのTinyUSBライブラリやnRF52のBLE対応を行う予定です。