Paso 3: Programación - lado de la PC
El programa construirá la carga de comandos según las opciones de línea de comandos (consulte la uso) y enviar el comando al dispositivo conectado al puerto USB.
El puerto puede especificarse con la opción -u, de lo contrario tratará de/dev/ttyUSB0, / dev/ttyUSB0, / dev/ttyACM0, /dev/ttyACM1, como los arduinos pueden asignarse como (al menos) estos archivos, dependiendo del tipo de arduino y desconexiones/reconexiones.
Como se indica en la introducción que el Arduino tiene que tener su función autoreset deshabilitado, de lo contrario reiniciará cada vez que se realiza una conexión. Esto es lo que el IDE puede programar el chip, pero no es deseable en nuestro caso. Si desea probar el código con un arduino autoreset habilitado, debe agregar un comando de sleep(2) después de la conexión (después de abrir el archivo tty) y dejó que reset arduino pudiendo llegar los mensajes.
Como era de esperar el código envía un 'I' carácter a Arduino, y luego envía la carga útil y lee el archivo para esperar respuesta de Arduino. Este paso no es crucial para un simple comando envíe, pero será si el objetivo es obtener información de Arduino sí mismo o a otro dispositivo controlado por radio. Por ahora el Arduino solo responde "OK" así que el programa sólo muestra la respuesta como es.
En cuanto a la parte de Arduino, es una parte del código donde el mensaje se convierte en la representación ASCII del mensaje binario.
mensaje [0] = 'I';
convertir carga útil binaria, en caracteres de ASCII (representación HEX)
para (i = 1, j = 0; i < 39; i += 2, j ++) {}
mensaje [i] = (carga útil [j] & 0xF0) >> 4;
Si (mensaje [i] < 10) {}
mensaje [i] += '0'; ASCII
} else {}
mensaje [i] += 'A' - 10;
}
mensaje [i + 1] = carga útil [j] & 0x0F;
Si (mensaje [i + 1] < 10) {}
mensaje [i + 1] += '0'; ASCII
} else {}
mensaje [i + 1] += 'A' - 10;
}
printf ("0 x %c %c", mensaje [i], message[i+1]);
}
Los operadores bit a bit una vez más se utilizan para seleccionar y cambiar el nombre o apellidos 4 pedacitos y convertirlo en un dígito o un carácter (A F):
mensaje [i] = (carga útil [j] & 0xF0) >> 4;
Aquí tomamos el byte y aplicar una máscara 11110000 así obtenemos sólo los bits izquierdos primeros, y cambiar estos bits a la derecha
mensaje [i + 1] = carga útil [j] & 0x0F;
Aquí mismo pero bits seleccionados ya están a la derecha del byte por lo que hay un cambio es necesario.
Si (mensaje [i] < 10) {}
mensaje [i] += '0'; ASCII
} else {}
mensaje [i] += 'A' - 10;
}
Aquí si el dígito es < 10 valor ASCII es comprendido entre 48 y 57 (decimal), y sólo tiene que añadir el valor mentionado aquí el valor de carácter '1' (que es de 48 '1' es utilizable sin saber la tabla ASCII por corazón ;)). El mismo se aplican a caracteres A F pero A(Hex) es 10(Decimal) por lo que si añadimos el valor mentionado aquí el valor ASCII de 'A' estaríamos 10 valores a alta. Así que sumamos el valor -10 y el final con el carácter propio.
Ahora, te preguntarás por qué nos molestamos conversión de hexadecimal a ASCII y ASCII a Hex en el otro lado. Sería correcto ;)
De hecho, en este caso es inútil, y la primera versión del código trabajó directamente con valores binarios. Realmente funciono enviando sólo los 5 bytes que son realmente útiles y Arduino había hecho la actualización de la plantilla de carga útil. Así que ahora enviamos 40 bytes en vez de 5. ¿Por qué razón?
Bueno, aunque esto está fuera de esta particular instructivo que indicaba que tenía un segundo regulador micro en mi habitación para la segunda unidad de acondicionador de aire. Este chip es una abeja de Wifi Seeediuno. Me resultó difícil de implementar el comportamiento correcto en que chip usar zócalos así que acabé utilizando el servidor web incorporado minimalista, así que le mande el comando completo de IR en la dirección URL en caracteres Hex.
Ahora usted tiene la razón: quería usar el mismo código para el control de ambas unidades, envío de datos a USB o por WiFi, pero manipulando el mismo mensaje, en el mismo formato.