.. note::
こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。
**参加する理由は?**
- **エキスパートサポート**:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
- **学び&共有**:ヒントやチュートリアルを交換してスキルを向上させましょう。
- **独占的なプレビュー**:新製品の発表や先行プレビューに早期アクセスしましょう。
- **特別割引**:最新製品の独占割引をお楽しみください。
- **祭りのプロモーションとギフト**:ギフトや祝日のプロモーションに参加しましょう。
👉 私たちと一緒に探索し、創造する準備はできていますか?[|link_sf_facebook|]をクリックして今すぐ参加しましょう!
.. _ar_take_photo_sd:
7.6 SDカードで写真を撮る
============================
この文書は、ESP32-CAMを使用して写真を撮り、SDカードに保存するプロジェクトについて説明しています。
このプロジェクトの目的は、ESP32-CAMを使用して画像をキャプチャし、SDカードに保存する簡単なソリューションを提供することです。
**必要な部品**
このプロジェクトでは、以下のコンポーネントが必要です。
一式を購入するのが確かに便利です。リンクはこちらです:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - 名前
- このキットのアイテム
- リンク
* - ESP32 Starter Kit
- 320+
- |link_esp32_starter_kit|
以下のリンクから個別に購入することもできます。
.. list-table::
:widths: 30 20
:header-rows: 1
* - コンポーネントの紹介
- 購入リンク
* - :ref:`cpn_esp32_wroom_32e`
- |link_esp32_wroom_32e_buy|
* - :ref:`cpn_esp32_camera_extension`
- |link_esp32_extension_board|
**関連する注意事項**
ESP32-CAMを使用する際には、スケッチをアップロードするためにGPIO 0ピンをGNDに接続する必要があることに注意してください。
また、GPIO 0をGNDに接続した後、ESP32-CAMのオンボードRESETボタンを押して、ボードをフラッシュモードにする必要があります。
画像をSDカードに保存する前に、SDカードが適切にマウントされていることも重要です。
**操作手順**
#. カードリーダーを使ってSDカードをコンピュータに挿入し、その後フォーマットします。 :ref:`format_sd_card` のチュートリアルを参照してください。
#. カードリーダーを取り外し、SDカードを拡張ボードに挿入します。
.. image:: ../../img/insert_sd.png
#. 今度は、カメラを接続します。
.. raw:: html
#. USBケーブルを使ってESP32-WROOM-32Eをコンピュータに接続します。
.. image:: ../../img/plugin_esp32.png
#. コードを開きます。
.. note::
* ``esp32-starter-kit-main\c\codes\7.6_take_photo_sd`` のパスの下にある ``7.6_take_photo_sd.ino`` ファイルを開きます。
* ボード(ESP32 Dev Module)と適切なポートを選択した後、 **アップロード** ボタンをクリックします。
* :ref:`unknown_com_port`
.. raw:: html
#. 今度は、 **PSRAM** を有効にします。
.. image:: img/sp230516_150554.png
#. パーティションスキームを **Huge APP (3MB No OTA/1MB SPIFFS)** に設定します。
.. image:: img/sp230516_150840.png
#. Arduino IDEで適切なポートとボードを選択し、ESP32にコードをアップロードします。
#. コードのアップロードに成功したら、 **Reset** ボタンを押して写真を撮ります。また、シリアルモニターで以下の情報が表示されていることを確認して、成功したキャプチャを見ることができます。
.. code-block:: arduino
Picture file name: /picture9.jpg
Saved file to path: /picture9.jpg
Going to sleep now
.. image:: img/press_reset.PNG
#. 今度は、拡張ボードからSDカードを取り外し、コンピュータに挿入します。撮ったばかりの写真を見ることができます。
.. image:: img/take_photo1.png
**どのように動作するのか?**
このコードは、AI Thinker ESP32-CAMを操作して写真を撮り、SDカードに保存し、その後ESP32-CAMをディープスリープ状態にします。主な部分の概要は以下の通りです:
* **Libraries**:コードは、ESP32-CAM、ファイルシステム(FS)、SDカード、EEPROM(電源サイクルをまたいでデータを保存するために使用)に必要なライブラリを含めて開始します。
.. code-block:: arduino
#include "esp_camera.h"
#include "Arduino.h"
#include "FS.h" // SD Card ESP32
#include "SD_MMC.h" // SD Card ESP32
#include "soc/soc.h" // Disable brownour problems
#include "soc/rtc_cntl_reg.h" // Disable brownour problems
#include "driver/rtc_io.h"
#include // read and write from flash memory
* **Pin Definitions**:このセクションでは、ESP32-CAMのカメラモジュールへのピン接続を表す定数を設定します。
.. code-block:: arduino
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
* **Global Variables**: グローバル変数 ``pictureNumber`` は、撮影してSDカードに保存した写真の枚数を追跡するために宣言されています。
.. code-block:: arduino
int pictureNumber = 0;
* **Setup Function**: ``setup()`` 関数では、いくつかのタスクが達成されます:
* まず、カメラが操作中にESP32-CAMがリセットされるのを防ぐために、ブラウンアウト検出器を無効にします。
.. code-block:: arduino
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
* デバッグ用にシリアル通信を初期化します。
.. code-block:: arduino
Serial.begin(115200);
* GPIOピン、XCLK周波数、ピクセルフォーマット、フレームサイズ、JPEG品質、フレームバッファカウントなどを含むカメラ設定が ``camera_config_t`` で設定されます。
.. code-block:: arduino
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_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
* 次に、設定でカメラを初期化し、失敗した場合はエラーメッセージを出力します。
.. code-block:: arduino
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x", err);
return;
}
* SDカードを初期化し、失敗した場合はエラーメッセージを出力します。
.. code-block:: arduino
if (!SD_MMC.begin()) {
Serial.println("SD Card Mount Failed");
return;
}
uint8_t cardType = SD_MMC.cardType();
if (cardType == CARD_NONE) {
Serial.println("No SD Card attached");
return;
}
* カメラで写真を撮り、フレームバッファに保存します。
.. code-block:: arduino
fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Camera capture failed");
return;
}
* EEPROMを読み出して最後の写真の番号を取得し、新しい写真の番号を増やします。
.. code-block:: arduino
EEPROM.begin(EEPROM_SIZE);
pictureNumber = EEPROM.read(0) + 1;
* 新しい写真のためにSDカード上にパスを作成し、写真番号に対応するファイル名で保存します。
.. code-block:: arduino
String path = "/picture" + String(pictureNumber) + ".jpg";
fs::FS &fs = SD_MMC;
Serial.printf("Picture file name: %s\n", path.c_str());
* 写真を保存した後、次の電源サイクルで取得するために写真番号をEEPROMに戻して保存します。
.. code-block:: arduino
File file = fs.open(path.c_str(), FILE_WRITE);
if (!file) {
Serial.println("Failed to open file in writing mode");
} else {
file.write(fb->buf, fb->len); // payload (image), payload length
Serial.printf("Saved file to path: %s\n", path.c_str());
EEPROM.write(0, pictureNumber);
EEPROM.commit();
}
file.close();
esp_camera_fb_return(fb);
* 最後に、オンボードLED(フラッシュ)を消して、ESP32-CAMをディープスリープ状態にします。
.. code-block:: arduino
pinMode(4, OUTPUT);
digitalWrite(4, LOW);
rtc_gpio_hold_en(GPIO_NUM_4);
* スリープモード: ESP32-CAMは、各写真を撮った後に電力を節約するためにディープスリープに入ります。リセットボタンを押すか、特定のピンにシグナルを送ることで起動できます。
.. code-block:: arduino
delay(2000);
Serial.println("Going to sleep now");
delay(2000);
esp_deep_sleep_start();
Serial.println("This will never be printed");
* ループ関数: ``loop()`` 関数は空です。セットアッププロセスの後で、ESP32-CAMはすぐにディープスリープに入ります。
このコードが機能するためには、スケッチをアップロードする時にGPIO 0がGNDに接続されていることを確認し、ボードをフラッシュモードにするためにオンボードRESETボタンを押す必要があるかもしれません。また、"/picture"をあなたのファイル名に置き換えてください。EEPROMのサイズは1に設定されており、0から255までの値を保存できます。255枚以上の写真を撮る予定がある場合は、EEPROMのサイズを増やし、写真番号をどのように保存し、読み出すかを調整する必要があります。