Paso 2: Programación - lado de Arduino
Para la parte remota de IR vamos a utilizar la biblioteca Arduino IRremote (https://github.com/shirriff/Arduino-IRremote). Esta biblioteca se puede utilizar para enviar datos predefinidos sobre IR, como LIRC. Pero utilizaremos solamente para sus funciones de auxiliar (para ajustar la frecuencia de 38KHz para IR y para administrar tiempos mientras que envía mensajes).
En el anterior instructable encontramos que para comunicar comandos para el acondicionador de aire necesita enviar una secuencia de cierre, una introducción constante, la secuencia de bloqueo otra vez, entonces la carga real. Bien el Arduino puede muy bien tener la introducción de su código y esperando a la carga. Sólo podríamos enviar los valores de opciones y hacer el Arduino modificar una plantilla con estos valores, pero para mantenerlo simple sólo te proporcionan la carga entera y lo deja enviar como es. Para enviar los bits se encenderá el IR LED encendido y apagado según la los tiempos encontrados previamente.
Aquí el Arduino actúa como un "esclavo", nunca iniciar una comunicación. Como pretendo hacer usos múltiples de esta unidad que comenzar las comunicaciones por un solo carácter 'I' significa 'enviar por IR', seguido de 19 bytes de carga útil. El Arduino envía el mensaje al acondicionador de aire.
En el lado de Arduino el código puede parecer un poco demasiado complicado, pero es porque se supone que sirven como un relais de la radio, por lo que la comunicación entre el Pi y el Arduino sobre interfaz Serial no siempre será simplemente enviar el mensaje de IR.
Aquí está la fuente de arduino que se utiliza para enviar comandos al acondicionador de aire.
Un poco de explicación:
-> el bucle código sólo cheques si un comando está listo. En ese caso se ejecuta el comando (por ahora solo "enviar un mensaje de IR").
-> el SerialEvent() se llama después de un loop(), si hay serie de datos en el búfer. En esta función que es leer el comando, la carga útil está preparada y, a continuación, se coloca una bandera a la función loop() que un comando está listo
serialEvent recibir caracteres ASCII que representan valores HEX. Para convertirlo que utilizamos la función sscanf con el "x %" (hexadecimal) opción de formato. Almacenamos los caracteres recibidos en una matriz de 5 char y llenarlo con: "0 x" + los 2 chars '\0' (al final de la cadena).
char hexConvert [5] = "0 x";
ASCII se recibe
para (int i = 0; i < 19; i ++) {}
hexConvert [2] = Serial.read();
hexConvert [3] = Serial.read();
hexConvert [4] = '\0';
convertir a lo caracteres recibido en un valor numérico en carga [i]
sscanf (hexConvert, "%x" y (payload[i]));
}
En este punto la carga [i] contiene el valor binario representado por lo caracteres recibido.
En el enviar horarios adecuados de comando se utilizan cerraduras, introducción y carga útil. Para enviar los datos, el código tiene que enviar cada bit por separado con la función irsend.mark(duration) y irsend.space(duration). Como se explica en el instructivo la duración es de sobre 400 (realmente debería estar más cerca de 420 creo) la marca (en estado) y 400 o 1300us por el espacio (estado OFF) para enviar un 0 o un 1, respectivamente.
Enviar cada bit de cada byte en el código siguiente se utiliza:
para (int s = 0; s < payloadSize; s + +) {}
para (int i = 7; i > = 0; i--) {/ / Bit más significativo es lo primero
irsend.Mark(irSpace);
irsend.Space ((carga útil [s] >> i) y 1 == 1? irOne: irZero);
}
}
Si no estás familiarizado con las operaciones bit a bit hay un montón de tutoriales disponibles en la red.
Lo que pasa aquí es:
Para cada byte de la carga útil (funciona del mismo modo con la introducción):
Para los que van de 7 a 0
cambiar el byte para que alinea a la derecha
Mira el último bit
Si este bit es uno, enviar una señal de "irOne" (1300us), que enviar una señal de "irZero" (400)
Básicamente lo que se obtiene al cambiar el byte de N filas (añadiendo ceros a la izquierda) es el Nth del pedacito en el lado de la derecha. Cuando enmascara con un AND bit a bit (y) 1 tomamos sólo el bit más a la derecha, así que todo el mundo obtenemos el valor de n bits.
Ejemplo con 5B en hexa = 0101 1011 en binario. El paréntesis está aquí hacer hincapié en los bits cambiados de puesto, para facilitar la lectura...
me = 7 = > cambio (0) 101 1011 para 7 filas = 000(0) > 0000
máscara con 1 = > 0000 0000 y 0000 0001 = 0 = > Enviar irZero
i = 6 = > shift (01) 01 1011 6 filas = 00(01) > 0000
máscara con 1 = > 0000 0001 & 0000 0001 = 1 = > Enviar irOne
i = 5 = > shift (010) 1 1011 5 filas = 0(010) > 0000
máscara con 1 = > 0000 0010 & 0000 0001 = 0 = > Enviar irZero
i = 4 = > cambiar (0101) 1011 para 4 filas = > 0000 (0101)
máscara con 1 = > 0000 0101 & 0000 0001 = 1 = > Enviar irOne
i = 3 = > shift (0101 1) 011 para 3 filas = > 000 (0 1011)
máscara con 1 = > 0000 1011 & 0000 0001 = 1 = > Enviar irOne
i = 2 = > shift (0101 10) 11 para 2 filas = > 00 (0110 01)
máscara con 1 = > 0001 0110 & 0000 0001 = 0 = > Enviar irZero
i = 1 = > shift (0101 101) 1 para la 1 fila = > 0(010 1101)
máscara con 1 = > 0010 1101 & 0000 0001 = 1 = > Enviar irOne
i = 0 = > cambiar (0101 1011) para la fila 0 = > (0101 1011)
máscara con 1 = > 0101 1011 & 0000 0001 = 1 = > Enviar irOne
Así que enviamos a pedacitos a la izquierda al orden correcto.
Observe que eso Biblioteca IRremote utiliza pin3 para enviar mensajes. Supongo que podría ser posible usar el pin 11 (mismo temporizador para PWM) modificando la clavija en el código de la biblioteca de destino, pero no lo he probado.