Étape 15 : Arduino Code
Permet d’observer certains éléments de l’esquisse de l’Arduino avant de commencer à essayer de l’utiliser pour déplacer le bras.
La première est la façon dont nous disons l’esquisse les paramètres pour les servos, puisque nous utilisons la bibliothèque mini-Maestro. J’ai fait cela en mettant en place un tableau de structures, chaque réglage des paramètres pour le servo de bras (lignes 31-43 de l’esquisse
struct maestro_parameters { // servo_channel, name, min, max, home, speed, accel, and neutral come // directly from the min-maestro channel settings tab so it is a good // idea to take a screen shot and print it out. int servo_channel; char servo_name[20]; int servo_min; int servo_max; int servo_home; int servo_speed; int servo_accel; int servo_neutral; // The next two variables are required for Arduino mapping function. We will be mapping degrees to // microseconds. fromLow corresponds to the servo_min and and fromHigh corresponds to // servo_max. // If we use the shoulder as an example if your servo_min value is 672 microseconds, // which would correspond to +180 degrees and your servo_max value is 2248 microseconds // which corresponds to -180 degrees the fromLow and fromHigh values would be +180 // and -180 degrees respectively int servo_fromLow; int servo_fromHigh; // The next two variables are used to set the servo constraints. In, other //words the max allowable travel for each of servos int servo_constLow; int servo_constHigh; } servo[6];
Des valeurs spécifiques pour les servos sont fixés à lignes 66-71. Pour mon bras, ce serait :
servo[0] = (maestro_parameters) {0, "Base", 1064, 1663, 1366, 0, 0, 1504, -90, 90, -80, 80}; servo[1] = (maestro_parameters) {1, "Shoulder", 672, 2248, 2040, 40, 0, 2040, -180, 180, -10, 180}; servo[2] = (maestro_parameters) {2, "Elbow", 928, 1872, 1738, 10, 0, 1505, 180, -180, -160, 45}; servo[3] = (maestro_parameters) {3, "Wrist_Pitch", 928, 2128, 928, 10, 0, 1500, 0, 180, 0, 180}; servo[4] = (maestro_parameters) {6, "Wrist_Rotate", 608, 2448, 1500, 40, 0, 1500, 90, -90, -90, 90}; servo[5] = (maestro_parameters) {7, "Gripper", 1312, 1792, 1358, 7, 0, 1500, 0, 10, 0, 10};
Nous allons parler de la fonction de mappage pendant quelques secondes. En général, les fonctions de mappage est sous la forme suivante :
servoPosMs = 4*map(servoPosDeg, servo[servoNum].servo_fromLow, servo[servoNum].servo_fromHigh, servo[servoNum].servo_min, servo[servoNum].servo_max);
Pour référence, qu'il faut multiplier la valeur résultante de la cartographie par 4 étant donné que la bibliothèque de mini-Maestro fonctionne attend valeurs par incréments de 1/4 microseconde. Ce que j’ai trouvé, c’est que la fonction de mappage n’est pas exact pour les réducteurs servo épaule et le coude, il était hors de quelques degrés, ce qui a causé des inexactitudes dans le bras de servo de positionnement. Ce que je me suis retrouvé faire est créer mes propres courbes de régression linéaire pour ces servos et leur incorporation dans la courbe. Cela a été fait en fonction de moveServo() des croquis.
Nous allons jeter un oeil à cette fonction :
void moveServo() {/ / les limites de fonction de contraindre le mouvement servo donc vous ne saturez pas le bras en positions vous / / ne veulent pas servoPosDeg = contraindre (servoPosDeg, servo [servoNum] .servo_constLow, servo[servoNum].servo_constHigh) ; //Mini Maestro valeurs du 1/4 ms il faut multiplier par 4. if(servoNum == 1) {servoPosMs = 4*(4.4406*servoPosDeg+1491.1);} else if(servoNum == 2) {servoPosMs = 4*(-2.4208*servoPosDeg+1436.2);} else { void moveServo() { // The Constrain function limits the servo movement so you do not overdrive the arm into positions you // do not want servoPosDeg = constrain(servoPosDeg, servo[servoNum].servo_constLow, servo[servoNum].servo_constHigh); //Mini Maestro values given in 1/4 ms so you have to multiply by 4. if(servoNum == 1) { servoPosMs = 4*(4.4406*servoPosDeg+1491.1); } else if(servoNum == 2) { servoPosMs = 4*(-2.4208*servoPosDeg+1436.2); } else { servoPosMs = 4*map(servoPosDeg, servo[servoNum].servo_fromLow, servo[servoNum].servo_fromHigh, servo[servoNum].servo_min, servo[servoNum].servo_max); } //Serial.println(servoPosDeg); // setSpeed tells the servo how fast you want the servo to move, // set Target tells the servo where to move maestro.setSpeed((uint8_t) servo[servoNum].servo_channel, (uint16_t) servo[servoNum].servo_speed); maestro.setTarget((uint8_t) servo[servoNum].servo_channel, (uint16_t) servoPosMs); // The while loop is here to tell the sketch to wait till the servo has finished moving before // sending a done message while(maestro.getMovingState() == 1) { //Serial.println("Moving Servo"); }; //Serial.print ("Position is: "); //Serial.println (maestro.getPosition(servo[servoNum].servo_channel)); Serial.println ("Done"); }<p> Serial.println ("Done");</p><p>}</p>
Dans l’esquisse validée, j’ai commenté les lignes pour la régression linéaire. Vous devrez déterminer si vous devez cela ou non. Fondamentalement, Prévenez le servo pour passer à la + 90 ou -90 (selon le servo) et voir si c’est vraiment à 90 degrés. Si vous vous sentez comme si ce n’est pas satisfaisant utiliser le centre de contrôle de Maestro pour déplacer le servo à 0, 90 180 degrés (voir figure), copier les valeurs de la microseconde et utiliser MS Excel pour faire une courbe de tendance linéaire (Assurez-vous de dire pour montrer l’équation.
Pour tester l’esquisse, charger l’esquisse dans l’Arduino. Lorsque vous avez terminé de chargement ouverte jusqu'à la série fenêtre commande et envoyer des commandes à bras en forme de suite :
servoNum, cible degrés
Exemple,
0, 25 puis appuyez sur la touche Retour
Cela déplace le servo de base à gauche de 25 degrés.
Pour résumer :
Num de servo | Servo |
---|---|
0 | Base |
1 | épaule |
2 | coude |
3 | hauteur de poignet |
4 | faire pivoter le poignet |
6 | pince |