BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(ソフトウェア編)
サンプルスケッチでリモコン信号の解析
IRセンサーが正しく接続できているか確認するのと、使用するリモコンのキーのコードを確認します。
使うリモコンのフォーマットが分かっている人は少ないと思うので、まず、何フォーマットなのか調べるところから始めます。
スケッチは、「ファイル」->「スケッチ例」->「IRremote」->「ReceiveDump」を使います。
書き込んでからシリアルモニターを開きます。
この例ではArduino UNOを使っています。XIAOを使っても同じです。
シリアルモニターを表示したら、リモコンのスイッチを押して解析させてみます。
そうそう、シリアルの通信速度は115200bpsです。
これは一例で、プロトコルは「SONY」で「アドレス=0x1C」と「コマンド=0x3A」ということが解析できています。
素晴らしい。オシロでチマチマと解析している場合じゃないです。
使用したいキーを押してアドレスとコマンドを記録しておきます。プロトコルもです。
ボリュームのUP アドレス=0x1C、コマンド= 0x69
ボリュームのDOWN アドレス=0x1C、コマンド= 0x68
この2つのキーを決めて、メモっておけばOKです。
改造ベースのサンプルスケッチを開く
これまででリモコンのプロトコルとアドレス、コマンドが分かったため
実際に動作させるサンプルスケッチを開きます。
「ファイル」->「スケッチ例」->「IRremote」->「SimpleReceiver」を使います。
プログラムの冒頭部のところにプロトコル一覧があります。
最初は NECが選択されています(// コメントアウトが外れている)ので、使用するリモコンのプロトコルの行の先頭の「//」コメントアウトを外して、NECをコメントアウトします。
NECフォーマットを使うのであれば、ここはそのままでOK。
ブログラムを書き込みます。
先ほどと同様にシリアルモニターを開いてリモコンのキーを押してみます。
ばっちりですね。
リモコンのキーを一度押しても表示は複数行でます。これはリモコンが連続で同じコマンドを発行しているからです。25ms~100ms間隔くらいで出すものが多いようです。
上の例ではgap=24500us と書いてあるのが受信間隔(空白の時間)です。
動作させるプログラムを書く
「書く」といっても簡単です。先ほどの「SimpleReceiver」をベースにちらっと改修します。ピンク色の文字の所が追加、変更行です。
冒頭部
//#define DECODE_DENON // Includes Sharp
//#define DECODE_JVC
//#define DECODE_KASEIKYO
//#define DECODE_PANASONIC // the same as DECODE_KASEIKYO
//#define DECODE_LG
//#define DECODE_NEC // Includes Apple and Onkyo
//#define DECODE_SAMSUNG
#define DECODE_SONY
//#define DECODE_RC5
//#define DECODE_RC6
//#define DECODE_BOSEWAVE
//#define DECODE_LEGO_PF
//#define DECODE_MAGIQUEST
//#define DECODE_WHYNTER
//#define DECODE_DISTANCE // universal decoder for pulse width or pulse distance protocols
//#define DECODE_HASH // special decoder for all protocols
#define PORT_A 8 // Rotary Encoder A
#define PORT_B 9 // Rotary Encoder B
#include <Arduino.h>
・・・・・・
使用するリモコンのプロトコルに合わせておきます。
その下側でA相、B相信号のpin割り当てを#defineします。ここでは 8番と9番にしました。
続いて setup()関数
余計なコメントなどを消しました。
void setup() {
Serial.begin(115200);
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK, USE_DEFAULT_FEEDBACK_LED_PIN);
digitalWrite(PORT_A,LOW);
digitalWrite(PORT_B,LOW);
pinMode(PORT_A,INPUT);
pinMode(PORT_B,INPUT);
}
こちらもIOポートの初期設定です。
OPEN DRAINの設定が出来なかったため、出力は「LOW」のみで、通常時は「入力」にしておきます。
つまり、IOポートの「INPUT」<->「OUTPUT」を切換えてOPEN DRAIN相当にしています。
最後に loop() 関数
余計なコメントを削除して実際に使う部分だけにしました。
void loop() {
if (IrReceiver.decode()) {
if(IrReceiver.decodedIRData.address == 0x1C){
if (IrReceiver.decodedIRData.command == 0x69) {
// do something
Serial.print(F("Comand UP\n"));
pinMode(PORT_A,OUTPUT);
delay(10);
pinMode(PORT_B,OUTPUT);
delay(10);
pinMode(PORT_A,INPUT);
delay(10);
pinMode(PORT_B,INPUT);
delay(50);
IrReceiver.decode(); //データを捨てる
} else if (IrReceiver.decodedIRData.command == 0x68) {
// do something else
Serial.print(F("Comand DOWN\n"));
pinMode(PORT_B,OUTPUT);
delay(10);
pinMode(PORT_A,OUTPUT);
delay(10);
pinMode(PORT_B,INPUT);
delay(10);
pinMode(PORT_A,INPUT);
delay(50);
IrReceiver.decode(); //データを捨てる
}
}
IrReceiver.resume(); // Enable receiving of the next value
}
}
黄色いところが先ほどのリモコンキーのアドレスとコマンドです。
ご自身の使用するリモコンのアドレスとコマンドに置き換えてください。
いかがでしょうか。
意外と簡単にリモコン対応できたと思います。
最終的な配線
BlueSnowDACのロータリーエンコーダへの配線(A相とB相)と、電源配線(3.3VとGND)で合計4本です。
実際に動かしてみてボリュームのUP/DOWNが逆だったら、プログラムの#defineのポート番号を入れ換える(8 <-> 9)か、A・B配線を入れ換えてください。
エンコーダーからの信号にArduinoで介入してボリュームのUP/DOWNが可能になりました。
メニュー操作をするにはロータリーエンコーダのプッシュスイッチ部もコントロールする必要がありますが、その辺はおいおいということで。
※このロータリーエンコーダのプッシュスイッチはプルダウン抵抗+3.3vへのスイッチになっているので注意が必要です。
使用できるリモコン
私が実験で使ったのは、SONYのオーディオ用やAppleRemote、照明機器のリモコンですが、それ以外のリモコンも使えると思います。ただ、家電製品協会フォーマット(エアコン用など温度やタイマー設定があるタイプ)など、あまり複雑なものは適しません。
https://akizukidenshi.com/catalog/g/gM-07245/
NECフォーマットらしい。
https://akizukidenshi.com/catalog/g/gM-07042/
Arduino用と書いてます。
このあたりがお手頃で使いやすいかもしれませんね。
本日はここまでにします。
Arduinoは優秀はライブラリがあるので、とても簡単に、そして短時間でやりたいことを実現できますね。このような用途では大いに助かります。
« BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(準備とハードウェア編) | トップページ | BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(メニュー操作編) »
「BlueSnowDAC」カテゴリの記事
- BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(メニュー操作編)(2021.11.27)
- BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(ソフトウェア編)(2021.11.24)
- BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(準備とハードウェア編)(2021.11.23)
- BlueSnowDACにSPDIF入力を付ける方法(秋月電子 AE-DIR8416編)(2021.11.15)
- BlueSnowDACにSPDIF入力を付ける方法(WM8805編)(2021.11.07)
「Arduino」カテゴリの記事
- MUSES72323 Balanceボリュームの表示機追加について(2022.12.24)
- BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(メニュー操作編)(2021.11.27)
- BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(ソフトウェア編)(2021.11.24)
- BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(準備とハードウェア編)(2021.11.23)
- ArduinoによるOLED表示機 電流削減に挑戦してみました(2021.02.21)
コメント
« BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(準備とハードウェア編) | トップページ | BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(メニュー操作編) »
こんにちは。
私もXIAOを各種設定に使い回しています。IRをロータリーエンコーダの代わりにする試み、参考にします。DACの設定も、これで兼ねられそうですか。
以前、インサーキットで設定していた時、壊してしまいました。デバッグ用にLCDを付けました。
CircuitPythonの方が気楽そうですが、Arduinoの方がライブラリーが豊富ですね。
投稿: AYOR | 2021年11月25日 (木) 11時52分
AYORさん
参考にしてみてください。
arduinoは基本的にC++ですので、C/C++言語をやってきた人にはうってつけですが、新しくプログラムを習得するならPythonの方が良い部分が多いと思います。
今回のようにライブラリを使うケースでは、既に実績のあるライブラリがある方を選択すれば、手間をかけずに実現できます。
ライブラリも自分で作るというのでしたらmicroPython系を選ぶというのもアリです。ただ、IRリモコンの受信には外部割込みとタイマー割込み処理が必要になりますですので、ちょっと苦労する部分があるかもしれません。
投稿: たかじん | 2021年11月25日 (木) 21時15分