上の写真は小さなOV2640カメラを使った、映像ストリーミングの実験です。PCのブラウザーでWiFiから受信したそのままです。
カメラとマイクロSDがESP32にセットされた、ESP32-CAMというモジュールが一昨年ごろから海外で流通しています。ご存じの方は多いかと思いますが、切手サイズのESP32自体は240MHzデュアルコアで動きWiFiもBlueToothも内蔵、日本の技適ももつ優れものです。
このESP32-CAMは500円未満で手に入るのは驚きです。
海外ではたくさん使われているモジュール(なので安いわけ)ですが、搭載されているESP32はEspressif社製ではなくAI Thinker(Shenzhen Anxinke Technology社)製です。ESP32Sというモデルで、欧米の適合認証は表示されていますが日本の技適がないので、国内では電波を出せません。つまり日本では、例えばSDへの録画用Still Cameraなどとして電波を出さない方法で使う必要があります。
とはいえその場合はカメラとSDカードに割り当ててないピン数が限られ、制御には工夫がいります。WiFiもBlueToothも使えないわけで、シリアル通信でコントロールするのがやっとというところです(Debug用のシリアルへの出力はオフにして)。私も今までのところそのようにして電波を出さない防犯カメラとして使用中(それでも十分安価^^)。シリアル以外に使えるピンとしてはIO0だけかもしれません(プログラム書き込み以外のときのみ)。
ところが、搭載されているESP32Sを、日本の技適のあるモデル(Espressif社の各モデルなど)に換装してもピン配列が同じならちゃんと動くわけです。勇敢にも実際に試された方がいるのがすばらしい!次のリンク。
ESP32-CAMを試してみた | machinanette Blog
あ、それならやってみようかと、映像ストリーミングを実験してみたもの(FCC適合認証があるので実験は総務省へのオンライン届け出で即日可能、最後に少し書き足しておきます)。PCからWiFiでアクセスしたのが最初に掲げた写真です。ごく簡単なプログラムで作れArduino IDEで書き込みますが、プログラムを記事の最後のほうに載せておきます。ESP32にArduino-IDEで書き込むには、IDEに事前にESP32ライブラリーを追加する必要があります。この入れ方は以前に次の記事に書いたとおりです。
ESP32のアクセスポイント (つまりスタンドアローンWiFi-LAN) - 勝手な電子工作・・
またUSB接続端子はないので、プログラムを書き込む際にはUSB-TTL変換モジュールが必要ですが、種類はどれでも大丈夫。リセットのピンはESP32-CAMにあるボタンが使えるので不要。安価なCH340gで十分です。製品のPCBにはショートをさけるための透明ビニールがかぶされていますが、それをはがした写真は次。
これ自体の回路に3.3Vを供給するために、搭載されているレギュレータの3.3V出力ピンから自分のVCCピンへと黄色のジャンパーで供給します。
ピンの並びは色々ありますが、海外ネットでの価格はどれも概して100円未満。一例は次。
プログラムを書き込むときは、これとESP32-CAMとを次のように接続します。
青のワイヤーは書き込み時専用です。実行時はこれを外します。
写真では少しわかりにくいので、次に書き直します、汚くてすみませんが。
Arduino-IDEでの書き込みはスンナリといきますが、IDEの出力メッセージ欄でもし「.....」が繰り返されるときは、ESP32-CAMにある小さなリセットボタンを1度だけおせば進行します。
書き終わったらワイヤーを全て外して、上図左上の5VピンとGndピンの間に5Vの電源を接続し、リセットを押せば、独立のWiFiサーバーつまり独立のアクセスポイントとして立ち上がります(この記事の最後につけるプログラムの場合です)。立ち上げのためのWiFi環境は必要ありません。
他のサイトを見る限り、どれも既存のWiFi環境を必要とする作り方ですが、ここではそういう環境がいらず、どこでも使えるアクセスポイントにしています。よって、SSIDもIPアドレスもパスワードもプログラムで自分が指定した通りにできます。
画像ストリーミング中の電流はわずか166mA(実測)ですので、電池で動かせ移動が容易です。ただしESP32は切手サイズに240MHzデュアルコアが入っているため温度はかなり上昇しますので、放熱に注意が必要。(実測温度は、時間のあるときに記事の後ろに書き足しておこうと思います)
テストではつぎのように洗濯ばさみなどで挟むと、たてるにも使いやすい^^;
最後のほうにこの実験用プログラムをつけておきますが、Arduino-IDEで書き込む際のボード指定は”AI Thinker ESP32 CAM"です。これを実用に使う際は技適の表示があるESP32に換装する必要があるのは前に述べた通りで、電波法に違反しないために必須です(実験でも「技適未取得機器を用いた実験等の特例制度」による届け出が必要で、この実験もそうしています)。
この目的と同様なプログラムは、Arduino-IDEでファイル→スケッチ例から "ESP32"→"Camera"とすれば出てくるのですが、そのままだとWiFi環境の中でしか動きません。セキュリティのためにMACアドレスフィルタリングをつかっている場合など、いちいちつなぐのが面倒ですし、WiFi環境が変わったり、ないところでも使えるようにしたいわけ。よって書き換えたものです。
実験はたったのいっぺんでスンナリと動いたので却ってびっくり。デュアルコアの威力でビデオストリーミングしながらマルチスレッドで動くようです。PCからでもスマホからでも問題なく動きます。ただし、一度に複数クライアントへの配信はつながりはしますが速度に無理があります。
/****************************************************************
* ESP32-CAM (ESP32+OV2640 module) as an Access Point *
* V00: Image streaming Nov.07, 2020 Akira Tominaga *
* Remarks: Specify board as "AI Thinker ESP32 CAM", *
* though Example exists at ESP32 -> Camera. *
* Change WiFi to Access-Point-server type. *
*****************************************************************/
#include "esp_camera.h"
#include "WiFi.h"
#define CAMERA_MODEL_AI_THINKER
#include "camera_pins.h"
const char ssid[] = "HOGE-007";
const char pass[] = "hoge007desu";
const IPAddress ip(192, 168, 32, 7);
const IPAddress subnet(255, 255, 255, 0);
WiFiServer server(80);
void startCameraServer();
void setup() { // ***** ESP32 setup *****
Serial.begin(9600);
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_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;
//init with high specs to pre-allocate larger buffers
if(psramFound()){
config.frame_size = FRAMESIZE_UXGA;
config.jpeg_quality = 10;
config.fb_count = 2;
} else {
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 12;
config.fb_count = 1;
}
// camera init
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();
if (s->id.PID == OV3660_PID) {
s->set_vflip(s, 1);//flip it back
s->set_brightness(s, 1);//up the blightness a little
s->set_saturation(s, -2);//lower the saturation
}
//less frame size for higher initial frame rate
s->set_framesize(s, FRAMESIZE_QVGA);
// ***** setting as an Access Ppoint
WiFi.softAP(ssid, pass);
delay(100);
WiFi.softAPConfig(ip, ip, subnet);
IPAddress myIP = WiFi.softAPIP();
Serial.print("SSID= ");
Serial.println(ssid);
Serial.print("Fixed IP addr= ");
Serial.println(myIP);
Serial.println("Server starts!");
startCameraServer();
Serial.print("Camera OK! Use 'http://");
Serial.println(WiFi.localIP());
}
void loop() { // ***** ESP32 Loop ****
delay(10000); // do nothing for a test
Serial.println("Looping");
}
では今回の実験はこのへんで。
2020.11.09追記:画像ストリーミング中の発熱
室温24.3℃の場合、次のように発熱します。
ESP32自体は基板へ上手に放熱しているようでむしろ裏側が熱くなります。一番熱いのは上側にある 5Vto3.3V のレギュレータで、46.5℃になっています。周囲が暑いときはもっと上がるかも。少ない消費電流とはいえサイズも小さいですからね。
もしESP32をきちんと換装し本番に使う場合は、放熱を考慮しないとまずいかもしれません。ファンをつけたくない場合ケースには閉じこめずソケット等を通じ別基板に逃がすのがよいかなあ・・。
2020.11.15追記:複数回追記してすみません。週末がきたのでやってみました。まず、かんたんな48mmx34㎜基板を作製。
三脚がつけられるよう小さな箱に取り付け、ヘダーピン雌ソケットにESP32-CAMを挿す。
そして30分間ストリーミングしたらところで測ると次の温度です。本日はだいぶ暖かく部屋の温度は25.0℃です。
モジュールの最高温度は5℃下がりました。主にグラウンドからよく伝わると思いきや意外に下がらないのはモジュールにくっついてきたピンヘダーのオスが鉄製だから(鉄は熱伝導率が悪く銅の約5分の1)。
実験期間終了(180日間でこの場合は来年4月末)までに、ESP32換装を実行する際、銅に交換する?とはいえ表面実装ICの除去はいたしかたないとして、スルーホールからの除去は苦手なので、まあこの程度の放熱で我慢するか・・。
以下は蛇足ですが、実験の届け出はマイナンバーカードとその読取器があればすぐできます。FCCとCEの適合認証があるので比較的簡単。
この記事でぐちゃぐちゃ説明するより、「技適未取得機器を用いた実験の特例制度」をググってみていただくのが良いと思います。なお期限までに廃止届も忘れずに出す必要がありますが。
以上、お役に立てば幸いです。
©2020 Akira Tominaga, All rights reserved.