背景とか所感
- 背景
- ESP8266, ESP32のOLED付きのコンパクトなボードのポテンシャルを知りたいと思っていた。
- M5Stackは魅力的だが価格的に結構するので、個人的に安価な構成でどこまで行けるかに興味がある。
- 先日、メルカリで格安で出品されていたのを見つけ、試しに購入してみた。
- ちなみに現在 Amazonで購入すると約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 : 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は以下に接続されているようである。
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表示できた。
OLEDの動作確認
- ここまで出来ればあとは普通のArduinoである。
- サクッとOLEDに超音波距離センサ(HC-SR04)の検出値を表示してみた。
- 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使って色々試してみたい。