WiFi Kit 8（0.91インチOLED付きESP8266）を使ってみる


![IMG_1748.jpg](https://qiita-image-store.s3.amazonaws.com/0/283854/ed7f0934-57bd-a4cc-2488-70fa8151ac82.jpeg)

## 背景とか所感
- 背景
 - ESP8266, ESP32のOLED付きのコンパクトなボードのポテンシャルを知りたいと思っていた。
 - M5Stackは魅力的だが価格的に結構するので、個人的に安価な構成でどこまで行けるかに興味がある。
 - 先日、メルカリで格安で出品されていたのを見つけ、試しに購入してみた。
 - ちなみに現在 [Amazonで購入](https://www.amazon.co.jp/Pinbotronix-ESP8266-WiFi開発ボード-0-91インチESP8266-OLEDディスプレイWifiキット8/dp/B07FNDY4GT?SubscriptionId=AKIAIKOBVBNCMWEMOMAA&tag=hidemaruo9128-22&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B07FNDY4GT)すると約1500円。
- 所感
 - 独自のピンアサインを考慮するだけで、I2CのOLED付きArduinoとして普通に使える。
 - WifiのIPアドレスだとか、センサの検出値だとか、ステータスが表示できてとっても便利である。
 - スマホと連携したら外で結構使えそう。

## WiFi Kit 8（OLED付きESP8266）
- Spec
 - マスターチップ：ESP8266
 - OLED:0.91インチ 128x32 白
 - USBインターフェースチップ：CP2102
 - フラッシュ:32 Mbyte
 - 作動電圧：3.3V～7V
 - サポートモード：softAp、station、softAp+station、WiFi-Direct
 - 出力功率：19.5dBm @ 11b、16.5dBm @ 11g、15.5dBm @ 11n.
- 製造元Webサイト
 - http://www.heltec.cn/project/wifi-kit-8/?lang=en
- GitHub
 - https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series
- Amazon含め、どこで買ってもマニュアルは付いて来ないので、使い方は自分で調べる必要がある。

## 環境セットアップ
- iMac
 - MacOS High Sierra 
- UARTドライバ
 - 自分が購入した基板には「CP2104」というチップが実装されているので、以下のドライバを入れておく。
 - [CP210x USB to UART Bridge VCP Drivers](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers) : SiLabsUSBDriverDisk 23-09-50-721.dmg
 - この新しい？バージョンでないと認識されず、ちょっとだけハマった。
- Arduino IDE v1.8.5
 - ボード追加で、「ESP8266」を追加。
 - OLED制御用に「Adafruit SSD 1306」と「Adafruit GFX Library」を追加。


## （たぶん不要）
- 多少ハマったので、記載。
- 製造元Webサイトを見るとGitHubへのリンクがあり、Macへのインストール方法が掲載されているが、自分が試した感じ、たぶんこれは要らない。
 - https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series/blob/master/InstallGuide/mac.md
- 結局、以下に記載の通り、自分のArduino IDE環境では「WiFi Kit 8」でコンパイルオプション選択メニューが表示されず、そのせいでコンパイルエラーが解消しなかった。
 - ボードは普通に「Generic ESP8266 Module」を選択すれば良い。
 - 要は、Pinアサインが独自なだけの普通のESP8266実装基板として使えば良い。
- まあ一応、手順通りにするとhardware/heltecフォルダ配下にボードのピン構成とかの仕様書PDFが配置されるので、仕様書がローカルの手元に入手できるという点で、意味はある。

```
mkdir -p ~/Documents/Arduino/hardware
cd ~/Documents/Arduino/hardware
git clone https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series.git heltec
cd heltec/esp32
git submodule update --init --recursive
cd tools
python get.py
cd ~/Documents/Arduino/hardware/heltec/esp8266
git submodule update --init --recursive
cd tools
python get.py
```

```
iMac-nabeshin:~ nabeshin$ cd Documents/Arduino/hardware/
iMac-nabeshin:hardware nabeshin$ ls
espressif
iMac-nabeshin:hardware nabeshin$ git clone https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series.git heltec
Cloning into 'heltec'...
remote: Enumerating objects: 471, done.
remote: Counting objects: 100% (471/471), done.
remote: Compressing objects: 100% (363/363), done.
remote: Total 8494 (delta 115), reused 256 (delta 76), pack-reused 8023
Receiving objects: 100% (8494/8494), 87.87 MiB | 2.19 MiB/s, done.
Resolving deltas: 100% (3588/3588), done.
Checking out files: 100% (3157/3157), done.
iMac-nabeshin:hardware nabeshin$ cd heltec/
.git/             .gitmodules       PinoutDiagram/    SchematicDiagram/ esp8266/          
.gitignore        InstallGuide/     README.md         esp32/            
iMac-nabeshin:hardware nabeshin$ cd heltec/esp32/
iMac-nabeshin:esp32 nabeshin$ git submodule update --init --recursive
iMac-nabeshin:esp32 nabeshin$ cd tools/
iMac-nabeshin:tools nabeshin$ python get.py
System: Darwin, Info: Darwin-17.7.0-x86_64-i386-64bit
Platform: x86_64-apple-darwin
Downloading xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
Done
Extracting xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
Downloading esptool-2.6.0-macos.tar.gz
Done
Extracting esptool-2.6.0-macos.tar.gz
Downloading mkspiffs-0.2.3-arduino-esp32-osx.tar.gz
Done
Extracting mkspiffs-0.2.3-arduino-esp32-osx.tar.gz
Renaming mkspiffs-0.2.3-arduino-esp32-osx to mkspiffs
Done
iMac-nabeshin:tools nabeshin$ cd ~/Documents/Arduino/hardware/heltec/esp8266
iMac-nabeshin:esp8266 nabeshin$ git submodule update --init --recursive
iMac-nabeshin:esp8266 nabeshin$ cd tools/
iMac-nabeshin:tools nabeshin$ python get.py
Platform: x86_64-apple-darwin
Downloading x86_64-apple-darwin14.esptool-f80ae31.tar.gz
Done
Extracting dist/x86_64-apple-darwin14.esptool-f80ae31.tar.gz
Downloading x86_64-apple-darwin14.xtensa-lx106-elf-20ed2b9c.tar.gz
Done
Extracting dist/x86_64-apple-darwin14.xtensa-lx106-elf-20ed2b9c.tar.gz
Downloading x86_64-apple-darwin14.mkspiffs-7fefeac.tar.gz
Done
Extracting dist/x86_64-apple-darwin14.mkspiffs-7fefeac.tar.gz
iMac-nabeshin:tools nabeshin$ 
```

- Arduino IDEを起動。
 - 前述の通り、「ツール」 -->「ボードマネージャ」で「WiFi_Kit_8」を選択してサンプルコードをコンパイルすると、こんなエラーが。。。

```
xtensa-lx106-elf-g++: error: {build.flash_flags}: No such file or directory
exit status 1
ボードWiFi_Kit_8に対するコンパイル時にエラーが発生しました。
```

- xtensa-lx106-elf-g++ ってのは存在するが、コンパイルオプションで"{build.flash_flags}"が指定されてないようである。
 - /Users/nabeshin/Documents/Arduino/hardware/heltec/esp8266/tools/boards.txt.pyあたりを見ると、これに対応するオプションがArduino IDEの選択項目で選べないらしい。
- 仕方ないので、"Generic ESP8266 Module"を選択するとあっさりコンパイルが通り、書込みも実行も正常にできた。
 - こちらのメニューには"{build.flash_flags}"に対応する選択項目「Flash Mode」が出ている。
 - う〜〜ん、、、"WiFi_Kit_8" なんて選ぶ必要ないじゃん。
- まあ、これでとりあえずコンパイルが通り、ボードに書き込みが出来た。

# EPS8266として扱う
- 余計な時間を食われたが、気を取り直して作業再開。
- そもそも本質的に捉えると、このボードはESP8266に独自に128*32のOLEDをくっつけただけ。
- 要は、独自のピン配置だけ気をつけてコードを組めば普通に動くはず。
 - WiFi_Kit_8 のPinoutDiagramを見ると、ESP8266とOLEDは以下に接続されているようである。

-  [WIFI_Kit_8_Diagram(new).pdf](http://www.heltec.cn/download/WIFI_Kit_8_Diagram(new).pdf)

| OLED Pin | ESP8266(WIFI_Kit_8) GPIO  |
|:---------|:-------|
| OLED_SDA | GPIO_4  |
| OLED_SCL | GPIO_5  |
| OLED_RST | GPIO_16 |

- 尚、このOLEDのi2cアドレスは「0x3c」
- 「Reset Method」は「nodemcu」にして置くのを忘れずに。（これは本家のマニュアルにも記載がある。）

## OLEDの動作確認
- OLED表示サンプルコードを開く
 - 「ファイル」 --> 「スケッチ例」 --> 「Adafruit SSD 1306」 --> 「ssd1306_128x32_i2c」

```
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     16//4 // Reset pin # (or -1 if sharing Arduino reset pin)
```
- 上記の行を"WiFi_Kit_8"の基板のピン配置に調整。
 - このボードはRESETピンがGPIO_16 に繋がっているので、番号を4 --> 16に変更。


```
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
```

- ここのi2cアドレスは 「0x3c」 のままでOK
- これだけでコンパイル、書き込みが成功し、無事にOLED表示できた。

![IMG_1759.JPG](https://qiita-image-store.s3.amazonaws.com/0/283854/7764f120-69b4-145f-c116-789c67be97d5.jpeg)


## OLEDの動作確認
- ここまで出来ればあとは普通のArduinoである。
- サクッとOLEDに超音波距離センサ(HC-SR04)の検出値を表示してみた。

![IMG_1773.jpg](https://qiita-image-store.s3.amazonaws.com/0/283854/58007254-3322-1dd8-a0bf-d562c1f39981.jpeg)

- Pin接続 

| HC-SR04 | ESP8266(WIFI_Kit_8) GPIO  |
|:--------|:---------|
| Vcc     | 5V       |
| Trig    | GPIO_12  |
| Echo    | GPIO_13  |
| Gnd     | Gnd      |


```

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     16 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

int trig = 12; // HC-SR04 トリガー出力ピン
int echo = 13; // HC-SR04 エコー入力ピン

void setup() {
  Serial.begin(9600);

  pinMode(trig,OUTPUT);
  pinMode(echo,INPUT);

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  display.display();
  delay(2000); // Pause for 2 seconds

  // Clear the buffer
  display.clearDisplay();
}

void loop() {
    // 超音波の出力終了
  digitalWrite(trig,LOW);
  delayMicroseconds(1);
  // 超音波を出力
  digitalWrite(trig,HIGH);
  delayMicroseconds(11);
  // 超音波を出力終了
  digitalWrite(trig,LOW);
  // 出力した超音波が返って来る時間を計測
  int t = pulseIn(echo,HIGH);
  // 計測した時間と音速から反射物までの距離を計算
  float distance = t*0.017;
  // 計算結果をシリアル通信で出力
  Serial.print(distance);
  Serial.println(" cm");


  display.clearDisplay();
  display.setTextSize(2); // Draw 2X-scale text
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
//  display.println("Distance");
  display.print(distance);
  display.println(" cm");
  display.display();
  
  delay(1000);
}
```


# まとめ
- 期待通りコンパクトでいい感じ。 
 - Arduinoで同じくLCDやOLEDと繋いで同じことやった事があるが、ディスプレイが一体になってるコンパクトさが良い。
- ここまでできれば、あとは各種センサを繋いで値を表示したり、Wifiでどっかサーバに飛ばしたり、何でもできる。
- 独自のピンアサインを考慮するだけで、I2CのOLED付きArduinoとして普通に使える。
 - 一応、本家のサイトにあるように環境をセットアップしたが、自分のArduino IDE環境ではコンパイル出来なかった。
 - Arduino IDE v1.8.5 で最新のESP8266ボードライブラリを持って来れば本家のツールは不要だったりするかも。
- 次は、本格的にWifi使って色々試してみたい。