Raspberry Pi PicoでTensorflowプロジェクトを動かしてみる
Raspberry Pi Picoには公式のTensorFlow Lite Microのライブラリraspberrypi/pico-tflmicroがあります。このライブラリを使ってディープラーニングモデルを動かす事ができますが、今回はこのライブラリを使っているプロジェクトArduCam/RPI-Pico-Camのperson_detectionをビルドして動かしてみます。PCはmacOSでvscodeを使いました。
僕自身も普段からハンダ付けなどする人間ではないのでピンヘッダを付けるところから話を進めます。部品についてもリンクを貼っているので、この記事が書かれて数カ月間の間であれば、購入して自分で材料を揃えることも出来ると思います。
部品一覧
部品名 | リンク |
---|---|
ピンヘッダ | ssci.to/92 |
ジャンプワイヤー | ssci.to/2295 |
ブレッドボード | ssci.to/313 |
USB-Serial変換アダプタ | ssci.to/2782 |
SPIカメラ(ArduCAM) | ssci.to/3780 |
ジャンプワイヤーはメス-メスが4本あればOKです。束で連結している方がまとまりやすので、こんなのでも良いかもしれません。僕は実際に使ったのはこっちの方です。ArduCAMにはジャンプワイヤーが付属していたのでそれを使っています。
ピンヘッダも20ピンが2本あればとりあえず大丈夫ですが、紹介しているリンクは40ピンが10本のセットで、これを半分に折って使います。ジャンプワイヤーやピンヘッダは単価も安いので、このように多少多めに買うことになると思います。
PCとPicoとの接続で2本のデータ通信の出来るUSB A-microBのケーブルが2本要りますが、Androidなどで持っている人も多いと思いますので、省略しています。
ブレッドボードはArducamに付属しているジャンプワイヤーがオス-メスになっている関係や、カメラを固定する目的で使用するので、その必要を感じなければ必要ありません。
また、ハンダゴテやハンダがなければ、購入する必要があります。ハンダゴテは電子工作用のもので、ハンダは精密プリント基板用のものを使いましたが、良いかどうか自分では分からないので、ここでは紹介しません。
Lチカしたり、vscodeを設定する
今回のプロジェクトはC/C++プロジェクトなので、ここを見てuf2ファイルを使ってLチカできるとか確認してみると良いと思います。
pdfファイルのp34からRaspberry pi4以外での開発環境の構築の仕方が載っているので、これを見てvscodeの開発環境を整えます。raspberrypi/pico-examplesをビルドして、Lチカ以外の例も試してみると良いと思います。後でUSB-シリアル変換アダプタの配線確認にhello_world
のシリアル版を利用します。
ピンヘッダをハンダ付けする
40ピンのピンヘッダを半分に手で折ります。この製品はどこからでも手で折れるので、折るポイントを間違えないように気を付けます。実際には折れやすいようにと、目印のためにハサミで印を付けてから折りました(ソフトウェアと違って、とりあえずコンパイルしてエラーして直すというのは出来ないので、多少慎重にやったほうが良いと思います。僕もたまにこういう作業をすると、電圧間違えて一瞬でセンサーを壊したりしてきています。今回はピンヘッダを10本買っているので、いずれ成功するでしょう)。
ピンヘッダが折れたら、半田付けします。写真のように、ブレッドボードにピンの長い方を挿してからPicoを上にのせると、作業がしやすいと思います。
付けたら、こんな感じです。ピンが出ている方の裏面には各ピンの名称が書かれているので、この方向で正しいと思います。
USB-シリアル変換アダプタでハローワールドしてみる
まずraspberrypi/pico-examplesのhello_worldのシリアル版hello_serial.uf2
を書き込みます。
変換アダプタ | Pico |
---|---|
GND | GND |
Tx | GP1(Rx) |
Rx | GP0(Tx) |
配線としては、上の通りにピンをジャンプワイヤーで繋ぎます(TxはRxに、RxはTxに繋ぎます)。VCC端子は使わないので関係無いと思いますが、ジャンパーピンは3.3Vに繋いでます。変換アダプタとPC、PicoとPCをそれぞれUSBケーブルで接続します。
ls -l /dev/tty*
でtty.usbserial-XXXXX
というパターンのものを探して、次のコマンドを実行します。
minicom -b 115200 -o -D /dev/tty.usbserial-XXXXX
出力は次のような感じで、一定の間隔でHello, world!
と表示されれば正しく設定出来ています。
Hello, world!
Hello, world!
Hello, world!
Hello, world!
もしminicom
がインストールされていなければbrew install minicom
でインストール出来ます。
person detectionを試す
ArduCam/RPI-Pico-Camのtfmicroをビルドして実行してみます。vscodeは/path/to/RPI-Pico-Cam/tfmicro
を開いて、.vscode/settings.json
を次のようにします。
{
"cmake.environment": {
"PICO_SDK_PATH": "/path/to/raspberrypi/pico-sdk/"
}
}
プロジェクトをcmakeプロジェクトとして構成してからコマンドパレットを開いてCMake:ビルド
を選んでビルドします。出来たperson_detection_int8.uf2
をPicoに書き込みます。
Arducam | Pico |
---|---|
CS | GP5 |
MOSI | GP3 |
MISO | GP4 |
CSK | GP2 |
GND | GND |
VCC | 3.3V |
SDA | GP8 |
SCL | GP9 |
ArducamとPicoを上の表の通りにピンをジャンプワイヤーで接続します。ジャンプワイヤーのオスメスの関係とカメラを固定したいので、下の写真のようにブレッドボードを使います。
この状態で/dev/tty.usbmodemXXXX
のデバイスを探してminicomで次のように繋ぐと、github.comに載っているようなログが表示されます。
minicom -b 115200 -o -D /dev/tty.usbmodemXXXX
ログが表示されたら、カメラの表示を得るために、processingでperson_detection_display.pde
を実行します。ただし、Macのコードだけボーレートが間違っているので、実行前にデバイス名と共に直しておきます。
@@ -35,8 +35,8 @@ void setup()
// if you know the serial port name
//myPort = new Serial(this, "COM4", 921600); // Windows
- myPort = new Serial(this, "/dev/ttyUSB0", 921600); // Linux
- // myPort = new Serial(this, "/dev/cu.usbmodem14401", 9600); // Mac
+ //myPort = new Serial(this, "/dev/ttyUSB0", 921600); // Linux
+ myPort = new Serial(this, "/dev/tty.usbserial-XXXXXX", 921600); // Mac
// wait for full frame of bytes
myPort.buffer(bytesPerFrame);
processingが入っていない場合はbrew install --cask processing
でインストール出来ます。processingはコマンドラインからではなく、Launchpadから探して実行します。
Discussion