Étape 15 : logiciel
Le logiciel est écrit en C et basé sur un exemple de projet de lib objectif évolution V-USB. Il s’agit d’un grand morceau de logiciel, et c’est gratuit et open source pour un usage personnel/non commercial.
http://www.obdev.at/Products/vUSB/index.html
Je ne vais pas aller dans les détails sur le fonctionne du logiciel. La rétro-ingénierie est l’accent mis par ce Instructable. Voici la version courte :
Vous avez besoin de deux programmes pour faire ce travail. Un programme sur votre ordinateur et le firmware pour le microcontrôleur.
Microcontrôleur :
Les transmissions RF réelles se fait par une routine d’interruption. J’utilise un interrupt timer parce que c’est la façon la plus simple pour obtenir le timing précis. L’interruption timer lit à partir d’un tampon global où les délais sont stockés. Je ne stocke l’état activé/désactivé du transmetteur RF depuis et s’éteint toujours suppléants. J’ai commencer avec une impulsion d’arrêt, puis alternent sur et en dehors des légumineuses.
La mémoire tampon contient 42 valeurs. Il y a 21 bits à transmettre, et chacun a une période basse et haute. Cette configuration n’est pas très efficace de la RAM, mais l’ATmega8 a beaucoup. Je vais le commerce RAM pour la lisibilité du code au lieu d’avoir la ram inutilisée !
La mémoire tampon est rempli par la fonction send_rf_frame (réseau, charge utile). Il renseigne les timings de droite dans le tableau buffer rf, commençant par le bit de départ, suivi par l’id de réseau de 12 bits et les 8 bits de la charge utile + somme de contrôle. Lorsque la mémoire tampon est rempli, la variable position de mémoire tampon est réinitialisée à 0, alors que la routine d’interruption commencera le travail de bit 0 dans la mémoire tampon.
Lorsque les données sont envoyées au microcontrôleur via le port USB, la fonction usbFunctionSetup() est appelée. Il s’agit d’une fonction que vous créez et où vous mettez votre code USB entrant.
Selon le type de demande envoyé depuis le PC, vous pouvez faire des choses différentes à l’intérieur de cette fonction. J’ai demande deux types configurés, les set_network_id et les send_command.
La demande de set_network_id juste prend l’id de réseau de 12 bits envoyé depuis l’ordinateur et les stocke dans une valeur d’entier global.
La demande de send_command appelle send_rf_frame() et lui passe l’octet commande reçue. Après cela, la routine d’interruption reprend.
À l’intérieur de la boucle de main() :
usbPoll() ; doit être appelée chaque quelques millisecondes (10 ou 50, pas sûr) pour l’USB fonctionne correctement.
Après que c’est fait, le comparateur analogique est vérifié. Si la tension de la pompe de charge est trop faible, la pompe de charge est démarrée. Si c’est à la tension désirée, la pompe de charge est arrêtée.
Enfin, un voyant d’État est défini sur ON si l’indicateur rf_busy est actif.
Ordinateur :
Du côté de l’ordinateur, j’ai aussi modifié l’exemple fourni par objectif développement. J’ai ajouté du code pour analyser les arguments de la ligne de commande. J’ai aussi écrit une fonction pour créer les octets de charge utile. Il faut des arguments tels que numéro de lampe, marche/arrêt, diffusion.
Le logiciel utilise libusb pour communiquer avec le microcontrôleur.
J’ai également créé un script php petites pour appeler le programme informatique de ligne de commande lorsque vous appuyez sur les boutons sur une page web. Ouvrez la page Web sur votre Android/iPhone et régler l’éclairage ! : D