はじめに
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行目付近を下記のように書き換えた
書き換え前
#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
書き換え後
#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や抵抗などがまとめてセットになっているので楽。