ZynqberryにRasPiカメラをつなでJupyterで表示
世の中にはたくさんの種類のZYNQボードがあります。
どんなZYNQボードでも、Jupyterや機械学習やSDSoCは動きます。
私は言いたい。
「PYNQにできることは他のZYNQボードにだってできる。」
PYNQ一辺倒の世の中に一石を投じ、脱PYNQ化を進めるため、ZynqberryにRaspberryカメラを接続し、画像をJupyter上で表示させてみることにしました。
Zynqberry(ジンクベリー)というのは、ドイツTrenzElectronic社が開発したZYNQボードで、その名のとおりRaspberry Pi形状のZYNQボードです。
ZynqberryはRaspiカメラ(V1.3)とHDMI出力をつなげることができます。
まず、公式サイト https://shop.trenz-electronic.de/en/TE0726-03M-ZynqBerry-Zynq-7010-in-Raspberry-Pi-form-factor のページにあるDownloadタブからReference Design→2017.1→zynqberrydemo1をダウンロードし、書き込んで動かします。
zynqberrydemo1のサンプルプログラムを動かすと、SDカード上にあるinit.shが起動され、その中で
rpicam /dev/i2c-5 devmem 0x43c10040 32 $rc
という2つのプログラムが動作します。
rpicamはTrenz社が作成したプログラムで、ソースはzynqberrydemo1\os\petalinux\project-spec\meta-user\recipes-apps\rpicam\files にあります。
中を見てみると、V1.3用のコードとV2.1用のコードがあり、解像度もいくつか用意されているようです。基本的にはI2Cのレジスタを操作してカメラの設定を行っています。
devmemは単体のプログラムではなく、busyboxの中の機能です。このコマンドは0x431c0040番地に1または3を書き込んで、VDMAの転送を開始します。
フレームバッファとビデオタイミングコントローラはFSBLで初期化され、RasPiカメラから取り込んだ画像が0x1FC00000に格納されます。
サンプルのzynqberrydemo1では0x1FC00000は画面に出力するバッファにもなっているので、カメラで撮った画像がそのままHDMIから出力されます。
zynqberrydemo1と3はRAMDISKで動くシンプルなLinuxなので、GUIのデスクトップは動きません。zynqberrydemo3は、カメラバッファと表示バッファが別々のアドレスなので、そのまま出力はされませんが、
dd if=/dev/fb1 of=/dev/fb0 bs=5120 count=720
で表示することができます。(ddすごい!)
使用したカメラは、秋月で購入しました。
Zynqberryにはスタータキットというのがあり、Ubuntu Linux 14.04とJupyterが動くように作りこまれています。Trenz社のサンプルとはLinuxのディストリビューションが全く異なるのですが、zynqberrydemo1で使用されていたrpicamはUbuntu 14.04に持っていっても動きました。
devmemはbusyboxのコマンドなので、同等のものを/dev/memを叩いて動かすようにします。こうすることで、リッチなUbuntu LinuxでもRasPiカメラを動かすことができます。
int fd = open("/dev/mem", O_RDWR | O_SYNC); uint32_t *vaddr = (uint32_t *)mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x43c10000); *(vaddr + 0x10) = 0x1; // 0x43c10040 munmap((void*)vaddr, 4096); close(fd);
Linuxが起動したら、ddを使って/dev/fb1から生画像を得ることができます。
また、fbgrabというツールを使うことで、フレームバッファの中身をPNG画像として保存することもできます。
fbgrabで画像を取得する時間は10秒くらいかかりました。結構遅いので、その間に手ブレすると歪んでしまいます。
ddまたはfbgrabで画像が読み出せることがわかったので、Jupyter上で画像を表示させてみることにします。
ZynqberryでJupyterを動かす方法は「ZynqberryでJupyter notebookを動かそう!」 にあります。
書いたPythonのコードは
#for Zynqberry Stater kit (https://www.trenz.jp/product/TE0726-STARTER-KIT)
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import subprocess
subprocess.call(["/usr/bin/fbgrab","-d","/dev/fb1","/tmp/grab.png"])
im = np.array(Image.open("/tmp/grab.png"))
plt.figure(dpi=100)
plt.imshow(im)
です。
このとおり、Jupyter上で、カメラ画像を表示することができました。
| 固定リンク
コメント