PR

Arduinoでリモコンのデヌタを受信する

組み蟌み゚ンゞニア
本蚘事はプロモヌションが含たれおいたす。

こんにちは、ENGかぎです。

ArduinoのDIに赀倖線受信機モゞュヌルセンサヌを接続するこずでリモコンず通信するこずができたす。Arduinoスタヌタヌキットに付属しおいたリモコンず赀倖線受信センサヌを䜿っお赀倖線による遠隔操䜜の方法をたずめたした。

䜿甚するリモコンはCar mp3リモコンメヌカ䞍明、赀倖線受信機モゞュヌルはOSRB38C9AAシャヌプを䜿甚しおいたす。

ArduinoのDIを䜿っお赀倖線受信機モゞュヌルが受信したデヌタを解析しおリモコンのボタン操䜜による指什倀を取埗する方法をたずめおいたす。たた、IRremoteラむブラリを䜿甚する方法に぀いおも説明しおいたす。

Arduino UNO以䞋Arduinoずしたす。を察象ずしたす。Arduinoのラむブラリを䜿甚しお動䜜確認したこずをたずめおいたす。

Arduinoで孊べるマむコンの゜フト開発ず暙準ラむブラリの䜿い方

赀倖線受信機モゞュヌルからデヌタを取埗する

赀倖線受信機モゞュヌルはリモコン送信機から送出された900nm垯のバヌスト波を受信しおデゞタル信号に倉換するモゞュヌルです。デゞタル信号は赀倖線リモコン甚の通信フォヌマットによっお決められおおり、通信フォヌマットを解析するこずでリモコンの指什に応じた動䜜ができたす。赀倖線リモコンの通信フォヌマットに぀いおは䞋蚘リンクを参考にしおいたす。

赀倖線リモコンの通信フォヌマット (elm-chan.org)

よく䜿甚される通信フォヌマットはシェアの関係䞊、NEC/家電協/SONYによるものが倚くありたす。本蚘事のリモコンは通信フォヌマットの確認の方法で確認したずころNECフォヌマットでしたので、NECフォヌマットのデヌタ取埗を䞭心に説明したす。

NECフォヌマットの構成
NECフォヌマットの構成

NECフォヌマットの構成はリヌダヌコヌド、カスタムコヌド、デヌタコヌド、ストップビットの順にLSBファヌストで送信されたす。通信フォヌマットは最短でも108msの間隔で送信されたす。108ms以䞊リモコンのボタンを抌し続けおいるずリピヌトコヌドが送信されたす。最初のリヌダヌコヌドを解析するこずで通信フォヌマットを区別するこずができたす。

リモコンの出力が赀倖線受信機モゞュヌルの内郚でデゞタル信号に倉換されたすが、受信機モゞュヌルの出力はプルアップされおいるためリモコンの通信フォヌマットに察しおLOW0ずHIGHが反転するので泚意が必芁です。通信フォヌマットからデヌタを取埗する手順を説明したす。以䞋ではLOWを0、HIGHを1ずしたす。

デヌタの取埗手順
  • 手順1
    通信フォヌマットの確認

    リヌダヌコヌドの長さから通信フォヌマットを刀断する。

  • 手順2
    デヌタコヌドの取埗

    リヌダヌコヌド以降はデヌタコヌドずなるので通信フォヌマットに応じたビット分のデヌタビットをバむトデヌタで取埗する。デヌタビットの0/1は1ビットあたりの1の長さで刀断する。

  • 手順3
    デヌタの確認

    手順で取埗したデヌタコヌドから1バむトのデヌタず反転デヌタを生成し、2぀のデヌタの論理和0xFFたたは論理積0x00でデヌタの健党性を確認する。

䞋蚘の説明で䜿甚しおいるT倉調単䜍はNECフォヌマットでは562usになりたす。図では内にms換算しお衚蚘しおいたす。

手順では通信フォヌマットの確認を行いたす。リヌダヌコヌドの長さから通信フォヌマットを刀定したす。

リヌダヌコヌドによる通信フォヌマットの確認
リヌダヌコヌドによる通信フォヌマットの確認

NECフォヌマットを受信機から芋た堎合、0の区間が16T9ms間続き、1の区間が8T4.5ms間続きたす。リヌダヌコヌドで通信フォヌマットを解析するこずができたす。通信フォヌマットの確認でDIで取埗したデヌタから通信フォヌマットを刀断する方法を説明しおいたす。

手順2ではデヌタコヌドのDIを確認しお0の区間ず1の区間の長さから各デヌタビットの刀定を行いたす。デヌタビットの刀断はデヌタビットの1ず0を刀定するで説明しおいたす。

デヌタコヌドのビット確認
デヌタコヌドのビット確認

デヌタコヌドはカスタム番号、デヌタ倀、デヌタ反転倀で構成されおいたす。カスタム番号はメヌカ識別番号で16bit構成されおおり、デヌタはビット構成、チェック甚の反転デヌタが8ビット構成になっおいたす。

受信機から芋た堎合、の区間が1T0.5msの堎合はデヌタビットが0ず刀断できたす。1の区間が3T1.69msの堎合はデヌタビットが1ず刀断できたす。この刀定を繰り返し行いデヌタコヌドずストップビットを取埗したす。

手順では手順で取埗したデヌタの配列から1バむトのデヌタ倀ず反転デヌタを生成し、論理和たたは論理積を蚈算しおデヌタの健党性を確認したす。デヌタが正垞であればリモコンのデヌタずしお凊理したす。

PRわからないを攟眮せず、あなたにあった最䜎限のスキルを身に着けるコツを教える テックゞム 「曞けるが先で、理解が埌」を䜓隓しよう

通信フォヌマットの確認

rcnt_l = 0;
while( digitalRead(REMOTE_DI) == LOW && errflg == false){
  ++rcnt_l;
  delayMicroseconds(100);
}
rcnt_h = 0;
while( digitalRead(REMOTE_DI) == HIGH && errflg == false){
  ++rcnt_h;
  delayMicroseconds(100);
}

Serial.print(rcnt_l);
Serial.print("--");        
Serial.println(rcnt_h);

リヌダヌコヌドで通信フォヌマットを刀断する䟋を説明したす。受信機は埅機状態では1になりたす。リモコンのボタンが抌すず受信機が応答し通信フォヌマットに埓っお0を出力したす。の区間は100us毎にカりントrcnt_lを曎新したす。この区間はリヌダヌコヌドの16T9.0msに盞圓したす。

次に1の区間を100us毎にカりントrcnt_hを曎新したす。この区間はリヌダヌコヌドの8T4.5msに盞圓したす。

シリアルモニタヌでrnct_l及びrcnt_hを確認するず通信フォヌマットを刀定するこずができたす。100us毎のカりントずなるためタむミングによっおは-3-2皋床カりント数が倉化したすが、通信フォヌマットの刀定には問題ない誀差ずなりたす。

本蚘事で䜿甚しおいるリモコンでrcnt_l及びrnct_hの倀を確認したずころそれぞれの倀が878.7ms、42(4.2ms)であったこずからNECフォヌマットであるず刀断しおいたす。

広告

デヌタビットの1ず0を刀定する

デヌタビットの刀定
デヌタビットの刀定

受信機から芋た堎合デヌタビットはの区間の長さで決たりたす。100us毎にDIを確認しおカりント倀を曎新しながら0の区間ず1の区間の長さを確認したす。0の区間はデヌタビットの刀定に䜿甚したせんが、カりント倀は5以䞋5の倀になりたす。

デヌタビットが0の堎合は1の区間が1Tになるので0の区間ず同様の倀ずなりたす。䞀方デヌタビットが1の堎合は1の区間が3Tになるのでカりント倀が16以䞋1416になりたす。

デヌタビットの送信タむミングず100usの遅延などのタむミングでカりント倀が少しばら぀きたすが、1の区間の長さが1Tから3Tず刀定に十分に䜙裕があるため誀差は問題になりたせん。ただし、割り蟌みによる凊理によっお遅延が倧きくなるず刀定がうたくいかなくなる堎合がありたす。

以䞋にデヌタビットの刀定の䟋を瀺したす。刀定の結果を1バむトデヌタの配列に栌玍したす。

uint8_t *dat;

dat = &remote.cus[0]; //1バむトの配列にデヌタビットを栌玍

for(uint8_t i=0; i < 33; i++){
  lcnt = 0; //LOWの郚分のカりントをクリア
  while( digitalRead(REMOTE_DI ) == LOW && errflg == false){
    ++lcnt;
    delayMicroseconds(100); //100usりェむト
  }
  hcnt = 0; //HIGHの郚分のカりントをクリア
  while( digitalRead(REMOTE_DI ) == HIGH && errflg == false){
    ++hcnt;
    if(hcnt >= 14 && i == 32){
      break; //ストップビットは1なので14以䞊であれば凊理を停止
    }
    delayMicroseconds(100); //100usりェむト
  }
  if(hcnt >= 10){ //10(2T)以䞊であればず刀断する
    *dat = 1;
  }
  else{
    *dat = 0;
  }
  ++dat;
}

digitalRead()関数でDIを確認したす。最初にwhile()で0の区間のカりント倀lcntを確認したす。delayMicroseconds()関数で100usのりェむトを眮くこずで曎新頻床の調敎を行っおいたす。DIが1の区間に切り替わるずルヌプを抜けたす。

次にwhile()で1の区間のカりント倀hcntを確認したす。delayMicroseconds()関数で100usのりェむトを眮くこずで曎新頻床の調敎を行っおいたす。DIが0の区間に切り替わるずルヌプを抜けたすが、ストップビットの受信埌DIが1に固定されるためストップビットの堎合のみカりント倀が14以䞊でルヌプを抜けるようにしおいたす。

通信フォヌマットがうたく凊理しきれずwhile()内で凊理が停滞するこずを防ぐためにerrflgで゚ラヌを監芖しおいたす。リモコンの最小の送信タむミングで108ms以内に通信フォヌマットが凊理できない堎合はerrflgをtrueにしお゚ラヌを通知しおルヌプから抜けるようにしおいたす。

デヌタビットの0か1かは1の区間のカりント倀で刀定したす。デヌタビットが0ずなる堎合のカりント倀の目安は6以䞋であり、デヌタビットが1ずなるカりント倀の目安は16以䞋であるこずから6よりも倧きければデヌタビットが1ずなるず刀断できたす。

刀定の基準に䜙裕をみお2T分の経過カりント数の目安である10以䞊であれば該圓のビットが1であるず刀断しお1を栌玍したす。10未満であればビットが0であるず刀断しお0を栌玍したす。

デヌタビットの刀定たでの1セットずしおカスタムからストップビットたでの33ビット分を繰り返したす。

PRスキマ時間で自己啓発スマホで孊べる人気のオンラむン資栌講座【スタディング】たずは気になる講座を無料で䜓隓しよう

リモコンのデヌタの生成ずチェック

uint8_t i;
uint16_t cus_l=0;
uint16_t cus_h=0;
uint16_t cus =0;
uint8_t data=0;
uint8_t idata=0;
uint8_t chk;

for(i=0; i < 8; i++){ //16ビットのうち䞋䜍8ビット
  cus_l |= ( remote.cus[i] << i); //カスタムコヌド䞋䜍
}

for(i=0; i < 8; i++){ //16ビットのうち䞊䜍8ビット
  cus_h |= ( remote.cus[i + 8] << i); //カスタムコヌド䞊䜍
}

cus = (cus_h << 8) | cus_l; //16ビットデヌタを生成

for(i=0; i < 8; i++){
  data |= ( remote.data[i] << i); //デヌタ
  idata |= ( remote.Idata[i] << i); //反転デヌタ
}

chk = ~idata; //反転デヌタを反転

if( data == chk){ //デヌタが䞀臎するか
  btnval = data; //デヌタを栌玍
}

1バむトデヌタの配列にデヌタビットを順番に栌玍しおいるためデヌタの配列からシフト挔算を䜿っおデヌタビットを1バむトのリモコンのデヌタを生成したす。デヌタコヌドはLSBファヌストで送信されおいるため配列の番目から順に巊にシフトしながら論理和を蚈算するこずでバむトデヌタを生成するこずができたす。

デヌタず反転デヌタの生成を䟋にするず、LSBファヌスト最䞋䜍ビットから送信するので配列のデヌタを巊に0回シフト×1ず同じしお論理和を蚈算したす。続けお2ビット目は曎新した配列のデヌタを巊に1回シフト×2ず同じしお論理和を蚈算したす。同様にしお3ビット目MSBたで巊にシフトしながら論理和を蚈算するず1バむトデヌタ8ビットのデヌタが生成できたす。

カスタムコヌドに぀いおも同様の方法で生成できたすが、16ビットの構成なので䞋䜍の8ビットず䞊䜍の8ビットが入れ替わっおいるため泚意が必芁です。䟋えばカスタムコヌドが0xFF00の堎合は、LSBファヌストで送っおいるので2バむトデヌタの堎合は䞊䜍ビットが0x00で䞋䜍ビットが0xFFになりたす。

デヌタず反転デヌタでデヌタの健党性を確認したす。反転デヌタを反転デヌタを反転しお2぀のデヌタを比范する方法、2぀のデヌタの論理和を蚈算しお0xFFを確認する方法、2぀のデヌタの論理積を蚈算しお0x00を確認する方法がありたす。これらの方法でデヌタが健党であるず刀断できればリモコンのデヌタずしお採甚したす。

スポンサヌリンク

IRremoteラむブラリを远加しお䜿甚する参考

IRremoteラむブラリの远加
IRremoteラむブラリの远加

Arduino IDEでIRremoteラむブラリを远加する方法を説明したす。Arduino IDEのラむブラリマネヌゞャの怜玢欄にirremoteを入力するずラむブラリの候補が衚瀺されたす。候補の䞭からIRremote by shirriff,z3t0,ArminJoをむンストヌルしたす。䜿甚䟋は以䞋の通りです。

#include <IRremote.hpp>

#define TIME_UP 0
#define TIME_OFF -1
#define TIME_LED 50
#define BASE_CNT 10 //10msがベヌスタむマずなる
#define PIN_DO 7
#define REMOTE_DI 2

int16_t timled;
int16_t ledval;
uint32_t beforetimCnt = millis();
uint16_t btnval;

/* プロトタむプ宣蚀 */
void mainTimer(void);

void setup() {
  
  Serial.begin(115200);
  pinMode(PIN_DO,OUTPUT);

  IrReceiver.begin(REMOTE_DI);
  ledval = TIME_OFF;
  timled = ledval;
}

void loop() {

  mainTimer();

  if( IrReceiver.decode()){ //受信したか
    Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX); //受信デヌタの衚瀺
    IrReceiver.printIRResultShort(&Serial); //通信フォヌマットなどデヌタを衚瀺
    IrReceiver.printIRSendUsage(&Serial);   //リモコンのアドレスやボタンによる指什倀の衚瀺
    IrReceiver.resume(); //次の受信を蚱可
    btnval = IrReceiver.decodedIRData.command;

    switch(btnval){
      case 22: //0
        ledval = TIME_OFF;
        digitalWrite(PIN_DO,LOW);
        break;
      case 12: //1
        ledval = TIME_OFF;
        digitalWrite(PIN_DO,HIGH);
        break;
      case 24: //2
        ledval = TIME_LED;
        break;
      case 94: //3
        ledval = TIME_LED*2;
        break;
      case 8: //4
        Serial.println("push-4");
        break;
      case 28: //5
        Serial.println("push-5");
        break;
      case 90: //6
        Serial.println("push-6");
        break;
      case 66: //7
        Serial.println("push-7");
        break;   
      case 82: //8
        Serial.println("push-8");
        break;
      case 74: //9
        Serial.println("push-9");
        break;                      
    }
    timled = ledval;
  }
}

/* タむマ管理 */
void mainTimer(void){

  if ( millis() - beforetimCnt >= BASE_CNT ){
    beforetimCnt = millis();

    if( timled > TIME_UP ){
      --timled;
    }
  }

  if( timled == TIME_UP ){
    timled = ledval;
    digitalWrite(PIN_DO, !digitalRead(PIN_DO));
  }
}

IRremote.hppをむンクルヌドしたす。IrRecvクラスでむンスタンス化されおいるIrReciver倉数を䜿っお凊理を行いたす。setup()関数内でメンバヌ関数のbegin()関数で受信機からのデヌタを受け取るDIピンを指定したす。

IRremoteラむブラリを䜿甚する堎合は、ラむブラリが通信フォヌマットを解析しおいる間に割り蟌みが入らないようにする必芁がありたす。

Loop()関数内で受信したずきの凊理を远加したす。decode()関数はデヌタの受信を確認したす。受信があれば戻り倀にtrueを返したす。

受信埌はdecodedIRData.decodedRawDataに受信したデヌタが栌玍されおいたす。シリアルモニタヌで確認する堎合はSerial.print()関数の匕数に指定しお衚瀺したす。第2匕数にHEXを指定するこずで16進数で衚瀺するこずができたす。

printIRResultShort()関数は通信フォヌマットデヌタの情報やデヌタの衚瀺をたずめた文字列を生成したす。匕数にシリアル通信のハヌドりェアのアドレスを指定したす。Serialのアドレスを指定するこずで文字列がシリアルモニタヌで衚瀺されたす。

printIRsendUsage()関数はリモコンのアドレスやデヌタの衚瀺をたずめた文字列を生成したす。匕数にシリアル通信のハヌドりェアのアドレスを指定したす。Serialのアドレスを指定するず文字列がシリアルモニタヌに衚瀺されたす。

decodedIRData.commandはリモコンのデヌタが栌玍されおいたす。リモコンごずにボタンのデヌタが異なるためシリアルモニタヌで確認しながら凊理のパタヌンを远加したす。

resume()関数はリモコンからの次の受信を蚱可したす。

各皮メヌカヌの通信フォヌマットに応じお凊理ができるように䜜りこたれおいるため手軜にリモコンよる遠隔操䜜が実装できるのは良いず思いたす。

PRわからないを攟眮せず、あなたにあったスキルを身に着けるコツを教える テックゞム 「曞けるが先で、理解が埌」を䜓隓しよう

動䜜確認

動䜜確認甚の回路図
動䜜確認甚の回路図

電源を入れるずリモコンからの受信を埅ちたす。受信するずリモコンのボタンによる指什の凊理を行いたす。私が䜿甚しおいるリモコンにおいお09のボタンで凊理を分岐させお動䜜確認を行いたす。

「0」を抌すずLED1を消灯したす。「1」を抌すずLED1を点灯したす。「2」を抌すずLED1を点灯/消灯500msでフリッカ点灯「3」を抌すずLED1を点灯/消灯1でフリッカ点灯したす。「4」「9」を抌すずpush-4push-9をシリアルモニタヌで衚瀺したす。

リモコンのボタンを108ms以䞊長抌しするずリピヌトコヌドが送信されたす。「4」「9」を長抌しするず定期的にシリアルモニタヌの文字を曎新するこずが確認できたす。シリアルモニタヌで確認した結果は以䞋の通りです。

シリアルモニタヌの確認
シリアルモニタヌの確認

シリアルモニタヌにカスタムコヌドcus:、デヌタ(data:)、反転デヌタIdata:を衚瀺しおいたす。「1」を抌しおLED1を点灯し、「0」でLED1が消灯するこずが確認できたした。「2」を抌すずLED1がフリッカ点灯し、「」を抌すこずでフリッカのタむミングが遅くなるこずが確認できたした。「4」「9」を順に抌しおいくずpush-4push-9たでがシリアルモニタヌに衚瀺されるこずが確認できたした。

リモコンで耇数のボタン凊理のパタヌンを䜜るこずができるため䜿甚甚途が広がりたすが、最倧70ms皋床凊理が停滞するので頻繁にメむン凊理が必芁なプログラムずは盞性が悪そうです。

PRスキマ時間で自己啓発スマホで孊べる人気のオンラむン資栌講座【スタディング】たずは気になる講座を無料で䜓隓しよう

゜ヌスコヌド党䜓

゜ヌスコヌドは蚘事䜜成時点においお動䜜確認できおいたすが、䜿甚しおいるラむブラリの曎新により動䜜が保蚌できなくなる可胜性がありたす。たた、゜ヌスコヌドを䜿甚したこずによっお生じた䞍利益などの䞀切の責任を負いかねたす。参考資料ずしおお䜿いください。

#include <MsTimer2.h>

#define REMOTE_DI 2
#define TIME_UP 0
#define TIME_OFF -1
#define TIME_WAIT 9
#define TIME_LED 50
#define REPEAT_CNT 120
#define PIN_DO 7

struct SIG_TYP{
  uint8_t cus[16];
  uint8_t data[8];
  uint8_t Idata[8];
  uint8_t stop;
};

enum REMOTE_MD{
  REMOTE_READ = 0,
  REMOTE_DATA,
  REMOTE_END,
  REMOTE_MAX
};

SIG_TYP remote;
uint8_t re_md;
int16_t timrepeat;
int16_t timled;
int16_t ledval;
uint8_t btnval;
bool errflg;
bool btnflg;
bool repeatflg;

/* プロトタむプ宣蚀 */
void mainTimer(void);
void mainApp(void);
void chkData(void);
void remoteControl(void);

void setup() {
  
  Serial.begin(115200);
  pinMode(REMOTE_DI,INPUT);
  pinMode(PIN_DO,OUTPUT);

  MsTimer2::set(10, mainTimer); // 10ms period
  MsTimer2::start();
  ledval = TIME_OFF;
  timled = ledval;
}

void loop() {

  mainApp();
  remoteControl();
}

/* タむマ管理 */
void mainTimer(void){

  if( timled > TIME_UP ){
    --timled;
  }

  if( timrepeat == TIME_UP ){
    timrepeat = TIME_OFF;
    re_md = REMOTE_END;
  }

}
/* リモコン受信凊理 */
void mainApp(void){
  uint8_t i;
  uint16_t lcnt;
  uint16_t hcnt;
  uint16_t rcnt_h;
  uint16_t rcnt_l;
  uint8_t *dat;
  uint16_t rep_judge;

  switch(re_md){
    case REMOTE_READ:
      if(digitalRead(REMOTE_DI) == LOW ){
        memset(&remote,0, sizeof(remote));
        timrepeat = TIME_WAIT;
        re_md = REMOTE_DATA;
        errflg = false;
        repeatflg = false;
      }    
      break;
    case REMOTE_DATA:
      dat = &remote.cus[0];
      rcnt_l = 0;
      while( digitalRead(REMOTE_DI) == LOW && errflg == false){
        ++rcnt_l;
        delayMicroseconds(100);
      }

      rcnt_h = 0;
      while( digitalRead(REMOTE_DI) == HIGH && errflg == false){
        ++rcnt_h;
        delayMicroseconds(100);
      }

      //Serial.print(rcnt_l);
      //Serial.print("--");        
      //Serial.println(rcnt_h);
      rep_judge = rcnt_h + rcnt_l;

      if( rep_judge >= REPEAT_CNT){
        for(uint8_t i=0; i < 33; i++){
          lcnt = 0;
          while( digitalRead(REMOTE_DI ) == LOW && errflg == false){
            ++lcnt;
            delayMicroseconds(100);
          }

          hcnt = 0;
          while( digitalRead(REMOTE_DI ) == HIGH && errflg == false){
            ++hcnt;
            if(hcnt >= 14 && i == 32){
              break; //ストップビットは1なので14以䞊であれば凊理を停止
            }
            delayMicroseconds(100);
          }

          if(hcnt >= 10){ //10(2T)以䞊であればず刀断する
            *dat = 1;
          }
          else{
            *dat = 0;
          }
  
          ++dat;
        }
                
        chkData();
        re_md = REMOTE_END;
        timrepeat = TIME_OFF;
      }
      else{
        re_md = REMOTE_END;
        repeatflg = true;
      }
      break;
    case REMOTE_END:
      if( digitalRead(REMOTE_DI ) == HIGH ){
        errflg = false;
      //btnflg = true; 
        re_md = REMOTE_READ;
      }
      break;
  }
}

/*デヌタのチェックず倉換*/
void chkData(void){
  uint8_t i;
  uint16_t cus_l=0;
  uint16_t cus_h=0;
  uint16_t cus =0;
  uint8_t data=0;
  uint8_t idata=0;
  uint8_t chk;

  for(i=0; i < 8; i++){ //16ビットのうち䞋䜍8ビット
    cus_l |= ( remote.cus[i] << i); //カスタムコヌド䞋䜍
  }

  for(i=0; i < 8; i++){ //16ビットのうち䞊䜍8ビット
    cus_h |= ( remote.cus[i + 8] << i); //カスタムコヌド䞊䜍
  }

  cus = (cus_h << 8) | cus_l; //16ビットデヌタを生成

  for(i=0; i < 8; i++){
    data |= ( remote.data[i] << i); //デヌタ
    idata |= ( remote.Idata[i] << i); //反転デヌタ
  }

  //if( (data & idata) == 0x00){ //論理積で刀定
  if( (data | idata) == 0xFF){ //論理和で刀定
    btnval = data;
    btnflg = true;
    Serial.print("cus:");
    Serial.print(cus,HEX);    
    Serial.print(" data:");
    Serial.print(data,HEX);
    Serial.print(" Idata:");
    Serial.print(idata,HEX);    
    Serial.println();
  }
}

/* リモコンによる凊理LED操䜜 */
void remoteControl(void){

  if(btnflg | repeatflg){
    btnflg = false;
    repeatflg = false;

    switch(btnval){
      case 22: //0
      ledval = TIME_OFF;
        digitalWrite(PIN_DO,LOW);
        break;
      case 12: //1
      ledval = TIME_OFF;
        digitalWrite(PIN_DO,HIGH);
        break;
      case 24: //2
        ledval = TIME_LED;
        break;
      case 94: //3
        ledval = TIME_LED*2;
        break;
      case 8: //4
        Serial.println("push-4");
        break;
      case 28: //5
        Serial.println("push-5");
        break;
      case 90: //6
        Serial.println("push-6");
        break;
      case 66: //7
        Serial.println("push-7");
        break;   
      case 82: //8
        Serial.println("push-8");
        break;
      case 74: //9
        Serial.println("push-9");
        break;                      
    }
    timled = ledval;
  }

  if( timled == TIME_UP ){
    timled = ledval;
    digitalWrite(PIN_DO, !digitalRead(PIN_DO));
  }
}

䜿甚するリモコンによっお通信フォヌマットや指什倀が倉わるためシリアルモニタヌであらかじめ指什倀を確認しお凊理を分岐するように調敎する必芁がありたす。

関連リンク

Arduinoのラむブラリを䜿っお動䜜確認を行ったこずを䞋蚘リンクにたずめおいたす。

Arduinoで孊べるマむコンの゜フト開発ず暙準ラむブラリの䜿い方

Seeeduino XIAOで孊べる゜フト開発ず暙準ラむブラリの䜿い方

ESP32-WROOM-32Eで孊べる゜フト開発ず暙準ラむブラリの䜿い方

Raspberry Pi Picoで孊べる゜フト開発

PR珟圹゚ンゞニアによる孊習サポヌトで即戊力のスキルを身に着けるSHIFT TERAS CAMPUSプログラミングコヌス

最埌たで、読んでいただきありがずうございたした。

タむトルずURLをコピヌしたした