安いWi-Fi機能付きのESP8266マイコンを試す（準備編）

## 最初に

### ESP8266マイコンとは
<details><summary>スペック表</summary><div>

|項目|内容|備考|
|:-|:-|:-|
|プロセッサ|ESP8266|32ビットRISC CPU|
|MODEL|ESP-8266 D1 mini HW-350|フラッシュメモリ4MB|
|メーカー|Espressif||
|DIO|11|   |
|ADC|1|AD:0.0V-1.0V (10bit)  |
|I2C|1|   |
|SPI|1|   |
|PWM|-|ソフトウェアPWM|
|Arduiono|互換|追加のボードマネージャーURL [ESP8266]<br>http://arduino.esp8266.com/stable/package_esp8266com_index.json |
|USB形状|microB|  |
|USBシリアル|CH340G|シリアルポート   |
</div>
</details>

<details><summary>ポート表</summary><div>
本体シルク（SLK）とポートとの対応
|  |  | 本体SLK | 本体SLK |  |  |
|:-:|:-:|:-:|:-:|:-:|:-:|
|   | RST | RST | TX | GPIO1 | TX  |
|   | ADC0 | A0 | RX | GPIO3 | RX  |
| WAKE | GPIO16 | D0 | D1 | GPIO5 | SCL |
| SCLK  | GPIO14 | D5 | D2 | GPIO4 | SDA |
| MISO | GPIO12 | D6 | D3 | GPIO0 | FLASH |
| MOSI  | GPIO13 | D7 | D4 | GPIO2 |   |
| CS | GPIO15 | D8 | G | GND  |
|   | 3.3V | 3V3  | 5V |   |
</div>
</details>

## 使うまで

<details><summary>下準備</summary><div>

<dl>

<dt>1.CH340ドライバのインストール</dt>
<dd>Nanjing Qinheng Microelectronics Co., Ltdからダウンロード</dd>
<dd>CH341ドライバ: <a href="https://www.wch-ic.com/downloads/CH341SER_ZIP.html">https://www.wch-ic.com/downloads/CH341SER_ZIP.html</a></dd>
</dl>

<dt>2.Arudion IDE準備[追加のボードマネージャー]</dt>
<dd>ファイル→基本設定→追加のボードのマネージャーURLに入力</dd>
<dd>http://arduino.esp8266.com/stable/package_esp8266com_index.json<br>
を入力</dd>
</dl>
<dt>3.Arudion IDE準備[ボード]</dt>
<dd>ツール→ボード→ボードマネージャー</dd>
<dd>ボードマネージャー：ESP8266 で検索</dd>
<dd>esp8266 by ESP8266 Community を選択</dd>
<dd>インストールボタンがある場合は、未インストールなのでインストール</dd>
<dd>ツール→ボード→[esp8266]→メニューから[Generic ESP8266 Module]</dd>
</dl>
<dt>4.Arudion IDE準備[ポード]</dt>
<dd>ツール→ポード→USB COMポートを選択</dd>
</dl>
</div>
</details>

## Arudiono IDEで使う

<details><summary>ボード上LED点灯</summary><div>
スケッチ

```
const uint8_t TARGET_PIN = LED_BUILTIN;
const uint8_t LED_ON     = LOW;
const uint8_t LED_OFF    = HIGH;
const unsigned long DELAY_TERM = 1000;
const unsigned long DELAY_BLINK = 100;

// setup
void setup() {
  // ボード上のLEDを指定
  pinMode(TARGET_PIN, OUTPUT);
}

// ループ
void loop() {
  //  消灯
  digitalWrite(TARGET_PIN, LED_OFF);  // 消灯
  delay(DELAY_TERM);                  // 待ち
  //  点灯(ちょっと消灯)
  digitalWrite(TARGET_PIN, LED_ON);   // 点灯
  delay(DELAY_TERM);                  // 待ち
  digitalWrite(TARGET_PIN, LED_OFF);  // 消灯
  delay(DELAY_BLINK);                 // 待ち
  //  点灯(ちょっと消灯)
  digitalWrite(TARGET_PIN, LED_ON);   // 点灯
  delay(DELAY_TERM);                  // 待ち
  digitalWrite(TARGET_PIN, LED_OFF);  // 消灯
  delay(DELAY_BLINK);                 // 待ち
}
```
LOWが点灯、HIGHが消灯。ちょっと、間違えやすい…
</div>
</details>


<details><summary>アナログ値入力</summary><div>
スケッチ

```
const  uint8_t AD_PIN = A0;
const  unsigned long SERIAL_SPEED = 115200;
const  unsigned long DELAY_TERM = 1000;
const  float CALC_OFFSET  = 0;
const  float CALC_RATE    = 1;
const  float CALC_RESOL   = 1024;

// setup
void setup()
{
  Serial.begin(SERIAL_SPEED);

  pinMode(AD_PIN, INPUT);
}

// ループ
void loop()
{
  int input_val = 0;
  float volt = 0;

  input_val = analogRead(AD_PIN);

  volt = ((float)(input_val) / CALC_RESOL) * CALC_RATE + CALC_OFFSET;
  Serial.printf("ADC = %d , %fV \r\n", input_val, volt);

  delay(DELAY_TERM);
}
```
</div>
</details>

<details><summary>PWM制御</summary><div>
スケッチ

```
#include <Ticker.h>

const uint8_t TARGET_PIN  = LED_BUILTIN;
const unsigned long DELAY_TERM = 500;
const unsigned long SERIAL_SPEED = 115200;

const uint8_t PWM_ON      = HIGH;
const uint8_t PWM_OFF     = LOW;
const int     PWM_HZ      = 50;

Ticker    pwm_ticker;
uint32_t  pwm_cycle_ms;
float     duty_rate;

// setup
void setup() {
  Serial.begin(SERIAL_SPEED);

  // ボード上のLEDを指定
  pinMode(TARGET_PIN, OUTPUT);

  pwm_cycle_ms = 1000.0 / PWM_HZ;
  duty_rate = 0;

  //  msec
  pwm_ticker.attach_ms(pwm_cycle_ms, pwm_dest);
}

//  PWM
void pwm_dest() {
  unsigned int microSec;

  microSec = ((float)pwm_cycle_ms * duty_rate * 1000);

  digitalWrite(TARGET_PIN, PWM_ON);
  delayMicroseconds(microSec);
  digitalWrite(TARGET_PIN, PWM_OFF);
}

// ループ(ここでは出力せず、PWMの大きさを変えているだけ)
void loop() {
  
  duty_rate += 0.05;
  if (duty_rate > 1.0)
  {
    duty_rate = 0;
  }
  Serial.printf("cycle = %d duty_rate = %f \r\n", pwm_cycle_ms, duty_rate);

  delay(DELAY_TERM);
}
```
</div>
</details>

## 最後に
スケッチコードはCC BY-SA 4.0（著作者の情報とCCライセンス継承はお願いします。商用利用・改変・再配布は問題なし）です。