TTGO-Camera による定点観測・WEBサーバ経由の画像公開
2020.03.04
YouTubeでポイントを説明しています。画像をクリックすると再生できます。
今回は、TTGO-Cameraを用いて定点観測した画像をWEB公開する仕組みを構築します。
TTGO-Camera の画像を直接インターネットに流すのではなく、WEBサーバ側から定期的にTTGO-Cameraを呼び出して画像を取得・保存して、
保存した画像の中から最新の画像を公開します。
■TTGO T-Camera ESP32 WROVER & PSRAM Camera Module ESP32-WROVER-B OV2640 Camera Module 0.96 OLED (魚眼レンズ)

TTGO T-Camera はイメージセンサーにOV2640(オムニビジョン)を搭載、UXGA(1600×1200)解像度での撮影が可能です。
ESP32に小型LCD、人感センサーが付き、PSRAMは8Mバイトです。
技適取得済みですので安心して使用できます。
【T-Camera specification】
Master Chip: | esp32 dual-core |
Protocol: | Wi-Fi 802.11 b/g/n & Bluetooth 4.2 BLE & BR/EDR |
Flash: | 4MBytes |
PSRAM: | 8MBytes |
Display: | SSD1306 I2C(OLED液晶128×64) |
PIR: | AS312(モーションセンサー) |
Uart Chip: | CP2104 |
Charging chip: | IP5306 I2C |
Camera: | OV2640(カメラ2M pixel) |
■TTGO T-Camera 動作確認
予め、GitHubで公開されているサンプルプログラムが書き込まれているので、
USBから電源供給すると、アクセスポイントモード(AP-Mode)で起動します。
WiFi接続に、TTGO-CAMERA-XX:XXを選択します。
http://2.2.2.1に接続すると設定画面が表示されます。
設定画面上部の解像度(Resolution)を適当に変更して、画面を下のほうにスクロール、[Start Stream]を押します。
カメラからの映像が表示されます。TTGO-Cameraの基板にカメラが逆さに取り付けられているので、画像の上下が逆になっています。
■開発環境・WEB公開環境
【開発環境】
プログラムのビルド、TTGO-Camera への書込み、画像ファイル転送テストを行います。
Platform : | Raspberry Pi 2 Model B (ARMv7) |
Distribution : | Raspbian Stretch |
【WEB公開環境】
TTGO-Camera からの定期的な画像取得およびその画像を公開します。
Platform : | Raspberry Pi 3 Model B+ |
Distribution : | ubuntu 18.04.3 server |
■ライブラリ・ダウンロード
Interface 2020年 04 月号
今回の内容はこちらを参考にしています。一読されると理解を深められると思います。
使用するソースコードは下記よりダウンロードしてください。
Interface 2020年4月号 マイクロIoTカメラ
IF2004A.zip を解凍して、
→[IF2004A]
→[esp32_ttgo]
→[ttgo_wifi_httpd]
→[esp32_cam2]
→esp32_cam2.ino を使用します。
esp32-camera-master.zip
ソース解析用にこちらもダウンロードしておきましょう。
■esp32_cam2.inoの編集・ビルド
開発環境にはARMv7あるいはARMv8のラズベリーパイが必要です。後述しますが、TTGO-Camera を固定ローカルIPアドレスでブロードバンドルータに
WiFi接続するようにプログラムの書き換えを行います。
また、プログラムを書き込むために、Raspberry Pi と TTGO-Camera をUSB接続します。
プログラムのビルドには、Platformioを使用します。
まずは、接続デバイスを確認します
$ platformio device list
/dev/ttyUSB0
------------
Hardware ID: USB VID:PID=10C4:EA60 SER=01B86EA3 LOCATION=1-1.5
Description: CP2104 USB to UART Bridge Controller
/dev/ttyAMA0
------------
Hardware ID: 3f201000.serial
Description: ttyAMA0
利用できるボードを確認します
$ platformio boards "espressif32"
Platform: espressif32
=======================================================================
ID MCU Frequency Flash RAM Name
------------ ----- ----------- ------- ------ --------------------
esp32cam ESP32 240MHz 4MB 320KB AI Thinker ESP32-CAM
.....
開発環境の初期化を行います
$ mkdir ~/TTGO-Camera
$ cd ~/TTGO-Camera
$ platformio init -b esp32cam
esp32_cam2.ino を初期化により作成された srcディレクトリの下にコピーします。
余談ですが、はじめは開発環境に手軽なRaspberry Pi Zero Wを使おうと思ってました。
下記は、Raspberry Pi Zero W でビルドした結果です。
$ platformio run
Processing esp32cam (platform: espressif32; framework: arduino; board: esp32cam)
-----------------------------------------------------------------------
PlatformManager: Installing espressif32
Downloading [####################################] 100%
Unpacking [####################################] 100%
espressif32 @ 1.11.2 has been successfully installed!
The platform 'espressif32' has been successfully installed!
The rest of packages will be installed automatically depending on your build environment.
PackageManager: Installing tool-esptoolpy @ ~1.20600.0
tool-esptoolpy @ 1.20600.0 has been successfully installed!
PackageManager: Installing toolchain-xtensa32 @ ~2.50200.0
Error: Could not find a version that satisfies the requirement '~2.50200.0' for your system 'linux_armv6l'
platformioは以下のURLからパッケージを探します。
http://dl.platformio.org/packages/manifest.json
manifest.jsonの中身をみてみると
....
"toolchain-xtensa32": [
{
"sha1": "78fd686e27d2619a2691150a25015ab44ae5d7ca",
"system": [
"linux_armv7l",
"linux_armv8l"
],
"url": "http://dl.platformio.org/packages/toolchain-xtensa32-linux_armv7l-2.50200.80.tar.gz",
"version": "2.50200.80"
},
....
linux_armv61 は対象外なので、パッケージをダウンロードできませんでした。
開発環境をRaspberry Pi 2 (ARMv7)に換えてビルドします。
$ platformio run
Processing esp32cam (platform: espressif32; board: esp32cam; framework: arduino)
----------------------------------------------------------------
PlatformManager: Installing espressif32
Downloading [##########################] 100%
Unpacking [##########################] 100%
espressif32 @ 1.11.2 has been successfully installed!
The platform 'espressif32' has been successfully installed!
The rest of packages will be installed automatically depending on your build environment.
PackageManager: Installing framework-arduinoespressif32 @ ~3.10004.191002
Downloading [##########################] 100%
Unpacking [##########################] 100%
framework-arduinoespressif32 @ 3.10004.200129 has been successfully installed!
PackageManager: Installing toolchain-xtensa32 @ ~2.50200.0
Downloading [##########################] 100%
Unpacking [##########################] 100%
toolchain-xtensa32 @ 2.50200.80 has been successfully installed!
PackageManager: Installing tool-esptoolpy @ ~1.20600.0
tool-esptoolpy @ 1.20600.0 has been successfully installed!
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32cam.html
PLATFORM: Espressif 32 1.11.2 > AI Thinker ESP32-CAM
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
DEBUG: Current (esp-prog) External (esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES: framework-arduinoespressif32 3.10004.200129 (1.0.4), toolchain-xtensa32 2.50200.80 (5.2.0), tool-esptoolpy 1.20600.0 (2.6.0)
Converting esp32_cam2.ino
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 26 compatible libraries
Scanning dependencies...
Dependency Graph
|-- 1.0.1
|-- 1.0
Building in release mode
Compiling .pio/build/esp32cam/src/esp32_cam2.ino.cpp.o
Generating partitions .pio/build/esp32cam/partitions.bin
/home/pi/TTGO-Camera/src/esp32_cam2.ino:40:21: fatal error: SSD1306.h: No such file or directory
*****************************************************************
* Looking for SSD1306.h dependency? Check our library registry!
*
* CLI > platformio lib search "header:SSD1306.h"
* Web > https://platformio.org/lib/search?query=header:SSD1306.h
*
*****************************************************************
#include "SSD1306.h"
compilation terminated.
Compiling .pio/build/esp32cam/libe19/Wire/Wire.cpp.o
Compiling .pio/build/esp32cam/libd94/WiFi/ETH.cpp.o
*** [.pio/build/esp32cam/src/esp32_cam2.ino.cpp.o] Error 1
============== [FAILED] Took 210.86 seconds =============
SSD1306.h が見つからないと言われたので、まずはライブラリを検索します。
$ platformio lib search "header:SSD1306.h"
$ platformio lib search "header:SSD1306.h"
ESP8266_SSD1306
===============
#ID: 562
I2C display driver for SSD1306 OLED displays connected to ESP8266, ESP32, Mbed-OS
Compatible platforms: Espressif 32, Espressif 8266
Authors: Daniel Eichhorn, ThingPulse, Fabrice Weinberg
ESP8266 and ESP32 OLED driver for SSD1306 displays
==================================================
#ID: 2978
I2C display driver for SSD1306 OLED displays connected to ESP8266, ESP32, Mbed-OS
Compatible platforms: Espressif 32, Espressif 8266
Authors: ThingPulse, Fabrice Weinberg
ssd1306
=======
#ID: 1904
Display driver for VGA, SSD1306, SSD1325/SSD1327, SSD1331, SSD1351, ILI9163/ST7735, ILI9341, PCD8544.
Compatible platforms: Atmel AVR, Atmel megaAVR, Atmel SAM, Espressif 32, Espressif 8266,,,,
Authors: Alexey Dynda
....
互換プラットフォームが適合するものだけでも複数のライブラリが見つかります。
https://github.com/lewisxhe/esp32-camera-series のREADME をみてみます
・OLED requires esp8266-oled-ssd1306 library support
のリンクをクリックすると、
ThingPulse OLED SSD1306 (ESP8266/ESP32/Mbed-OS)
に飛びます。
It is also available as a platformio library. Just execute the following command:
platformio lib install 562
とあるので、検索結果の先頭で表示されたライブラリが該当します。
$ platformio lib install 562
Library Storage: /home/pi/TTGO-Camera/.pio/libdeps/esp32cam
LibraryManager: Installing id=562
Downloading [####################################] 100%
ESP8266_SSD1306 @ 4.1.0 has been successfully installed!
$ platformio run
無事にビルドが完了しました。警告は無視しましょう。
■プログラムの書換え
esp32_cam2.ino を開いて、プログラムを書き換えます。
TTGO-Camera のIPアドレスの固定化、連続モードの解除、画像サイズ変更、表示補正を行います。
また、直接ブラウザ表示しないので、余計なヘッダー情報も出力しないようにしています。
$ vi src/esp32_cam2.ino
#define WIFI_SSID "*************" ← ネットワーク環境に合わせて
#define WIFI_PASSWD "*************" ← 設定してください
// capture and send
// while (1) { ← ループをコメントアウト
......
size_t hlen = snprintf((char *)tmp_buf, 64, _STREAM_PART, _jpg_buf_len);
//if ((res = httpd_resp_send_chunk(req, (const char *)tmp_buf, hlen)) != ESP_OK) return res;
if ((res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len)) != ESP_OK) return res;
//if ((res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY))) != ESP_OK) return res;
if (fb->format != PIXFORMAT_JPEG) free(_jpg_buf);
esp_camera_fb_return(fb);
......
// } // while
// return res;
....
IPAddress fixed_ip( 192, 168, 11, 30); // for fixed IP Address
IPAddress gateway( 192, 168, 11, 1); // Gateway Address
IPAddress subnet(255, 255, 255, 0); // Subnet Mask
IPAddress DNS( 192, 168, 11, 1); // DNS server
WiFi.config(fixed_ip, gateway, subnet, DNS);
Wire.begin(I2C_SDA, I2C_SCL);
if (psramFound()) {
config.frame_size = FRAMESIZE_XGA; // 1024x768
config.jpeg_quality = 10;
config.fb_count = 2;
....
oled.init();
参考:espressif/esp32-camera パラメタ一覧
Ref.https://github.com/espressif/esp32-camera
Ref.https://github.com/espressif/esp32-camera/blob/master/driver/include/sensor.h
Ref.https://github.com/espressif/esp32-camera/blob/master/driver/include/esp_camera.h
ビルドしたコードを、TTGO-Camera にアップロードします。
$ platformio run -t upload
ラズパイから、TTGO-Cameraの応答を確認します。
$ ping 192.168.11.30
PING 192.168.11.30 (192.168.11.30) 56(84) bytes of data.
64 bytes from 192.168.11.30: icmp_seq=1 ttl=255 time=1150 ms
64 bytes from 192.168.11.30: icmp_seq=2 ttl=255 time=126 ms
.....
■公開WEBサーバの設定
WEBサーバの構築は「ラズパイで自宅WEBサーバ構築 全16回」を参考にしてください。

TTGO-Camera を開発環境のラズパイから外して、電力供給用のUSBケーブルに繋ぎます。
カメラ画像取得用スクリプト作成
取得する画像は防犯目的も考慮して、上書き保存は行わず、日付をフォルダー名として作成し、
その下に、ファイル名 '時刻.jpg' として保存します。
また、TTGO T-Camera はカメラが逆さまに取り付けられているので、逆さまに映った画像を180℃回転させています。
<WEBサーバのドキュメントルート>
+-<TTGO-Camera>
+--<20200302>
| +-000000.jpg
| +-000500.jpg
| +-....
| +-235500.jpg
+--<20200303>
| +-....
+--<20200304>
| +-....
+--....
$ vi ~/TTGO-Camara/scripts/getImage.php
<?php
$folder = '/home/pi/www-root/TTGO-Camera/'.date('Y-m-d');
if (!file_exists($folder)) mkdir($folder,0777);
$savePath = $folder.'/'.date('His').'.jpg';
$fp = fopen($savePath,'w');
$ch = curl_init("http://192.168.11.30/");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);
fclose($fp);
$source = imagecreatefromjpeg($savePath);
$rotate = imagerotate($source, 180, 0);
imagejpeg($rotate, $savePath, -1);
imagedestroy($source);
imagedestroy($rotate);
?>
crontab 設定
5分おきに画像を取得します。
$ vi ~/TTGO-Camara/scripts/getImage.sh
#!/bin/bash
#
SCRIPTDIR=/home/pi/TTGO-Camera/scripts
INCPATH=.:/usr/lib/php
/usr/bin/php -d include_path=$INCPATH $SCRIPTDIR/getImage.php > getImage.log 2>&1
$ chmod a+x getImage.sh
$ sudo vi /etc/crontab
*/5 * * * * root /home/pi/TTGO-Camera/scripts/getImage.sh >/dev/null 2>&1
$ sudo service cron restart
※画像ファイルの削除
画像ファイルは防犯用途も考慮して、上書き保存ではなく、日時による新規作成の方法を用いています。
画像ファイルの削除もスクリプトファイルを作成して、定期的に古い画像を削除するようにするとよいと思います。
WEBページへの埋め込み
PHPで書かれた動的ページに埋め込む場合は、下記のようなコードを組み込みます。
<?php
......
$web_dir = '/TTGO-Camera/'.date('Y-m-d').'/';
$dirpath = '/home/pi/www-root'.$web_dir;
$dir = opendir($dirpath);
while (false !== ($filenames[] = readdir($dir))) ;
closedir($dir);
rsort($filenames);
if( is_file( $dirpath.$filenames[0]) ) {
echo '<img src="'.$web_dir.$filenames[0].'">';
}
......
?>
↓次のようなタグが挿入されます
<img src="/TTGO-Camera/2020-03-02/231500.jpg">
|

【深層学習関連】
【画像処理関連】

【音楽関連】

【WEBサイト構築関連】

【開発環境関連】

【SNS関連】

【周辺機器関連】

【その他】

トランジスタ技術 2021年1月号
特集: アナログ回路はノイズと闘う ~システムの性能を維持して安定な動作を実現するために~
Interface 2021年1月号
☆特集 Jetson/ラズパイ/PCで自習 Python画像処理100
☆特別付録:コンピュータ手帳2021
日経Linux 2021年 1月号
★超保存版・冊子付録 Ubuntu完全対応 Linuxコマンド逆引き大辞典 264項目
★付録DVD 特集連動2本入り「Ubuntu 20.10 日本語Remix」「Ubuntu Server20.10」
ラズパイマガジン2020年12月号
温度、距離、におい、圧力など、さまざまな種類のセンサー350種類を一挙に紹介します。特性や価格を示した一覧表を用意したので、用途に合った適切な製品を選べます。そのうちの34種類のセンサーは、仕組みから配線図まで図解で分かりやすく解説します。
15Stepで踏破 自然言語処理アプリケーション開発入門
エンジニアの実務に役立つ知識に絞り、独自に15の学習ステップを体系化しました。
数値計算にNumPy、形態素解析にMeCab、機械学習にscikit-learn、ディープラーニングに
Keras等を使い、Pythonのコードを記述し動かしていきます。
プログラミング・ビットコイン ―ゼロからビットコインをプログラムする方法
Linuxサーバーがゼロから作れる本
このLinuxを使いこなす上で一番手っ取り早いのが自分でLinuxサーバーを構築してみることです。
WindowsやMacのパソコンしか使ったことが無い人でも理解できるよう、
しくみや手順の解説を丁寧にまとめ上げた、ゼロからのサーバー入門ガイドです。
Raspberry Pi 3 Model B V1.2 (日本製) 国内正規代理店品
【仕様概要】CPU:ARM 1.2GHz 4コア、GPU:2コア 3D・動画支援、RAM:1GB、ネットワーク:LAN/Wi-Fi/Bluetooth、インターフェース:USB/HDMI/オーディオ/GPIO(UART/I2C/I2S/SPI...)。
Arduino Nano
ATmega328搭載/
動作電圧: 5V/
入力電源電圧(推奨):7~12V/
デジタル入出力ピン: 14本/
PWMチャンネル: 6本/
アナログ入力チャンネル: 8本/
直流電流(1ピン当り最大): 40 mA/
直流電流(3.3Vピン、1ピン当り最大): 50 mA/
Flashメモリ: 32 KB (ATmega328) 内2KBはブートローダーで使用/
SRAM: 2 KB (ATmega328)/
EEPROM: 1 KB (ATmega328)/
Clock Speed: 16 MHz
逆引き PIC電子工作 やりたいこと事典
機能が豊富で、速度・アナログ制御・省電力性・コストの面でもアドバンテージをもつPICマイコン。そんなPICマイコンの使い方を、目的別にやりたいことから引ける、逆引きタイプのガイドブックです。
C言語による PICプログラミング大全
2002年に初版、2009年に第2版を発売した名著『C言語によるPICプログラミング入門』
が大幅リニューアルし「大全」として生まれ変わりました。
本書では、機能豊富なPIC16F1シリーズを使いこなすために、統合開発環境を
MPLAB X IDEに、CコンパイラはMicrochip Technology社純正のXC8に、それぞれ変更しました。
C言語でPICマイコンのプログラミングを始めたい方から、最新のPICマイコンの機能をとことん使い倒したい方まで、必ず役に立つ1冊です。
PICと楽しむRaspberry Pi活用ガイドブック
「PICマイコン+Raspberry Pi3B」という組み合わせで、高機能な電子工作を簡単に実現し、電子工作を各段に高度化する方法について解説していきます。
ESP32&Arduino 電子工作 プログラミング入門
電子工作ファンに人気のマイコンArduino、そしてWiFiとBluetooth内蔵でネットワーク接続しやすいESP32。それらのマイコンでプログラムを組む際に使うのが「Arduino言語」です。
超特急Web接続!ESPマイコン・プログラム全集
IoT技術の回路とプログラムを解説しました.
トランジスタ技術2016年9月号と2017年3月号の特集に
最新の情報を加筆して一冊に仕上げました.
回路とプログラムのサンプル資料として最適です.
ラズベリー・パイやIchigoJamを連動させた例も紹介しています
M5Stack用カード型キーボードユニット
M5Stackにフル機能のQWERTY配列キーボードを実装できるユニットです。複数のボタンの組み合わせ(Sym + Key、Shift + Key、Fn + Key)や豊富なキーの値を出力することが可能です。
Ubuntu サーバー徹底構築
サーバー用UbuntuでLinuxサーバーを構築しよう!
導入からLinuxやコマンドの基本、各種サーバー構築、バックアップやストレージ管理まで!
サーバー用Linuxディストリビューションとして定評のあるUbuntu Serverの中でも、
10年長期サポート版であるUbuntu Server 18.04 LTSに対応!
[改訂第3版]Linuxコマンドポケットリファレンス
本書はLinux操作に必要なコマンドを収録したポケットリファレンスです。機能別にコマンドを分類し、各コマンドページでは書式/使用例などをコンパクトにまとめています。またアルファベット順索引も用意しており、名前しかわからなくてもすぐに目的のコマンドを探すことができます。今回の改訂では仮想化、データベース、クラウド時代に対応したネットワークコマンドなどを追加しています。おもなLinuxディストリビューションのCentOS、Fedora、Debian GNU/Linux、Ubuntuに対応し、初心者から上級者まで必携の1冊です。
できるPRO Apache Webサーバー 改訂版 Version 2.4/2.2/2.0対応
番のApache独学書を改訂しました!
CentOS、Ubuntu、Windows、Mac OS Xに対応しています。できるPROシリーズは、実際の画面や詳細なイラスト、概念図などで構成。
はじめての方でも理解しやすくなっています。
インストール、アクセス制限、CGI、モジュール拡張、ログ管理など、基本的なことから実践的なことまでていねいに解説しています。
[改訂第3版]PHPポケットリファレンス
PHPを利用したいすべての方必携の「PHPポケットリファレンス」最新版がついに登場! PHP 5/4による開発の際によく利用される機能を集約し、必要な知識を目的別、逆引きでまとめました。PHP5.3以降を対象とし、PHP4からある機能はPHP4でも利用できることがわかるようになっています。またオブジェクト指向型のAPI解説を大幅に強化。開発の現場には1冊置いておきたい書籍です。
MySQL ポケットリファレンス
MySQLはさまざまなWebサービスの中核を担うデータベースです。本書はMySQLの基礎的な内容を中心に、日常的によく使うちょっとしたコマンドや、外部管理ツールとの連携など、MySQLの管理/運用にあたって便利な情報を素早く探し出すことができます。MySQL自体の操作、MySQL特有のコマンド、MySQL専用管理ツール、PHPからの操作など、MySQLを実際に使っているユーザーに役立つ内容となっています。
Postfix詳解―MTAの理解とメールサーバの構築・運用
電子メールの配送システムの中核を担うプログラム「MTA」(Message Transfer Agent)のひとつが、「Postfix」です。 この全容を記した本です。
すところなく解説していきます。
DNSがよくわかる教科書
本書では、DNSの仕組みから、ドメイン名のルール、主なリソースレコードの内容、コマンドによる動作確認、DNSの運用ノウハウ、DNSSECの基礎知識まで、順を追ってやさしく解説します。
|