Étape 20 : Code : ajout de contrôle
À l’étape précédente, nous définit une routine d’analyse fondamentale et discuté de la façon d’utiliser l’interpolation pour les servos avec SOUPLESE. Maintenant, que se passe-t-il si vous souhaitez contrôler votre Zombot ?
Il y a une foule de façons d’implémenter ceci, tant dans le matériel et le logiciel. J’ai choisi de le manipuler à l’aide de connexion sérielle de l’Arduino, ce qui signifie qu’il sera vraiment trivial pour contrôler le robot sans fil via Bluetooth, ou que je fais en ce moment pour le débogage, simplement via le câble USB.
Ce n’est certainement pas la façon la plus élégante de parvenir à ces résultats, mais il est si tout va bien facile à lire et à comprendre, ainsi que flexible.
Comme avant, je vais joindre le code complet ci-dessous, mais je vais aller à travers les points clés ici.
Protocole de communication
J’ai décidé de mettre en place mon protocole de communication de la façon suivante.
- Chaque paquet de données (l’instruction) du contrôleur au robot est une chaîne de caractères composée de deux parties, séparées par un ":" caractère.
- Le « commandement » vient en premier et dit le robot quoi faire (par exemple : commencez à déplacer)
- Le « argument » vient qu’en second et fournit des informations supplémentaires
- Chaque paquet de données commence par un "[" et se termine par un "]"
Définir des Variables globales
Outre les variables définies précédemment, nous devons maintenant mettre en place certaines variables qui seront utilisées dans notre protocole de communication série.
Définir des fonctions
Lire une commande de série
Cette fonction peut être appelée pour vérifier l’interface série pour les commandes reçues.
Il vérifie les octets entrants serial (personnages) un par un, les jeter, sauf s’ils sont un "[" qui indique le début d’une commande.
Lorsqu’une commande a été commencée, chaque octet est stocké dans la variable « commande » jusqu'à une ":" ou "]" est reçu. Si un ":" est reçu, nous commençons à stocker les octets suivants dans la variable « argument » jusqu'à une "]" est reçu.
Si à tout moment un "[" est reçue pendant la lecture d’une autre instruction, que l’instruction précédente est ignorée. Cela ne nous empêche coincé si quelqu'un jamais transmis une "]" caractère de fin de commandement et nous voulions nous faire une nouvelle commande.
Après avoir reçu une commande complète la fonction « processCommand » est appelée, ce qui sera effectivement laissez-vous et l’action de la commande.
Traiter une commande
Une fois qu’une commande valide (et éventuellement un argument) ont été reçues, dont ils ont besoin d’être procesed, afin que nous puissions prendre les mesures appropriées.
Pour l’instant je n’ai pas besoin plus d’un octet d’information pour définir une commande, il suffit de nous regarder le premier octet de commande. À l’aide de cet octet comme argument pour une qu’énoncé nous permet d’effectuer une fonction définie par l’octet de commande.
Dans cet exemple, nous recherchons le caractère « w », le « s » ou le « c ».
Si « w » est reçu, puis les cadres de l’animation sont remplacées par une nouvelle animation qui définit un mouvement de « papillon ».
Si « s » est reçu, puis les cadres de l’animation sont remplacées par une nouvelle animation qui définit un mouvement de « crawl ».
Si « c » est reçu, les cadres de l’animation sont tous ensemble à la même position, effectivement s’arrêtant tout mouvement.
Puisqu’on ne peut pas réaffecter toutes les valeurs dans un tableau à la fois, nous tout d’abord définir un nouveau tableau temporaire pour chaque servo, contenant les nouvelles images, puis utilisez le "memcpy" pour copier ces valeurs sur l’emplacement de l’image réelle du tableau en mémoire.
Boucle principale
Le seul ajout nécessaire dans la boucle principale est un appel pour vérifier les entrées d’utilisateur à chaque itération de la boucle.