TTGO T-Cameraのファームウェアを改造してみました。
1.ファームウェア開発環境の準備
ファームウェアはArduino環境で開発しますので、まずはLinuxMint19に開発環境を導入します。
まずは、pyserialをインストールしておきます。
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py $ sudo python get-pip.py $ sudo pip install pyserial $ sudo apt install python3-pip $ sudo pip3 install pyserial
自分のユーザーアカウントを dialout グループに追加した後、一旦ログアウトしてログインし直します。
Aruduino公式サイトから arduino-1.8.9-linux64.tar.xz をダウンロードしてきて展開します。生成された arduino-1.8.9 というディレクトリをホームディレクトリ直下に移動した後、
シェルを開いて、
$ cd ~/arduino-1.8.9/ $ sudo ./install.sh
で Arduino をインストール完了です。インストールが完了したら、 「Menu → プログラミング → Arduino」でArduino IDEを起動します。次にArduino IDEの「ファイル→環境設定」で「追加のボードマネージャのURL」に
https://github.com/espressif/arduino-esp32/releases/download/1.0.2/package_esp32_dev_index.json
を設定します。引き続き、「ツール→ボード→ボードマネージャ」で「esp32 by Espressif Systems」を探してインストールします。インストールが完了したら、「ツール→ボード→ESP32 Wrover module」を選択すれば、Arduino自体の準備は完了です。
2.ソースコードの導入
ソースコードは https://github.com/lewisxhe/esp32-camera-series からZIPでダウンロードしてきます。ダウンロードした esp32-camera-series-master.zip を展開し、展開したディレクトリ名をesp32-camera-seriesに変更して、~/Arduino の下に移動します。
Arduino IDEの「ファイル→開く」で ~/Arduino/esp32-camera-series/esp32-camera-series.ino を開いておきます。
3.ライブラリの準備
Arduino OneButton Library を https://github.com/mathertel/OneButton からZIPでダウンロードしてきて、OneButton-master.zip を展開します。展開したら、ディレクトリ名をOneButtonに変更して、~/Arduino/liraries の下に移動します。
BME280のライブラリについては TTGO T-Cameraでは正常な値を表示しない(そのため、途中から削除されている)のでソースコード中の
#include <Adafruit_BME280.h>
の行はコメントアウトしておきます。
esp8266-oled-ssd1306 Library を https://github.com/ThingPulse/esp8266-oled-ssd1306 からZIPでダウンロードしてきて、esp8266-oled-ssd1306-master.zipを展開します。ディレクトリ名をesp8266-oled-ssd1306に変更して、~/Arduino/liraries の下に移動します。
ここまででビルドと書き込みはできるはずです。Arduino IDEのチェックマーク(検証)を押してコンパイルしてみます。うまく行ったら、右矢印マークを押して書き込みもテストしておきます。
4.SoftAPモードからSTAモードへ変更
#define SOFTAP_MODE //The comment will be connected to the specified ssid
をコメントアウトして、SoftAPモードを禁止して、
#define WIFI_SSID "your wifi ssid" #define WIFI_PASSWD "you wifi password"
のところに接続先のSSIDとパスワードを設定します。
5.ESP32のIPアドレスを固定IPに変更する
SSID/PASSWORDの設定の箇所の後に以下の記述を追加
#define FIXED_IP #ifdef FIXED_IP IPAddress fixed_ip( 192, 168, 1, 100); // for fixed IP Address IPAddress gateway( 192, 168, 1, 1); // Gateway Address IPAddress subnet(255, 255, 255, 0); // Subnet Mask IPAddress DNS( 8, 8, 8, 8); // DNS server #endif
WiFi.begin()の直前に以下の記述を追加
#ifdef FIXED_IP WiFi.config(fixed_ip, gateway, subnet, DNS); // Set fixed IP address #endif
6.mDNS対応
ローカルネット内からはIPアドレスではなくホスト名でアクセスできると便利なので、mDNS対応させておきます。
先頭の
#include <WiFi.h>
の後に
#include <ESPmDNS.h>
を追加します。続いて、SSID/PASSWORDの設定の箇所の後に以下の記述を追加します。
#define AVAHI #ifdef AVAHI #define AVAHI_HOST "esp32" // esp32.local #endif
引き続き、setup()の最後の箇所の
Serial.print("Camera Ready! Use 'http://"); Serial.print(ip); Serial.println("' to connect");
を
#ifdef AVAHI // Set up mDNS responder (reference : mDNS_Web_Server.ino) if (!MDNS.begin(AVAHI_HOST)) { Serial.println("Error setting up MDNS responder!"); while(1) { delay(1000); } } Serial.println("mDNS responder started"); Serial.print("Camera Ready! Use 'http://"); Serial.print(AVAHI_HOST); Serial.print(".local"); Serial.println("' to connect"); #else Serial.print("Camera Ready! Use 'http://"); Serial.print(ip); Serial.println("' to connect"); #endif
に変更します。更に、void drawFrame1(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) の中の
#ifdef SOFTAP_MODE display->setFont(ArialMT_Plain_10); display->drawString(64 + x, 25 + y, buff); #else display->setFont(ArialMT_Plain_16); display->drawString(64 + x, 35 + y, ip); #endif
を
//#ifdef AVAHI // display->setFont(ArialMT_Plain_10); // display->drawString(64 + x, 25 + y, "http://" AVAHI_HOST ".local"); //#else #ifdef SOFTAP_MODE display->setFont(ArialMT_Plain_10); display->drawString(64 + x, 25 + y, buff); #else display->setFont(ArialMT_Plain_16); display->drawString(64 + x, 35 + y, ip); #endif //#endif
に書き換えます。(いくつかの行がコメントアウトになっているのは、表示にはIPアドレスもほしいためです。すべてURLでいい場合にはコメントを外します)
さらに、void drawFrame2(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)の中の
display->drawString(64 + x, 25 + y, "http://" + ip );
を
#ifdef AVAHI display->drawString(64 + x, 25 + y, "http://" AVAHI_HOST ".local"); #else display->drawString(64 + x, 25 + y, "http://" + ip ); #endif
に書き換えます。
7.カメラの向きとOLEDの表示が上下逆なのを修正
oled.init();
の後あたりに
oled.flipScreenVertically();
を追加します。
これでボードに書き込むと同じサブネットのPCからは http://esp32.local で、異なるPCからは http://IPアドレス でアクセスできます。どちらもOLEDディスプレイにも表示されます。
初めまして。
こちらの記事が大変参考になり、TTGO-Cameraを動かすことができました。
ありがとうございます。
ケースは3Dプリンタで自作されたのですか? スゴ過ぎます。😆
コメントありがとうございます。
TTGO T-Cameraが動いたようでよかったです。見返すと、去年のGWのことだったんですねw。
それ以降、ウチのTTGOはずっと自宅の3Dプリンタを稼働時も非稼働時もずっと監視し続けています。
あんなにあれこれ調整できる必要もないので、もうちょっとファームを改造したい気もしますが、困ってないのでそのままです。