JPEGカメラを試してみる その4
(動きを検出したら電子メールを送信してみる編)

〔PCで動作編〕 〔PICで接続編〕 〔Arduinoで接続編〕   〔マイコンのトップに戻る〕


前ページその1では、パソコンにカメラを接続して動作確認の記事を書きました。
そして、その2(PIC)・その3(Arduino)でマイコンに接続してSDカードに画像を保存する記事を書きました
ですので、ここの実験を行いたい人はまずその1その2を読んでからをお勧めします。
(って言うかぁ、その1その2をまず実験してからの方が良いです)

VC0706チップ搭載のJPEGカメラは、カメラ画像の変化即ちカメラ前で何か動きが有った場合に
通知してくれる"モーション監視"機能が搭載されています。
この機能の簡単な動作サンプルプログラムは、その2その3で実験しています。

でぇ、ここのその4では、カメラが動きを検知したらその時の画像をSDカードに保存し、電子メールで
画像を添付し送り出して見たいと思います。
この実験はSDをFlashAirに 替えるだけで、勇気と希望と情熱さえあれば誰にでも簡単に動作させる事
が出来るのですよぉ、素晴らしい、ワンダフォー、(^-^)//""

その4の実験ポイントは
その2の技でぇ、”動きを検知し”その時の画像を”FlashAir(SD)”に保存します。
FlashAirのiSDIO機能を使いFlashAirの共有メモリに”保存した画像のファイル名”をセットします。
・FlashAir搭載Lua機能の”MailSend”関数を使ったスクリプトを作成しFlashAirに書き込んで置きます。
 後はFlashAirに監視画像が保存された時にこのスクリプトファイルが実行されます。 *1)
 スクリプトファイルが実行されれば共有メモリから”画像のファイル名”を取り出してそのファイルを
 添付して”メールを送る”事になります。

FlashAir外観これがFlashAirです、SDHC カードに無線LANを内蔵した物です。
今では何処でも手に入ると思われますが、FlashAirの第3世代(W-03)以降で
ファームウェアバージョン3.00.01以降でないと実験不可です。

このFlashAirの記事はこちらか、
東芝の「FlashAir SD-WE/WD/WCシリーズマニュアル」のサイトを見ましょう。

《FlashAirのファームウェアバージョンチェック》

このページの実験には、FlashAirのファームウェアバージョンがV3.00.01以上でないと動作しません。
チェックは、FlashAirの\SD_WLAN\CONFIGファイルを開きます、”VERSION=FA9CAW3AW3.00.01”と
なっていればOKですが、そうでなければぁ、東芝サイトのソフトウェア更新ツールをダウンロードして
実行しましょう。
実行後は設定情報が買った時の状態に戻ります、注意ですね!!
(FlashAirTool.exeツールを実行してもバージョンは表示されますです、ハイ。)

《FlashAirの共有メモリ》

FlashAirとマイコン或いは無線LANデバイスとデータのやり取りを行うのにFlashAir内の共有メモリを
介して行えば簡単にコミュニケーションをとる事が可能になります。

こちらのレジスタマップを見て下さい、共有メモリで読み書きする部分は"Reserved for Vendor"部分の0x1000番地から512バイトです。 *1)

その部分の先頭から12バイトに保存する画像のファイル名をiSDIO機能でPICが書き込みます、
ファイル名は IMG?????.JPG ?????に "00000"から撮影毎に+1されていきます。
でぇ、Luaスクリプトファイル(mail_NotifyMotion.lua)は画像が書き込まれた時に自動起動されるので
起動後、共有メモリの先頭3バイトが"IMG"ならメールを送信し、メモリに"000000000000"を書き込み
終了する様になっています。ですので画像ファイル名は変更しない様に注意しましょう。

《FlashAirの設定》

FlashAirをここの実験で使用出来るように設定を行う必要が有ります。
FlashAirの基本設定とFlashAirTool.exeツールのインストール操作はこちらのページを参照下さい。

FlashAirの同時接続機能について

今回の実験では、メールを送信するのでお使いのインターネットに接続されているAPにアクセスする為
にFlashAirの"インターネット同時接続機能を有効にする"操作を行う必要が有ります。
(LuaスクリプトやiSDIO機能でも接続出来るのですがぁ、ここのページでは取り合えず下記の操作方法
 を採ります)

@ ”FlashAirTool”を起動させます。(無論FlashAirはPCに接続)

A ツールのメニューから"ネットワーク設定"をクリックします。

B "インターネット同時接続機能を有効にする"にチェックを入れ、接続先APの"SSID"と"パスワード"
  を設定後、[適用]ボタンをクリックします。
  (これでFlashAirが電源ONした時にAPに自動的に接続するはずです)

APに接続している最中に、AP側がダウンし再起動してもFlashAirは再接続を行いません、なので、
  本当はメール送信時にLuaスクリプトやiSDIO機能でAPに接続する様にした方が良いかもね

Luaスクリプトについて

Luaスクリプトを起動させるには以下の3つのタイミングが有ります。

SDカードの起動時に実行
 LUA_RUN_SCRIPTで起動時に実行するLuaスクリプトのパスを指定します。
SDカードにファイルを書き込んだ時に実行
 LUA_SD_EVENTでファイル書き込み時に実行するLuaスクリプトのパスを指定します。
 今回は画像ファイルが保存された時に実行させたいのでこのタイミングを使います。
SDカードにブラウザからアクセスした時に実行
 "http://flashair/xxxx.lua"等とアクセスを行う、スクリプトの標準出力がブラウザの画面に表示出来る

@ 下記からダウンロードしたスクリプトファイル(mail_NotifyMotion.lua)を
  FlashAirのルートディレクトリにコピーします。
A FlashAirの”\SD_WLAN\CONFIG” ファイルをメモ帳辺りで開きます。
B ”LUA_SD_EVENT=/mail_NotifyMotion.lua”を追記します。
C スクリプトファイルを開き、メールの送信先/送信元とプロバイダーの接続するメールサーバに
  契約ID/パスワードを書き換える必要が有ります(下記参照)。

Lua スクリプトはファイルが書き込まれた時に起動するが、どのファイルが書き込まれたのかは
  判りません、ファイルのタイムスタンプ等で一番新しい時刻を探すとか何か対策を講じなければ
  なりませんが、今回は共有メモリを介してファイル名を渡す様にしました。

スクリプトファイル(mail_NotifyMotion.lua) の例
下は"yahoo"のメールサーバでの例です、自分の環境に合わせて青 い文字部分を書き換えて下さい。
因みに、緑色文字部分がメールのタイトルです。
fname = fa.sharedmemory("read", 0, 12, 0)  -- 共有メモリからファイル名を読込む
if (string.sub(fname,1,3) == "IMG") then
from = "txnww????@yahoo.co.jp" -- 送信元
rcpt = "txnww????@ybb.ne.jp" -- 送信先
ans = fa.MailSend {
from = from,
headers = "To: "..rcpt.."\r\nFrom: "..from.."\r\nSubject: 動きを検出したぞぉ!",
body = "カメラ1が動作した。", -- メールの本文
server = "smtp.mail.yahoo.co.jp", -- 接続するメールサーバ
user = "txnww????",
password ="??????",
attachment = fname, -- 送付するファイル名
ContentType = "image/jpg"
}
fname = fa.sharedmemory("write", 0, 12, "000000000000")
print(ans)
end
メールのタイトルと本文が日本語になっていますがFlashAirが変換してくれるみたいです、
  半角文字の英数字が混じった時に上手く変換されないパターンが有ったので、
  その場合は諦めて半角文字の英数字としましょう。

《モーション監視機能コマンドフォーマット》

VC0706チップの”モーション監視”関連のコマンドフォーマットです。

MOTION_CTRL - モーション監視の有効無効を設定する
 [0x56] [0x00] [0x42] [0x03] [
0x00] [0x01] [enabling control]
 enabling control 0x01=有効 0x00=無効

COMM_MOTION_CTRL
- モニターリングの制御を行う
 [0x56] [0x00] [0x37] [0x01] [control flag]
 control flag 0x01=開始 0x00=停止

カメラからの返答
 正常:[0x76] [0x00] [0x42or0x37] [0x00] [0x00]
 異常:[0x76] [0x00] [0x42or0x37] [0x03] [0x00]

COMM_MOTION_DETECTED - 動きを検出した時にカメラから通知される
 [0x76] [0x00] [0x39] [0x00]

※ 木々が風で揺れても動作したり等ちょっとした動きでも反応しまくりなのでサンプルプログラムは
  通知を数回受けたら”検知”としています。
その1で紹介した”VC0706CommTool.exe”ツールによれば、”動きしきい値の設定”や
  ”Motionモーションウィンドウの位置設定” 等のMotion Settingが出来る様であるがぁ...
  やり方が不明です。もっとぉ解り易いマニュアルを書いてほしいぞぉ、困ったもんだぁ。

《実態配線図》

実態配線図
この実態配線図はその2と同じ物です、
詳しくはそちらを参照下さい、但し、スイッチは使いません。
最近、この実験回路を使い回ししている気がするなぁ

《送信するかちょっとぉ実験》

メールが送信出来るのかをFlashAir単体でちょっと送ってみましょう。

@ FlashAirに"IMG00000.JPG"として何か画像 ファイルを書き込んで置きましょう。

A 上記を読んで、FlashAirの設定やCONFIGファ イルの設定にスクリプトファイルのコピー&編集等は
  終了していますね。

B 上回路のSDカードスロットの電源のみ配線してFlashAirを刺し電源を入れて下さい、
  又は、PCにSDスロットが有ればそこに刺しても良いです。

C ブラウザーのアドレスバーで[http://flashair/] を入力しましょう。
FlashAirのディレクトリ画面
この様な感じでディレクトリ内容が表示されたら接続OKです。
上手く表示されない場合はFlashAirの設定を見直しましょう。

D 次に共有メモリにファイル名をセットします、ブラウザーのアドレスバーで
  [http://flashair/command.cgi?op=131&ADDR=0&LEN=12&DATA=IMG00000.JPG] を入力しましょう。
  成功すれば、”SUCCESS”がブラウザに表示されます。

E メールを送るのでluaスクリプトファイル(mail_NotifyMotion.lua) を起動させます。
  ブラウザーのアドレスバーで[http://flashair/mail_NotifyMotion.lua]と入力しましょう。
  (”SDカードにブラウザからアクセスした時に実行”で直接起動させます)
  成功すれば、”Mail 送信 MailSend is success.終了”がブラウザに表示されます。

F メールを見て下さい、”動きを検出したぞぉ!”のタイト ルで送信されていると思います。
  上手く送信されない場合は、スクリプトファイル記述のメール設定を見直しましょう。

《本番の実験》

注意)
2017年頃は”SMTP-AUTH”承認は無かった気がするがぁ、2021年現在は導入されています。
ですがぁ、ここのプログラムでは”SMTP-AUTH”の実装がされていないので動作しないでしょう。
 *2)

上記の実験でFlashAir単体でのメール送信は出来たと思います。
次はPICのサンプルプログラム(mail_MotionMon.c)を書き込んで行います。

@ 上記実験が終了しているので、FlashAirの設定やCONFIGファイルの設定にスクリプトファイルの
  コピー&編集等は済んでいると思います。

A 上の回路は配線済んでいますね、サンプルプログラム(mail_MotionMon.c)はコンパイルしてPICに
  書き込み済んでいますね。

B SDカードスロットにFlashAirを刺し回路電源を入れて下さい。
  起動させるとLCDの1行目に[ Camera ]が表示されます、この後約10秒に初期化が始まります
  (FlashAirが立ち上がるのを待つ為に10秒程Sleepしています)

C SDカードの初期化を行います、SDカードが挿入されていなかったり、SDの初期化が失敗すれば
  LCDの2行目に[ErrorSDC]が表示されます。
  次にLCDの1行目にはカメラのファームウエアバージョン[VC0703 1].00を表示し、LCDの行目に
  [StartMon]を表示してモーション監視が開始されます。
  もし、カメラがエラーを返せばLCDの1行目に[ERR-0x11]を表示し、LCDの2行目に[ERR-0x30]が
  表示されます。

D カメラの前で手をかざして数秒間動かして見て下さい。
  (カメラの前を手が横切った位では動作しないと思います)
  動きを検知した場合、LCDの1行目に[motionON]を表示します。
  正常時は共有メモリにファイル名を書込み、LCDの2行目に進捗情報として書き込み回数を表示
  します。終了すればLCDの1行目に[Success ]が表示されます。
  失敗時は、ファイルのオープンエラー[FailOpen]か、TakePictureエラー[ERR-0x36]が表示されます
  
E 後は上記実験の様にFlashAirがメールを送信してくれるはずです。
  (動きを検知してから約1分程でメールが届くと思います。)

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

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

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

ダウンロードファイルを解凍すると下記の様なファイル構成です。

 mail_NotifyMotion.lua・・・・・ luaスクリプトファイル(メールを送信するサンプル)

 mail_MotionMon.c・・・・本体のプログラムソースファイル(動き検出時写真を記録するサンプル)
 skVC0706.c・・・・・・・・・ VC0706-chip用関数ライブラリのソースファイル
 skVC0706.h・・・・・・・・・ VC0706-chip用関数のヘッダファイル
 skUARTlib.c・・・・・・・・・ USART通信を行う関数ソースファイル
 skUARTlib.h・・・・・・・・・ USART通信を行う関数のヘッダファイル
 skiSDIOlib.c・・・・・・・・・ iSDIOライブラリ関数ソースファイル
 skiSDIOlib.h・・・・・・・・・ iSDIOライブラリ用ヘッダファイル
 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で計算されています。

mail_MotionMon.c

動き検出の調整として、約15秒以内にカメラからの検出信号(コマンド)を6回受けたら本検出と
しています、その変更調整ポイントは
#define DETECTED_COUNT   6              // 動きを6回検出で、本検出とする

// 最初の動き検出から約15秒以内にDETECTED_COUNT数だけ検出無しならリセット
Wait(10) ; // 100ms
if (d_cnt != 0) {
t_cnt++ ;
if (t_cnt >= 150) {
d_cnt = t_cnt = 0 ;
}
}
と上記の赤数値部分を調整下さい。
[Motion Setting]が出来るのであればこんな事しなくても良いかもなのだがぁ....

skVC0706.c
skVC0706.h

この内容は”その2”を参照下さい。

skiSDIOlib.c

skiSDIOlib.h

この内容は”FlashAir のiSDIO機能を使いPICから操作して見ます ”を参照下さい。
ライブラリ内の"writeExtMemory( )"関数のみ使っています。

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

この内容は”秋月電子I2C接続小型LCDモ ジュールに表示を行う”を参照下さい。
但し、"skI2Clib.h"はMSSP2側を利用する様に#define定義しています。

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)"に変更しています。

《その他》

これでぇ不審者や侵入者にペットの見張りに寝たっきりな人の監視等に見張り番くんが簡単に出来そうですね。



リンクの見直し(*1) 2020/03/17
"SMTP-AUTH"認証未実装(*2) 2021/03/05


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