TTGO T-Camera ファームウェア改造

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 T-Camera ファームウェア改造” への2件の返信

  1. 初めまして。
    こちらの記事が大変参考になり、TTGO-Cameraを動かすことができました。
    ありがとうございます。
    ケースは3Dプリンタで自作されたのですか? スゴ過ぎます。😆

    1. コメントありがとうございます。
      TTGO T-Cameraが動いたようでよかったです。見返すと、去年のGWのことだったんですねw。
      それ以降、ウチのTTGOはずっと自宅の3Dプリンタを稼働時も非稼働時もずっと監視し続けています。
      あんなにあれこれ調整できる必要もないので、もうちょっとファームを改造したい気もしますが、困ってないのでそのままです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)