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

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

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

ソフトウエア編

はじめに

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

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

機能 デバイス プログラミング言語
学習リモコン ESP32-DevKitC-32E C++
ユーザーインターフェース 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 59行目~61行目)
  #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\Ayu\.platformio\penv\Scripts\platformio.exe device monitor –environment esp32dev

— Terminal on COM3 | 115200 8-N-1
— Available filters and text transformations: colorize, 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:13104
load:0x40080400,len:3036
entry 0x400805e4
START src/main.cpp from Nov 5 2024
Using library version 4.4.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, 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
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

Send with: IrSender.sendNEC(0x4BBA, 0x4C, <numberOfRepeats>);

Raw result in internal ticks (50 us) – with leading gap
rawData[68]:
-65535
+180,-89
+12,-10 +12,-33 +12,-10 +12,-33
+12,-33 +12,-32 +12,-11 +12,-32
+12,-33 +12,-33 +12,-10 +12,-33
+12,-10 +12,-10 +12,-34 +11,-11
+11,-11 +12,-11 +11,-33 +12,-33
+11,-11 +12,-11 +11,-33 +12,-11
+11,-33 +12,-33 +12,-11 +11,-11
+11,-34 +11,-34 +11,-11 +11,-34
+11
Sum: 1376
Raw result in microseconds – with leading gap
rawData[68]:
-3276750
+9000,-4450
+ 600,- 500 + 600,-1650 + 600,- 500 + 600,-1650
+ 600,-1650 + 600,-1600 + 600,- 550 + 600,-1600
+ 600,-1650 + 600,-1650 + 600,- 500 + 600,-1650
+ 600,- 500 + 600,- 500 + 600,-1700 + 550,- 550
+ 550,- 550 + 600,- 550 + 550,-1650 + 600,-1650
+ 550,- 550 + 600,- 550 + 550,-1650 + 600,- 550
+ 550,-1650 + 600,-1650 + 600,- 550 + 550,- 550
+ 550,-1700 + 550,-1700 + 550,- 550 + 550,-1700
+ 550
Sum: 68800

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, 12,33, 12,33, 12,32, 12,11, 12,32, 12,33, 12,33, 12,10, 12,33, 12,10, 12,10, 12,34, 11,11, 11,11, 12,11, 11,33, 12,33, 11,11, 12,11, 11,33, 12,11, 11,33, 12,33, 12,11, 11,11, 11,34, 11,34, 11,11, 11,34, 11}; // Protocol=NEC Address=0x4BBA Command=0x4C Raw-Data=0xB34C4BBA 32 bits LSB first

Result as microseconds array – compensated with MARK_EXCESS_MICROS=20
uint16_t rawData[67] = {8980,4470, 580,520, 580,1670, 580,520, 580,1670, 580,1670, 580,1620, 580,570, 580,1620, 580,1670, 580,1670, 580,520, 580,1670, 580,520, 580,520, 580,1720, 530,570, 530,570, 580,570, 530,1670, 580,1670, 530,570, 580,570, 530,1670, 580,570, 530,1670, 580,1670, 580,570, 530,570, 530,1720, 530,1720, 530,570, 530,1720, 530}; // Protocol=NEC Address=0x4BBA Command=0x4C Raw-Data=0xB34C4BBA 32 bits LSB first

uint16_t address = 0x4BBA;
uint16_t command = 0x4C;
uint64_t rawData = 0xB34C4BBA;


Pronto Hex as string
char prontoData[] = “0000 006D 0022 0000 015B 00AA 0018 0012 0018 003F 0018 0012 0018 003F 0018 003F 0018 003D 0018 0014 0018 003D 0018 003F 0018 003F 0018 0012 0018 003F 0018 0012 0018 0012 0018 0041 0016 0014 0016 0014 0018 0014 0016 003F 0018 003F 0016 0014 0018 0014 0016 003F 0018 0014 0016 003F 0018 003F 0018 0014 0016 0014 0016 0041 0016 0041 0016 0014 0016 0041 0016 06C3 “;

図22 ターミナル出力全文

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

Protocol=NEC Address=0x4BBA Command=0x4C Raw-Data=0xB34C4BBA 32 bits LSB first

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を使って学習リモコンを作る(7) ソフトウエア 本機のプロジェクト
ESP32を使って学習リモコンを作る(8) ソフトウエア 本機プロジェクトの勘所
ESP32を使って学習リモコンを作る(9) ハードウエア設計の勘所
ESP32を使って学習リモコンを作る(10) 学習リモコンを操作した時のターミナル出力
Smart_Remote_Controller プロジェクト GitHub

(YI)

コメント

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