Edited at

ESP32 Devkitc+IRremoteの注意点


はじめに

bluetoothを使った赤外線リモコンを作ろうとしたときにハマったのでメモとして残しておきます。


環境

使用ソフト:Arduino

使用マイコン:esp32-devkitc

使用ライブラリ:IRremote(GitHub)


行おうとしたこと

IRRemoteをArduino IDEにインストールし、サンプルスケッチのIRremote>IRrecvDumpV2をESP32に書き込もうとした。


発生したトラブル

esp32に11番ピンがなかったのでIrecvDumpV2のrecvPinを15に書き換えて実行したところ下記のコンパイルエラー。


Arduino:1.8.9 (Windows 7), ボード:"ESP32 Dev Module, Disabled, Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS), 80MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 115200, None"

In file included from C:\Users\ユーザー名\AppData\Local\Temp\arduino_modified_sketch_934277\IRrecvDumpV2.ino:4:0:

C:\Users\ユーザー名\Documents\Arduino\libraries\IRremote/IRremote.h:365:23: error: 'SEND_PIN' was not declared in this scope

const int sendPin = SEND_PIN;

^

exit status 1
ボードESP32 Dev Moduleに対するコンパイル時にエラーが発生しました。

「ファイル」メニューの「環境設定」から
「より詳細な情報を表示する:コンパイル」を有効にすると
より詳しい情報が表示されます。

IRremote.hは赤外線の送受信用のライブラリなのだが、ESP32では赤外線送信がサポートされていないからESO32用のSEND_PINが定義されていないようだ。(Wifiの送信周りと干渉するらしい?)

8/29追記:多分割り込みやPWM信号がArduinoと互換性が無いからだろう。別記事にて自作してみたので作ってみたい人は確認してみてください。

なのでライブラリ(C:\Users\ユーザー名\Documents\Arduino\libraries\IRremote\IRremote.h)の365行目付近を下記のように書き換えた

書き換え前


IRremote.h


#ifdef USE_SOFT_CARRIER
private:
int sendPin;

unsigned int periodTime;
unsigned int periodOnTime;

void sleepMicros(unsigned long us);
void sleepUntilMicros(unsigned long targetTime);
#else
const int sendPin = SEND_PIN;
#endif


書き換え後


IRremote.h


#ifdef USE_SOFT_CARRIER
private:
int sendPin;

unsigned int periodTime;
unsigned int periodOnTime;

void sleepMicros(unsigned long us);
void sleepUntilMicros(unsigned long targetTime);
#elif defined(ESP32)
// No system LED on ESP32, disable blinking by NOT defining BLINKLED

// avr/interrupt.h is not present
#else
const int sendPin = SEND_PIN;
#endif


これでコンパイルが通り、動かしてみたら問題なく動いたので良しとする。


余談

赤外線送受信用のセンサーやLEDはSeeedのデバイスを利用した。FETや抵抗などがまとめてセットになっているので楽。