
ここで使用されるカメラ(HM01B0)は解像度がさして高くありません。
もう少し鮮明な画像が欲しい場合は以下を参照ください。
Pi Pico でエッジAI を試してみる(2-2)人物検出(Person Detection)by B0067
マイコンで機械学習モデルを使ってみます。TinyML というやつです。
まずは、Raspberry Pi Pico というマイコン上でカメラを使ってみます。
マイコンで物体検出(Detection)などをしようとすればカメラは必要です。
Switchscienceではセットで販売してます。
が、Pico W を使いたい場合はバラで集めます。
全体の取り合わせはこんな感じ。
カメラはArducam HM01B0 QVGA Camera Module
スペック:解像度320 x 320ピクセル(QVGAウインドウ対応、モノクロ、最大QVGA @ 60 fps)
開発環境は
の2パターンでやってみます。
Arduino IDE
●開発環境はArduino IDE
●母艦はラズパイ3Model B
OSイメージは、表示に使うProcessing の相性も含めて32-bitのDesktopがいいかもしれません。
●これらを使ってカメラ用のファームウェアを作ってインストール
●その後カメラ画像はシリアル経由でProcessingを通じて表示
という段取りになります。
ラズパイ3 Model B にArduino IDE をインストール(1/5)
1 2 3 |
sudo apt-get update sudo apt-get install arduino -y |
メニュに2か所現れています。
Raspberry Pi Pico にカメラを接続(2/5)
今回使うカメラ:Arducam HM01B0 QVGA Camera Module for Raspberry Pi Pico
結線はこんな感じ。VCC は3.3Vでも5Vでもどっちでもいいです。
ラズパイ3にPico を接続してArduion IDE でコーディング(3/5)
カメラ用のコードをファームウェアとしてインストールするので、Pico のBOOTSELボタンを押しながらラズパイのUSBポートに接続します。
ラズパイからPico はストレージ・ドライブとして認識されています。
ls /dev/tty*
もし何も見えない場合は下記からFirmwareをダウンロードしてPicoにコピーしてみてください。認識されるはずです。
Arduino IDE 起動
ファイルー>環境設定で、追加のボードマネージャーのURLに以下を記述してOKをクリック。
https://www.arducam.com/downloads/Pico/package_pico4ML_index.json
ツールー>ボードー>ボードマネージャーからライブラリインストール
検索フィルターにpicoを入力して検索
ArducamPico4MLをインストール
ボードマネージャーからArducamPico4MLをアサイン
シリアルポート設定
ツールー>シリアルポート
/dev/ttyAMA0
カメラ用のファームウェアを作成してインストールします。
ファイルー>スケッチ例ー>Cameraー>exampleー>HM01B0_USB
書き込みボタンをクリック
コンパイル実行後、UF2ファイルがPico のフラッシュメモリーに書き込まれます。
書き込みに失敗する場合
No drive to deploy というメッセージが出て書き込みエラーになることがあります。ポートの認識が正常にできていないようです。
Pico のBOOTSELボタンを押しながらUSBケーブルを再接続します。
ポートが再認識され、この状態で書き込みができる可能性があります。
書き込まれるとUF2ファイルなので終了後Picoは再起動されます。
再起動後のシリアルポートを再確認
ls /dev/tty* を見ると新しいポート名が確認できます。控えておきます。
以上で、Arduino IDE はお役御免です。
終了します。
ラズパイ3にProcessing をインストール(4/5)
processingを使ってカメラ画像を取得表示してみます。
現バージョンは4系ですが、安定を求めてここは3系をインストールします。
1 2 3 4 5 |
cd ~/ wget https://github.com/processing/processing/releases/download/processing-0269-3.5.3/processing-3.5.3-linux-armv6hf.tgz tar xvzf processing-3.5.3-linux-armv6hf.tgz |
注:64-bitのOSではうまく動かないようです。
現バージョンを使いたい場合は以下にアクセスしてラズパイ版をダウンロード・解凍して使いましょう。
Need another version ?のRaspberry Pi をクリック
Donate の画面になりますがダウンロードは開始されています。現在お金がなければ寄付は後にします。
ちなみに、OSが32-bitか64-bitかを判別するコマンドです。32とか64が表示されます。
>getconf LONG_BIT
カメラ画像をProcessing で表示(5/5)
以下から、Processing 表示用のスクリプトを入手します。
https://github.com/ArduCAM/RPI-Pico-Cam/blob/master/rp2040_hm01b0/display/preview.pde
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
/* This sketch reads a raw Stream of RGB565 pixels from the Serial port and displays the frame on the window. Use with the Examples -> CameraCaptureRawBytes Arduino sketch. This example code is in the public domain. */ import processing.serial.*; import java.nio.ByteBuffer; import java.nio.ByteOrder; Serial myPort; // must match resolution used in the sketch final int cameraWidth = 96; final int cameraHeight = 96; final int cameraBytesPerPixel = 1; final int bytesPerFrame = cameraWidth * cameraHeight * cameraBytesPerPixel; PImage myImage; byte[] frameBuffer = new byte[bytesPerFrame]; byte[] header = new byte[3]; byte[] score = new byte[2]; void setup() { size(320, 320); // if you have only ONE serial port active //myPort = new Serial(this, Serial.list()[0], 9600); // if you have only ONE serial port active // if you know the serial port name myPort = new Serial(this, "COM11", 921600); // Windows // myPort = new Serial(this, "/dev/ttyUSB0", 921600); // Linux // myPort = new Serial(this, "/dev/cu.usbmodem14401", 9600); // Mac // wait for full frame of bytes myPort.buffer(bytesPerFrame); myImage = createImage(cameraWidth, cameraHeight, GRAY); fill(255, 0, 0); } void draw() { image(myImage, 0, 0, 320, 320); } int state = 0; int read = 0; int result = 0; int startbyte; void serialEvent(Serial myPort) { if (read == 0) { startbyte = myPort.read(); if (startbyte == 0x55) { state = 1; } if (startbyte == 0xAA && state == 1) { read = 1; } if (startbyte == 0xBB && state == 1) { result = 1; } } if (result == 1) { myPort.readBytes(score); result = 0; } if (read ==1) { // read the saw bytes in myPort.readBytes(frameBuffer); // access raw bytes via byte buffer ByteBuffer bb = ByteBuffer.wrap(frameBuffer); bb.order(ByteOrder.BIG_ENDIAN); int i = 0; while (bb.hasRemaining()) { // read 16-bit pixel short p = bb.getShort(); int p1 = (p>>8)&0xFF; int p2 = p&0xFF; // convert RGB565 to RGB 24-bit int r = p1;//((p >> 11) & 0x1f) << 3; int g = p1;//((p >> 5) & 0x3f) << 2; int b = p1;//((p >> 0) & 0x1f) << 3; // set pixel color myImage .pixels[i++] = color(r, g, b); r = p2;//((p >> 11) & 0x1f) << 3; g = p2;//((p >> 5) & 0x3f) << 2; b = p2;//((p >> 0) & 0x1f) << 3; // set pixel color myImage .pixels[i++] = color(r, g, b); } read = 0; } myImage .updatePixels(); } |
このスクリプトを1部修正します。
3/5の最後で控えておいたPicoのポート名を使います。
このスクリプトはProcessing起動後に使用します。
4/5で解凍したフォルダーに移動して、Processing を起動します。
1 2 3 |
cd processing-3.5.3/ ./processing |
注:Error: Could not create the Java Virtual Machineというようなエラーメッセージが出た場合
多分OSは64-bitだと思われます。32-bit版のOSで再実行してみましょう。
開始
上記で修正したpreview.pdeを読み込むかコピー・ペーストして実行します。
カメラからの画像が表示されます、モノクロで解像度も低いですけど……ちゃんと見えます。
C/C++
必要なツールなどを準備するために、事前にpico_sdk をインストールしておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
sudo apt update sudo apt install -y build-essential cmake gcc-arm-none-eabi git curl mkdir ~/pico cd ~/pico git clone https://github.com/raspberrypi/pico-sdk cd pico-sdk git submodule update --init echo "export PICO_SDK_PATH=$HOME/pico/pico-sdk" >> ~/.bashrc . ~/.bashrc |
元ネタはこちら
Processingとカメラ間の画像転送にUSBシリアル変換コネクタを使っています。
カメラ(HM01B0)の結線は上記と同じ。
変換コネクタの結線はこんな感じ。
コード
元ネタとはツリー構造が違っていたので、若干修正。
Clone Arducam library
1 2 |
cd ~/ git clone https://github.com/ArduCAM/RPI-Pico-Cam.git |
Compile
1 2 3 4 5 |
cd RPI-Pico-Cam/rp2040_hm01b0 mkdir build cd build cmake .. make |
buildフォルダーにarducam_firmware.uf2が生成されているのを確認。
上記と同様に
Pico のBOOTSELボタンを押しながらラズパイのUSBポートに接続します。
ラズパイからPico はストレージ・ドライブとして認識されています。
arducam_firmware.uf2をドラッグ・ドロップしてPico を再起動。
上記と同様にProcessing を起動してカメラ画像を確認しますが、preview.pdeスクリプトに記述するポート名と通信速度は以下のようになります。
1 |
myPort = new Serial(this, "/dev/ttyUSB0", 115200); |
カメラ画像が表示されます。
Leave a Reply