2020年3月7日土曜日

Attiny 412で赤外線リモコンを受信してみた

 Attiny412でNECフォーマットな赤外線リモコンを使ってみた。このマイコン小さいのにペリフェラルめっちゃついてるし面白い…

とりあえずArduinoのmegaTinyCoreを使ってjtag2updiな書き込み機で試してみた。UPDIは電源とグラウンドとUPDIのピンだけで書き込めるのですごく便利だ。

IRremoteライブラリはtinyAVR1に対応していなかったので、簡易的にメインループ内で実行できるような状態で確認してみた。

#define ir 2

void setup() {
  pinMode(ir, INPUT);
  Serial.begin(115200);
  Serial.println("megaTinyCore IR reciever");
}

void loop() {
  unsigned long int sb, lt, ht;

  while(digitalRead(ir) == HIGH){;}
  sb = micros();
  while(digitalRead(ir) == LOW){;}
  lt = micros() - sb;

  if(lt > 9000){
    sb = micros();
    while(digitalRead(ir) == HIGH){;}
    ht = micros() - sb;
    if(ht > 4500){
      ir_decode();
    } else if(ht > 2100){
      Serial.println("---Repeat Code---");
    }
  }
}

void ir_decode(){
  int i;
  unsigned int custom;
  uint8_t data,data_inv;
  unsigned long int sb, len;

  i=0;
  while(1){
    sb = micros();
    while(digitalRead(ir) == LOW){;}
    while(digitalRead(ir) == HIGH){;}
    len = micros() - sb;

    if(i < 16){
       if(len > 2000){
         custom = custom << 1 | 1;
       } else {
         custom = custom << 1 | 0;
       }
    }else if(i < 24){
       if(len > 2000){
         data = data << 1 | 1;
       } else {
         data = data << 1 | 0;
       }
    }else if(i < 32){
       if(len > 2000){
         data_inv = data_inv << 1 | 1;
       } else {
         data_inv = data_inv << 1 | 0;
       }
    }
    i++;
    if(i >= 32){
      break;
    }
  }
  if(data == uint8_t(~data_inv)){
    Serial.print("Custom Code:0x");
    Serial.println(custom,HEX);
    //Serial.println(data,BIN);
    Serial.print("Data Code:0x");
    Serial.println(data,HEX);
    //Serial.println(data,BIN);
  }
}


これで一応受信できてるっぽい。サンプルなのでシリアルポートで出力してるけど簡易的な用途だったらAttiny202でも行けるかもしれない。ちなみにこの状態で2237バイト。
シリアルなかったら202に収まるかも?

2 件のコメント: