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に収まるかも?
素晴らしい!
返信削除ありがとうございます!
削除