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ディスプレイにも表示されます。