Select Your Language

免責事項

  • 本サイトの情報の利用、内容、サービスによって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ユーザーご自身の責任においてご利用いただきますようお願いいたします。

    本サイトで頒布している基板およびキットは、技術者、またはそれに準ずる電気的知識をお持ちの電子工作ファンの方のためのものです。一般のオーディオファンの方のためのものではありません。
    また、頒布基板およびキットは、いかなる条件でも動作を保証するものではございませんので、あらかじめご了承ください。

    電子工作では、火傷、感電、火災などの可能性があります。十分に注意をして作業して下さい。

    営利目的のご使用は認めておりません。 記事の転載や、基板・キットの商用利用の方は、ご連絡ください。学生やサークルの学習目的でまとめてご購入する場合は特別価格でご提供させていただきます。
無料ブログはココログ

スポンサー

« BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(準備とハードウェア編) | トップページ | BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(メニュー操作編) »

2021年11月24日 (水)

BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(ソフトウェア編)

Arduinoを使って赤外線リモコン機能を追加するお話です。こちらの続きになります。

Ir_remo20

ちょっと乱雑ですが、エンコーダーに接続した図です。配線は4本。(実験中)

 

 

 

サンプルスケッチでリモコン信号の解析

IRセンサーが正しく接続できているか確認するのと、使用するリモコンのキーのコードを確認します。

Ir_remo9

使うリモコンのフォーマットが分かっている人は少ないと思うので、まず、何フォーマットなのか調べるところから始めます。

スケッチは、「ファイル」->「スケッチ例」->「IRremote」->「ReceiveDump」を使います。

書き込んでからシリアルモニターを開きます。

Ir_remo10

この例ではArduino UNOを使っています。XIAOを使っても同じです。

 

シリアルモニターを表示したら、リモコンのスイッチを押して解析させてみます。
そうそう、シリアルの通信速度は115200bpsです。

Ir_remo11

これは一例で、プロトコルは「SONY」で「アドレス=0x1C」と「コマンド=0x3A」ということが解析できています。

素晴らしい。オシロでチマチマと解析している場合じゃないです。

 

使用したいキーを押してアドレスとコマンドを記録しておきます。プロトコルもです。

 ボリュームのUP        アドレス=0x1C、コマンド= 0x69

 ボリュームのDOWN  アドレス=0x1C、コマンド= 0x68

この2つのキーを決めて、メモっておけばOKです。

 

 

 

改造ベースのサンプルスケッチを開く

これまででリモコンのプロトコルとアドレス、コマンドが分かったため

実際に動作させるサンプルスケッチを開きます。

「ファイル」->「スケッチ例」->「IRremote」->「SimpleReceiver」を使います。

Ir_remo12

プログラムの冒頭部のところにプロトコル一覧があります。

最初は NECが選択されています(// コメントアウトが外れている)ので、使用するリモコンのプロトコルの行の先頭の「//」コメントアウトを外して、NECをコメントアウトします。

NECフォーマットを使うのであれば、ここはそのままでOK。

 

ブログラムを書き込みます。

先ほどと同様にシリアルモニターを開いてリモコンのキーを押してみます。

Ir_remo13

ばっちりですね。

リモコンのキーを一度押しても表示は複数行でます。これはリモコンが連続で同じコマンドを発行しているからです。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配線を入れ換えてください。

Ir_remo21

エンコーダーからの信号にArduinoで介入してボリュームのUP/DOWNが可能になりました。

メニュー操作をするにはロータリーエンコーダのプッシュスイッチ部もコントロールする必要がありますが、その辺はおいおいということで。

※このロータリーエンコーダのプッシュスイッチはプルダウン抵抗+3.3vへのスイッチになっているので注意が必要です。

 

 

 

使用できるリモコン

私が実験で使ったのは、SONYのオーディオ用やAppleRemote、照明機器のリモコンですが、それ以外のリモコンも使えると思います。ただ、家電製品協会フォーマット(エアコン用など温度やタイマー設定があるタイプ)など、あまり複雑なものは適しません。

https://akizukidenshi.com/catalog/g/gM-07245/

Ir_remo21NECフォーマットらしい。

 

https://akizukidenshi.com/catalog/g/gM-07042/

Ir_remo21Arduino用と書いてます。

このあたりがお手頃で使いやすいかもしれませんね。

 

 

 

 

本日はここまでにします。

 

Arduinoは優秀はライブラリがあるので、とても簡単に、そして短時間でやりたいことを実現できますね。このような用途では大いに助かります。

 

« BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(準備とハードウェア編) | トップページ | BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(メニュー操作編) »

BlueSnowDAC」カテゴリの記事

Arduino」カテゴリの記事

コメント

こんにちは。

 私もXIAOを各種設定に使い回しています。IRをロータリーエンコーダの代わりにする試み、参考にします。DACの設定も、これで兼ねられそうですか。

 以前、インサーキットで設定していた時、壊してしまいました。デバッグ用にLCDを付けました。

CircuitPythonの方が気楽そうですが、Arduinoの方がライブラリーが豊富ですね。

AYORさん

参考にしてみてください。

arduinoは基本的にC++ですので、C/C++言語をやってきた人にはうってつけですが、新しくプログラムを習得するならPythonの方が良い部分が多いと思います。

今回のようにライブラリを使うケースでは、既に実績のあるライブラリがある方を選択すれば、手間をかけずに実現できます。

ライブラリも自分で作るというのでしたらmicroPython系を選ぶというのもアリです。ただ、IRリモコンの受信には外部割込みとタイマー割込み処理が必要になりますですので、ちょっと苦労する部分があるかもしれません。

コメントを書く

(ウェブ上には掲載しません)

« BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(準備とハードウェア編) | トップページ | BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(メニュー操作編) »

サイト内検索(new)

2022年1月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31