BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(メニュー操作編)
XIAOを使ってIRリモコン機能を追加する案です。
ロータリーエンコーダーのプッシュスイッチの方もリモコンから操作できるようにして入力切換やデジタルフィルタ切換などが可能になりました。
if文での分岐からswitch-case文に変更、ポート操作部を関数化してプログラムコードが読みやすくなりました。
自分で言うのは恥ずかしいですが洗練されました(笑)
配線の接続
まずはハードウェアの説明です。追加する配線は1本で、全部で5本になります。
XIAO側の配線です。 C配線が追加になりました。
IR受信部は配線で引き伸ばさずXIAOに直接付けた方が良いです。もし引き伸ばすのであれば受信ICの根元(Vcc-GND間)に0.1~1uF程度のバイパスコンデンサを入れてください。
こちらは、BlueSnowのフロント基板の裏面です。 同様にC配線が追加です。
3.3V電源は写真のようにC1の足から引き出すと良いでしょう。
Pch オープン・ドレイン
ロータリーエンコーダのプッシュスイッチは、電源側に接続されていてプルダウン抵抗によりLOWになるような回路になっています。LEDのアノードと共通なので、選択肢はありません。
< プッシュスイッチをONすると3.3Vに >
回転させるエンコーダーの方は、電源でもGNDで接続可能だったのですが慣例的にGNDへと接続してプルアップ抵抗により3.3Vへ釣っています。
ということで、プッシュスイッチ側へ介入するにはオープンドレインのPchを使う必要があります。
でも、Pch オープンドレインってあまり見ないですよね。
マイコンやロジック回路の世界でオープンドレイン、オープンコレクタと言うと、ほぼNch・NPNの事を指します。
※)PLCなど産業機器のIOではNPNオープンコレクタ、PNPオープンコレクタは普通にラインアップ、使い分けされています。
3.3VのArduinoが必須
という訳で、今回、Pchのオープンドレインを使うのですが、Arduinoでは設定できないため、出力をHIGHに設定しておいて、INPUT(ハイ・インピーダンス)とOUTPUTを切換えて等価の動作にしてあげます。
注意点としては、ポートをOUTPUTにしたとき電源電圧が出力されるため、ロータリーエンコーダの電源電圧と同じにしておかなければいけません。
つまり3.3V電源でArduinoを動作させておく必要があります。
通常のArduino UNOなどの基板は5V電源が採用されているためNGです。
Arduino Pro Miniの3.3V仕様などはOK。
Seeeduino XIAOも3.3V駆動なので大丈夫です。
ソフトウェア
冒頭部に以下の#defineを配置しました。
#define PORT_A 8 // Rotary Encoder A
#define PORT_B 9 // Rotary Encoder B
#define PORT_C 7 // push Switch
#define ADDRE 0x1D // address
#define COMM_UP 0xB // up command
#define COMM_DOWN 0xD // down command
#define COMM_MENU 0x2 // menu command
#define COMM_OK 0x5D // OK command
ソースコードの中を編集せず冒頭部だけ編集して対応できるようになりました。
// の後ろはコメントです。 前回のup、downキーに加えてmenuやOKをリモコンのキーに割り付けます。
BlueSnowDACのロータリーエンコーダではプッシュスイッチ1個で「短いクリック」と「長押し」の2つ動作を使い分けしたのですが、リモコンはキーが沢山あるので独立したキーにしました。(その方がソフトを組みやすいという理由で)
setup()関数に
digitalWrite(PORT_A,LOW); // pull up
digitalWrite(PORT_B,LOW); // pull up
digitalWrite(PORT_C,HIGH); // pull down
pinMode(PORT_A,INPUT);
pinMode(PORT_B,INPUT);
pinMode(PORT_C,INPUT);
C配線用のピンを割り当てています。 ポートCだけ出力時HIGHなのがPchオープンドレイン相当にしているところです。
up()関数、down()関数のほか、menu()関数、ok()関数をつくりました。
void up(){
pinMode(PORT_A,OUTPUT);
delay(10);
pinMode(PORT_B,OUTPUT);
delay(10);
pinMode(PORT_A,INPUT);
delay(10);
pinMode(PORT_B,INPUT);
delay(50);
}
一例としてup()関数を見るとこんな感じです。何のテクニックもなく単純明快で分かりやすいですね。
最後の50msディレイはリモコンをポチッと1回押した時に2連発で認識してしまう対策です。リモコンの種類や押し方に差があるので、どうも2重押しになってしまうという方はディレイ時間を伸ばして下さい。
loop()関数では以下のようにコマンドに応じて関数を呼ぶようにしました。
if(IrReceiver.decodedIRData.address == ADDRE){
switch(IrReceiver.decodedIRData.command){
case COMM_UP:
Serial.print(F("Comand UP\n"));
up();
break;
case COMM_DOWN:
Serial.print(F("Comand DOWN\n"));
down();
break;
case COMM_MENU:
Serial.print(F("Comand MENU "));
menu();
Serial.print(F("!\n"));
break;
case COMM_OK:
Serial.print(F("Comand OK "));
ok();
Serial.print(F("!\n"));
break;
default:
break;
}
}
Serial.print~ ってのはデバッグ用の出力なので動作には必要ありませんが、残っていても悪さをしないのでそのままにしてあります。
ダウンロード
ダウンロード - simplereceiver_test_xaio_2.zip
先日の通り、「SimpleReceiver」をベースにしています。解凍したSimpleReceiver_Test_XAIO.inoをダブルクリックするとArduinoIDEが起動すると思います。
ボード選択やシリアルポート選択は環境に合わせて再設定してください。***.inoファイルはそういった環境の情報が埋め込まれていない単なるテキストファイルです。
使用するリモコンに合わせて編集
こちらも先日の通り「ReceiveDump」で解析しても良いのですが、プロトコルさえわかっていれば、「SimpleReceiver」でリモコンキーのコマンドを知ることができます。
ダウンロードしたSimpleReceiver_Test_XAIO.inoではコメントアウトしてある下記の部分を復活させることでシリアルモニタにコマンドが表示されます。
トルと書いてある /* と */ を削除すると その間のソースコードが有効になり、リモコン信号を受信したときのコマンドが見えるようになります。
コンパイルして書き込んだあと、リモコンを受信させたときのシリアルモニターです。
menu、OK(長押し決定)に割り当てたいキーのコマンドを冒頭部の#defineのところにアサインすれば良いです。
トルと書いてある /* と */ を戻さなくても動作はしますが、キー割り当てが決まりましたら戻しておくことを推奨します。
※ リモコンのプロトコルが全く不明なときは「ReceiveDump」で解析した方が良いかもしれません。そして、NEC以外のプロトコルの場合は冒頭部の // を変更して有効なリモコンプロトコルの部分を生かしてください。
以上で完了です。
記事は長かったのですが、やってることは単純ですので応用したいケースにも対応できると思います。これもArduinoのライブラリの力ですね。
« BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(ソフトウェア編) | トップページ | 1000万PV記念プレゼント!!! »
「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(ソフトウェア編) | トップページ | 1000万PV記念プレゼント!!! »
あの〜。
大変申し訳無いのですが、
前回までの記載通りにprogramを入力して終わりの方に、
エッ!ダウンロード出来るの?
で、ダウンロードして、しっかりと確認したんですけど、
void down();
void menu();
void ok();
が見当たらないのです?
投稿: MOSAKU | 2021年11月29日 (月) 00時25分
MOSAKUさん
大変失礼いたしました。別のファイルをUPしていたようです。
入れ換えました。
よろしくお願いいたします。
前回までのライブラリを入れるところまでは必須です。 ダウンロードしたファイルにはライブラリのインストールパッケージは含まれていません。
投稿: たかじん | 2021年11月29日 (月) 20時11分
お世話になります。
ダウンロードした SimpleReceiver_Test_XAIO_2.ino のプロトコルとアドレス、コマンドを書き換えて、「マイコンボードに書き込む」をすると
「SimpleReceiver_Test_XAIO_2:52:10: fatal error: PinDefinitionsAndMore.h: No such file or directory」
とエラーが出てしまいます。原因がわかりますでしょうか。
ボードはSeeeduino XIAOで、プロトコル他は「ReceiveDump」で調べました。
投稿: ヨシダ | 2022年2月18日 (金) 16時26分
ヨシダさん
ファイルもしくはディレクトリがないというエラーですね。
解凍したファイルをどこに入れるかを書いていませんでした。
arduinoのプロジェクトファイルが置かれたところに解凍後のフォルダを置いてください。
Windows10ですと、
C:\Users\(ユーザー名)\Documents\Arduino\SimpleReceiver_Test_XAIO_2
という感じです。
それでもダメでしたら、SimpleReceiver_Test_XAIO_2.inoをテキストエディタで開いて全コピーして、スケッチ例からSimpleReceiverを開いて上書きしても良いと思います。
投稿: たかじん | 2022年2月18日 (金) 20時16分
返信ありがとうございます。教えて頂いた方法でうまくいきました。
ちなみにXIAOにIRセンサを接続した状態では、PCにUSB接続してもXIAOが起動・認識されなかったのでセンサをはずしてから作業しました。
投稿: ヨシダ | 2022年2月19日 (土) 10時34分
ヨシダ さん
うまく行ったようで良かったです。
IRセンサーを外さないと書き込めない。 という事は無かったような気がするのですが、どうだったろうか。。 色々デバッグしながらソフトを書いたので、大丈夫だったと思うんですけどね。
投稿: たかじん | 2022年2月19日 (土) 23時56分