ESP32を使って学習リモコンを作る(3) ソフトウェア 赤外線リモコン受信( irReceive )

赤外線リモコン スマートリモコン Smart Remote Controller Aruduino PlatformIO ESP32

本項では全画面表示が可能な図番に * を付けています。

ソフトウェア編

はじめに

学習リモコンを構成するソフトウェア

ESP32 を使った学習リモコンのソフトウェアは ESP32 本体のファームウェアと制御用の Web ブラウザで構成されています。スマートフォン、タブレットや PC などデバイスに依存せずに IP アドレスだけ指定することで簡単に使うことができるので専用アプリケーションではなく、Web ブラウザにしました。家庭内での運用を想定しているので ESP32 にローカル Web サーバーの機能を持たせて Web ブラウザを表示しています。(表1)

機能デバイスプログラミング言語
学習リモコンESP32-DevKitC-32EC++
ユーザーインターフェースPC、スマートフォン、タブレットHTML、Java Script、CSS
表1 学習リモコンを構成するソフトウェア

ソフトウェア開発環境

開発環境は非常に使いやすい Visual Studio Code に拡張機能を追加しています。 IoT システムソフトウェア開発環境と同じになります。

要素技術

学習リモコンに必須の4件のソフトウェア要素技術について説明して、最後に本機のソフトウェアを説明します。

ソフトウェア要素技術
 ・赤外線リモコン受信(irReceive)
 ・赤外線リモコン送信(irSend)
 ・webserver
 ・Flash 読書き(SPIFFS)

赤外線リモコン受信(irReceive)

「あすき」さんの「Arduino(ESP32)でエアコンの赤外線リモコンの信号をコピーして発信する」を参考にさせていただきました。

ハードウェア

図1 は irReceive に用いる回路図です。
前回 ESP32を使って学習リモコンを作る(2) で紹介した「図1 赤外線受光回路」との違いは、NPN トランジスタ Q1 2SC945 のベースバイアス抵抗 R2 22KΩ が VDD=3.3V に固定されていることです。

*図1 irReceive 回路

部品配置は ESP32-DevkitC-32E の右側が irReceive 部品配置図になります。(図2)
前回 ESP32を使って学習リモコンを作る(2) で紹介した「図5 部品配置図」との違いは NPN トランジスタ Q1 2SC945 のベースバイアス抵抗 R2 22KΩ が VDD=3.3V に固定されていることです。(図2 オレンジ矢印で示した配線)

*図2 irReceive 部品配置

プロジェクトを作成する

Visula StudioCode (VSCode) を開いて画面左端縦の「アクティビティバー」からアリさんマーク(赤丸)をクリックします。(図3)

*図3 Visual Studio Code を開く

プライマリサイドバーが表示されるので Create New Project をクリックします。(図4)

*図4 プライマリサイドバー

PIO Home 画面が表示されます。(図5)

*図5 PIO Home 画面

画面中央から右寄りの Quick Access から + New Project をクリックすると、Project Wizard が表示されます。(図6)

*図6 Project Wizard

Project Wizard に従って入力します。(図7)
  Name:  irRemote (何でもいいので任意のプロジェクト名を入力)
  Board: Espressif ESP32 Dev Module (プルダウンメニューから選択します)
  Framework: Arduino (プルダウンメニューから選択します)

*図7 Project Wizard に必要事項を入力した

Project Wizard で Finish をクリックするとプロジェクトが自動生成されます。(図8)

*図8 プロジェクトが自動生成された

ライブラリ

IRremote のライブラリが必要になります。IRremote は platformio.ini にライブラリ依存性を定義すると自動的にインストールされます。

irReceive プロジェクト

自動生成されたプロジェクトに追加、変更を加えて irReceive に対応させます。

platformio.ini ファイルに以下の 3 行を追加します。(図9)
  lib_deps = z3t0/IRremote@^4.4.1 (ライブラリ名を訂正しました)
  upload_port = COM3 (使用する PC によって変わります)
  monitor_speed = 115200

*図9 platformio.ini

main.cpp をクリックして自動生成されたファイルの内容を表示します。(図10)

*図10 main.cpp

自動生成された main.cpp の内容を全て削除します。
GitHub リポジトリから ReceiveDump.ino の内容をコピーします。(図11)

*図11 ReceiveDump.ino ファイル

空になった main.cpp に ReceiveDump.ino の内容をペーストします。(図12)

*図12 ReceiveDump.ino をペーストした

main.cpp にペーストした内容に次の3項目を追加します。(図13 63行目~65行目)
  #define LED_BUILTIN 26
  #define RAW_BUFFER_LENGTH 750
  #define RECORD_GAP_MICROS 12000

*図13 main.cpp に 3 行追加した

src フォルダにカーソルを合わせて右クリックして表示されたメニューから「新しいファイル」を選択すると、src フォルダ下に入力窓が表示されるので、ファイル名を「PinDefinitionsAndMore.h」と入力します。(図14)

*図14 PinDefinitionsAndMore.h ファイル


GitHub リポジトリから PinDefinitionsAndMore.h の内容をコピーします。(図15)

*図15 PinDefinitionsAndMore.h

作成した src/PinDefinitionsAndMore.h ファイルを開いてペーストします。(図16)

*図16 ペーストした

main.cpp、PinDefinitionsAndMore.h に警告が出ていますがそのままで構いません。 ビルド(build) すると自動的に解消されます。

ファームウェアビルド

PROJECT TASKS から Build をクリックするとビルドが開始されて [SUCCESS] と表示されると完了です。(図17)

*図17 Biuld 結果

ファームウェア書込み

ESP32-DevKitC-32E を USB ケーブルで PC に接続します。
PROJECT TASKS から Upload をクリックすると ESP32-DevKitC-32E へファームウェアの書込みが開始されて [SUCCESS] と表示されると完了です。(図18)

*図18 Upload 結果

ファームウェア実行

PROJECT TASKS から Monitor をクリックするとファームウェアの実行が開始されて、ターミナルウインドウにメッセージが表示されます。

「If you receive protocol NEC, Samsung or LG, run also ReceiveDemo to check if your actual protocol is eventually NEC2 or SamsungLG, which is determined by the repeats」が表示されるとファームウェアが動作を開始して赤外線リモコン信号の待受け状態になります。(図19)

*図19 赤外線リモコン信号待受け

赤外線リモコン信号受信

赤外線リモコン送信機(例 Bose Freestyle)を irReceive 回路の赤外線リモコン受光ICに向けて任意のボタン(例 Off)を押します。(図20)

図20 Bose FreeStyle

赤外線の入力が自動的に検出されてターミナルにメッセージが出力されます。(図21、図22)

*図21 赤外線信号を受信した時の動作

monitor 開始からのターミナル出力全文を図22 に示します。

* 実行するタスク: C:\Users\tatsu\.platformio\penv\Scripts\platformio.exe device monitor –environment esp32dev — Terminal on COM5 | 115200 8-N-1 — Available filters and text transformations: debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time — More details at https://bit.ly/pio-monitor-filters — Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ets Jul 29 2019 12:21:46 rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0030,len:1184 load:0x40078000,len:13192 load:0x40080400,len:3028 entry 0x400805e4 START src/main.cpp from Oct 5 2026 Using library version 4.7.1 Ready to receive IR signals of protocols: NEC/NEC2/Onkyo/Apple, Panasonic/Kaseikyo, Denon/Sharp, Sony, RC5, RC6, LG, JVC, Samsung,FAST, Whynter, Lego Power Functions, Bosewave, MagiQuest, OpenLASIR, Universal Pulse Distance Width, Hash at pin 15 12000 us is the (minimum) gap, after which the start of a new IR packet is assumed 20 us are subtracted from all marks and added to all spaces for decoding Because of the verbose output (>200 ms at 115200 baud), repeats are not dumped correctly! If you receive protocol NEC, Samsung or LG, run also ReceiveDemo to check if your actual protocol is eventually NEC2 or SamsungLG,which is determined by the repeats Protocol=NEC Address=0x4BBA, Command=0x4C, Raw-Data=0xB34C4BBA, 32 bits, LSB first, Gap=3276750us, Duration=68850us Send with: IrSender.sendNEC(0x4BBA, 0x4C, ); Raw result in internal ticks (50 us) – with leading gap rawIRTimings[68]: -65535 +180,-89 +12,-10 +12,-33 +12,-10 +13,-32 +12,-33 +12,-32 +13,-10 +12,-33 +12,-33 +11,-33 +12,-11 +11,-33 +12,-11 +11,-11 +12,-33 +12,-10 +12,-10 +12,-11 +11,-33 +13,-32 +12,-11 +12,-10 +11,-34 +12,-10 +12,-33 +12,-32 +12,-11 +12,-11 +11,-33 +12,-32 +13,-10 +12,-33 +12 Duration=1377 ticks Raw result in microseconds – with leading gap rawIRTimings[68]: -3276750 +9000,-4450 + 600,- 500 + 600,-1650 + 600,- 500 + 650,-1600 + 600,-1650 + 600,-1600 + 650,- 500 + 600,-1650 + 600,-1650 + 550,-1650 + 600,- 550 + 550,-1650 + 600,- 550 + 550,- 550 + 600,-1650 + 600,- 500 + 600,- 500 + 600,- 550 + 550,-1650 + 650,-1600 + 600,- 550 + 600,- 500 + 550,-1700 + 600,- 500 + 600,-1650 + 600,-1600 + 600,- 550 + 600,- 550 + 550,-1650 + 600,-1600 + 650,- 500 + 600,-1650 + 600 Duration=68850us Result as internal 8bit ticks (50 us) array – compensated with MARK_EXCESS_MICROS=20 uint8_t rawTicks[67] = {180,89, 12,10, 12,33, 12,10, 13,32, 12,33, 12,32, 13,10, 12,33, 12,33, 11,33, 12,11, 11,33, 12,11, 11,11, 12,33, 12,10, 12,10, 12,11, 11,33, 13,32, 12,11, 12,10, 11,34, 12,10, 12,33, 12,32, 12,11, 12,11, 11,33, 12,32, 13,10, 12,33, 12};// Protocol=NEC Address=0x4BBA, Command=0x4C, Raw-Data=0xB34C4BBA, 32 bits, LSB first, Gap=3276750us, Duration=68850us Result as microseconds array – compensated with MARK_EXCESS_MICROS=20 uint16_t rawIRTimings[67] = {8980,4470, 580,520, 580,1670, 580,520, 630,1620, 580,1670, 580,1620, 630,520, 580,1670, 580,1670, 530,1670, 580,570, 530,1670, 580,570, 530,570, 580,1670, 580,520, 580,520, 580,570, 530,1670, 630,1620, 580,570, 580,520, 530,1720, 580,520, 580,1670, 580,1620, 580,570, 580,570, 530,1670, 580,1620, 630,520, 580,1670, 580}; // Protocol=NEC Address=0x4BBA, Command=0x4C, Raw-Data=0xB34C4BBA, 32 bits, LSB first, Gap=3276750us, Duration=68850us uint16_t address = 0x4BBA; uint16_t command = 0x4C; uint64_t rawIRTimings = 0xB34C4BBA; Pronto Hex as string without repeat sequence char prontoData[] = “0000 006D 0022 0000 015B 00AA 0018 0012 0018 003F 0018 0012 001A 003D 0018 003F 0018 003D 001A 0012 0018 003F0018 003F 0016 003F 0018 0014 0016 003F 0018 0014 0016 0014 0018 003F 0018 0012 0018 0012 0018 0014 0016 003F 001A 003D 0018 0014 0018 0012 0016 0041 0018 0012 0018 003F 0018 003D 0018 0014 0018 0014 0016 003F 0018 003D 001A 0012 0018 003F 0018 06C3 “;

図22 ターミナル出力全文

赤外線リモコン信号の待受け状態から赤外線リモコン信号を受信した時のターミナル出力の先頭行を見ると次のように表示されています。

Protocol=NEC Address=0x4BBA, Command=0x4C, Raw-Data=0xB34C4BBA, 32 bits, LSB first, Gap=3276750us, Duration=68850us

Protocol=NEC と表示されているので赤外線リモコン信号のフォーマットは NEC フォーマットが使用されていることがわかります。( 赤外線リモコンの通信フォーマット 参照 )

NEC フォーマット( MSB ファースト)は、カスタマーコード 2 バイト、データ 1 バイト、データ のビット反転 1 バイトの計 4 バイトで構成されています。ターミナル出力では Address 2 バイト、Command 1 バイト、Command のビット反転 1 バイトの計 4 バイトがこれに相当します。なおターミナル出力は LSB ファースト表示なので NEC フォーマットとは並びが逆になっています。

この例の場合はカスタマーコードが 「BA 4B」、データが「4C」、データのビット反転が「B3」であることを示しています。データ「4C」はデシマルで「76」となり、Off ボタン(power)に対応していることがわかります。(On ボタンは、Game、Video、AUX と複数あります)
( Bose 社赤外線リモコン信号フォーマットはこちらを参照: Discrere Code Hunter / Converting IR Codes )

波形確認

赤外線リモコン信号を受信した時の波形を確認してみます。図1 irReceive 回路の Q1 2SC945 コレクタ出力端子( = ESP32-DevKitC-32E の15 ピン )にオシロスコープのプローブを接続して観測した波形が図23 になります。

*図23 オシロスコープ波形

オシロスコープ波形(図23)を NEC フォーマットに則して解析してみます。ビットの区切りを細い赤線、バイトの区切りを太い赤線で補助線を引きます。
バイナリコード、並べ替え( MSBファースト)、Decimal、Hexa Decimal の順で読み取ります。(図24)
カスタマーコードが 「BA 4B」、データが「4C」、データのビット反転が「B3」となり irRemote を実行してターミナルから出力された結果(図22)と一致しました。

*図24 フォーマット解析

次回は 赤外線リモコン送信(irSend)について説明します。

リンク

ESP32を使って学習リモコンを作る(1) 学習リモコンでどんなことができるの?
ESP32を使って学習リモコンを作る(2) ハードウェア
ESP32を使って学習リモコンを作る(3) ソフトウェア 赤外線リモコン受信( irReceive )
ESP32を使って学習リモコンを作る(4) ソフトウェア 赤外線リモコン送信( irSend )
ESP32を使って学習リモコンを作る(5) ソフトウェア webserver
ESP32を使って学習リモコンを作る(6) ソフトウェア Flash 読書き(SPIFFS)
ESP32を使って学習リモコンを作る(71) ソフトウェア 本機のプロジェクト
ESP32を使って学習リモコンを作る(81) ソフトウェア 本機プロジェクトの勘所
ESP32を使って学習リモコンを作る(9) ハードウェア設計の勘所
ESP32を使って学習リモコンを作る(10) 学習リモコンを操作した時のターミナル出力
Smart_Remote_Controller プロジェクト GitHub

(YI)

コメント

error: Content is protected !!
タイトルとURLをコピーしました