Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
TFTタッチスクリーン赤外線リモコン

概要

Arduino core for the ESP32とESP-WROOM-32開発ボードと、TFTタッチシールドを利用して、赤外線リモコンを作成しました。

デザインは、HUISの真似です。かっこいいので。

作るもの

TFTタッチシールドを利用して、赤外線リモコンを作成します。画面へのタッチも検出できるので、赤外線リモコンにぴったりです。

用意するもの

以下のものを用意します。

  • ESP-WROOM-32
  • USBケーブル
  • TFTタッチシールド
  • 赤外線LED(今回はスイッチング用にFETを利用しました。こちらのページを参考にさせてもらいました)

TFTタッチシールドを利用した実験は、こちらのページを参照してください(ESP32側のピン番号が異なります)。ESP-WROOM-32の赤外線リモコンの実験はこちらを参照してください。

基本的な考え方

考え方は単純で、以下のようなものです。

  • 画面上にリモコン(ボタンなど)を表示
  • 表示したリモコン(ボタンなど)に赤外線情報や呼び出す関数の情報を割り当て
  • タッチした場所に応じた赤外線情報を送信、関数を呼び出す

設計

ハードウェアの設計

TFTタッチシールドとESP-WROOM-32との接続は以下のように行いました。また、赤外線LEDをESP32の27番ピンで制御するようにしました。接続には、Arduino用ユニバーサル プロトシールド基板を用いました。

ESP32のピン 意味 タッチシールドのピン
(番号は、Arduino Unoのピン番号と同じ読み方をしています)
25 タッチセンサー用CS 8
33 TFT用D/C 9
15 TFT用CS 10
23 MOSI 11
19 MISO 12
18 SCK 13
27 赤外線LED -
3.3V 電源 5V
GND GND GND

プログラムの設計

以下のクラスを作成しました。

  • tftRmtClass
  • rmtSendClass
  • panasonicRmtSendClass
  • necRmtSendClass

tftRmtClass

赤外線リモコンそのものを制御するメインのクラスです。主なメソッドは以下のようなものです。

メソッド名 説明 詳細
addButton() ボタンを追加します。 ボタンの座標、大きさ、表示する図形、表示するテキスト、ボタン押下時の動作(赤外線信号送信、呼び出す関数)を定義します。
deleteAllButton() 追加したボタンをすべて削除します。 addButton()で追加したボタンをすべて削除します。
displayAllButtons() ボタンを表示します。 addButton()で追加したボタンをすべてTFT液晶ディスプレイ上に表示します。
checkButtons() 画面が押されたかを調べます。 ボタンが押された場所に登録されているボタンに登録されている赤外線信号の送信や、関数を呼び出します。この関数をloop()で実行します。
setScreenSaver() スクリーンセーバーを登録します。 スクリーンセーバーとして実行する関数と、スクリーンセーバーを実行するまでのアイドル時間を登録します。

addButton()

addButton()はできるだけ汎用なものにしようとして、パラメータ数が増えてしまう典型的なよくない関数です。最低16個のパラメータが必要です。

表示できる図形は、四角形、円、三角形、矢印(の先)、電源ボタンです。また、テキストも表示できます。

int addButton(uint16_t x, uint16_t y, uint16_t w, int16_t h, int16_t xMag, int16_t yMag, 
    tftRmtFigure_t figureType, uint16_t figureColor, uint16_t outlineColor, const char *text, int size, uint16_t textColor,
    void (*function)(void), tftRmtType_t rmtType, uint16_t customCode, uint8_t numDataCode, ...);

checkButtons()

画面がタッチされたかどうかをチェックし、タッチされていた場合は、その座標上に登録されているボタンの機能を実行します。

同じ場所に複数のボタンが登録されているときは、一番先に登録したボタンの機能が呼び出されます。

loop()の中で呼び出し続けます。

setScreenSaver()

スクリーンセーバーも登録できます。スクリーンセーバーとして登録する関数は、checkButtons()の中で呼ばれ続けるので、関数の中でブロック(delay()とか)しないように作成してください。

rmtSendClass

赤外線リモコン送信するための親クラスです。ESP32のrmtSendClass用の設定と、共通関数(データのパッキング)を定義しています。実際に赤外線コードを送信するクラスを、別途作成する必要があります。

panasonicRmtSendClass

家電協フォーマットの赤外線信号を送信するクラスです。家電協フォーマットはデータ長が可変のため、メーカーによりデータ長が異なるのではないかと想像し、パナソニックのリモコン専用みたいな名前にしています。今回はCATVのセットトップボックス(TZ-LS300F)を制御します。

可変長引数を使うとか、センチネルを配置するとかすれば、一つに集約できるのですが、今回はそこまでは行っていません。

necRmtsendclass

NECフォーマットの赤外線信号を送信するクラスです。今回は、東芝のテレビ(REGZA 37Z8000)とDVDレコーダー(DBR-W1007)を制御します。

スケッチ

スケッチは大きくなったので、GitHubに配置しました。

動作している様子

ユニバーサルプロトシールドに組み込み、ESP-WROOM-32を下に取り付けてみました。結構な厚みがあります。

動作している様子です。相変わらず写真の腕が上がりません。今回は、TV用2個とCATV用1個の画面を作成して、下の三角ボタンで切り替えるようにしました。

今も修正しているので、写真とGitHub上のソースコードで差分が出るかもしれません。

参考サイト

その他

赤外線リモコンの解析

こちらのページを参考にしてください。

REGZAのリモコンコード

テレビのほうですが、赤外線コードの割り当てを調べたところ、カスタムコードは1種類ではなく、3種類はあるようです。

TFTタッチシールド

以下のような症状が出ており、TFTへの表示がやや不安定です。

  • しばらく書込みを続けていると、円を表示しようとしても、下半分が押しつぶされたような形になる。
  • TFTタッチシールドですが、文字を表示する座標によって、一部しか表示されなかったり、それ以降の表示が全くできなかったりという症状が出ています。

ハードウェアの故障のような気もしますが、何かご存知の方がいらっしゃれば、ぜひご連絡ください。

バージョン

Arduino 1.8.4/Arduino core for the ESP32/ESP-WROOM-32



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2018 garretlab all rights reserved.
inserted by FC2 system