JPEGカメラを試してみる その2
(PICに接続しSDカードに保存してみる編)

〔PCで動作編〕   〔Arduinで接続編〕 〔メール通知編〕 〔マイコンのトップに戻る〕


前のページ"その1"では、カメラをUART通信でパソコンに 接続して動作確認を行いました。
このページでは、カメラをPIC(18F26K22)に接続してSDカードに写真を記録させて見たいと思います。
PICはプログラム容量が16K以上、SRAMが1.2K以上、MSSPx2、USARTx1の物を使いましょう。
(受信バッファを小さくすればSRAM1K以内でもOKだが、保存に時間が掛かるでしょう)

JPEGカメラは、UARTで接続しコマンドをPICから送信する事により動作させる事が出来ますが、
私の手に入れたカメラに因るのか不明ですがコマンドによっては上手く動作しない物が有るようです。
データシートによると結構機能が有る様に見受けられるのですがぁ...
取りあえずは写真を撮る機能は動作するのでその辺の記事のみとなります。

《通信コマンドの説明》

VC706プロトコル説明書は、adafruit.comこちらか らダウンロードしましょう。

マイコンからカメラへのコマンドフォーマット

[0x56] [カメラ番号] [コマンド番号] [データ数] [データ0-16]........

カメラからの通知フォーマット


[0x76] [カメラ番号] [コマンド番号] [通信状況] [データ数] [データ0-16]........

※ ”カメラ番号”は初期値は0で、2個以上ぶら下げるなら"SET_SERIAL_NUMBER(0x21)" コマンドで
   変更します(0-255の範囲)。
※ ”データ数”はコマンドにより変わりこのバイトより後ろのデータ長を示します。
※ ”通信状況”は送信したコマンドに対するカメラの返答です。
   0=コマンドを正しく実行します。(正常時)
   1=システムはコマンドを受信しません。
   2=データ長がエラーです。
   3=データフォーマットエラー。
   4=コマンドは今実行できません。
   5=コマンドが受信されましたが、正しく実行されませんでした

画像データ(FBUF)の読み込みフォーマット

1フレーム分の読み込み指示コマンド(0x32)データ

[0x56] [0] [0x32] [12]
 [FBUFのフレーム] [制御モード] [FBUFアドレスx4byte][読込みデータ長x4byte][待ち時間x2byte]

※ ”FBUFのフレーム”は、0=カレントのフレーム 1=ネクストフレームを選択
※ ”制御モード”は画像データ 転送モードの指定を8 ビットで行います。
  0000[101][0=MCU 1=DMA]とビットで設定、でも参照したサンプルのプログラムのデータ
  [101]はデータシートでは[111]に見えるがぁ[111]だと動作しなかったがぁ、良くわからん。
  DMAにするとデータの転送速度が上がると書いて有るが使い方不明。
※ ”FBUFアドレス”読み込むデータバッファのアドレス、8の整数倍で指定する
※ ”読込みデータ長”指定は4の倍数を設定する、ここで指定した分が1フレームとして送られて来る
  のでJPEG画像のデータ数分繰り返す
  画像のデータ数は"GET_FBUF_LEN(0x34)" コマンドで得る事が出来ます。
※ "待ち時間"は送信されるデータのインターバル時間で、単位は0.01msです。

返信される1フレーム分のデータ

[0x76] [0] [0x32] [0] [0] (インターバル時間)
[データ1]から[データn]
(インターバル時間) [0x76] [0] [0x32] [通信状況] [0]

※ 送信データの長さは指定した分送られて来る、このページでは128byteとする

《JPEGフォーマットについて》

JPEGのファイルデータは"FF D8"で始まり"FF D9"のコードで終わります。
詳しい説明は、こちらの”JpegAnalyzer Plus オンラインヘルプ”を参照下さい。
又、この"JpegAnalyzer"のツールはこちらからダウンロード可能です。 *1)

《実態配線図》

実験部品は秋月電子の、I2C接続小型LCDとSDカードソケットはスイッチサイエンスで購入しましたが、
現在は販売終了で代替えがこちらですがピン配列が異なっていますので配線が下記回路と違います。
(出来るだけ現在販売中の部品を使いたい所なのですがぁ...)
実態配線図
回路の電源ですが、カメラI/OとSDが3.3Vでなので回路全体を3.3Vで行いました。
SDカードソケットはSPI(MSSP1を使用 し、カメラはUSART(USART1)を使って います。
LCDは無くても良いのですが、状況を表示するのに便利なのでI2C(MSSP2)を使って接続します。
スイッチはシャッター代わりです。尚、スイッチやI2Cのプルアップ抵抗はPIC内蔵を利用しています。

カメラモジュールの端子配列は左から[TVOUT][RX][TX][GND][VCC]で[TVOUT]は無配線。
I2C接続小型LCDについてはこちらの ページを参照下さい。
SDカードソケットについてはこちらのページを参照下さ い。

《サンプルプログラムについて》

ここのサンプルは”skSDlib”を使ったプログラムになります。

↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
VC0706_skSDlib.zip

プログラムソースをダウンロードしたら、MPLAB Xにてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプ ロジェクトに取込んで下さい。
次にコンパイルPIC書き込みを実行して下さい。
MPLAB(R) XC8 C Compiler Version 1.40コンパイラを使用しています。

ダウンロードファイルを解凍すると下記の様なファイル構成です。
 Snapshot.c・・・・・ 本体のプログラムソースファイル(スナップ写真を撮るサンプル)
 MotionMon.c・・・・ 本体のプログラムソースファイル(動きを監視するサンプル)
 skVC0706.c・・・・・・VC0706-chip用関数ライブラリのソースファイル
 skVC0706.h・・・・・・VC0706-chip用関数のヘッダファイル
 skUARTlib.c・・・・・・USART通信を行う関数ソースファイル
 skUARTlib.h・・・・・・USART通信を行う関数のヘッダファイル
 skSDlib.c・・・・・・・・・SDライブラリ関数ソースファイル
 skSDlib.h・・・・・・・・・SDライブラリ用ヘッダファイル
 skSPIlib.c・・・・・・・・・SPI通信を行う関数ソースファイル
 skSPIlib.h・・・・・・・・・SPI通信を行う関数のヘッダファイル
 skI2CLCDlib.c・・・・・I2C接続LCDライブラリ関数ソースファイル
 skI2CLCDlib.h・・・・・I2C接続LCDライブラリ用ヘッダファイル
 skI2Clib.c・・・・・・・・・I2C通信を行う関数ソースファイル
 skI2Clib.h・・・・・・・・・I2C通信を行う関数のヘッダァイル

 尚、CPUのクロックは32MHzを想定しています。
 なので通信速度等(USART/I2C)はシステムクロック32MHzで計算されています。

Snapshot.c

スナップ写真を撮るサンプルです、 起動させるとLCDの1行目に[ Camera ]が 表示されます、
この時にSDカードが挿入されていなかったり、SDの初期化が失敗すればLCDの2行目に
[ErrorSDC]が表示されます。
でぇ3秒後、
LCDの1行目にはファームのバージョン[VC0703 1].00 を表示し、エラー時は[ERR-0x11]を表示する。
LCDの2行目には画像のサイズ[640x480]を表示 し、エラー時は[ERR-0x30]が表示されます。
撮影準備完了です。

カメラを撮影対象に向けスイッチを押しましょう、[SwitcnON] が表示されます。
正常時は、LCDの2行目に進捗情報として書き込み回数を表示します。
終了すればLCDの1行目に[Success ]が表示 されます。
失敗時は、ファイルのオープンエラー[FailOpen]か、TakePictureエラー[ERR-0x36]が表示されます。

ファイル名について

IMG?????.JPG
?????に"00000"から撮影毎に+1されていきます、ですが電源を切ればまた"00000"から
カウントされるので同じファイル名は上書きされるでしょう。
それが嫌な場合はEEPROMに番号などを書き込んで処理をしましょう。
EEPROMの読み書き方法はこちらのMCC-Memory編の記事 を参考にして下さい。

MotionMon.c

動きを監視するサンプルです、起動後約3秒後に
LCDの1行目にはファームのバージョン[VC0703 1].00 を表示し、
LCDの2行目に[StartMon]を表示してモーション監視が開始されます。

動きを検知したら"Detected" を表示し、3秒後に文字を消しますが、監視は続行中でぇ
再び動きを検知したら"Detected" 表示を繰り返します。

このサンプルは"Detected"を表示するだけですので後はご自分で、写真を保存するなり
警報を出すなりご自由に行いましょう。

このカメラには、 動きを監視する為の微調整を行う設定が出来るらしいがぁ...
どんなにやったら良いかわからん。


カメラの実写1
そのままの写真です、加工無し
我が家の庭の紅白梅の木ですがぁ....
でもぉ、カメラ何処に向けているか解らないんだよね...orz

《ライブラリの説明》

上の画像で約24 秒程データをファイルに保存するのに掛かります。
"skVC0706.h"に
#define VC070X_READDATA_BUFFSZ        128    // 画像データ受信バッファサイズ
"skUARTlib.h"に
#define UART_BUFFER_SIZE   128     // USARTの受信バッファサイズ
の行が有ります、これを"256"にした場合は、約19秒程でした。
SDの書き込み単位が512byteなのでこれまでは変更できますが、PICのSRAMとの相談になります。
尚、この値を小さくすればSRAM1024byte以内でも入ると思うがぁ...

skVC0706.h

VC0706-chipとUSART通信で制御を行う為の関数ライブラリ用ヘッダファイルです。
"skVC0706.c"を利用する場合に
#include "skVC0706.h" をプログラムの先頭で記述して下さい。

今回は32MHzで利用しているので、
#ifndef _XTAL_FREQ
// Unless already defined assume 32MHz system frequency
// This definition is required to calibrate __delay_us() and __delay_ms()
#define _XTAL_FREQ 32000000 // 使用するPIC等により動作周波数値を設定する
#endif
と記述しています、32MHz以外で利用する人は"32000000"を書き換えて下さい。

skVC0706.c

VC0706-chipとUSART通信で制御を行う為の関数集です。
(VC0703chipでも動作するかもですがchipないので不明です)
この関数集自体は他のPICでもおそらく使用出来ると思います。

ans = VC070x_GetError( )
 エラー情報を得る処理
 最後に受信した時のエラー番号を返します。
 なので、関数をコールしてエラーだった場合はこの関数でエラー内容を知る事が出来ます。

 uint16_t ans:1byte目に”コマンド番号” 2byte目に"エラー番号"で返します。
        エラー番号
                     0 = コマンドを正しく実行します。(正常時)
                     1 = システムはコマンドを受信しません。
                     2 = データ長がエラーです。
                     3 = データフォーマットエラー。
                     4 = コマンドは今実行できません。
                     5 = コマンドが受信されましたが、正しく実行されませんでした
                    
10 = 送信したコマンドの返答でない物を受信した。
           11 = 返答を待ったがタイムオーバー
  例)
union VC070X_ERROR_t Err ;
char *p ;

p = VC070x_GetVersion() ;
if (p == 0) {
Err.info = VC070x_GetError() ;
printf("GetVersion error cmd=%d err=%d",Err.cmd_no,Err.err_no) ;
} else printf("%s",p) ;

ans = VC070x_Reset( )
 カメラのリセットを行う処理
 リセットすると電源ON時と同じメッセージを送信して来るので、関数内で1秒待ち読み捨てています。
 電源ON後2-3秒程してコマンド指示を開始する様にデータシートに書いて有るので、
 リセットしたら2-3秒程待った方が良さげかもね。

 int ans:成功時は0を返し、失敗時は-1を返します

ans = VC070x_GetVersion( )
 ファームウェアのバージョンを得る処理

 char *ans:成功時はバージョン情報文字列へのアドレスを 返します(例:"VC0703 1.00\0")
        失敗時は0を返します。

ans = VC070x_PowerCtl(info,time)
 省電力モードの制御を行う処理(この処理は未実験)

 int        info: 0=OFF 1=ON その他 = 指定time時間で省電力モードに入ります
 unit16_t time:10ms単位で指定(0x0000-0xFFFF)します
 int         ans:成功時は0を返し、失敗時は-1を返します

ans = VC070x_GetCompression( )
 画像の圧縮比を得る処理

 int  ans: 成功時は0x00〜0xFFを返し、失敗時は-1を返します

ans = VC070x_SetCompression( val)
 画像の圧縮比を設定する処理
 リセットすると元に戻ります、Myカメラのデフォルト値は0x35でした。

 int   val:画像圧縮比の指定をしま す、0x00〜0xFFです(数値が高いと圧縮比も高い)
 int  ans:成功時は0を返し、失敗時は-1を返 します

ans = VC070x_GetColorSts( )
 COLORのモードを得る処理

 int  ans:成功時は 0=自動設定  1=COLORモード  2=白黒モード
                失敗時は-1を返します。

ans = VC070x_SetColorCtl( val)
 COLORのモードを設定する処理(この処理は上手く動作せず)
 白黒モードにして見たがぁ、色落ち?になっただけで白黒にならなかったが?
 自動は、光加減で切り替わるらしいのでぇ夜になったら白黒に切り替わるのでは?

 int   val:COLORのモードの指 定をします(0=自動設定  1=COLORモード  2=白黒モード)
 int  ans:成功時は0を返し、失敗時は-1を返 します

ans = VC070x_GetImageSize( )
 画像の大きさを得る処理

 int  ans:成功時は  0(0x00)="640x480"  17(0x11)="320x240"  34(0x22)="160x120"
               失敗時は-1を返します。

  画像の大きさを設定する処理を行って見たのですが、設定後リセットしたり等いろいろ
   いじってみたのですがぁ...上手く動作させる事が出来ず"640x480"から変わりませんでした。

ans = VC070x_MotionCtlEnable( )
 モーション監視を許可する処理

 int  ans:成功時は0を返し、失敗時は-1を返 します

ans = VC070x_SetMotionCtl(val)
 動きのモニターリングを制御する処理

 int   val:1=モニターリング開始   0=モニターリング停止
 int  ans:成功時は0を返し、失敗時は-1を返 します

ans = VC070x_MotionDetect( )
 モーション監視を行う処理
 カメラのフレーム内で動きが有った場合に"COMM_MOTION_DETECTED(0x39)" が通知されます、
 なので、この関数はwhile(1){ }内で常にコールする必要が有ります。("MotionMon.c"を参照)

 int  ans:-1 = 何も受信していないか或いはエラーを受信した
               それ以外は、受信したコマンド番号を返します。

  "COMM_MOTION_DETECTED(0x39)"以外のコマンドも受信する所に注意しましょう。

ans = VC070x_TakePicture( )
 画像をキャプチャーする処理
 この関数をコールする場合は、ビデオが起動している事が前提です。

 uint32_t ans:成功時はキャプチャーした画像のファイ ルサイズを返します
                       失敗時は0を返します。

ans = VC070x_ReadPicture(adrs,len)
 画像データを読み込む処理
 キャプチャーした画像データを、指定したFBUFのアドレスから指定した分だけ読み込みます。

 uint16_t adrs:読み込むFBUFのアドレスを指定し ます(8の整数倍で指定)
 int         len:読み込むデータの長さ指定します
                       (VC070x_READDATA_BUFFSIZ未満とし、4の整数倍で指定)
 int      ans:成功時は読み込ん だデータの格納先を返します

ans = VC070x_ResumeVideo( )
 ビデオを再開する処理
 写真を取り込んだらこの関数でビデオを再開させます。

 int ans:成功時は0を返し、失敗時は-1を返します

  "プロトコル説明書"のFBUF_CTRLで、resumeは0x02となっていますが0x03の間違いと思います。



カメラの通信速度変更は実験していません、壊れるとぉ泣いちゃうのでぇ...


skI2CLCDlib.c
skI2CLCDlib.h
skI2Clib.c
skI2Clib.h

この内容は”秋月電子I2C接続小型LCDモ ジュールに表示を行う”を参照下さい。
但し、"skI2Clib.h"はMSSP2側を利用する様に#define定義しています。
32MHz以外で利用する人は"32000000"や通信速度を書き換えて下さい。


skUARTlib.c
skUARTlib.h

この内容は”FT232RL使用によりUSBをシリアル変換し てマイコンと繋ぎます”を参照下さい。
但し、"skUARTlib.h"はUSART1側を利用する様に#define定義しています。
また、USARTの受信バッファサイズは128byteとしています。

skSDlib.c
skSDlib.h
skSPIlib.c
skSPIlib.h

この内容は”MMC/SDカードを接続し読書きを行って見ます”を参 照下さい。
但し、"skSPIlib.h"はMSSP1側を利用する様に#define定義しています。
また、システムクロックは"32MHz"でSPIの通信速度は"Fosc/4(8MHz)"に変更しています。
尚、SPIの通信速度はSDカードの"スピードクラス"によって異なるので注意が必要かも ね。

《fileioで動作させて見た》

Microchip社MLA(Microchip Libraries for Applications)のFramework”fileio”で動作させて見ます。
詳しい内容はこちらを参照して下さい。
又、プログラムはこちらの”fileio_PIC18.zip”+ "VC0706_fileio.zip" のプログラムを使います。
fileio_PIC18.zip”の"main.c"ファイルを "VC0706_fileio.zip"の"Snapshot.c"と入れ替えて
コンパイルします。
尚、回路とプログラムの動作は上記と同じです。

コンパイルしたら、プログラム60%でSRAMが49%やはりでかい、
因みに”skSDlib”では、プログラム21%でSRAMが30%。
だがぁ、保存速度がぁ”skSDlib”は約24秒で”fileio”が約17秒....さすがぁMicrochip社
(さすがに"skSDlib"プログラムを見直そうかな.....)

《FlashAirの話》

SDカードソケットに"FlashAir"を挿入すれば動作します、なので、こちらを参考に操作すれば
保存された画像ファイルをPCや携帯にダウンロードしたり、"iSDIO"の機能を利用してブラウザから
動画撮影やそれをブラウザに表示させたりとか出来ると思います。
ここではその実験は行いませんが...

PS. 実験を行いました、”メール通知編”をご覧下さい。

《その他》

"adafruit"のF.A.Q.ページに
?Why is the color washed out? It looks like a monochrome image.
Because it was designed for surveillance, the sensitivity of the camera extends into the infrared range.
This means that objects that reflect or emit infrared rays will appear lighter than the do to the human eye.
In some cases the image will appear washed out and almost monochromatic.
A more natural rendering can be achieved using an IR blocking filter such as a B+W 486.

?なぜ、色が洗い流されたのですか? モノクロ画像のように見えます。
監視用に設計されているため、カメラの感度は赤外線範囲に及んでいます。
これは、赤外線を反射または放射する物体が、人間の目の光よりも明るく見えることを意味する。
場合によっては、画像は洗い流されてほぼ単色に見えます。
より自然なレンダリングは、B + W 486などのIRブロックフィルタを使用して実現できます


 Google翻訳による

こんな感じでぇ、写真がぁ白黒ぽく撮れる場合が多々有るのですよぉ〜。
ああ、って事はぁ、赤外線LEDを取り付ければ夜でもバッチリって事ですねぇ。

他のカメラを手に入れてもう一度(他の機能等)実験したい気分だがぁ、先立つ物がない....orz....
まあ、あくまで監視用カメラって所ですね、画質には期待しない方がよさげぇ。




リンクの見直し(*1) 2020/03/17


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.