Etape 3: Robot logiciel
Je choisis de mettre en œuvre l’esquisse du robot dans un fichier unique, ce qui rend un peu long, mais tout ce que met en un place. Plutôt que de marcher dans la SW par ligne, je vais juste commenter de comment il est organisé, et ce que chaque section se concentre sur.
L’esquisse démarre avec l’en-tête standard commentaire et bibliothèque de fichiers include. J’ai n’a documenté l’utilisation de broches de bouclier dans le commentaire de l’en-tête afin de me garder tout droit sur SW utilisation des broches. J’ai également défini une structure de données qui est utilisée par la fonction PID, avec la pensée que cela permettrait de rendre plus facile d’ajouter une deuxième cascade vitesse PID plus tard.
Viennent ensuite que les instructions #define pour les constantes et couramment utilisé les valeurs qui peuvent être facilement changées. Par exemple, une fois que vous déterminez ce que le P optimal, j’ai et les valeurs de D sont pour votre robot, ils peuvent être en permanence recodés ici. Viennent ensuite les définitions variables, que j’ai essayé de regrouper de façon logique - vous pouvez être le juge de la façon dont je l’ai fait.
La section suivante contient les fonctions qui sont utilisées plus tard dans le sketch. La première fonction implémente le PID d’équilibrage. Il s’agit de la SW j’ai fortement exploité du tutorial de Brett Beauregard. La fonction PID comprend une section pour enregistrer les informations de PID sur carte SD si l’enregistrement de données sont activées. Pendant l’accord les valeurs PID, je l’ai trouvé pédagogique et ludique, à voir le comportement individuel du terme PID. Cette enregistre les données dans un fichier au format CSV, que j’ai ensuite importé dans Excel et généré des graphiques pour la visualisation. Ce tous évidemment fonctionne uniquement si vous avez une carte SD card dans le jury de Galileo.
Elle est suivie de quelques fonctions de commande du moteur qui mappent les informations de commande de moteur aux commandes de direction, de vitesse et de frein pour le flasque arrière
Suivant est une fonction pour récupérer les données de position du module MPU-6050. J’ai volé ceci avec fierté de code de référence de Jeff Rowberg. J’utilise une méthode régulière-intervalle-données-pull pour transfert de données, plutôt qu’en utilisant les interruptions comme Jeff l’a fait, comme j’ai eu quelques difficultés à obtenir les interruptions au travail. L’intervalle de temps est implémenté dans la boucle principale du programme, et j’ai trouvé cela un 3ms intervalle ne permettait pas d’assurer il n’y a aucun débordement de données.
Nous passons ensuite à un ensemble de fonctions pour gérer la communication Bluetooth. Celles-ci commencent par quelques fonctions d’envoyer les commandes plus complexes - ceux-ci ont éclaté dans des fonctions principalement pour la lisibilité du code. Puis vient l’analyseur de commande Bluetooth primaire, qui met en œuvre le protocole de communication de réception avec l’application Android. Cette fonction s’accumule personnages du port série Bluetooth jusqu'à ce que le caractère de fin de commandement est détecté, et ensuite il décode la commande. Comme prévu, le décodage finit par être juste une grande instruction case.
La fonction définitive est la machine d’État contrôle robot de niveau élevé. J’ai mis en œuvre à l’instar d’une fini-État-machine (FSM) - probablement exagéré, mais j’ai imaginé cette expansion lorsque des fonctionnalités sont ajoutées au robot.
Ensuite est la fonction de paramétrage requise par toutes les esquisses d’Arduino. Les commentaires dans le code devraient rendre cette section assez explicite. Il y a une section qui tente d’initialiser le fichier SD pour enregistrement de données et devrait l’erreur si une carte SD n’est pas présente, mais je n’avais pas passer beaucoup de temps cette validation.
Enfin, il y a la boucle principale de croquis. La première section implémente une minuterie pour la récupération de données de la MPU-6050. Si les données sont récupérées, il y a quelques calculs pour détecter si le robot est en position vertical, ou perdre l’équilibre.
Ensuite le port série est relié au module Bluetooth est activé pour un caractère reçu, et si on attend, la fonction Bluetooth est appelée.
Il est suivi par le PID et la minuterie de commande du moteur. L’instruction « if » fait en sorte que le contrôle PID/moteur n’arrive que lorsque le robot cherche activement à l’équilibre. C’est où les données de MPU_6050 sont introduites dans le PID et la sortie de PID est passée sur la commande du moteur. C’est également où le pilotage est mis en œuvre, en ajoutant l’entrée de direction Bluetooth dérivé d’un moteur et enlève pas de l’autre. Parce que nous faisons des mathématiques supplémentaires sur la sortie de PID, nous avons à nouveau contrainte que limite de la PID Max/Min pour conserver au sein des valeurs PWM moteurs.
Enfin la machine d’État contrôle robot est appelée, et une minuterie est utilisée pour implémenter la fonction battement de coeur de robot. J’ai commencé avec un coeur séparé battu Bluetooth commande et commande de tension de batterie, mais alors eux fusionnées en une seule fonction, avec la tension envoyée comme une indication du rythme cardiaque.
Et c’est - un peu de longue haleine, mais rien de trop complexe.