Étape 19 : Code : ramper
Arduino outils et connaissances de la Fondation
Si vous cherchez une bonne introduction à Arduinos, puis il y a beaucoup de Instructables pour vous, voici un excellent.
Je suis aller à suppose que vous avez téléchargé et installez l' IDE Arduino et sont en mesure de télécharger le code à votre Arduino, la mentionné précédemment instructable vous guidera à travers tout cela et plus encore.
Vue d’ensemble du code
À l’étape précédente, nous avons décidé que nous mettrait en œuvre le rampant de cyclisme par le biais de « cadres » de l’animation qui définirait la position de chacun des servos à un moment donné dans le temps.
Obtenir le code complet est jointe à un fichier, mais je vais aller à travers la plupart des sections ici afin que vous puissiez comprendre eux. Si vous déjà comprendre, alors c’est très bien, parce que vous pouvez sans doute penser à une meilleure façon de faire ce que j’ai fait.
Importer les bibliothèques requises
La seule bibliothèque qui est nécessaire pour que ce code est « Servo.h », qui est plein de fonctions pratiques qui rendent extrêmement facile contrôler des servos de l’Arduino.
Définir des Variables globales
Voici les variables qui sont accessibles depuis n’importe où dans le code. Nous les utilisons pour stocker des informations qui seront nécessaires à un stade ultérieur
Variables de minuterie
La commande millis() renvoie le nombre de millisecondes depuis la carte Arduino a commencé à exécuter le programme en cours. Nous pouvons stocker le résultat de millis() et puis le comparer au résultat à un stade ultérieur pour déterminer combien de temps il a été entre les deux appels.
Servo de détails Variables
Ces variables stockent qui épingle chaque servo est connecté, ainsi que des micros combien correspondent aux min (rentré/abaissé) et max (élevé/étendu)
Frames
Première impression peut être que nous devrions vient de mettre les servos aux positions définies par la première image, attendre un délai donné (frameDuration) et puis définissez les servos vers la position suivante.
Cela se traduira par une animation horrible cependant, étant donné que les servos passera aussi vite que possible dans le poste et ensuite attendre là pour leur prochaine instruction.
Le moyen de contourner cela est d’interpoler entre les cadres. En d’autres termes, si la durée de mon cadre est 2 secondes, après 1,75 secondes je veux les servocommandes de soit les trois quarts (75 %) de la voie entre image 1 et image 2.
C’est un peu trivial de maths de comprendre où le servo devrait être si nous savons combien de la trame est écoulé comme rapport. Dans les mots, c’est juste (image précédente) +(the difference between the next and previous frames) * (pourcentage de trame durée écoulée), ceci est connu comme "interpolation linéaire".
Ici, nous définissons les images réelles. Notez que j’ai utilisé 0 à 1000, où 0 indique rétracté/abaissé et 1000 indique étendu/déclenché. J’aurais pu choisir n’importe quel nombre et il pourrait bien y avoir des choix plus logiques, mais la plage m’a fourni un bon compromis entre la résolution et la lisibilité.
Nous allons utiliser la fonction map() plus tard pour mapper 0 à la variable LSMin et 1000 à LSMax variable que nous avons définie plus tôt (cet exemple est évidemment pour l’épaule gauche, mais il serait le même processus pour tous les autres servos).
Si vous souhaitez définir des animations plus complexes ou plus lisses que vous pourriez facilement ajouter plus d’images et aussi utiliser des nombres autres que min/max. Une possibilité serait d’utiliser environ 8 images pour faire un beau mouvement elliptique.
Afin d’appliquer ce calcul d’interpolation qu'il faut garder une trace de l’image précédente et une trame, donc nous avons mis en place certaines variables de le faire.
Objets de servo
Enfin, créez des objets de servo et assignez-les aux variables. Ceux-ci sont des instances de la classe de servo qui nous inclus dans Servo.h et offrent des fonctions utiles pour contrôler chaque servo.
Définir des fonctions
Fonction de réglage de l’Arduino
La fonction de setup() Arduino est le premier bit de code qui obtient exécuter après que les variables globales ont été définis. Tout ce qui est nécessaire ici pour l’instant est d’attacher les objets servo à leurs codes secrets et démarre le port série, dans le cas où nous voulons signaler quoi que ce soit pour debuggging.
Set image suivante
Cette fonction est appelée une fois que nos servos arriver à la fin d’une trame. Tout ce qu’il fait est :
- Incrémentation de la « currentFrameIndex » (à moins que nous avons atteint la dernière image, auquel cas il boucle retour à frame 0)
- Enregistrer la position actuelle de la trame comme « la dernière image »
- Récupérer la position suivante de la trame du tableau animation
Fonction d’interpolation
Comme décrit précédemment, nous allons utiliser une interpolation linéaire pour déterminer exactement quelle position un servo devrait être dans à un moment donné entre deux images.
Mon professeur de science informatique a toujours dit qu’étant un bon programmeur tout allait être paresseux, si vous pouvez éviter de réécrire le code plusieurs fois en le plaçant dans une fonction, puis le faire.
Cette fonction simplement implémente l’équation d’une interpolation linéaire entre deux images et puis mappe ce poste de cadre à une position du servo et l’applique à l’objet de servo.
Fonction de mise à jour de servo
Cette fonction rend le code plus propre en enlevant une partie de celui-ci de la boucle principale.
Tout d’abord le rapport de la trame qui est déjà terminée est calculé selon le nombre de millisecondes qui se sont écoulées depuis le démarrage de l’armature, divisé par le nombre de millisecondes que mettent à compléter un cadre.
Ce ratio est transmis à la fonction d’interpolation pour chaque servo, mise à jour de la position de chacun.
Boucle principale
La principale loop() est où toute l’action se passe, dès qu’il termine l’exécution de tout le code figurant à l’intérieur d’elle, il saute au début et recommence.
La première étape de la boucle principale est d’enregistrer le nombre de millisecondes depuis le début du programme en cours d’exécution) afin que nous puissions déterminer combien de temps écoulé depuis la dernière itération de la boucle.
En utilisant cette fois nous pouvons déterminer si le temps écoulé est supérieur à la période que nous avons défini pour l’interpolation étapes, dans l’affirmative, appellent la fonction updateServos() pour générer de nouvelles positions interpolées.
On vérifie aussi si le temps écoulé est supérieur à la durée du cadre, auquel cas il faut appeler la fonction setNextFrame().