Paso 15: Software
El software está escrito en C y basado en un proyecto de ejemplo de lib objetivo evolución V-USB. Esta es una gran pieza de software, y es libre y de código abierto para el uso personal no comercial.
http://www.obdev.at/Products/vusb/index.html
No voy a entrar en grandes detalles sobre cómo funciona el software. La ingeniería inversa es el énfasis de este Instructable. Aquí está la versión corta:
Necesitas dos programas para hacer este trabajo. Un programa en la computadora y el firmware para el microcontrolador.
Microcontrolador:
Las transmisiones de RF reales realiza una rutina de interrupción. Utilizar una interrupción de contador de tiempo porque esta es la forma más fácil de obtener sincronización precisa. La interrupción de temporizador lee desde un búfer global donde se almacenan los tiempos de retardo. No almacenar el estado de encendido/apagado del transmisor RF desde el encendido y apagado siempre suplentes. Comienza con un pulso apagado, luego alternan y apagar impulsos.
El búfer contiene valores de 42. Hay 21 bits a transmitir, y cada uno tiene un período de bajo y un período de alta. Esta configuración no es muy eficiente de RAM, pero el ATmega8 tiene un montón. A operar RAM para legibilidad de código en lugar de tener ram sin usar!
El búfer se rellena por la función send_rf_frame (red, capacidad de carga). Llena en los tiempos de la derecha en la matriz de búfer de rf, empezando con el bit de inicio, seguido por el identificador de red de 12 bits y 8 bits de carga útil + suma de comprobación. Cuando el buffer se llena, la variable de posición de búfer se restablece a 0, para que la rutina de interrupción comenzará trabajo de bit 0 en el búfer.
Cuando se enviaron datos al microcontrolador por el puerto USB, se llama la función usbFunctionSetup(). Esta es una función que cree y donde pones el código USB entrado.
Dependiendo del tipo de solicitud enviado desde la PC, puede hacer cosas diferentes dentro de esta función. Tengo pedido dos tipos configurados, set_network_id y send_command.
La solicitud de set_network_id sólo toma el identificador de red de 12 bits enviado desde el ordenador y almacena en un valor entero global.
La solicitud de send_command llama send_rf_frame() y pasa el byte de comando recibido a él. Después de eso, se asume la rutina de interrupción.
Dentro del bucle de main():
usbPoll(); tiene que ser llamado cada pocos milisegundos (10 o 50, no estoy seguro) para el USB para que funcione correctamente.
Después de hecho esto, se comprueba el comparador analógico. Si el voltaje de la bomba de carga es demasiado bajo, se encienda la bomba de carga. Si es a la tensión deseada, se apaga la bomba de carga.
Por último, un LED de estado está activada si se activa la bandera de rf_busy.
Computadora:
En el lado de la computadora también he modificado el ejemplo proporcionado por el desarrollo objetivo. He añadido algo de código para analizar los argumentos de la línea de comandos. También escribí una función para crear los bytes de carga útil. Toma argumentos como el número de la lámpara, encendido, difusión.
Los programas informáticos utiliza libusb para comunicarse con el microcontrolador.
También he creado un script de php pequeña para llamar el programa de computadora de la línea de comandos cuando se pulsa el botón en una página web. Abra la Página Web de tu Android/iPhone y controlar las luces! : D