簡単な装置で試してみたいことがある。 ロータリーエンコーダで数値を設定しUSB(HID)経由で読み出せるぐらいの装置。 マイコンは手持ちの BluePillを使おうと思ったが、 上手く行って製造となっても STM32F103なんて手に入る気がしない。 いやAliExpressで買えるのだが1個1000円も払いたくない。 Raspberry Pi Picoなら 半導体不足と無縁そうなので この機会に手を出してみることにした。
Raspberry Pi Picoに手を出す電子工作
開発環境
開発完了を調べると 公式のSDKは cmakeとか使うらしい。 使い慣れた vscode + platformio で開発したいので 調べると platformioも対応している。 すんなり導入できて、LチカプログラムをBuildし、 uploadはエラーになったが BOOTSELモードでUSBメモリと認識されたPicoに ファイルをコピーしてプログラムを書込み、動作させることができた。
PicoのRUN端子(ピン30)にGNDに接続されたSWをつけるとリセットできるので、 BOOTSELモード遷移時にUSBを抜き差しする必要がなくて便利である。
プログラムのデバッグにはシリアルポートへの出力が欲しい。 picoのArduinoのSerialはUSBのシリアルポートなので プログラム書込む毎に消失して面倒。 GP0をTX, GP1をRXとするシリアルポートがSerial1に定義されている。 それ以外のピンのシリアルポートを使用したい場合は以下のようにすれば良い。
UART my_serial(8, 9); // TX: GP8, RX:GP9
シリアルポートに使用可能なピンは(GP0,1),(GP4,5),(GP8,9),(GP12,13)の4組。
今後
platformioでuploadに失敗する原因はよくわからないが、 いずれuploadできるようにしたい。 jlinkにも対応しているそうなので AliExpressに安いコンパチ品を注文した。 Raspberry Pi Pico自身を使って 別のPicoに書き込む方法もあるらしい。 こちらも、そのうち試してみたい。
Platformioのpicoのライブラリを見ると USB keyboardやmouseがあるので 何かサポートされているようだ。 USB(HID)が簡単に実装できることを祈る。 descriptorが面倒なのよね。
PicoのCPU(RP2040)は2コアだが platformioでは1コアで動かしている気がする。 性能は求めていないので1コアの方が面倒が無くて良い。 排他制御が割込み禁止だけで済む。 2コアだと mutexとか semaphore 必要?