Programei um ATTINY13 para acionar um led IR em 36kHz com este código:
void setup(){
DDRB |= (1<<PB0); //Set pin PB0 as output
//DDRB |= (1<<PB1); //Set pin PB1 as output
TCNT0 = 0;
TCCR0A = 0;
TCCR0B = 0;
TCCR0A |=(1<<COM0A0); //Timer0 in toggle mode Table 11-2
TCCR0A |=(1<<WGM01); //Start timer 1 in CTC mode Table 11.5
TCCR0B |= (1 << CS00);// Prescaler table 11.6
OCR0A=110; //CTC Compare value, 36khz
}
void loop(){ //cycle = 1/36 = 28μs
for (int i=0; i<10; i++) { //burst of 10 cycles
TCCR0A |=(1<<COM0A0); //on for 14μs
delayMicroseconds(14);
TCCR0A &= ~(1<<COM0A0); //off for 14μs
delayMicroseconds(14);
}
delayMicroseconds(392); //gap of 14 cycles
}
A função de loop é baseada na folha de dados do TSOP1236 sobre taxa e taxa de burst / gap:
• A frequência da portadora deve estar próxima da frequência central do passe de banda (por exemplo, 36 kHz). • O comprimento da rajada deve ser 10 ciclos / rajada ou mais. • Após cada rajada entre 10 e 70 ciclos, é necessário um intervalo de pelo menos 14 ciclos. • Para cada rajada com mais de 1,8 ms, é necessário um tempo de intervalo correspondente em algum momento no fluxo de dados. Esse intervalo deve ser pelo menos 4 vezes maior que o burst. • Até 800 rajadas curtas por segundo podem ser recebidas continuamente.
Estou recebendo leituras agora no final do receptor, usando o Arduino e um attachInterrupt ().
Eu postei uma pergunta aqui sobre isso. Ele ganhou o prêmio tumbleweed, mas eu parecia ter encontrado a resposta.
No entanto, o alcance diminuiu significativamente de alguns metros, quando eu estava ultrapassando o LED e não estava usando lacunas, para cerca de 30 centímetros agora. Também não é muito estável; às vezes não relata uma quebra de feixe, às vezes relata.
Eu só preciso de um metro. O que estou fazendo errado?