Help us understand the problem. What is going on with this article?

ESP32をArduino IDEから使う時のTipsのメモ

More than 1 year has passed since last update.

ESP32をArduino IDEで開発する際に気がついたちょっとしたTipsのメモ
自分の覚書も兼ねているので随時更新していく予定

サーボ関連

サーボ関数は動かないのでLEDコントロールを使う。サンプルは以下。

survoTest.ino
//ESP32 Servo Control sample

//use first channel of 16 channels (started from zero)
#define LEDC_CHANNEL_0 0
//use 10 bit precission for LEDC timer
#define LEDC_TIMER_BIT 10
//use 50 Hz as a LEDC base frequency
#define LEDC_BASE_FREQ 50
//ServoPWM pin
#define SRV_PIN 13

int min = 26; // (26/1024)*20ms = 0.5 ms (-90deg)
int max = 122; // (122/1024)*20ms = 2.4 ms (+90deg)

void setup() {

// Setup timer and attach timer to a led pin
 ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_BIT);
 ledcAttachPin(SRV_PIN, LEDC_CHANNEL_0);

ledcWrite(0, min);

}

void loop() {

ledcWrite(0, min);

for(int n = min; n <= max; n++){
 ledcWrite(0, n);
 delay(20);
 }
}

Neopixel(WS2812)関連

基本はAdafruitのNeopixel Libraryが使える
https://github.com/adafruit/Adafruit_NeoPixel

ESP32で使う場合はshow()メソッドの前にdelay(1)を入れると安定する
割り込みでエラーが出る場合の対処方法は以下を参考
https://github.com/adafruit/Adafruit_NeoPixel/issues/139

Mr.MartyMacGyverのライブラリも使える
https://github.com/MartyMacGyver/ESP32-Digital-RGB-LED-Drivers
安定しているが記述が複雑なので、Adafruitのライブラリの方が簡単

I2C関連

I2Cを使う時はESP32標準のwire関数の引数にピンを指定する

Unopuino32の場合は以下のピンを割り当てている

int SDA32 = 22;
int SCL32 = 23;
Wire.begin(SDA32, SCL32);

I2C OLED(SSD1306)用のライブラリ

https://github.com/squix78/esp8266-oled-ssd1306
Unopuino32用であればI2Cピン指定を以下の様に修正

SSD1306 display(0x3c, 22, 23); // slvAdr, SDA, SCL

小型OLEDはaitendoやebayから数百円で購入する事が可能。但し、ピンの並び順が”VCC-GND-SCL-SDA”になっている必要あり。

2017/9/23時点で以下のものはピン配置確認済
aitendo: http://www.aitendo.com/product/14959
ebay: http://www.ebay.com/itm/281740440799
aliexpressで購入すると商品写真とピン配置が異なる事があるので要注意

タイマー割り込み

タイマー割り込みを使う場合は、ESP32 example sketchの”RepeatTimer”を参考に以下のコードを追加

// Timer Interrupt setting
hw_timer_t * timer = NULL;

volatile SemaphoreHandle_t timerSemaphore;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

void IRAM_ATTR onTimer(){
  // Increment the counter and set the time of ISR
  portENTER_CRITICAL_ISR(&timerMux);

  /*** ここにタイマー割り込みで実行するコードを記載 ***/

  portEXIT_CRITICAL_ISR(&timerMux);
  // Give a semaphore that we can check in the loop
  xSemaphoreGiveFromISR(timerSemaphore, NULL);
  // It is safe to use digitalRead/Write here if you want to toggle an output
}

void setup() {
  // Create semaphore to inform us when the timer has fired
  timerSemaphore = xSemaphoreCreateBinary();

  // Use 1st timer of 4 (counted from zero).
  // Set 80 divider for prescaler (see ESP32 Technical Reference Manual for more info).
  timer = timerBegin(0, 80, true);

  // Attach onTimer function to our timer.
  timerAttachInterrupt(timer, &onTimer, true);

  // Set alarm to call onTimer function every second (value in microseconds).
  // Repeat the alarm (third parameter)
  timerAlarmWrite(timer, 1000, true);

  // Start an alarm
  timerAlarmEnable(timer);
}

analogWrite()問題

“Arduino core for the ESP32″ではanalogWrite()関数をサポートしていない

代わりに、ledcWrite()関数を使用する事でPWM出力が可能
ESP32の場合LEDCは任意のピンに割り当てることが出来る

ESP32 example sketchの”LEDCSoftwareFade”を参考に以下の様に記述する

const int LED_PIN = 27; // PWM出力するPin No.
// use first channel of 16 channels (started from zero)
#define LEDC_CHANNEL_0 0
// use 13 bit precission for LEDC timer
#define LEDC_TIMER_13_BIT 13
// use 5000 Hz as a LEDC base frequency
#define LEDC_BASE_FREQ 5000

// Arduino like analogWrite
// value has to be between 0 and valueMax
void ledcAnalogWrite(uint8_t channel, uint32_t value, uint32_t valueMax = 255) {
 // calculate duty, 8191 from 2 ^ 13 - 1
 uint32_t duty = (8191 / valueMax) * min(value, valueMax);

// write duty to LEDC
 ledcWrite(channel, duty);
}

void setup() {
 // Setup timer and attach timer to a led pin
 ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);
 ledcAttachPin(LED_PIN, LEDC_CHANNEL_0);
}

void loop(){
  for(int i=0; i<256; i++){
    ledcAnalogWrite(LEDC_CHANNEL_0, i);
    delay(10); // change delay time can breath faster or slower
   }
}

Wifi経由でIFTTTを使う

以下の手順で出来る
Wifi経由でIFTTTへ接続しLINEへ通知

BLEライブラリを使ってみる

自分の過去記事を参照
Arduino IDEでBLEライブラリを導入
ESP32 ArduinoIDEでBLE経由で温度を通知

WiFiのSSID、パスワードを外部から設定しアクセスポイントに接続

ESP-TOUCHを使う

ESP32のサンプルスケッチの”WiFiSmartConfig”を参考にする
“ESP-TOUCH”という仕組みを使いスケッチ内にSSID、パスワードを記述せずにスマホのアプリからAPに接続可能
ESP-TOUCH Overview
ESP-TOUCHユーザーガイド

設定用アプリ
Espressif Esptouch (iOS)
ESPert SmartConfig (Android)

WifiManagerを使う

こちらを使えばブラウザ経由で任意のAPに接続できる
WifiManager-ESP32
具体的な手順はQiitaの投稿を参照
ESP32 WiFiのSSID、パスワードを外部から設定しアクセスポイントに接続

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away