Zenn
Open3

ESP32-CAMをブラウザから操作

ukiriukiri

ブラウザからの操作でESP32-CAMにPWM信号を発生させ、サーボモーターを動かす。
ESP32-CAMに新しい命令を追加するのは
https://qiita.com/Nabeshin/items/e7ce27f852af8086bc33
と同様。

CameraWebServer.ino

下記によればSDカードを使わなければgpio14が使えそう。
https://randomnerdtutorials.com/esp32-cam-ai-thinker-pinout/
なので

CameraWebServer.ino
pinMode(4, OUTPUT);    //LEDフラッシュライト用 GPIO出力

の下に

CameraWebServer.ino
pinMode(14, OUTPUT); 

を追加。

以上。
本質的ではないが、githubなどにあげる際、パスワードなどが公開されるのを防ぐために、ssidの情報を別ファイルに移す。下記を追加し、.gitignore に ssid.h を入れる。

CameraWebServer.ino
#include "ssid.h"
const char* ssid = MY_SSID;
const char* password = MY_SSID_PASS;

ssid.h

ssid.h
#define MY_SSID "ssid"
#define MY_SSID_PASS "pass"

app_httpd.cpp

初めの方の色々宣言してあるところに下記を追加

app_httpd.cpp
static int8_t pin14 = 0;

サーボを動かすために下記を追加。

app_httpd.cpp
#include <ESP32Servo.h>
Servo myservo;
app_httpd.cpp
static esp_err_t cmd_handler(httpd_req_t *req)

内の else if が連続しているところの末尾に下記を追加。

app_httpd.cpp
else if(!strcmp(variable, "pin14")){
      pin14=val;
      myservo.attach(14);
      if(pin14){
        //digitalWrite(14, HIGH);
        myservo.write(0);    // サーボモーターを0度の位置まで動かす
        delay(500);
        myservo.write(90);   // サーボモーターを90度の位置まで動かす
        delay(500);
        myservo.write(0);  // サーボモーターを180度の位置まで動かす
        delay(500);
        digitalWrite(14, LOW);
      }else{
        digitalWrite(14, LOW);
      }
app_httpd.cpp
static esp_err_t status_handler(httpd_req_t *req)

内の p+=... が連続しているところの末尾に下記を追加。

app_httpd.cpp
p+=sprintf(p, "\"pin14\":%u", pin14);

以上。
本質的ではないエラー処理。
カメラが起動した後、flashを動作させても問題ないが、サーボモーターを動かすとカメラが止まってエラーを吐き続ける。エラーが発生した際はsetup()関数を呼び始めからやりなおす。

app_httpd.cpp
static esp_err_t stream_handler(httpd_req_t *req)

内の無限ループを下記のように変更。

app_httpd.cpp
while(true){
        detected = false;
        face_id = 0;
        fb = esp_camera_fb_get();
        if (!fb) {
            Serial.println("Camera capture failed!!");
            setup(); // to reboot after servo moter.
            //res = ESP_FAIL;
            res = ESP_OK;

これで下記にアクセスすればサーボモータが回るようになる。
http://(ip address)/control?var=pin14&val=1"

ukiriukiri

機能的には前回投稿で終わりだが、使い勝手が悪いので、
htmlでボタンを作り、クリックすると、phpにPOSTでsubmitされ、
curl-execされるようにした。
https://www.php.net/manual/ja/function.curl-exec.php
前回投稿の最後で触れたように、所定のアドレスにアクセスしさえすれば良い。

phpファイルはgithubにあげるかも。

ukiriukiri

ブラウザのレイアウトはこんな感じ。

動作しているところを載せたかったが、特定のサービスにアップしていないとダメらしい。

作成者以外のコメントは許可されていません