安価なESP32-CAMモジュールを使ったDIYホーム監視システムのセットアップに関する初心者向けガイドへようこそ。このブログは「自分でホーム監視システムを設定できるかな?」、「ESP32-CAMのプログラミングは複雑すぎる?」、「始めるために必要な基本は何?」と疑問に思っている方々に最適です。この包括的なガイドでは、技術的なバックグラウンドに関係なく、すべての方がアクセスしやすい形で、プロセスの各ステップを詳しく説明します。
・プログラミングの経験がほとんどないけど、ESP32-CAMの設定はできるかな?
・カメラを使った電子工作がしたい
このような疑問に大手メーカのエンジニアでDX業務を担当しているよすけが回答します。
・手作りのプロジェクトに興味があり、新しい技術やツールを使って自宅で何かユニークなものを作りたいと思っている人たち。
・プログラミングや電子工作にあまり精通していないが、自分で何か新しいことを学びたいと考えている人たち。
・低コストで自宅のセキュリティシステムを構築したいと考えている人たち。
ESP32-CAMとは – 初心者にもわかる基本概要
ESP32-CAMの概要
ESP32-CAMは、小型でコスト効率の高いカメラモジュールです。これは、ESP32という人気のあるマイクロコントローラに基づいており、Wi-FiとBluetooth機能を内蔵しています。ESP32-CAMは主に画像とビデオの取得、処理、およびアップロードに使用されます。このモジュールは、ホームオートメーション、監視カメラ、ロボットプロジェクトなど、さまざまなアプリケーションに適しています。
ESP32-CAMの主要機能
ESP32CAMは下記のようにWi-FI、Bluetoothを兼ね備えており、携帯から操作できることが非常におすすめです。さらに写真も撮れることで、様々なプロジェクトに応用できます。
- カメラモジュール: 高解像度の写真やビデオをキャプチャできます。
- Wi-Fi接続: 無線LANを介してインターネットに接続し、データをアップロードまたはストリーミングできます。
- Bluetooth機能: 近距離のデバイスと通信するためのBluetooth接続をサポートします。
- 低消費電力: ESP32は省エネ設計であり、バッテリ駆動のプロジェクトに最適です。
なぜESP32-CAMが選ばれるのか
ESP32-CAMの人気の理由は、その汎用性とコスト効率の良さにあります。手頃な価格でありながら、高度な機能を備えており、初心者から上級者まで幅広いユーザーに適しています。プログラミングと電子工作の基本的な知識があれば、カスタマイズ可能な監視カメラやその他の関連プロジェクトを簡単に作成できます。
ESP32-CAMの用途
ESP32-CAMの基本仕様
- ホームセキュリティ: 自宅の監視カメラとして使用できます。
- リモートモニタリング: 遠隔地からの映像の確認や、ペットの監視などに利用できます。
- プロジェクトと実験: 学校のプロジェクトや趣味の電子工作に組み込むことができます。
- IoT(モノのインターネット)アプリケーション: インターネットに接続されたスマートデバイスとして機能させることが可能です。
- プロセッサ: ESP32チップセット。
- メモリ: PSRAMオプションを含む、小型のオンボードメモリ。
- 画像解像度: 様々な解像度オプションがありますが、PSRAMの有無によって最大解像度が異なります。
- 拡張性: GPIOピンを介してセンサーや他のデバイスを追加できます。
必要なツールとコンポーネント
ESP32-CAMプロジェクトを始めるためには、特定のツールとコンポーネントが必要です。この章では、必要なアイテムのリストを提供し、各アイテムの役割と重要性について説明します。
必要なコンポーネントのリスト
- ESP32-CAMモジュール: これはプロジェクトの中心となる部品です。カメラとESP32マイクロコントローラが組み込まれています。
- USB-TTLシリアル変更ケーブル: ESP32-CAMようにシリアル変換ケーブルが必要です。
- コンピューター: プログラムの書き込みとデバッグに使用します。
- ジャンパワイヤー: ESP32-CAMを他のデバイスや電源に接続するために使用します。
- 電源アダプター: 安定した電源供給を確保するために必要です。ESP32-CAMは5Vを必要とします。
すべて安価に購入できるため、ぜひトライしてみてください。下記で購入できます。
各コンポーネントの役割
各部品の役割はこのようになります。
- ESP32-CAMモジュール: 画像とビデオの取得、処理、Wi-Fi経由でのデータ送信を行います。
- マイクロUSBケーブル: ESP32-CAMへのプログラミングと電力供給の両方を提供します。
- コンピューター: Arduino IDEなどのソフトウェアを使用して、ESP32-CAMにプログラムを書き込むために使用します。
- ジャンパワイヤー: 電源や他のセンサーへの物理的な接続を可能にします。
- 電源アダプター: 一定の電力をESP32-CAMに供給し、安定した動作を保証します。
- 外部カメラ: より高品質の画像や特定の用途に適したカメラを使用するために交換可能です。
プログラムの基本 – コードの解説
ESP32-CAMプロジェクトを成功させるためには、提供されたプログラムコードの理解が不可欠です。この章では、コードの各部分がどのような機能を果たし、なぜそれが重要なのかを初心者にも理解しやすい言葉で解説します。
プログラムの概要
提供されたプログラムは、ESP32-CAMモジュールを使用して画像をキャプチャし、Wi-Fi経由でデータを送信するためのものです。このコードは、カメラの設定、Wi-Fi接続の設定、そしてWebサーバーの開始を含んでいます。
コードの主要なセクション
(1) ライブラリのインクルード:
#include <WiFi.h>
これらの行は、ESP32-CAMとWi-Fi機能を操作するために必要なライブラリをプログラムに含めることを意味します。
#include "esp_camera.h"
(2) カメラモデルの選択: このセクションでは、使用するカメラモデルに応じて、特定のモデルを定義します。例えば、#define CAMERA_MODEL_AI_THINKER
は、AI ThinkerモデルのESP32-CAMを使用することを指定します。
#define CAMERA_MODEL_AI_THINKER
(3)Wi-Fi設定:
これらの行では、Wi-FiネットワークのSSIDとパスワードを設定します。自分の環境に合わせて入力してください。
const char* ssid = "your_ssid";
const char* password = "your_password";
(4)カメラ設定: このセクションでは、ピンの設定、画像の解像度、ピクセルフォーマットなど、カメラの設定を行います。
(5)Wi-Fi接続:
このコマンドでESP32-CAMを指定したWi-Fiネットワークに接続します。
WiFi.begin(ssid, password);
(6)Webサーバーの開始:
この関数は、カメラの映像をWebサイト上で閲覧できるようにするWebサーバーを開始します。
startCameraServer();
コードの詳細な解説
カメラの初期化:
このコマンドは、前述の設定を使ってカメラを初期化します。
esp_camera_init(&config);
センサー設定の調整:
このようなコマンドは、カメラの画像を垂直に反転させたり、明るさや彩度を調整したりするために使用されます。
s->set_vflip(s, 1);
Wi-Fi接続の確認:
このループは、ESP32-CAMがWi-Fiに接続されるまで待機します
while (WiFi.status() != WL_CONNECTED)
スケッチ例にも、同様のCameraWebServerという例があるので、こちらのプログラムを使用して、まずは動くプログラムを探し、それに対して、自分の追加したい機能を加えていくとよいです。
コード全文
こちらがコード全文になります。
SSID, Passwordを自分のWifiに設定してください。
#include "esp_camera.h"
#include <WiFi.h>
//
// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality
// Ensure ESP32 Wrover Module or other board with PSRAM is selected
// Partial images will be transmitted if image exceeds buffer size
//
// You must select partition scheme from the board menu that has at least 3MB APP space.
// Face Recognition is DISABLED for ESP32 and ESP32-S2, because it takes up from 15
// seconds to process single frame. Face Detection is ENABLED if PSRAM is enabled as well
// ===================
// Select camera model
// ===================
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
//#define CAMERA_MODEL_ESP_EYE // Has PSRAM
//#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM
//#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM
#define CAMERA_MODEL_AI_THINKER // Has PSRAM
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM
//#define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM
// ** Espressif Internal Boards **
//#define CAMERA_MODEL_ESP32_CAM_BOARD
//#define CAMERA_MODEL_ESP32S2_CAM_BOARD
//#define CAMERA_MODEL_ESP32S3_CAM_LCD
//#define CAMERA_MODEL_DFRobot_FireBeetle2_ESP32S3 // Has PSRAM
//#define CAMERA_MODEL_DFRobot_Romeo_ESP32S3 // Has PSRAM
#include "camera_pins.h"
// Wi-Fi接続情報
const char* ssid = "Your SSID";
const char* password = "Your Password";
void startCameraServer();
void setupLedFlash(int pin);
void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true);
Serial.println();
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sccb_sda = SIOD_GPIO_NUM;
config.pin_sccb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.frame_size = FRAMESIZE_UXGA;
config.pixel_format = PIXFORMAT_JPEG; // for streaming
//config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition
config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
config.fb_location = CAMERA_FB_IN_PSRAM;
config.jpeg_quality = 12;
config.fb_count = 1;
// if PSRAM IC present, init with UXGA resolution and higher JPEG quality
// for larger pre-allocated frame buffer.
if(config.pixel_format == PIXFORMAT_JPEG){
if(psramFound()){
config.jpeg_quality = 10;
config.fb_count = 2;
config.grab_mode = CAMERA_GRAB_LATEST;
} else {
// Limit the frame size when PSRAM is not available
config.frame_size = FRAMESIZE_SVGA;
config.fb_location = CAMERA_FB_IN_DRAM;
}
} else {
// Best option for face detection/recognition
config.frame_size = FRAMESIZE_240X240;
#if CONFIG_IDF_TARGET_ESP32S3
config.fb_count = 2;
#endif
}
#if defined(CAMERA_MODEL_ESP_EYE)
pinMode(13, INPUT_PULLUP);
pinMode(14, INPUT_PULLUP);
#endif
// カメラの初期化
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x", err);
return;
}
// カメラセンサーの取得と設定の調整
sensor_t * s = esp_camera_sensor_get();
// initial sensors are flipped vertically and colors are a bit saturated
if (s->id.PID == OV3660_PID) {
s->set_vflip(s, 1); // flip it back
s->set_brightness(s, 1); // up the brightness just a bit
s->set_saturation(s, -2); // lower the saturation
}
// drop down frame size for higher initial frame rate
if(config.pixel_format == PIXFORMAT_JPEG){
s->set_framesize(s, FRAMESIZE_QVGA);
}
#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)
s->set_vflip(s, 1);
s->set_hmirror(s, 1);
#endif
#if defined(CAMERA_MODEL_ESP32S3_EYE)
s->set_vflip(s, 1);
#endif
// Setup LED FLash if LED pin is defined in camera_pins.h
#if defined(LED_GPIO_NUM)
setupLedFlash(LED_GPIO_NUM);
#endif
// Wi-Fi接続開始
WiFi.begin(ssid, password);
WiFi.setSleep(false);
// 接続完了まで待機
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// カメラサーバーの開始
startCameraServer();
// サーバーのURLを表示
Serial.print("Camera Ready! Use 'http://");
Serial.print(WiFi.localIP());
Serial.println("' to connect");
}
void loop() {
// Do nothing. Everything is done in another task by the web server
delay(10000);
}
セットアップ手順 – ステップバイステップ
ESP32-CAMをセットアップし、動作させるための具体的な手順をステップバイステップで紹介します。このセクションは、初心者でも簡単に追従できるように設計されています。
必要なツールと材料の確認
- ESP32-CAMモジュール
- シリアル変換USBケーブル
- コンピューター(Arduino IDEがインストールされていること)
- Wi-Fi接続環境
- ジャンパワイヤー(オプション)
Arduino IDEのセットアップ
- Arduino IDEのインストール: Arduinoの公式ウェブサイトからArduino IDEをダウンロードし、インストールします。
- ESP32ボードの追加: Arduino IDEにESP32ボードマネージャを追加します。これには、ツール、ボードマネージャから追加できます。下記参照。
ESPボードの追加方法
ESPのボードをインストールします。
ESP32-CAMのプログラミング
- ESP32-CAMへの接続: ESP32-CAMをコンピューターにマイクロUSBケーブルで接続します。
- Arduino IDEでの設定: 「ツール」メニューからボードタイプとして「AI Thinker」を選択し、適切なポートを指定します。ESPのボードをインストールしていないばあ、は、
- プログラムのアップロード: 第3章で紹介したプログラムをArduino IDEにコピーし、Wi-FiのSSIDとパスワードを適切に設定した後、「アップロード」ボタンをクリックします。回路の接続方法は下記参照。
プログラムアップロード時は下記回路となります。ESP32-CAMのGND-IO0はデータ書き込み時は接続してください。
Wi-Fi接続とカメラの動作確認
プログラムアップロード後、上記回路に記載のESP32-CAMのGND-IO0のケーブルを外してください。この作業を忘れると、いつまでもつながりません。
- Wi-Fi接続: プログラムがESP32-CAMにアップロードされると、モジュールは自動的にWi-Fiに接続し始めます。
- カメラサーバーのアクセス: Arduino IDEのシリアルモニターで表示されるIPアドレスをブラウザに入力してアクセスします。
- カメラ映像の確認: Webサーバーにアクセスすると、ESP32-CAMによってキャプチャされた映像が表示されます。
Serialモニタを開き、下記WiFi Connectedと記載されたら完了です。IPアドレスに携帯または、PCから接続しましょう。カメラ映像が確認できます。
もし、シリアルモニタ上にWiFi Connectedと表示されない場合は、ESP32-CAMのピン側に(5Vピンの隣)にResetボタンがあるのでそのボタンを押してください。それでも接続されない場合は、上記のGND-IO0のケーブルが接続されたままになっている可能性があります。
上記でWiFiの接続が完了しました。
実際に接続した状態がこのような画面になります。グレースケール画像に変換したり、顔のDetectionをすることもできます。また、人物の登録もできるので、顔認識を利用した、ロック解除システムなども作ることができます。
YouTubeに実際の様子を投稿しておりますので、見てください。
今後、ESP32camとモータを接続して、カメラカーを作成していきます。
終わりに
このブログを通じて、ESP32-CAMの世界への扉が開かれたことを願っています。私たちが提供したステップバイステップのガイド、詳細なプログラム解説、そしてトラブルシューティングのヒントが、あなたのDIYプロジェクトやテクノロジーへの興味を深める助けとなることを期待しています。
ESP32-CAMは、その多様性と柔軟性により、無限の可能性を秘めています。今回の基本的なセットアップから始めて、自分だけのユニークなプロジェクトを作り上げていく過程は、非常に充実したものになるでしょう。また、このプロセスを通じて学んだスキルは、将来的に他のプロジェクトにも応用できる貴重な経験となります。
技術は常に進化していますが、基本を理解し、実際に手を動かしてみることが、この進化の速い分野での学習の鍵です。何か問題に直面したとしても、それは学びと成長の機会です。常に好奇心を持ち、挑戦する心を忘れずに、ESP32-CAMとともに新しい創造の旅を楽しんでください。
最後に、このブログがあなたの技術的な冒険の一部になれたことを嬉しく思います。次のプロジェクトでの成功を心より祈っています。それでは、創造的な一歩を踏み出しましょう!