Raspberry Pi にカメラを接続して画像を NAS に転送

画像認識のための Raspberry Pi セットアップもいよいよカメラ設置段階まで進みました。今回の目標は Raspi でデジタルカメラを動作させて、得られた画像データをネットワークHDD (NAS) に転送することです。

ストレージも USB ポート数も何もかもが不足している Raspi の弱点はネットワーク接続機器を使って補います。

カメラモジュール
一般的に Raspi でカメラと言えば、カメラモジュールを用います。私も「ちょっと珍しいから」という理由で赤外線カメラモジュールを購入しました。


Raspberry Pi Camera Module V2 カメラモジュール

後述する理由から一般的なカメラモジュールは購入を見送りましたが、赤外線カメラでも接続方法は変わるところはありません。

モジュールに繋がっているフレキシブルケーブル (FFC)を Raspi 回路基板のクリップに差し込めば接続完了です。

Raspberry Pi Zero W の場合にはモジュール付属ケーブルの形状が合いませんので、モジュールからフレキケーブルを引き抜いて、対応するケーブルに差し替える必要があります。

このケーブルは専用ケースの付属品になっていますので、ケースを購入すると一緒に入手できます。


Raspberry Pi Zero W公式シェル新品

このモジュールを接続した状態で、ターミナルから以下のコマンドを打ち込むと動作確認ができます。

$ raspistill -o ~/Desktop/cam.jpg

さらに画像の上下を反転させたり、ビデオやタイムラプスを撮影することも可能です。詳しくは公式のドキュメントに詳細が書いてあります。




WEBカメラ
カメラモジュールは簡単に使えて便利なのですが、私のそもそもの目的はコンベアベルトを作成することです。

この目的であれば、電子部品としては高額であまり入手性もよくない公式モジュールを使用しなくても十分な可能性があります。

また、モジュールに付属するフレキケーブル (FFC) やフレキ基盤 (FPC) も本音を言えば、あまり積極的に使いたい部品ではありません。繊細で壊れやすいためです。

市販品のデジタルカメラにも使用されている部品ですが、故障品を修理に出したときに補修部品としてよく見かける印象があります。

さらには学生時代にレンズスパナレンチを使ってオートフォーカスレンズを分解したときにも、自身で誤って破断させました。苦い経験です(※保証対象外になりますので真似しないでください)。

そこで、できればフレキケーブルは使用しておらず、複数個を調達することを考えて、もっと安価かつ入手性の良いカメラを探して行き着いた先が WEB カメラです。

こちらは USB ケーブルに Micro USB 変換コネクタを噛ませて Raspi の USB ポートに接続すれば、使用できるようになります。当然ながら Raspi 以外の普通の Linux デスクトップ PC でも問題なく使用できます。

使い方も lsusb コマンドで接続を確認、fswebcam コマンドで静止画キャプチャを作成、ffmpeg コマンドでビデオを録画といった具合に Linux マシンでいつもやっていることと変わりません。

$ lsusb
Bus 001 Device 002: ID 058f:6366 Alcor Micro Corp. Multi Flash Reader
Bus 001 Device 005: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

$ fswebcam -d /dev/video0 -r 1280x720 ~/Desktop/cam.jpg

$ ffmpeg -t 30 -f v4l2 -framerate 25 -i /dev/video0 ~/Desktop/output.mkv

これでファイル作成に成功していれば、画像認識用のプログラムからでも問題なく呼び出せるはずです。なんだか、こちらの方が使い慣れていて安心感がありますが、画質の面ではピクセル数 3280 × 2464 の SONY IMX219 を搭載した Raspi カメラモジュール(Camera Module v2) の方に利があります。


ロジクール ウェブカメラ C270n 国内正規品 2年保証

カメラから静止画像やビデオが取り込めるようになりましたら、次に問題になるのはストレージです。

画像認識の学習用データを自作しようと思ったら、どれだけ容量の大きなSDカードを用意したところで気休め程度にしかなりません。

むしろSDカードを補助記憶装置がわりに使用する Raspi の性質を考慮すると、学習データごときで容量を圧迫するのは「もったいない」とすら思えてきます。そこでデータの保存には無線接続されたハードディスク(NAS)をすることを考えます。

NAS(ネットワーク接続ストレージ)
一般的に市販されている NAS を購入してきて無線 LAN ルータやハブに接続すると、機器の内部ではローカル IP アドレスという 32bits のユニークな整数値が割り当てられます(※表示としては10進法に変換されて4桁ごとにドットで区切られたものが用いられます)。

このIPアドレスに同じネットワークに繋がっているパソコンやスマートフォンから接続すると、データを転送して保存したり、読み込んだりすることができるようになります。

Raspi を含む Linux マシンからローカル IP アドレスを調べるには、ずばりネットワーク自体のアドレスに対してホストスキャンをかければ一覧が表示されます。ネットワーク(※正確にはクラスCネットワークといいます)自体のアドレスは 192.168.1.0 に決まっているので対象の IP アドレスは 192.168.1.0 です。

$ sudo apt -y install nmap
$ sudo nmap -sn 192.168.1.0/24
[sudo] password for Goddard: 
Starting Nmap 7.60 ( https://nmap.org ) at 2019-08-31 13:04 JST
Nmap scan report for _gateway (192.168.1.1)
Host is up (0.00036s latency).
MAC Address: 00:00:00:00:00:00 (Mitsubishi Electric)
Nmap scan report for 192.168.1.3
Host is up (0.044s latency).
MAC Address: 00:00:00:00:00:00 (Sony Mobile Communications AB)
Nmap scan report for 192.168.1.6
Host is up (0.12s latency).
MAC Address: 00:00:00:00:00:00 (Asustek Computer)
Nmap scan report for 192.168.1.10
Host is up (0.11s latency).
MAC Address: 00:00:00:00:00:00 (Hon Hai Precision Ind.)
Nmap scan report for 192.168.1.11
Host is up (0.11s latency).
MAC Address: 00:00:00:00:00:00 (Raspberry Pi Foundation)
Nmap scan report for 192.168.1.13
Host is up (0.00024s latency).
MAC Address: 00:00:00:00:00:00 (I-O Data Device)
Nmap scan report for Ganymede (192.168.1.7)
Host is up.
Nmap done: 256 IP addresses (7 hosts up) scanned in 6.56 seconds

ここで私が使用している NAS は I-O DATA LAN DISK なので、目的のローカル IP アドレスは 192.168.1.13 と言うことがわかります。


I-O DATA NAS 4TB RAID 1/デュアルコアCPU/高速モデル/2ドライブ/日本製 3年保証

I-O DATA もしくは組み込み Linux と Samba で動いている NAS をお持ちの方は、試しにウェブブラウザから NASのローカルIPアドレス(私の場合では http://192.168.1.13/) にアクセスされると、そのまま設定画面にアクセスできちゃったりします。

この IP アドレスの SMB/CIFS ファイルシステムにある任意のディレクトリを Raspi にマウントしてしまえば、ターミナルやファイルシステムから自由にアクセスできるようになります。

ここではルート直下にある disk1 ディレクトリをマウントします。お使いの環境によっては share だったり Public だったりと言った別の名前がつけられているかもしれませんので、適宜改編してください。

$ sudo apt install cifs-utils
$ sudo mkdir /mnt/iodata && chmod 755 /mnt/iodata
$ sudo mount -t cifs //192.168.1.13/disk1 /mnt/iodata -o username=PI,password=RASPBERRY,iocharset=utf8

うまく実行できましたら、カメラから取得したデータを実際に保存してみます。うまく保存できていれば成功です。

$ sudo mkdir /mnt/iodata/raspberryPi/
$ sudo fswebcam -d /dev/video0 -r 1280x720 /mnt/iodata/cam.jpg

再起動時に毎回マウントすることが面倒であれば、あらかじめ設定しておけば起動時に自動的にマウントされます。

$ sudo vi /etc/fstab
//192.168.1.13/disk1 /mnt/iodata cifs username=PI,password=RASPBERRY,file_mode=0755,dir_mode=0755,iocharset=utf8,

これでようやくカメラを使って画像認識をはじめる準備が整いました。ここまで来て、ようやく学習データづくりとソフトウェアの着手に取り掛かれます。

まだまだ先は長いのです。

Android タブレットを Raspberry Pi モニタ代わりに使用する

Raspberry Pi Zero W V1.1 の出力装置として Android タブレットを使用することを考えます。

HDMIケーブルを用いて Raspberry Pi をディスプレイモニタに接続すれば Linux デスクトップPCとして Raspi を使用することは可能です。

この方法では、しかし、モニタの設置点に作業場所が固定されるなどの不都合が生じます。そこで Android タブレットをモニタに転用することで問題を解消します。

少し検索すると Microsoft Remote Desktop Protocol 準拠の xrdp サーバを利用する方法がよく出てきますが、過去にパッケージのインストール順序と設定で苦労した覚えがありますので、ここでは Virtual Network Computing (VNC) を利用して無線LAN経由で遠隔操作する方針を取ります。

まずは X11vnc をインストールするために Raspi にキーボードを接続して CTRL + Alt + T キーを同時に押してターミナルを立ち上げます。これは Ubuntu 派生の Linux ディストロで有効なキーボード・ショートカットです(※ デフォルト状態の Debian では無効です) 。

ターミナルが立ち上がりましたら、次のコマンドを打ち込んで必要なパッケージをインストールします。

$ sudo apt update
$ sudo apt -y upgrade
$ sudo apt -y install x11vnc

インストールが完了しましたら Raspi のIPアドレスを調べて、その後に X11vnc にパスワードを設定して実行します。

$ ifconfig wlan0
eth0: flags=4163 mtu 1500
inet 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.1.255

$ x11vnc -storepasswd
Enter VNC password: 
Verify password:    
Write password to /home/pi/.vnc/passwd?  [y]/n 
Password written to: /home/pi/.vnc/passwd

$ x11vnc -usepw -forever -display :0

この状態で Android タブレット側の VNC クライアントを用いて Raspi に接続するとタブレットから遠隔操作を行えるようになります。

私の環境では Raspi の IP アドレスは 192.168.1.11 であり VNC で使用されるポート番号は TCP/5900 なので接続先は 192.168.1.11:5900 となります。これを指定して接続を行えばいいというわけです。

うまく接続できれば、タブレット画面に Raspi の出力が表示されるようになります。




ただし、ここで問題となるのは、この画面が表示されるのは X11vnc が起動しているときだけで、一度 Raspi の電源を落とすと再度 HDMI ケーブルを使用してモニタに接続する必要があることです。

このままでは不便なので Raspi の OS が立ち上がったときに自動的に X11vnc が実行されるように設定ファイルを作成します。

$ mkdir -p ~/.config/autostart
$ vi ~/.config/autostart/x11vnc.desktop

ファイルの内容は最低限これだけあれば十分です。必要に応じて、適宜改編してください。


[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=X11VNC
Comment=
Exec=x11vnc -usepw -forever -display :0
StartupNotify=false
Terminal=false
Hidden=false


設定ファイルが用意できましたら、Raspi を再起動して設定ファイルが機能しているかどうかを調べます。

$ sudo reboot 

これで Raspi の再起動後に VNC クライアントから再接続できるようになっていれば自動起動は成功です。ここまで完了すれば、取り敢えずは Raspi からディスプレイモニタを取り外してしまっても何とかなります。

さて、次回はいよいよカメラを接続して画像認識の第一歩をはじめます。

つづき: Raspberry Pi にカメラを接続して画像を NAS に転送

はじめての Raspberry Pi Zero W セットアップ

カメラモジュールを使用するために Raspberry Pi Zero V1.1 を購入しました。

私にとって初めてのラズパイで不慣れなので、公式の推奨どおりに NOOBS を使用して OS イメージを作成することを考えます。

セットアップに最初に必要なものはネットワークに接続されていて、SDカードを読み書きできる PC だけです。ここでは Linux マシンを使用します。動作環境は以下のとおりです。

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

最初に NOOBS と Raspbian OS をネットワークからダウンロードしてきます。公式サイトからダウンロードしても良いですが、物理的な距離がダウンロード速度にも影響しますので国内のミラーサイトを利用されたほうが高速です。

今回は北陸先端大学のミラーサイトを使用させていただきます。北陸先端大学と山形大学にはいつもお世話になります。

$ sudo apt update
$ sudo apt -y upgrade
$ sudo apt -y install aria2
$ aria2c http://ftp.jaist.ac.jp/pub/raspberrypi/NOOBS/images/NOOBS-2019-09-30/NOOBS_v3_2_1.zip.torrent -d ~/Downloads/

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
80cdf4|OK  |   2.0MiB/s|/home/buran/Downloads//NOOBS_v3_2_1.zip.torrent
f45f9a|OK  |    18MiB/s|/home/buran/Downloads//NOOBS_v3_2_1.zip

Status Legend:
(OK):download completed.

$ sha256sum ~/Downloads/NOOBS_v3_2_1.zip
9d040a0b2795e940cab848c612a9ccfd739cf7ea5fcb1d42141f93cefcef4078  /home/buran/Downloads/NOOBS_v3_2_1.zip

ダウンロードが完了しましたら、公式ダウンロードサイトにアクセスして SHA-256 hash が一致することを確認します。

一致していない場合は必要なファイルが正常にダウンロードできていませんので、再試行が必要です。




問題なければ NOOBS_v*_*_*.zip ファイルを解凍して README ファイルを開きます。

$ mkdir ~/Downloads/noobs
$ unzip ~/Downloads/NOOBS_v3_2_1.zip -d ~/Downloads/noobs/
$ cd ~/Downloads/noobs
$ cat INSTRUCTIONS-README.txt

それによると解凍したファイルを全てSDカードに記録させればブートできるようになるらしいので、そのとおりに実行します。

この時点でSDカードスロットルに記録メディアを挿入して、以下のようにフォーマットとマウンティングを行います。フォーマットは FAT または FAT32 が指定されていますので、ここを間違えると起動しなくなります。モニタに接続しても No Video Input と表示される場合には、こういうところが怪しいですね。

$ sudo gparted
$ sudo fdisk -l
$ sudo mount -t vfat /dev/sdc1 /media/buran/raspbian
$ cd /media/buran/raspbian
$ unzip ~/Downloads/NOOBS_v3_2_1.zip
$ cd ~
$ sudo umount /dev/sdc1

これで OS の書き込みが完了して、いよいよ Raspberry Pi を起動できるようになるはずです。

しかし USBケーブルを接続して通電しただけでは Raspberry Pi は起動しているのかどうか、よくわからないので HDMI ケーブルを通して動作確認用のモニタに出力を表示させます。

したがって、ここからはモニタとマウス、それから HDMI ケーブルが必要になります。この辺りは PC さえあれば、何でもできる Arduino のほうが良く出来てるなという感想を抱きます。

ここでキーボードを繋ぎたくなるところですが、インストール時にはマウス操作が必要になりますので、NOOBS を使用する場合には最初だけはマウスを接続します。

無事にインストールが完了しますと、一般的なデスクトップ Linux として使用できるようになります。無線LANにも接続できますし、ターミナルから設定を行えばサーバとして使用することも簡単にできるようになります。

個人的には GUI 環境は不要ではあるものの、このクレジットカードの半分ほどの大きさのマシンが27インチ FullHD ディスプレイを動かしているのを眺めていると、その性能に感心してしまいます。

続き Android タブレットを Raspberry Pi モニタ代わりに使用する