Arduinoを使用したブラックまたはホワイトリモコンのデコーディング
このチュートリアルでは、ArduinoとIR受信機を使用して、白黒の赤外線リモコンからキーをデコードする方法を学びます。このプロジェクトの終わりには、リモコンでどのキーが押されたかを特定し、その情報をシリアルモニターに表示できるようになります。これは、テレビや他の家電製品など、持っているリモコンでデバイスを制御するのに便利です(ビデオの01:00で)。
私たちは、Arduino、赤外線受信モジュール、および信号をデコードするために必要なコードを含むシンプルなセットアップを使用します。赤外線受信機はリモコンからの信号をキャッチし、Arduinoはその信号を解釈して、どのボタンが押されたかを判断します。このプロジェクトは簡単で、さまざまなリモコンに適応することができます。
ハードウェアの解説
このプロジェクトの主なコンポーネントには、ArduinoボードとIR受信モジュール(通常はVS1838Bと指定されます)が含まれます。Arduinoはメインコントローラーとして機能し、リモコンから受信した信号を処理するコードを実行します。IR受信機はリモコンから発信される赤外線信号をキャッチし、Arduinoが理解できる形式に変換します。
VS1838Bは2.7Vから5.5Vの電圧範囲で動作し、ほとんどのArduinoボードと互換性があります。条件によっては、10メートルから15メートルの距離から信号を検出することができます。赤外線受信機は、リモコンのどのボタンが押されたかを示すデジタル信号を出力し、Arduinoがそれに応じて応答できるようにします。
データシートの詳細
| 製造業者 | VS1838B |
|---|---|
| 部品番号 | VS1838B |
| ロジック/IO電圧 | 2.7-5.5 V |
| 供給電圧 | 5 V |
| 出力電流(チャネルごと) | 1.5 mA |
| 受信距離 | 10-15 m |
| 入力周波数 | 38 kHz |
| 静流電流 | 0.8 mA(典型値) |
| 操作角度 | 70度 |
| パッケージ | TO-220 |
- IR受信機が損傷しないように、適切な電圧供給を確保してください。
- 受信機モジュールを直射日光や強い赤外線源から遠ざけてください。
- 必要に応じてプルアップ抵抗を使用して信号の読み取りを安定させてください。
- 配線接続は、不安定な信号を防ぐために確実であるべきです。
- 異なるリモコンをテストして、セットアップとの相性を確認してください。
-
デコーディング-IR-リモート-main-1
配線指示
IR受信機をArduinoに接続するには、まずIR受信機のVCCピンをArduinoの5Vピンに接続します。次に、受信機のGNDピンをArduinoのGNDピンの1つに接続します。最後に、IR受信機の信号ピン(通常はSIGまたはOUTとラベル付けされている)をArduinoのデジタルピン11に接続します。
接続が確実であることを確認してください。接触不良は不安定な読み取りにつながる可能性があります。IR受信機のPCBバージョンやベアモジュールを使用している場合でも、配線は同じです。モジュールのラベリングに従ってピンを正しく特定することを確認してください(ビデオの03:15で)。
IRremoteライブラリをインストールします。
Arduino IDEを起動します。Arduino.cc無料で) 左のライブラリアイコンをクリックし、検索してくださいIRremote「インストール」をクリックしてインストールします。
#include <IRremote.h>コード例とウォークスルー
int RECV_PIN = 11;
const char type ='W'; // W for white, B for black
const boolean PCB = 0; // 1 for PCB, 0 for bare module
IRrecv irrecv(RECV_PIN);この抜粋では、IRレシーバーのピン番号を定義します。RECV_PIN11に設定します。また、使用しているリモコンのタイプも指定します。type変数で、'W'は白いリモコンを、'B'は黒いリモコンを示します。PCB変数は、受信機のPCBバージョンを使用するか、素のモジュールを使用するかを区別します。
void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}入力が空白のため、翻訳できません。setup()関数では、9600ボーレートでシリアル通信を初期化し、IRレシーバーを起動します。これはシリアルモニターで出力を監視するために重要で、どのキーが押されたかを見ることができます。
void loop() {
if (irrecv.decode(&results)) {
robojaxValidateCode(results.value); // Validate the received code
irrecv.resume(); // Receive the next value
}
delay(100);
}主なloop()IR受信機が信号をデコードしたかどうかを確認します。もしそうであれば、それは呼び出します。robojaxValidateCode受信した値を処理し、その後次の信号のリスニングを再開する関数。delay(100)ループが速く回りすぎないようにし、信号処理に役立ちます。
デモンストレーション / 期待すること
すべての設定が完了し、コードがアップロードされたら、シリアルモニターを開いて出力を確認します。リモコンのキーを押すと、対応するキー名がモニターに表示されるはずです。キーが認識されない場合は「Key unknown」と表示されます。接続が緩いと誤った読み取りを引き起こす可能性があるため、キーをしっかりと押すようにしてください(ビデオの05:40で)。
キーを連続して押すと、出力に繰り返し値や16進数コードが表示されることがあります。この動作は正常であり、望む場合はこれらの連続した信号をフィルタリングするようにコードを修正できます。さらに、特定のキー操作に基づいて動作を行うようにコードを調整することも可能です。例えば、照明をオンにしたり、他のデバイスを制御したりできます。
ビデオのタイムスタンプ
- 00:00 開始
- ハードウェアの説明
- 04:26 配線の説明
- 05:20 コードが説明されます
- 12:27 コードデコーディングのデモンストレーション
/*
* Original code and library from - http://arcfn.com
*
* This code decodes keys of Black IR remote and White IR remote
* sold on eBay for Arduino.
* You have to select the type of your remote as Black or White in the code below
* and also select your receiver 1838 either as PCB or bare module. See video for details
*
* Modified/Written by Ahmad Shamshiri
* on July 28, 2018 at 22:48 in Ajax, Ontario, Canada
* for Robojax.com
* Watch video instruction for this code:https://youtu.be/muAkBQb24NI
* Get other Arduino codes from Robojax.com
*
*/
#include <IRremote.h>
int RECV_PIN = 11;
const char type ='W';// W for white, B for black. Must keep single quotes like 'B' or 'W'
const boolean PCB = 0;// if receiver is PCB set to 1, if not set to 0. See video for details
IRrecv irrecv(RECV_PIN);
// this is array holding codes for White Remote when used with PCB version of receiver
unsigned int whiteRemotePCB[] ={
0xE318261B, // CH-
0x511DBB, // CH
0xEE886D7F, // CH+
0x52A3D41F, // |<<
0xD7E84B1B, // >>|
0x20FE4DBB, // >||
0xF076C13B, // -
0xA3C8EDDB, // +
0x12CEA6E6, // EQ
0xC101E57B, // 0
0x97483BFB, // 100+
0xF0C41643, // 200+
0x9716BE3F, // 1
0x3D9AE3F7, // 2
0x6182021B, // 3
0x8C22657B, // 4
0x488F3CBB, // 5
0x449E79F, // 6
0x32C6FDF7, // 7
0x1BC0157B, // 8
0x3EC3FC1B // 9
};
// this is array holding codes for White Remote when used with non-PCB version of receiver
unsigned int whiteRemote[] ={
0xFFA25D, // CH-
0xFF629D, // CH
0xFFE21D, // CH+
0xFF22DD, // |<<
0xFF02FD, // >>|
0xFFC23D, // >||
0xFFE01F, // -
0xFFA857, // +
0xFF906F, // EQ
0xFF6897, // 0
0xFF9867, // 100+
0xFFB04F, // 200+
0xFF30CF, // 1
0xFF18E7, // 2
0xFF7A85, // 3
0xFF10EF, // 4
0xFF38C7, // 5
0xFF5AA5, // 6
0xFF42BD, // 7
0xFF4AB5, // 8
0xFF52AD // 9
};
// key labels of white remote
String whiteRemoteKey[] ={
"CH-",
"CH",
"CH+",
"|<<",
">>|",
">||",
"-",
"+",
"EQ",
"0",
"100+",
"200+",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9"
};
// this is array holding codes for Black Remote when used with non-PCB version of receiver
unsigned int blackRemote[] ={
0xFF629D, // ^
0xFF22DD, // <
0xFF02FD, // OK
0xFFC23D, // >
0xFFA857, // v
0xFF6897, // 1
0xFF9867, // 2
0xF0C41643, // 3
0xFF30CF, // 4
0xFF18E7, // 5
0xFF7A85, // 6
0xFF10EF, // 7
0xFF38C7, // 8
0xFF5AA5, // 9
0xFF42BD, // *
0xFF4AB5, // 0
0xFF52AD // #
};
// this is array holding codes for Black Remote when used with PCB version of receiver
unsigned int blackRemotePCB[] ={
0x511DBB, // ^
0x52A3D41F, // <
0xD7E84B1B, // OK
0x20FE4DBB, // >
0xA3C8EDDB, // v
0xC101E57B, // 1
0x97483BFB, // 2
0xF0C41643, // 3
0x9716BE3F, // 4
0x3D9AE3F7, // 5
0x6182021B, // 6
0x8C22657B, // 7
0x488F3CBB, // 8
0x449E79F, // 9
0x32C6FDF7, // *
0x1BC0157B, // 0
0x3EC3FC1B // #
};
// Black remote key names
String blackRemoteKey[] ={
"^",
"<",
"OK",
">",
"v",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"*",
"0",
"#"
};
decode_results results;
void setup()
{
Serial.begin(9600);
// In case the interrupt driver crashes on setup, give a clue
// to the user what's going on.
Serial.println("Robojax Remote Decoder");
irrecv.enableIRIn(); // Start the receiver
}
void loop() {
if (irrecv.decode(&results)) {
//Serial.println(results.value, HEX);
robojaxValidateCode(results.value);// used the "robojaxValidateCode" below
irrecv.resume(); // Receive the next value
}
delay(100);
}
/*
* function: robojaxValidateCode
* validates the remote code and prints correct key name
* cd is code passed from the loop
* Written by A. S. for Robojax
*/
void robojaxValidateCode(int cd)
{
// Robojax IR Remote decoder
int found=0;
if(type =='W' && !PCB)
{
// Robojax IR White Remote decoder
// if type is set to 'W' (white remote) and PCB=0 then check Black remote code
for(int i=0; i< sizeof(whiteRemote)/sizeof(int); i++)
{
if(whiteRemote[i] ==cd)
{
Serial.print("Key pressed:");
Serial.println(whiteRemoteKey[i]);
found=1;
}// if matched
}// for
}else if(type =='W' && PCB){
// Robojax IR White Remote decoder
// if type is set to 'W' (white remote) and PCB=1 then check Black remote code
for(int i=0; i< sizeof(whiteRemotePCB)/sizeof(int); i++)
{
if(whiteRemotePCB[i] ==cd)
{
Serial.print("Key pressed:");
Serial.println(whiteRemoteKey[i]);
found=1;
}// if matched
}// for
}else if(type =='B' && PCB){
// Robojax IR White Remote decoder
// if type is set to 'B' (black remote) and PCB=1 then check Black remote code
for(int i=0; i< sizeof(blackRemotePCB)/sizeof(int); i++)
{
// Robojax IR black Remote decoder
if(blackRemotePCB[i] ==cd)
{
Serial.print("Key pressed:");
Serial.println(blackRemoteKey[i]);
found=1;
}// if matched
}// for
}else{
// if type is set to 'B' (black remote) and PCB =0 then check Black remote code
for(int i=0; i< sizeof(blackRemote)/sizeof(int); i++)
{
// Robojax IR black Remote decoder
if(blackRemote[i] ==cd)
{
if(blackRemoteKey[i] == "OK"){
digitalWrite(9,HIGH);
}
Serial.print("Key pressed:");
Serial.println(blackRemoteKey[i]);
found=1;
}// if matched
}// for
}// else
if(!found){
if(cd !=0xFFFFFFFF)
{
Serial.println("Key unknown");
}
}// found
}
必要かもしれないもの
-
アマゾンAmazonで赤外線リモコンを購入するamzn.to
-
イーベイeBayから赤外線リモコンを購入するebay.us
リソースと参考文献
まだリソースはありません。
ファイル📁
ファイルは利用できません。