SSPライブラリでRaspberry Pi Camera Moduleを動かしてみる

インターフェース誌で2016年12月号から3号連続で特集されているSSPライブラリを導入してみる。イメージセンサーの素の画像データ(RAWデータ)を取り出すことで,基本的な画質調整から試せるだけでなく,RAWデータの保存と画像処理を分離することで,撮影不能時間を短くしたり,raspivid以上の高速/高解像度の動画撮影が可能になる(らしい)。

hendigi.karaage.xyz

環境構築

SSPライブラリのインストール

インストール法は次のページを参考。概ね書いてあるとおりに実行していけばインストールできた。

www.visionproc.org

ただし最新のバージョンでは,ラズパイにOpenCVをインストールする方法にあるとおり,ファイル拡張は不要(というかできない)。

インストールできたかは次のコマンドで確認

$ cd ~/libssp/1.31/sample/

$ sudo stillsample/stillsample profiles/IMX219\(1280x720@60Hz\).xml stillsampletest.raw

$ ls -l stillsampletest.raw

実際に画を見るには,windowsでダウンロードページにあるRAWViwer1.3.exeを使う。

VisionProcessingFramework(VPF) 環境構築

まず,GUIで必要なgtkパッケージを入れる(VPFではgtk2を使うようで,gtk3だけでは不可)。

$ sudo apt-get install libgtk2.0-dev libgtk-3-dev

次に,OpenCVを入れる。なお,OpenCVのインストールに関してはraspberry pi opencv ビデオで顔認識(コンパイルなし!) - KOKENSHAの技術ブログも参考。

$ sudo apt-get install libopencv-dev

続いて,次のページに書いてあるとおりに実行。
www.visionproc.org

 ASTROの導入

 VPFでも解像度が小さいうちはいいが,大きいとRpiの画面(実際にはVNC viewer内)に入りきらず不便なので,Gain(感度;実際にはアナログゲインとデジタルゲイン),Coarse Integration Time(露出時間)を指定できるように変更したプログラムを利用する。Vision Processing Community:Downloadからastro_20171201.zipをダウンロードし,「~/libssp/1.31/astro」に展開。

ここまで来れば,例えば,次のコードで,3200X2400pxのJPGとRAWファイルが出力される(アナログゲイン:200,デジタルゲイン:300,露出時間:600)。

$ cd ~/libssp/1.31/sample/

$ ./still.sh output 200 300 600

これをPCへ移行させればよいのだが,RAWViwer1.3.exeではRAWファイルを読めなかった。RawTherapeeでは読める。ただし,このソフトでは最初の画素がBから始まることを仮定しており,チャネルミキサでRとBを入れ替える。

RPi-Cam-Web-Interface

※ しばらく前に書いた記事。最近の環境では不明だがとりあえずUPしておく。

Raspberry piのカメラを動かすための方法は以前に書いた(Pi NoIR Camera V2をひとまず使えるようにする - input-R)が,ここではraspberry piに特化したRPi Cam Web Interface を使う。

http://elinux.org/RPi-Cam-Web-Interface

参考にしたサイト

raspberry pi zero W にRPi-Cam-Web-Interfaceで監視カメラ製作 | 興味本位の Trial 安堵 Error

NoIR V2 - Video Streaming Baby Monitor | element14 | Raspberry Pi Projects

Raspberry With Cam in Birdhouse: 11 Steps (with Pictures)

インストール

RPi-Cam-Web-Interface - eLinux.orgに書かれている。

とりあえず使ってみる 

[record video start/stop] 現在のカメラ画像の動画録画をスタート・ストップ

[record image] 現在のカメラ画像の静止画をキャプチャー

[tamelapse start/stop] 現在のタイプラプス撮影をスタート・ストップ
 撮影間隔はCamera Settings-Timelapse-Intervalで秒単位(0-3200s)で設定可能。

[motion detection start/stop] 動体検知録画をスタート・ストップ
 動体検知を行うにはCamera Settingsで Motion detect modeをInternalにする。なお,このボタンを押して動体検知を始めるには,Schedule SettingsでDayModeをAllDaysとし,Motion Startにca 1,Motion Stopにca 0が入力されていることを確認しておく。

[Download Videos and Images] 保存されている動画・静止画をダウンロード
 撮影した画像は/var/www/html/mediaに保存されている。

各種の設定

Schedule Settings

指定した時間にコマンドを実行するための設定ができる。デフォルトは, 24時間休みなく動体検知したときに動画を記録する設定になっており,トップ画面のmotion detection startボタンをクリックすると動体検知録画が始まる。起動と同時に動体検知する場合には,Period Startにmd 1を書き込む。

次の欄にコマンドを入力して,スケジュールを設定する。DayModeはAllDay,Fixed Times,Sunbasedから選べる。

Motion Start:モーショントリガの開始が受信されたときに行う動作
Motion Stop:モーショントリガが停止したときに行う動作
Period Start:ある時間が来たときに行う動作

実行できるコマンドはCommand referenceのボタンを押すと説明がでてくる。例えば,md(動作検知),ca(動画録画),im(静止画キャプチャー),tl(タイプラプス撮影),それぞれ1でスタート,0でストップ。

例えば,18時に動画録画をスタートして1時間後にストップ,それ以降は動作検知して,動作があれば録画をしたければ,次の通りにする。

18:00 Period Start: ca 1

19:00 Motion Start: ca 1, Motion Stop: ca 0, Period Start md 1

録画したファイルがSDカード容量を超えるのを防ぐために,ファイル削除も可能。PurgeVideo_Hours, PurgeLapse_Hours, PurgeImage_Hours:それぞれ動画,タイプラプス画像,静止画が指定時間以上古いファイルを消去する

PurgeSpace_ModeEx:Min Space(%:使用可能ファイル容量の最小値), Max Usage(% :使用済ファイル容量の最大値),Min Space(GB:使用可能ファイル容量の最小値),Max Usage(GB:使用済ファイル容量の最大値)のいずれかで設定。

なお,これらのコマンドはManagement_Intervalで設定された間隔ごとに実行される(標準は3600秒=1時間)。

Camera Settings

いじりそうなものだけをピックアップ。

[Resolution] 解像度の設定。

[Buffer] 動体検知してから動画録画を行うまでにタイムラグがあるので,画像のバッファリングを行っておく(でないと,動作検知後の場面しか写らない)。

[MP4 Boxing mode] h.264をmp4に変換するかどうか。長時間録画の場合,これをoffにしないと,Rpiがoffになることがある。offにすると,そのままでは見られないので,VLC media playerなどで見ることになる。

 [Motion detect mode] 動体検知モード

Motion Settings

保存先の変更

Raspberry Piに使っているmicroSDカードの容量が小さいため,外付HDDに保存先を変える。ただし,HDDを接続していないときにはSDカードに保存させたい。

保存先フォルダの変更

まず,保存先のフォルダを ../mediaから../media/rpicamに変更する(保存がHDD直下で良ければ,無視してよい)。

保存先のフォルダを作る

 sudo mkdir /var/www/html/media/rpicam

フォルダの所有者を変更する

 sudo chown -R www-data:www-data /var/www/html/media/rpicam

保存先を変える

 sudo leafpad /etc/raspimjpeg

 image_path, lapse_path, video_pathの記述を変える

再起動後には,ここまでで保存先フォルダが変更されているはず。

外付HDDをマウント

次に,/var/www/html/mediaにマウント先を変更。一回限りで良ければ,管理者権限でアンマウントしてから,マウントしたいフォルダにマウントすればよい。

起動時に自動マウントするなら,/etc/fstabを管理者権限で開き,次の行を追加して保存。再起動するとOK。

UUID="XXX" /var/www/html/media      ntfs-3g defaults,nofail 0      0

マウントの詳細な手順は次のサイトを参考に。

白執事の徒然なる日々 Raspberry Pi にUSBメモリをマウント

Raspberry Pi 2でファイルサーバを作るまでのまとめ - Qiita

(余談1)マウント先は重複できるみたい。どう使うかはよく考えてないが。

unshare -m とか mount --make-shared とか - Qiita

(余談2)HDDへの供給電流にも注意

Raspberry Piに3TBのUSB HDD(HD-AC30TK)を追加してみた | あっかぎのページ

Pi NoIR Camera V2のケーブルを長くする

Raspberry Piのカメラ用ケーブルを長くする必要があったので,次の商品を購入 

 で,次のサイトに載っている方法でケーブルを差し替える。要は黒い部分を引けば,ケーブルを引き抜ける。本体側も同様に引き抜ける(ただし,一旦ケースから外さないといけない)。

www.modmypi.com

 

決まった時間にLEDの明るさを変える:Arduinoを使う

input-r.hatenablog.jp

以前,こんなページを書いたが,これを実行中にRaspberry Piがお亡くなりになるという不幸があったので,別の方法を考えてみる。

PWM調光はArduinoで対応することにして,Raspberry Piからシリアル通信で明るさを変えるようにする。

Arduinoで明るさを変える

analogWrite()で変えられる。UnoのようにATmega328Pを搭載しているArduinoボードでは,デジタルピン3,5,6,9,10,11で使える。5,6番ポートは約980Hzで,残りは約490Hzで出力する。

Arduino 日本語リファレンス

Raspberry PiからArduino経由でLEDの明るさを変える

参考にしたのは次のサイト。

karaage.hatenadiary.jp

まず,Arduinoのプログラム。

#define LED_PIN (3)
byte val;
void setup(){
  // Serial Setting
  Serial.begin(9600);
  // Port Setting
  pinMode(LED_PIN, OUTPUT);
  analogWrite(LED_PIN, 0);
}
void loop(){
  if(Serial.available() > 0){
    val=Serial.read();
    Serial.write(val);
    if(val == 'A'){
      analogWrite(LED_PIN, 255);
    }
    if(val == 'B'){
      analogWrite(LED_PIN, 0);
    }
  }
}
Raspberry Piは上記サイトの設定,プログラムをそのまま利用。

決まった時間にLEDの明るさを変える

cronを利用する。
crontab -eで設定ファイルを開き,下の内容を入力。ctrl+X→Y→Enterで上書き保存して終了。
#毎日18時に,上記のRaspberry Piのプログラムを実行する。
00 18 * * * python /home/hoge/script1.py
以上で,18時にLEDの明るさを変えられる(はず)。

 

決まった時間にLEDの明るさを変える

Raspberry PiでLEDの明るさを,決まった時間に変えることを試してみる。

明るさを変える

明るさはPWM調光で変える。その前に,精度の高いPWM信号を生成するのに,WiringPiというツールを使う。

WiringPiのインストー

まず,この書籍のp209に書いてある手順で,Python2用にWiringPi-Pythonをイン ストールする。

(追記)「Raspbianのカーネルと呼ばれるソフトウェアがバージョン4.9になると、書籍のままのインストールコマンドではWiringPi-Python正常動作しなくなります」ので,サポートページ(http://raspibb1.blogspot.jp/)に記載の方法でインストールする。が,rpi-updateを行うと,wiringpiにエラーが出るので,このページ(WiringPiでエラーになった場合のメモ - 豆腐とコンソメ)をもとにダウングレードする。

次いで,サポートページ(応用演習のPDF)にある手順で,Python3用にインストールしなおす。

bluebacks.kodansha.co.jp

一応,これでWiringPiをPythonでインポートできる。 

WiringPi2のインストー

次にWiringPi2をインストール。手順は次のサイトにあるとおり。

hombre-nuevo.com

ようやく,明るさを変える

参考にしたのは次のサイト。書いてあるとおりにすると,徐々に明るくなり,徐々に暗くなるようにできる。なお,wiringpiを用いる場合には管理者権限が必要なので,Terminalで「sudo idle」として開くこと。

blog.kakakikikeke.tk

ここで,余談。wiringpi2は入れなくても良さそうで,最初のimportでwiringpiをいれておけば上記のコードは同じように動く。

決まった時間にLEDの明るさを変える

ようやく本題。参考にしたのは次のサイト。

raspberrypi.stackexchange.com

で,次のコードで指定した時間に明るさを(DUTY1からDUTY2へ)変えられる。

import wiringpi
import datetime
from time import sleep
OUTPUT = 2
PWM_PIN = 18
DUTY1 = 600
DUTY2 =  20
wiringpi.wiringPiSetupGpio()
wiringpi.pinMode(PWM_PIN, OUTPUT)
wiringpi.pwmSetMode(wiringpi.GPIO.PWM_MODE_MS)
wiringpi.pwmSetClock(375)
wiringpi.pwmWrite(PWM_PIN, DUTY1)
try:
    while True:
        time = datetime.datetime.now().strftime("%H:%M")
        if time == "00:00":
            wiringpi.pwmWrite(PWM_PIN, DUTY2)
    sleep(0.2)
except KeyboardInterrupt:
    pass
wiringpi.pwmWrite(PWM_PIN, 0)

(参考)決まった時間に処理する

決まった時間に処理する方法としてはcronを使うのが一般的みたい。

make.bcde.jp

Raspberry PIでLED点灯コントロール、Part5 cronとPythonでLEDをコントロール | ものづくりエクスペリメント

Arduinoを使ってみる

Raspberry piに続いて,ArduinoArduino Uno R3)も買ってみたので,使ってみる。

参考にしたのは次のサイト。

Arduino のすすめ

Arduinoでお手軽電子工作:LEDを光らせてみる | Device Plus - デバプラ

初心者でもわかる・できる!Arduinoを使った初めての電子工作実践 | HTML5Experts.jp

開発環境「Arduino IDE」をダウンロード(Arduino - Software)して,Windows PCにインストール。PCとArduinoボードをつないで,ツールからボードとシリアルポートで使用するものを選択。これで一応使えたので,プログラムを作成して,コンパイル→アップロード。

 

複数のLEDを点灯させる

電子工作で最初に出てくるLピカをしてみる。

tool-lab.com

www.marutsu.co.jp

抵抗値計算

電流制限抵抗がないと過大電流が流れてしまうので,抵抗をおく。必要な抵抗値は次のサイトで計算。

diy.tommy-bright.com

使用したLED

秋月電子通商で購入した,次のLEDを使用。

5mm赤外線LED OSI3CA5111A (10個入): LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販

5mm赤外線LED OSI3CA5111A (10個入)
[OSI3CA5111A]
通販コード I-04779
発売日 2011/07/26
メーカーカテゴリ OptoSupply

5mmタイプの赤外線(IR)LEDです。 この赤外線LEDは可視光(赤色)をわずかに残すことで 防犯カメラの威嚇の効果にも最適です。

■主な仕様(Ta=25℃)
・本体:ウォータークリアー(無色透明)
・直径:5mm
・順方向電圧(VF):1.6V(標準)(@50mA)
・放射強度:45mW/sr(@50mA)
・ピーク波長:850nm(標準)(@50mA)
・逆耐圧:5.0V
・半減角:15°(狭角)
・PD:126mW

LEDが1個の場合

手持ちの抵抗が330Ωなので,ひとまずこれで点灯させる。Raspberry PiのGPIOでLEDを光らせる場合,電圧は3.3Vになるので,流れる電流は(3.3V-1.6V)/330Ω=5.2mAとなる(オームの法則から)。

 LEDが複数の場合

順方向電圧1.6Vなので,直列でたくさん点灯させようとすると,Raspberry PiのGPIOから電圧3.3Vでは流れない。そこで,手持ちの24V電源を活用する。10個のLEDを直列に接続すると,流れる電流は(24V-(1.6V×10))/330Ω=24.2mAとなる(オームの法則から)。

 なお,直列接続と並列接続のメリット,デメリットは次のサイトを参照。

LED駆動における直列接続と並列接続 - EDN Japan

余談

チャーリープレキシングによる点灯というのもあるらしい。

http://razzpisampler.oreilly.com/ch04.html