« Spartan-7ボードを設計しています2 | トップページ | SDSoCで作ったニューラルネットワークの回路がZynqberryで動いた! »

2018.08.25

ZynqberryにRasPiカメラをつなでJupyterで表示

世の中にはたくさんの種類のZYNQボードがあります。

どんなZYNQボードでも、Jupyterや機械学習やSDSoCは動きます。

私は言いたい。

「PYNQにできることは他のZYNQボードにだってできる。」

PYNQ一辺倒の世の中に一石を投じ、脱PYNQ化を進めるため、ZynqberryにRaspberryカメラを接続し、画像をJupyter上で表示させてみることにしました。

Zynqberry(ジンクベリー)というのは、ドイツTrenzElectronic社が開発したZYNQボードで、その名のとおりRaspberry Pi形状のZYNQボードです。

Te072603m_0

ZynqberryはRaspiカメラ(V1.3)とHDMI出力をつなげることができます。

Zbcam

まず、公式サイト 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 にあります。

Rpicam

中を見てみると、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すごい!)

使用したカメラは、秋月で購入しました。

Akizuki_cam

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

fbgrabで画像を取得する時間は10秒くらいかかりました。結構遅いので、その間に手ブレすると歪んでしまいます。

Test

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上で、カメラ画像を表示することができました。

Zb_jupyter_camera

|

« Spartan-7ボードを設計しています2 | トップページ | SDSoCで作ったニューラルネットワークの回路がZynqberryで動いた! »

コメント

コメントを書く



(ウェブ上には掲載しません)




« Spartan-7ボードを設計しています2 | トップページ | SDSoCで作ったニューラルネットワークの回路がZynqberryで動いた! »