Paso 7: Control remoto IR
Así que empecé por tutorial de IR de siguiendo las ladayada:
http://www.Ladyada.net/Learn/sensors/ir.html
Fue una forma realmente rápida de llegar a IR y estoy variar agradecidos para él, sin embargo se ha diseñado con un amplio arduino en mente y estaba trabajando con un ATtiny2313 que no han en cualquier lugar cerca de suficiente RAM para hacer el trabajo.
Usando su dibujo con un pequeño control remoto que tenía por ahí me registra el botón de encendido y tiene esto:
int PowerSignal [] [2] = {}
ON, OFF (en 10 de microsegundos)
{1138, 574},
76 {66},
78 {66},
{68, 70},
76 {70},
76 {66},
{68, 74},
{68, 78},
{68, 210},
216 {72},
214 {68},
216 {70},
{78, 206},
214 {70},
216 {70},
216 {70},
{68, 72},
72 {74},
{68, 216},
{68, 76},
78 {66},
214 {70},
{68, 78},
72 {66},
74 {70},
{68, 216},
{74, 70},
214 {68},
216 {72},
68 {72},
214 {74},
216 {66},
214 {70},
5014 {72},
{1134, 292},
5532 {62},
{1142, 294},
{58, 0}};
38 encendido/apagado pares, algunos de ellos demasiado grande para un solo byte, por lo que si iba a hacerlo como esta necesito 152 bytes.
Tenía bastante flash, aunque tomaría una buena cantidad de espacio podía repuesto lo, pero si tuviera que grabar las señales entrantes que estallaría mi presupuesto de RAM sin siquiera considerar las otras cosas que necesito memoria RAM para.
Pude haber comprobé el código como sucedió, pero luego es un poco difícil sincronización.
Lo pensé por un rato y he notado un patrón en mi código de infrarrojos.
Las señales eran menos 1ms entonces o eran mayores.
Utilice código de ladyada, tenía una tolerancia del 20%, que significa cualquiera de los números bajos correspondería con uno al otro.
Esencialmente no hubo diferencias entre un microsegundos 680 y 780, con la tolerancia.
Fue un caso similar para el más grande entonces valores de 1ms, allí son algunas excepciones, pero la mayoría forma la regla.
Yo pensé, qué pasa si yo tratarlos como solo pedacitos, un 0 menos entonces 1 MS y un 1 si fuese mayor.
Embalado en que vino para arriba con esto:
11000000 = 0xC0
00000000 = 0 x 00
0x55 = 01010101
0x55 = 01010101
0 x 00000100 = 04
0 x 00010000 = 10
00010001 = 0x11
01000101 = 0x45
01011101 = 0x5D
1100
Después de ignorar el último nibble (medio byte) era capaz de almacenar la señal de entrada a la vez en sólo 9 bytes, y la señal de comparación solo tomaría 9 así!
Si quería más características no se acaba el flash para almacenar códigos y siendo tan pequeña que podrían fácilmente se han almacenado en la EEPROM si necesitaba.
Una ventaja agregada era comprobar si el código emparejado no era más comparaciones de byte simple entonces 9.
Echa un vistazo en el código adjunto.
En la parte superior de que hay un conjunto define para hacer el código más fácil de seguir y mantener.
Es siguiendo el patrón mencionado más arriba, como una matriz de char y entró en hexadecimal.
Todo lo demás es básicamente en la función listenForIR que se llama continuamente desde el bucle principal.
Tenga en cuenta que se trata de una simple demo de código, en un proyecto final que se desea utilizar una interrupción para despertar cuando el IR se detecta algo.
Tengo una versión del código que hace eso.
Así que, ¿cómo funciona listenForIR?
Permite romper hacia abajo.
Comenzamos con un tiempo bucle que intenta obtener 9 bytes de datos de la ir
Empezamos poniendo el temporizador a un prescaler de 256.
En 1MHz esto nos deja tiempo hasta 65ms sin desbordamiento.
Receptores IR mantenga su pin de datos alto por defecto, que baja cuando se recibe una señal modulada.
Así que esperamos hasta que tengamos una baja, y si tomamos más de largo entonces 56ms espera que rescatar.
Una vez que tenemos una baja que necesitamos tiempo, pero no necesitamos a tiempo todo el tiempo como antes, y podríamos utilizar un mayor grado de precisión, para que cambiar el prescaler a 8.
Si la baja se mantiene durante más tiempo entonces 1ms, entonces saltan, de lo contrario el bucle termina temprano como el pin va alta.
El siguiente bit de código tiene un agradable uso de operaciones bit a bit que nos permite hacer un seguimiento de los cambios rápidamente y a buen precio (barato en términos de cpu y uso de la memoria):
current_byte << = 1;
current_byte | = estado;
while(IR_LOW); en el caso de un bajo más largo entonces el tiempo de espera anterior
Empezamos por cambiar todos los bits a la izquierda.
Que luego o en el valor 1 o 0, que agrega su valor al LSB (Bit menos significativo).
Después espere, caso fue un poco largo que nos hemos saltado fuera en anteriores.
Luego hacemos lo mismo para la parte alta del código.
Una vez tengamos todos los 8 bits (4 pares de baja y alta), lo almacenamos y empezar de nuevo.
Suponiendo que tenemos todos 9 bytes, salir del bucle y simplemente compararla contra nuestro código.
Si todos coinciden, nos cambia el LED.