TTGO ESP32開発ボード 簡易ガイド
===
[toc]
# 用語解説
## マイコンと開発ボード
マイコンとは、マイクロコンピュータ、MCU(Micro Controller Unit)の略称で、ソフトウェアを実行できる小さなコンピュータである。身近な例では炊飯器が分かりやすい。時間指定で炊飯を始める機能や米を炊くための綿密な温度調整は全てマイコンが行なっている。自動車などでは数十個のマイコンが機能している。
マイコンはそれ単体では扱いづらいので、組み込み開発をする場合には使いたいマイコンを搭載した開発ボードと呼ばれる基板を用いることになる。開発ボードは多種多様であるが、電源回路とLEDやボタンを搭載しただけのシンプルなものから、液晶や各種センサーを搭載した高級なものまで存在している。
## Arduinoについて
Arduino(アルディーノ)はボードの名前であり、フレームワークの名前である。イタリア発祥で、安価で学生にも使いやすいマイコンボードとして開発され、世界中で人気を博している。
> フレームワークとは枠組みを意味し、プログラミングにおいてはその分野でよく使う機能を体系的にまとめたもの
オープンソースハードウェアであるため、公式が発売しているMade in Italyな数々のArduinoボードに加えて、個人が趣味で作ったArduino互換機も非常に多く出回っている。
今回用いるボードは公式のArduinoボードでは無いが、Arduinoフレームワークに対応しているのでArduinoと同じように開発することができる。
### リファレンス
Arduinoはフレームワークであるので、使用できる関数や定数の一覧が公開されている。プログラミングに置いてそのような文書のことをリファレンスと呼ぶ。
#### Arduinoのリファレンス
* [公式ページのArduinoの関数リファレンス](https://www.arduino.cc/reference/en/)
* [Arduinoの日本語リファレンス](http://www.musashinodenpa.com/arduino/ref/)
## ESP32について
ESP32はEspressif社の開発したマイコンの俗称で、ESP32-WROOM32-Dというのが正式な型番である。安価だが技適認証されたWiFiやBluetooth機能を搭載しており、Arduinoフレームワークに対応しているため2019年現在人気がある。
> 主な諸元
> * CPU 32bit デュアルコアプロセッサ(400MIPS)
> * WiFi(802.11 b/g/n)
> * bluetooth v4.2
> * SRAM 520KB
> * ROM 448KB
> * UART x 3
> * SPI x 2
> * I2C x 2
> * I2S x 2
> * DAC x 2
> * ADC x 16
> * GPIO x 21
ESP32は厳密には2センチ四方程度の大きさの銀色のチップを指す。しかし、ESP32単体には電源回路などが組み込まれていないため、開発ボードに搭載された状態のものを活用することが多い。
# プログラミング
## プロジェクト: Lチカ(blink)
::: info
**目的** : LEDを点滅させて組み込み開発に慣れ親しむ
:::
以下のプログラムを`src/main.cpp`に書いて、ボードを接続し、書き込むとボードのLEDが1秒ごとに点滅を繰り返し始める。TTGO ESP32開発ボード裏面のLEDは5番ピンに繋がっている。
```cpp=
#include <Arduino.h> // Arduinoライブラリを導入
#define LED_PIN 5 // プログラム中のLED_PINという文字を5に置換
// 最初に一回だけ実行されるsetup()関数
void setup() {
pinMode(LED_PIN, OUTPUT); // LED_PIN(5番ピン)を出力ピンに設定
}
// setup()関数のあと無限ループするloop()関数
void loop() {
digitalWrite(LED_PIN, HIGH); // LED_PIN(5番ピン)をHIGH(5V)に設定
delay(1000); // 1000[ms]の間何もしない
digitalWrite(LED_PIN, LOW); // LED_PIN(5番ピン)をLOW(0V)に設定
delay(1000); // 1000[ms]の間何もしない
}
```
:::warning
### ボードに書き込めない時
* USBケーブルは繋がっているか?通信用のケーブルを使用しているか?
* モバイルバッテリーに付属するUSBケーブルは充電にしか使えないことがある
* ボードはデバイス一覧に表示されているか?
* ドライバがインストールされていないとボードは表示されない
* コンパイルエラーが出ていないか?
* プログラムを規則通り書けていないとコンパイルエラーとなり書き込みは行われない
* 行末の ; (セミコロン)を忘れていないか?
* カッコを閉じ忘れていないか?
* タイプミスが無いか?
### 書き込めたのに動かない場合
側面にあるリセットボタンを押すと良い
:::
:::info
**Tips**
Lチカとは"LEDをチカチカ(点滅)させる"の略である。組み込み開発の第一歩として、整えた開発環境とマイコンの動作確認として、世界中で行われている。
:::
---
## プロジェクト: Lチカ(blink-pwm)
::: info
**目的** : PWM(Pulse Width Modulation)を使う
:::
マイコンのピンは通常、ONの状態かHIGHの状態しか出力できないが、PWMという信号波形を用いることでLEDの明るさを変えることができる。
PWMはONとOFFを一定周期で繰り返す波形で、ONとOFFの比率(duty比)を変えることで電圧が変化しているのと同じような状態にできる。実際にはONとOFFを繰り返しているだけのため、LEDをスローモーションカメラで取れば点滅しているだけになってしまうが、人間の目には残像現象を起こす特性があるので問題なく明るさが変化しているように見える。

以下のプログラムではLEDがゆっくりと明るくなり、一瞬消灯するのを繰り返す。
```cpp=
#include <Arduino.h>
#define LED_PIN 5
int brightness = 0; // 明るさ保存用の変数
void setup() {
// 使用するタイマーのチャネルと周波数を設定
ledcSetup(0, 12800, 8);
// LED_PINをチャネル0へ接続
ledcAttachPin(LED_PIN, 0);
}
void loop() {
// チャネル0に明るさを設定
ledcWrite(0, brightness);
brightness += 1; // 明るさを増やす
if (brightness > 255) brightness = 0; // 明るさが255を超えたら0に戻す
delay(10);
}
```
ledcSetup()関数はチャネル, PWM周波数, デューティ比を表すbit数を指定する関数である。
上記プログラムではチャネルを0, PWM周波数を12800$[Hz]$,デューティ比を8bit指定(0から255まで)に指定している。チャネルは0から15までを自由に指定できる。
ledcAttachPin()関数は、特定のピンをチャネルに接続する関数である。
上記プログラムではLED_PINをチャネル0に接続している。なおチャネルに複数のピンを接続することもできる。
ledcWrite()関数はチャネルにduty比を指定する。duty比を8bitに指定している場合、0〜255の値が入力できる。チャネルのduty比を指定するので、複数のピンが繋がっていれば同時に変化する。
:::info
**Tips**
ledcWriteはESP32特有の機能である。
通常、ArduinoではanalogWrite()関数が用いられる。
身近で光っているもの(駅のLED電光掲示板など)は人間の目に見えない速さで点滅していることが多い。カメラで撮影すると、チラつくような映像が撮れることがあるのはそのためである。
:::
---
# 参考になるサイト
* Arduino(ESP32)リファレンス
https://garretlab.web.fc2.com/arduino/esp32/reference/
* 開発ボード会社のOLEDサンプル(T2 v1.4を使用)
https://github.com/LilyGO/TTGO-T2-SSD1331-SD
* PWM出力(ledcWrite関数)
https://wak-tech.com/archives/742
* Bluetooth LEを使う
https://deviceplus.jp/hobby/entry_070/
* アナログ電圧出力
https://kobazlab.tech/2018/01/29/esp32%e3%81%a7%e3%82%a2%e3%83%8a%e3%83%ad%e3%82%b0%e5%87%ba%e5%8a%9b/