令和最新ESP32でのArduino変更点まとめ

概要

1.0.6と2.0.6を比べて変更があった場所などを確認してみました。気になったものだけピックアップして紹介したいと思います。

アナログ電圧取得

まだanalogRead()のADC値を電圧変換して消耗しているの?
analogReadMilliVolts()を使いましょう。

(ちなみにこの関数は1.0.6時代にはありましたので結構古い関数になります)

利用例

uint16_t analog_adc = analogRead(15);
uint32_t analog_mv = analogReadMilliVolts(15);
Serial.printf("analog_adc=%d, analog_mv=%d\n", analog_adc, analog_mv);

結果

analog_adc=707, analog_mv=672
analog_adc=677, analog_mv=651
analog_adc=385, analog_mv=434
analog_adc=0, analog_mv=128
analog_adc=4095, analog_mv=3148

えーっと、GND直結の時に128mVになるんですね。。。3.3Vを入力してADCは最大値の4095ですが、3.148Vとなっています。。。

どうせ補正しないといけないのでanalogRead()でいいかな、、、

RGB LED

まだFastLEDで消耗していませんか?

arduino-esp32/BlinkRGB.ino at master · espressif/arduino-esp32
Arduino core for the ESP32. Contribute to espressif/arduino-esp32 development by creating an account on GitHub.
void neopixelWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val);

ただ1つのRGB LEDにしか対応していません。最近のDevKitには1つだけ搭載しているのでそこに対応したのだと思います。

個人的FastLEDはESP32向きではないのでもう少し軽いライブラリを使いたいです。

昔に検証したので、小さいライブラリにまとめ直そうかな。。。

DAC出力停止で0か中間値を出力していませんか?

void dacDisable(uint8_t pin);

無効化する関数が増えていました。

TONE

ESP32にはTONE関連の関数がないのでledc(PWM)を使うと思っていませんか?

void setToneChannel(uint8_t channel = 0);
void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0);
void noTone(uint8_t _pin);

なんと関数が追加されています。スケッチ例はありません。。。

I2Cスレーブ

独自実装したライブラリを利用していませんか?

arduino-esp32/esp32-hal-i2c-slave.h at master · espressif/arduino-esp32
Arduino core for the ESP32. Contribute to espressif/arduino-esp32 development by creating an account on GitHub.

ただし、利用しているコードを発見することができませんでした。

UARTのループバック

void uart_internal_loopback(uint8_t uartNum, int8_t rxPin);

関数が追加されています。

arduino-esp32/OnReceive_Demo.ino at master · espressif/arduino-esp32
Arduino core for the ESP32. Contribute to espressif/arduino-esp32 development by creating an account on GitHub.

上記とかで使っています。

割り込み

IRAM_ATTRをまだ使っていませんか?

arduino-esp32/GPIOInterrupt.ino at master · espressif/arduino-esp32
Arduino core for the ESP32. Contribute to espressif/arduino-esp32 development by creating an account on GitHub.
void ARDUINO_ISR_ATTR isr(void* arg) {
    Button* s = static_cast<Button*>(arg);
    s->numberKeyPresses += 1;
    s->pressed = true;
}

IRAM_ATTRの変わりにArduino互換のARDUINO_ISR_ATTRを使うようになりました。

arduino-esp32/esp32-hal.h at master · espressif/arduino-esp32
Arduino core for the ESP32. Contribute to espressif/arduino-esp32 development by creating an account on GitHub.
#define ARDUINO_ISR_ATTR IRAM_ATTR

上記でARDUINO_ISR_ATTRをIRAM_ATTRに置換しているので互換性もばっちりです。

I2Sがスッキリと

arduino-esp32/libraries/I2S/examples at master · espressif/arduino-esp32
Arduino core for the ESP32. Contribute to espressif/arduino-esp32 development by creating an account on GitHub.

I2Sクラスができたので、かなりすっきりと、、、したのですが、、、

typedef enum {
  I2S_PHILIPS_MODE,
  I2S_RIGHT_JUSTIFIED_MODE,
  I2S_LEFT_JUSTIFIED_MODE,
  ADC_DAC_MODE,
  PDM_STEREO_MODE,
  PDM_MONO_MODE
} i2s_mode_t;

設定できるモードでADC_DAC_MODEが使いにくいです。このクラス当初はADCとDACをサポートしていなかったと思いますが、追加されたみたいです。しかしADCを使おうとするとDACも初期化されるので25と26も使えなくなります。

  #define PIN_I2S_SD_IN 35 // Pin 35 is only input!

DACを使おうとすると、上記の設定により35がデフォルトで利用されることになります。

まとめ

いろいろ変わってはいますが、実用性があるのはtone()関連ぐらいでしょうか。あとかなり違うのはUSBとかESP32-S3関連の機能になっていました。

いかがだったでしょうか?

コメント

  1. ogu より:

    いつも記事を参考にさせていただいています。

    ひとつ質問をさせて頂きたいのですが、現在使用しているボードはM5StackCore2なのですが、先日、Windows10で使用しているarduinoIDEを1.8.x から最新の2.0.3へバージョンアップしたところ、AquesTalkの発話が異常になってしまいました。
    そこで参考にさせていただいている、こちらの関連サイトからダウンロードした、hello_aquestalk_i2s_M5StakCore2.inoのスケッチを書き込んだ所、音声は綺麗なのですが、異常に早口になっていて、int iret =の数字を100から変更しても反映されていない感じです。
    IDEを過去の物を使ってみたのですが、こちらはコンパイルエラーになってしまいます。
    当方ではどうにも原因が判らず、何等かのアドバイスが頂けると大変助かります。

    • たなかまさゆき より:

      // Set Speed(8000:Yukkuri, 12000:Normal)
      DAC_Create(8000);

      速度はたしかここだと思います。

      • ogu より:

        ご指摘ありがとうございます。
        下記の二つのパラメーターを変更しても発話速度に変化がありませんでした。
        arduino IDEを2.0.3にバージョンアップするまでは何も弄らずに問題がなかったので、
        何か当方の環境の問題かもしれません。
        もう少し原因を探ってみます。ありがとうございました。

        発話速度について
        int iret = CAqTkPicoF_SetKoe((const uint8_t*)koe, 100, 0xffffU);
        上記の100が速度で50-300(%)が指定できます。

        // Set Speed(8000:Yukkuri, 12000:Normal)
        DAC_Create(8000);