Étape 18 : Programme du bras.
Vous pouvez trouver l’esquisse qui contrôle le bras du robot dans le dépôt github sous DynamixShield/croquis/RobotArm. Je vais vous expliquer brièvement les parties principales de l’esquisse.
1. tout d’abord, vous devez inclure la classe DynamixSerial. Cette classe est ce que vous allez utiliser pour communiquer avec les servos de servomoteurs Dynamixel.
#include
2. ensuite, nous avons quelques variables d’attribuer les broches pour les capteurs de pression et manette de jeu et pour suivre les mouvements du servo.
#define SERVO_COUNT 5
#define AXIS_COUNT 4
Ces constantes ne changeront pas. Ils sont habitués à donner des noms
aux broches utilisées :
const int x1Pin = A0 ;
const int y1Pin = A1 ;
const int x2Pin = A2 ;
const int y2Pin = A3 ;
const int pressurePin = A11 ;
Index du tableau AxisPos qui contrôle la pince ouverture/fermeture
const int gripperCloseIdx = 1 ;
const int gripperOpenIdx = 3 ;
const int gripperIdx = 4 ;
int servoPos [SERVO_COUNT] ;
int servoDir [SERVO_COUNT] ;
int servoAdd [SERVO_COUNT] ;
int axisID [AXIS_COUNT] ;
int axisPos [AXIS_COUNT] ;
int gripPressure = 0 ;
3. ensuite, nous déclarons la classe DynamixelSerial. Cette classe suppose qu’il utilise pour les communications pour les servos de servomoteurs Dynamixel Serial1. Toutefois, si vous passez d’un port série hardware ici vous pouvez l’ignorer. C’est donc le logiciel peut être utilisé sur des projets personnalisés qui n’utilisent pas le DynamixShield.
DynamixelSerial servomoteurs Dynamixel ;
4. la prochaine partie la plus importante est l’installation. Nous démarrage notre connexion série de débogage et puis commencer la classe DynamixelSerial. Il est par défaut à une fréquence de communication 1 Mbaud et la broche qu’elle utilise pour contrôler l’half duplex du protocole servomoteurs Dynamixel est définie en fonction sur la carte que vous utilisez. Ainsi de suite a Due c’est cheville 22, mais sur le zéro c’est la broche 2. Cependant, vous avez également la possibilité de spécifier ces paramètres dans l’appel à la méthode begin pour remplacer ce qui est utilisé pour des projets personnalisés.
#ifdef ENABLE_DEBUG
Serial.Begin(57600) ;
while (!. Série) ;
Serial.println (« configuration de départ ») ;
#endif
Dynamixel.Begin () ; ou Dynamixel.begin (1000000, 22) ;
5. le programme d’installation a alors peu de code pour réinitialiser tous les servos à leur position par défaut pour l’obtenir prêt pour le mouvement. Aussi, elle réinitialise toutes les variables à leur état par défaut.
6. la boucle de traitement principale est assez simple. Il appelle simplement processJoysticks() et ensuite des retards pour 20 millisecondes.
void loop () {}
processJoysticks() ;
retard (20) ;
}
7. la méthode de levier de commande de process a une boucle qui passe par chaque axe de manette de jeu et lit la valeur analogique de la manette.
void processJoysticks() {}
String servoPosReport = "", servoAddReport = "", axisReport = "" ;
lire l’analogue en valeur :
pour (int i = 0; i
axisPos [i] = analogRead(axisID[i]) ;
8. il ajuste ensuite la valeur de la manette de jeu qui se situe entre 255 et 755 à une valeur comprise entre -5 et 5. Si la valeur est supérieure à 1020, cela signifie que nous sommes appuyant vers le bas sur la manette pour fermer les mâchoires de la pince, donc nous allons laisser la méthode de pince process face à cela.
Si elle est supérieure à 1020 puis le bouton est enfoncé.
Si {(axisPos [i] < 1020)
servoAdd [i] = carte (axisPos [i], 255, 755, -5, 5) ;
}
else {}
servoAdd [i] = 0 ;
}
9. ensuite, nous ajoutons la valeur de mouvement sur la position des servos.
Si ((servoPos [i] + servoAdd[i]) > = 0 & & (servoPos [i] + servoAdd [i] < 1024)) {}
servoPos [i] += (servoDir [i] * servoAdd[i]) ;
}
10. si nous avions la circulation sur cet axe nous définir la nouvelle position du servo.
Si (servoAdd [i]! = 0) {}
Dynamixel.moveSpeed (i + 1, servoPos [i], 150) ; Delay(10) ;
}
11. Enfin, il appelle processGripper. Que méthodes commence par lire le signal analogique pour le capteur de pression.
void processGripper (String & servoPosReport, String & servoAddReport) {}
gripPressure = analogRead(pressurePin) ;
12. Appuyez sur la manette droite ferme le girpper, tout en appuyant sur le joystick gauche ouvre. La méthode vérifie ceci en voyant si la position de l’axe de la position étroite ou ouverte de préhenseur est égale à 1023. Il s’agit de la valeur lue par la manette quand vous appuyez vers le bas à ce sujet. Si c’est vers le bas, puis nous avons mis le servo ajouter pour être plus ou moins 10. Dans le cas contraire, il ajoute zéro.
Si (axisPos [gripperCloseIdx] == 1023) {}
Si {(gripPressure < 850)
servoAdd [gripperIdx] = -10 ;
}
}
ElseIf (axisPos [gripperOpenIdx] == 1023) {}
servoAdd [gripperIdx] = 10 ;
}
else {}
servoAdd [gripperIdx] = 0 ;
}
13. nous définir la position du servo tant qu’il reste au sein de 0 et 512. La pince ne peut pas bouger plus que ça.
Si ((servoPos [gripperIdx] + servoAdd[gripperIdx]) > = 0
& & (servoPos [gripperIdx] + servoAdd [gripperIdx] < = 512)) {}
servoPos [gripperIdx] += (servoDir [gripperIdx] * servoAdd[gripperIdx]) ;
}
14. Enfin, si nous avons ajouté à la position, puis nous avons besoin définir la nouvelle position du servo de la pince.
Si (servoAdd [gripperIdx]! = 0) {}
Dynamixel.moveSpeed (gripperIdx + 1, servoPos [gripperIdx], 150) ;
}
Et c’est tout. Il y a d’autres choses dans le sketch que j’ai n’ont pas discuté ici, mais c’est principalement pour des fins de débogage. Vous pouvez activer le débogage de décommenter la //#define ENABLE_DEBUG 1 ligne en haut. Cet exemple affiche ce qui se passe lorsque vous exécutez l’esquisse. Utiliser l’IDE Arduino pour vous programmer le croquis dans votre microcontrôleur, puis permet d’exécuter notre nouveau bras robot !