RaspberryPiを使ってGPIOを操作することができるようになったので、今度はカメラを接続して見たいと思います。 カメラもRaspberryPiに端子の用意されたものと、USB接続の2タイプがあるのでそれぞれについても試してみたいと思います。
Raspberry Pi Cameraモジュール編
検索すると良い情報が結構あると思います。このエントリーをみていくことで問題なく進めていけるかなと思います。
【参考】
RaspberryPiのカメラといえば、直接リボンケーブルで接続できるカメラモジュールが挙げられます。最近本当に安くなっているので、カメラモジュールだけではなくケース込みでもかなり安く入手できるのがメリットだと思います。以前はもっと高価だったんですけどね…。
自分が買ったときには、カメラモジュールとケーブルのみでしたが、今購入するのであればケース付きのものをおすすめします。
では、使ってみましょう。
カメラモジュールを認識させる
RaspberryPiでカメラモジュールを使用するには、設定が必要になります。といってもraspi-configでカメラを有効化させるだけです。
以下のコマンドを入力して操作していきます。
$ sudo raspi-config
メニュー画面になったら…

5 Interfacing Optionsを選択して【Enter】キーを押下。

P1 Cameraを選択して【Enter】キーを押下。

カメラインターフェースの有効化を尋ねられるので

<Yes>を選択して【Enter】キーを押下。

これでカメラインターフェースが有効化されました。【Enter】キーを押下してメニューに戻ります。

メニューに戻ったら<Finish>を選択して【Enter】キーを押下します。

再起動するかを尋ねられるので<Yes>を選択して【Enter】キーを押下して再起動を行います。

再起動が完了するとカメラモジュールが使用できるようになっています。 以下のコマンドで撮影ができているか確認しましょう。
$ raspistill -o image.jpg
エラーが発生せず、カレントディレクトリにimage.jpgファイルが生成されていれば大丈夫です。

Node-REDからカメラモジュールを使用する
ここまでできたら、次はNode-REDから制御を行ってみましょう。Node-REDからこのカメラモジュールを操作するには、拡張ノードが必要になってきます。 今回は以下のノードをNode-REDから導入してみます。
Node-REDをWebブラウザで開き、右上にある【三】のボタンをクリックしてメニューを開き

メニューの中から【パレットの管理】をクリックします。

すると、【ユーザ設定】の【パレット】が開き【現在のノード】の画面が表示されます。この画面の【ノードの追加】タブをクリックします。

追加するノードの検索画面が開きます。

検索のテキストボックスに今回の拡張ノード名を入力すると、該当するノードが検索され、リストに候補が表示されます。
今回はcamerapiという名前の含まれているノードなので、これを入力します。
検索されたノードからインストールするノードの名前を確認して、【ノードの追加】ボタンをクリックします。

クリック後、インストール確認のダイアログが表示されるので【追加】ボタンをクリックします。

すると、インストールの作業が行われ、

拡張ノードがパレット(ノードのリスト)に追加されます。あー画面の左側のノードのリストはパレットっていうのか…今更だ…。あとで他のエントリーも修正しておこうと思います。

では今回インストールされたノードを確認してみます。【RaspberryPi】グループに【camerapi takephoto】が追加されているのがわかります。

では、今回導入したこのノードを試してみたいと思います。 ワークスペースに以下のノードを追加します。
injectノードcamerapi takephotoノードdebugノード
以下のように配置し、

各端子を接続していきます。

あとは、camerapi takephotoノードを設定していきます。ノードをダブルクリックしてプロパティ画面を開きます。
ここで設定できることは以下となります。
- ファイル名の設定(File Mode)
- 画像の解像度(Image Resolution)
- 画像の角度の変更(Rotation)
- 画像の上下左右の反転(Image Flip)
- 画質のプロパティ設定(Image Properties)
- エフェクト(Image Effect)
- ISO感度(ISO)
- 露出・ホワイトバランス(Preset modes)
- AGCの調整(Wait for AGC )
- LEDの点灯・消灯(LED)

細かい設定に関してはそれぞれ試してもらえればと思いますが、画像の解像度(サイズ)は大きくても仕方ないので、今回は 【ImageResolution】のプルダウンから【640x480】を選択し、完了ボタンをクリックします。

あとは、【デプロイ】ボタンをクリックします。

デプロイが成功しましたという表示がでればOKです。

あとはinjectノードをクリックして実行します。

カメラによるキャプチャが成功すると、デバッグのタブに

実際にファイルがあるかコンソールから確認すると

ちゃんとカメラの映像が入っています。
USBカメラ編
先ほどはRaspberryPiのカメラインターフェースに接続するモジュールでしたが、次はUSB接続のカメラをNode-REDから操作してみたいと思います。 Node-REDで使用できるUSBカメラの拡張ノードは調べてみるといくつかあります。
flows.nodered.org ↑の拡張ノードは使用できないようです(20191008現在Node-RED 0.20.7でインストールに失敗します)
まだまだあるかなとは思いますが、今回はこの中からnode-red-contrib-usbcameraを使用してみたいと思います。
node-red-contrib-usbcameraを使用してみる
今回使用したUSBカメラは以下のものです。カメラ自体は古いものなのですが、最新のUSBカメラものでもほとんど同じように使用することはできるかなと思います。
以前使用したときのエントリーはこちらになります。 uepon.hatenadiary.com
まずはUSBカメラをRaspberryPiのUSBコネクタに接続します。すると以下のようになります。
【認識前】
$ lsusb Bus 001 Device 004: ID 056e:4008 Elecom Co., Ltd Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
【認識後】
$ lsusb Bus 001 Device 004: ID 056e:4008 Elecom Co., Ltd Bus 001 Device 005: ID 046d:082c Logitech, Inc. Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 005: ID 046d:082c Logitech, Inc.がUSBカメラの認識部分になっています。
【画面】

拡張ノードのインストール
カメラが認識できたら、拡張ノードをインストールするのですが、事前に準備が必要になります。そこからはじめて行きます。
拡張ノードのインストールの事前準備(追加インストールするパッケージ)
拡張ノードのページをみるとこのノードはfswebcamコマンドを呼び出して実行をするようです。拡張ノードはfswebcamパッケージがインストールされていない場合でもエラーは発生しません。ただし、拡張ノード実行時にはエラーします。
【fswebcamパッケージがインストールされていない場合のエラー画面】

拡張ノードの説明では、以下のように書かれているので
You have to install fswebcam by following command.
$sudo apt install fswebcam
このコマンドを実行してパケージのインストールを行います。

すんなりとインストールできました。
拡張ノードのインストール
事前準備ができたので、拡張ノードのインストールを行っていきます。
画面の右上側にある【三】ボタンをクリックし、メニューの中から【パレットの管理】を選択しクリックをします。

【ユーザ設定】が表示されたら

【ノードを追加】のタブをクリックします。

検索のテキストボックスにusbcameraを入力すると、拡張ノードが検出されます。
検出された拡張ノードの【ノードの追加】ボタンをクリックします。

インストールの確認が表示されるので【追加】ボタンを押します。

するとインストール処理がスタートし

少しするとインストールが完了の表示がされます。【閉じる】ボタンを押して【ユーザ設定】を閉じます。

インストールされた拡張ノードは【RaspberryPi】カテゴリーの中に【usbcamera】という形で組み込まれます。

では、先程同様にテストをやってみましょう。以下のノードをワークスペースに配置していきます。
- injectノード(配置すると名称がタイムスタンプになる)
usbcameraノード- debugノード

ノードを配置したら、端子の接続を行っていきます。これで準備は完了です。あとはusbcameraノードのプロパティ設定を行っていくことになります。

usbcameraノードをダブルクリックしてプロパティを開くと3つのモードを選択することができます。

File Modeのプルダウンから選択することができるようになっています。Buffer、File Mode、Generateというモードがありここから選んでいくことになります。

モード設定
Bufferのプロパティ画面
Bufferはカメラが撮影した画像をデータの配列として取得することができるモードになります。後続の処理がファイル操作ではなく、データ配列のだった場合に使用できます。ファイル化するオーバーヘッドも大きい(SDメモリにファイルを書き込むので結構処理は遅くなります)ので可能であれば、こちらを使用するのはありだと思います。(デバッグは難しいかもしれませんが)
以下の設定値があります。
- File Mode(
Buffer) - Image Resolution(画像サイズ)

File Modeのプロパティ画面
File Modeはカメラが撮影した画像をファイルとして取得することができます。ただし、ファイル名は固定になります。(この処理の前にファイル名を生成することができれば可変のファイル名で保存も可能です)あと、保存するパスや画像フォーマットなども変更できるのがポイントです。PNGなどの画像ファイルを使用したい場合にはこちらで行うしかないかなと思います。
以下の設定値があります。
- File Mode(
File Mode) - File Name(ファイル名)
- File Default Path(保存するディレクトリ、パス)
- File Format(保存する画像のフォーマット。PNGやJPGなど)
- Image Resolution(画像サイズ)

Generateのプロパティ画面
Generateは自動的にファイル名を生成して、カメラが撮影した画像を保存するモードです。画像サイズは変更できるのですが、JPG形式でしかできないのがちょっと物足りない感じです。ただ、学習電通データとして何枚も何枚も画像を生成する場合には便利だと思います。
以下の設定値があります。
- File Mode(
Generate) - File Default Path(保存するディレクトリ、パス)
- Image Resolution(画像サイズ)

実行させてみる!
あとは実行させてみます。injectノードの左側のボタンをクリックするとこんな感じになります。
【Bufferモードでの実行】

実行すると、デバッグ表示には配列データが出力されます。
【Generateモードでの実行】

実行すると、デバッグ表示には出力されたがファイルパスが出力されます。
おわりに
カメラも使えるようになったぜーって感じなんですが、 なんと2019年9月30日にNode-REDのバージョンが1.0になりました!パチパチパチ nodered.org
ちょっとどうなっちゃうのかっていうのが気になるところではありますが、次回もなにかできるといいなと思っています。
【Node-RED 参考エントリ-】