Raspberry Pi PicoでTensorflowプロジェクトを動かしてみる

5 min読了の目安(約5000字TECH技術記事

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を次のようにします。

/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のコードだけボーレートが間違っているので、実行前にデバイス名と共に直しておきます。

/tflmicro/person_detection_display/person_detection_display.pde
@@ -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から探して実行します。