Dans ce tutoriel, vous allez pouvoir programmer votre bras robot 6 axes sans ordinateur avec les 3 nouvelles cartes et l'application Android Made by Eagle Robotics!
Eh oui les amis, après moult sollicitations et encouragements de la part de nos clients, nous l'avons enfin fait: créer un système pour programmer votre bras robot ou tout autre projet robotique sans ordinateur, sans codage, bref sans prise de tête. Bienvenue dans l'univers de la cobotique.
Tout est parti d'une idée de mon fils William qui m'a mis au défi de transformer les bras robots en marionnettes. Et comme chez Eagle Robotics on ne recule pas devant un défi...
Le nom des marionnettes est un clin d'oeil à l'agence qui s'occupe de notre communication visuelle @Kobora.
Nous avons donc développé 3 cartes shield pour la carte Arduino UNO + 1 application ANDROID:
COTE ROBOT: 2 cartes au choix lesquelles en fonction des commandes reçues de la carte Joystick vont gérer les mouvements des servomoteurs et des steppers du robot, et à partir de la carte Micro-SD (insérée dans le connecteur prévu à cet effet), enregistrer les mouvements des moteurs, enregistrer les délais d'attentes, et exécuter les séquences de mouvements et de délais d'attente. Je vous présente les cartes SHIELD EAGLE V2.0 et STEPSER V1.0
La Carte Shield Joystick 3.0 est une évolution de la 2.0 avec un nouveau design et une couleur disons noir mate (la précédente carte était blanche maculée).
Cette carte est dotée comme l'ancienne version de 2 Joysticks avec bouton poussoir intégré, 4 boutons poussoirs, d'un connecteur pour module Bluetooth HC05 (synchronisé avec le module Bluetooth de la carte shield côté robot pour l'échange de données), d'un connecteur pour accéléromètre et gyroscope MPU6500 /MPU6050/MPU9250. La nouveauté réside dans le fait que la carte peut non seulement gérer un écran OLED 0.96 pouces (comme la version précédente), mais aussi un écran OLED 1.3 pouces.
Nous avons développé (ouf je sais l'écrire maintenant sans faire de fautes...) un menu de sorte à sélectionner le moteur que l'on souhaite bouger, effectuer le mouvement du moteur, enregistrer ce mouvement, puis l'exécuter. Il est tout à fait possible de faire bouger plusieurs servomoteurs à la fois.Et pour finir, vous avez aussi la possibilité d'ajouter des "Temps d'attente" ou délais (delay in English please!) entre 2 mouvements de moteurs de 1 s à 3600 secondes max (1h). Vous aurez en effet besoin que votre robot effectue par exemple une pause de 10 secondes entre 2 séquences avant de reprendre sa tâche. C'est la raison pour laquelle il nous semblait important de rajouter cette fonctionnalité au projet.
Les données seront enregistrées dans la carte micro-SD située sur le shield côté robot au format .Txt (fichier texte que l'on peut ouvrir avec Bloc-notes). Nous y reviendrons plus tard dans la section programmation.
ON SELECTIONNE LE MOTEUR DE NOTRE CHOIX: SERVOMOTEUR...
OU MOTEUR PAS-A-PAS (pour la carte STEPSER)
ON BOUGE LE MOTEUR A NOTRE CONVENANCE
ON ENREGISTRE LA DONNEE DANS LA CARTE MICRO-SD DU ROBOT
ON AJOUTE UN DELAI D'ATTENTE (ICI 6 SECONDES)
ON ENVOI LE TEMPS AU ROBOT POUR ENREGISTREMENT DANS LA CARTE MICRO-SD.
ON ENVOI L'ORDRE AU ROBOT D'EXECUTER LE CONTENU DE SA CARTE MICRO-SD
2.2 - CARTE SHIELD EAGLE SERVOS V2.0
La carte Shield Eagle SERVOS V2.0 est une évolution de la précédente carte Eagle SERVOS V1.0 et peut gérer jusqu'à 12 servomoteurs. Elle dispose aussi d'un connecteur pour module Bluetooth HC05, HC06 (synchronisé avec le module Bluetooth de la carte Joystick 3.0), un connecteur pour LIDAR et modules ultrasons HC-SR04 version 2020 fonctionnant en I2C, et un connecteur pour modules accéléromètres et gyroscopes MPU6500 /MPU6050/MPU9250. La carte dispose aussi d'un régulateur de tension 5V 3A et d'un connecteur pour cartes Micro-SD. Ouf on y est arrivé!
Le principe de ce shield est de vous permettre d'une part d'enregistrer les mouvements des servomoteurs et les temps d'attentes dans la carte Micro-SD au format texte, et d'autre part d'exécuter ces informations. C'est ce que nous verrons dans la partie programmation.
BRANCHEMENT DU BRAS ROBOT
GESTION DU REGULATEUR DE TENSION
Le régulateur de tension 5V 3A est surtout utile si vous utilisez des servomoteurs de petit gabarit comme les SG90 et pour des robots comme les Spiderbots et Hexapode R12, et le Bras robot 4 axes. Il arrive aussi à gérer aisément 3 à 4 servomoteurs MG995 ou MG996, et même 6 servomoteurs. Mais compte tenu de l'effort demandé à un bras robot, et donc un besoin de puissance supplémentaire, le régulateur risque de ne pas fournir suffisamment d'énergie aux servomoteurs ce qui conduirait à l'éffondrement du Bras Robot. C'est la raison pour laquelle vous avez la possibilité via des cavaliers d'alimenter les servomoteurs via la régulateur de tension ou non, en fonction du comportement de votre robot.
Régulateur Activé: La tension de sortie et donc d'alimentation des servomoteurs est de 5V.
Régulateur Désactivé: Les servomoteurs sont alimentés en direct via le coupleur de piles 18650. La tension de sortie théorique est de 7.4V, mais on n'est plus autour de 6.8V, ce qui est largement suffisant pour les Servomoteur, tout en leur fournissant toutes la puissance nécessaire en terme d'ampérage.
2.3 - CARTE SHIELD STEPSER V1.0
Comme vous l'aurez sûrement deviné, STEPSER vient de la contraction entre STEPper (plus communément appelé dans la langue de molière de moteur pas-à-pas) et SERvomoteur. Donc comme vous voyez on a pas cherché bien loin pour nommer cette carte.
Et comme son nom l'indique, la carte STEPSER V1.0peut gérer jusqu'à 10 servomoteurs et 2 moteurs pas-à-pas. Elle dispose aussi d'un connecteur pour un module Bluetooth (synchronisé avec le module Bluetooth de la carte Joystick 3.0)
BRANCHEMENT DU BRAS ROBOT
N.B: Dans ce tutoriel, nous n'utilisons qu'un Stepper branché sur le connecteur du Haut.
GESTION DU REGULATEUR DE TENSION
Sur cette carte vous avez la possibilité d'utiliser une seule alimentation ou batterie pour alimenter vos servomoteurs (via le régulateur) et vos steppers. En effet les steppers demandent une tension d'au moins 14V jusqu'à 20V en moyenne, et les servomoteurs sont plus sur du 6.8V max. Le régulateur peut accepter de 7.5V à 20V max en entrée et délivre 5V 3A max en sortie. Le régulateur est activé ou désactivé via le jeu de cavaliers.
Régulateur ON:
Lorsque le régulateur est actif, les servomoteurs et les Steppers ont la même alimentation via la broche d'alimentation des Steppers.
Régulateur OFF:
Lorsque le régulateur est désactivé, les servomoteurs et les steppers sont alimentés séparément.
3 - L'APPLICATION ANDROID ROBOTICARM_V2
L'application Android ROBOTICARM_V2 disponible sur notre site permet de faire tout ce que le shield Joystick V3.0 fait à savoir utiliser le bras robot en direct, enregistrer les mouvements, et exécuter la séquence enregistrée
4 - LES PROGRAMMES ARDUINO
4.1 ENREGISTREMENT DES DONNEES DANS LA CARTE MICRO-SD
Nous allons aborder l'enregistrement des données entre le shield Joystick V3.0 et le shield Eagle V2.0 et voir comment la séquence exécutée par le bras robot est enregistrée dans la carte Micro-SD. Je vous présente l'opération "Rangement de chambre" initiée par mon fils dans la " vidéo du Making Of"
Considérez l'une des 3 images ci-dessous au choix, où le but est de faire passer l'objet A vers B:
IMAGE 1
OU IMAGE 2
ET ENFIN L'IMAGE 3
Supposons que nous voulions déplacer l'objet A dans B. Pour ce faire, nous allons devoir décomposer les mouvements du bras robot par séquences:
Je sélectionne le servomoteur S2 sur l'écran du shield Joystick
Je bouge le servomoteur vers le Bas
J'appuie sur le bouton pour enregistrer le mouvement dans la carte micro-SD
Je sélectionne le servomoteur S6 (pince) sur l'écran du shield Joystick
Je bouge le servomoteur pour fermer la pince et saisir l'objet A
J'appuie sur le bouton pour enregistrer le mouvement dans la carte micro-SD
Je sélectionne le Temps sur l'écran du shield Joystick
J'ajoute 3 secondes de délai (histoire de laisser le temps à la pince de saisir l'objet)
J'appuie sur le bouton pour enregistrer le délai de 3 secondes dans la carte micro-SD
Je sélectionne le servomoteur S2 sur l'écran du shield Joystick
Je bouge le servomoteur vers le Haut
Je sélectionne le servomoteur S3 sur l'écran du shield Joystick
Je bouge le servomoteur vers le Haut
J'appuie sur le bouton pour enregistrer le mouvement des 2 servomoteurs dans la carte micro-SD (lors de l'exécution, les 2 servomoteurs bougeront en même temps)
Je sélectionne le servomoteur S1 sur l'écran du shield Joystick
Je bouge le servomoteur vers la droite
J'appuie sur le bouton pour enregistrer le mouvement du servomoteur dans la carte micro-SD
Je sélectionne le servomoteur S2 sur l'écran du shield Joystick
Je bouge le servomoteur vers le Bas
Je sélectionne le servomoteur S3 sur l'écran du shield Joystick
Je bouge le servomoteur vers le Bas
J'appuie sur le bouton pour enregistrer le mouvement des 2 servomoteurs dans la carte micro-SD (lors de l'exécution, les 2 servomoteurs bougeront en même temps)
Je sélectionne le servomoteur S6 (Pince) sur l'écran du shield Joystick
Je bouge le servomoteur pour ouvrir la pince
J'appuie sur le bouton pour enregistrer le mouvement du servomoteur
Et voilà! nous avons crée notre séquence en utilisant le shield Joystick V3.0 et le shield Eagle Servos V2.0. Si vous utilisez la carte Shield STEPSER, la procédure est la même, mais vous pouvez aussi sélectionner les Steppers (moteurs pas-à-pas) sur l'écran du shield Joystick, effectuer le déplacement du Stepper, et ensuite enregistrer le mouvement dans la carte micro-SD en appuyant sur le bouton affecté à cette fonction sur la carte shield Joystick V3.0
Pour exécuter la séquence, il vous suffit d'appuyer sur le bouton prévu à cet effet sur le shield Joystick, et le robot se remettra automatiquement dans sa position de départ (position qu'il avait juste avant l'étape 1) et exécutera toutes les étapes de 1 à 25.
Une fois toute la séquence exécutée, vous pouvez continuer à programmer le robot et ajouter des étapes supplémentaires.
4.2 LECTURE DES DONNEES DE LA CARTE MICRO-SD
Prenons par exemple le fichier pour faire parler notre robot Koko (voir vidéo)
Notre fichier s'appelle Robot.txt et est crée automatiquement par le programme Arduino côté shield Robot. Mais libre à vous de l'appeler comme vous le souhaitez.
Bien! maintenant analysons le contenu du fichier. prenons par exemple la ligne 1:
1, 90,90,2,90,90,3,90,90,4,90,90,5,90,90,120,44
ceci signifie: Servo S1, position de départ S1, position d'arrivée S1, Servo S2, position de départ S2, position d'arrivée S2, Servo S3, position de départ S3, position d'arrivée S3, Servo S4, position de départ S4, position d'arrivée S4, Servo S5, position de départ S5, position d'arrivée S5, Servo S6, position de départ S6, position d'arrivée S6.
Comme vous pouvez le constater, il n'y a que le servomoteur S6 qui bouge vu que sa position de départ est différente de sa position d'arrivée.
Notre programme Arduino côté Robot va lire le fichier Ligne par Ligne et ainsi interpréter et exécuter les instructions reçues.
Nous allons ensuite nous intéresser à l'information suivante: T,4000
Lorsque le programme Arduino arrive sur ce type d'instruction et identifie la lettre T, il sait que les prochaines données qu'il va recevoir vont concerner un délai d'attente et mettra ainsi le système en pause (ici pendant 4 secondes).
Et pour finir nous nous intéressons à cette information qui n'est valable que pour la carte Shield STEPSER: M,0,2,0,0
qui signifie Mode Stepper, Position de départ Stepper P1, position d'arrivée Stepper P1, Position de départ Stepper P2, position d'arrivée Stepper P2.
Ici le stepper P1 bouge de la position 0 vers la position 2, en clair, l'axe du stepper effectue 2 tours complets. Selon la longueur de l'axe sur lequel votre robot pourra se déplacer, l'axe du stepper pourra effectuer plus ou moins de tours. Dans notre vidéo, le stepper pouvait réaliser jusqu'à 7 tours. Le Bras robot Stepser + joystick Arduino dispose aussi de 2 capteurs de fin de course.
4.3 PROGRAMME ARDUINO SHIELD JOYSTICK 3.0 /* * Programme: Robot Learning Menu - Shield Joystick V3.0 * Auteur: Christian Joseph * Date: 20/03/2022 * Help: Projet@eagle-robotics.com * Site: www.eagle-robotics.com */
SoftwareSerial BT(8,9); //Bluetooth int bt1 = 4; int bt2 = 5; int bt3 = 6; int bt4 = 7; int VRx = A0; int VRy = A1; int SW = 3; int xPos = 0; int yPos = 0; int SW_state=0; int x1 = 0; int y1 = 0; int VRx2 = A2; int VRy2 = A3; int SW2 = 2; int xPos2 = 0; int yPos2 = 0; int SW_state2=0; int x2 = 0; int y2 = 0; int val1, val2, val3, val4; int u = 0; String menu[9] = {"S1", "S2","S3", "S4", "S5", "S6", "P1", "P2","TI"};//Menu int tempus = 0;
Servo p[7]; File myFile; int vs1, vs2, vs3, vs4, vs5, vs6; //Variables de départ des servomoteurs int vs10, vs20, vs30, vs40, vs50, vs60; //Variables d'arrivée des servomoteurs String BluetoothData; // Variable de reception donné bluetooth int arm_speed;//Vitesse du bras robot pendant la phase d'apprentissage int arm_speed2; //Vitesse du bras robot pendant la phase d'exécution char data;//Variable utilisée pour stocker la donnée extraite de la carte Micro-SD, caractère après caractère char a,b; int t = 0; int w = 0; int c; int mvt, mvt1; //Variable utilisées lors de l'exécution des mouvements int ser1,pos1,pos11, ser2,pos2,pos22,ser3,pos3,pos33; int ser4,pos4,pos44, ser5,pos5,pos55,ser6,pos6,pos66; int temps = 0; int tempus = 0; //Données pour l'extraction des informations Numéro de servo, position de départ, position d'arrivée et Temps de pause dans la carte Micro-SD String a0 = ""; String a1 = ""; String a2 = ""; String a3 = ""; String a4 = ""; String a5 = ""; String a6 = ""; String a7 = ""; String a8 = ""; String a9 = ""; String a10 = ""; String a11 = ""; String a12 = ""; String a13 = ""; String a14 = ""; String a15 = ""; String a16 = ""; String a17 = ""; String tempo ="";
void setup() { //Attribution des broches Servomoteurs p[1].attach(2); p[2].attach(3); p[3].attach(4); p[4].attach(5); p[5].attach(6); p[6].attach(7); vs1 = 90; //Variable Base vs2 = 90; //Variable Bras vs3 = 90; //Variable Avant vs4 = 90; //Variable Poignet vs5 = 90; //Variable Main vs6 = 90; //Variable Pince
vs10 = 90; //Variable Base vs20 = 90; //Variable Bras vs30 = 90; //Variable Avant vs40 = 90; //Variable Poignet vs50 = 90; //Variable Main vs60 = 90; //Variable Pince arm_speed = 30; // Vitesse du Robot pendant la phase d'apprentissage arm_speed2 = 1; //Vitesse du Robot pendant la phase d'execution delay(100); Serial.begin(9600);//Initialisation Bluetooth
//Initialisation Carte Micro-SD while (!Serial) { ; }
Serial.print("Initialisation Carte SD...");
if (!SD.begin(10)) { Serial.println("initialisation KO!"); while (1); } Serial.println("initialization Faite."); //Initialisation servomoteurs p[1].write(90); p[2].write(90); p[3].write(90); p[4].write(90); p[5].write(90); p[6].write(120); delay(3000);// Temps d'attente pour permettre au bras robot de se positionner
}
void loop() {
if (Serial.available()) { // Si donnée Bluetooth reçue... BluetoothData = Serial.readString(); //Serial.println(BluetoothData); a = BluetoothData.charAt(0); if (BluetoothData == "S1F") { //Rotation Base vers la droite // Serial.println("servo1 actif"); while(b != 'S'){ b = Serial.read(); if (vs10 > 0){ vs10 = vs10 - 1; p[1].write(vs10); delay(arm_speed); //Serial.println(vs10); } } b = 'A'; } if (BluetoothData == "S1R") { //Rotation Base vers la gauche // Serial.println("servo1 actif"); while(b != 'S'){ b = Serial.read(); if (vs10 < 180){ vs10 = vs10 + 1; p[1].write(vs10); delay(arm_speed); //Serial.println(vs10); } } b = 'A'; } if (BluetoothData == "S2F") { // Rotation du bras vers le Bas while(b != 'S'){ b = Serial.read(); if (vs20 < 160){ vs20 = vs20 + 1; p[2].write(vs20); delay(arm_speed); //Serial.println(vs20); } } b = 'A'; } if (BluetoothData == "S2R") { //Rotation du bras vers le Haut while(b != 'S'){ b = Serial.read(); if (vs20 > 20){ vs20 = vs20 - 1; p[2].write(vs20); delay(arm_speed); //Serial.println(vs20); } } b = 'A'; } if (BluetoothData == "S3F") { //Rotation de l'avant bras vers le Bas while(b != 'S'){ b = Serial.read(); if (vs30 < 180){ vs30 = vs30 + 1; p[3].write(vs30); delay(arm_speed); //Serial.println(vs30); } } b = 'A'; } if (BluetoothData == "S3R") { //Rotation de l'avant bras vers le Haut while(b != 'S'){ b = Serial.read(); if (vs30 > 0){ vs30 = vs30 - 1; p[3].write(vs30); delay(arm_speed); //Serial.println(vs30); } } b = 'A'; } if (BluetoothData == "S4F") { //Rotation du poignet vers le Bas while(b != 'S'){ b = Serial.read(); if (vs40 < 180){ vs40 = vs40 + 1; p[4].write(vs40); delay(arm_speed); //Serial.println(vs40);}} b = 'A';} if (BluetoothData == "S4R") { // Rotation du poignet vers le Haut while(b != 'S'){ b = Serial.read(); if (vs40 > 0){ vs40 = vs40 - 1; p[4].write(vs40); delay(arm_speed); //Serial.println(vs40);}} b = 'A';} if (BluetoothData == "S5F") { //Rotation du poignet vers le Bas while(b != 'S'){ b = Serial.read(); if (vs50 < 180){ vs50 = vs50 + 1; p[5].write(vs50); delay(arm_speed); //Serial.println(vs50);}} b = 'A';} if (BluetoothData == "S5R") { // Rotation du poignet vers le Haut while(b != 'S'){ b = Serial.read(); if (vs50 > 0){ vs50 = vs50 - 1; p[5].write(vs50); delay(arm_speed); //Serial.println(vs50);}} b = 'A'; } if (BluetoothData == "S6F") { //Rotation du poignet vers le Bas while(b != 'S'){ b = Serial.read(); if (vs60 < 180){ vs60 = vs60 + 1; p[6].write(vs60); delay(arm_speed); //Serial.println(vs60);}} b = 'A'; } if (BluetoothData == "S6R") { // Rotation du poignet vers le Haut while(b != 'S'){ b = Serial.read(); if (vs60 > 0){ vs60 = vs60 - 1; p[6].write(vs60); delay(arm_speed); //Serial.println(vs60);}} b = 'A'; } if (a == 'T') { // Reception du Temps d'attente BluetoothData.remove(0,1); temps = BluetoothData.toInt(); temps = temps * 1000; myFile = SD.open("robot.txt",FILE_WRITE);//Enregistrement du temps d'attente dans la carte Micro-SD
if (myFile) { Serial.print("Ecriture dans Robot.txt..."); //Ici on ouvre le fichier robot.txt pour écrire la valeur Temps myFile.print("T,"); myFile.println(temps); myFile.close(); // On ferme le fichier robot.txt Serial.println(temps);}}
if (BluetoothData == "W") { // Enregistrement des données Servomoteur dans la carte Micro-SD
myFile = SD.open("robot.txt",FILE_WRITE); //Ici on ouvre le fichier robot.txt pour écrire la valeur de départ et d'arrivée de chaque Servomoteur if (myFile) { Serial.print("Ecriture dans Robot.txt..."); myFile.print("1,"); myFile.print(vs1); Serial.print(vs1); myFile.print(","); myFile.print(vs10); Serial.print(vs10); myFile.print(",2,"); myFile.print(vs2); Serial.print(vs2); myFile.print(","); myFile.print(vs20); Serial.print(vs20); myFile.print(",3,"); myFile.print(vs3); Serial.print(vs3); myFile.print(","); myFile.print(vs30); Serial.print(vs30); myFile.print(",4,"); myFile.print(vs4); Serial.print(vs4); myFile.print(","); myFile.print(vs40); Serial.print(vs40); myFile.print(",5,"); myFile.print(vs5); Serial.print(vs5); myFile.print(","); myFile.print(vs50); Serial.print(vs50); myFile.print(",6,"); myFile.print(vs6); Serial.print(vs6); myFile.print(","); myFile.println(vs60); Serial.println(vs60); myFile.close(); // On ferme le fichier robot.txt Serial.println("Fait.");} else { Serial.println("erreur ouverture Robot.txt");}
delay(2000); vs1 = vs10; vs2 = vs20; vs3 = vs30; vs4 = vs40; vs5 = vs50; vs6 = vs60;} if (BluetoothData == "P") { // Lecture et Exécution des données contenues dans la carte Micro-SD
myFile = SD.open("robot.txt");//Ouverture du fichier robot.txt en mode lecture p[1].write(90); //Initialisation des servomoteurs p[2].write(90); p[3].write(90); p[4].write(90); p[5].write(90); p[6].write(90); if (myFile) { Serial.println("robot.txt:");
while (myFile.available()) { data = myFile.read(); if (data == ','){//La virgule est un délimiteur qui nous permet de savoir lorsqu'on a extrait toute la donnée d'une variable //En effet certaine variable peuvent avoir 1 ou plusieurs chiffres, et le virgule permet de séparer les variables entre elles t = t + 1; } else if(data == 'T'){ // Si Data = T, alors on lit une variable temps Serial.print("delay en attente"); data = myFile.read(); //Extraction du temps de pause while(data != 'r'){ //Jusqu'au saut de ligne data = myFile.read(); tempo += data;} tempus = tempo.toInt(); Serial.println(tempus); tempo = ""; delay(tempus);// Exécution de la pause du robot } else if (data =='r'){// Extraction des données servomoteurs ser1 = a0.toInt(); Serial.print("Servo = "); Serial.println(ser1); pos1 = a1.toInt(); Serial.print("Position initiale = "); Serial.println(pos1); pos11 = a2.toInt(); Serial.print("Position finale = "); Serial.println(pos11); ser2 = a3.toInt(); Serial.print("Servo = "); Serial.println(ser2); pos2 = a4.toInt(); Serial.print("Position initiale = "); Serial.println(pos2); pos22 = a5.toInt(); Serial.print("Position finale = "); Serial.println(pos22); ser3 = a6.toInt(); Serial.print("Servo = "); Serial.println(ser3); pos3 = a7.toInt(); Serial.print("Position initiale = "); Serial.println(pos3); pos33 = a8.toInt(); Serial.print("Position finale = "); Serial.println(pos33); ser4 = a9.toInt(); Serial.print("Servo = "); Serial.println(ser4); pos4 = a10.toInt(); Serial.print("Position initiale = "); Serial.println(pos4); pos44 = a11.toInt(); Serial.print("Position finale = "); Serial.println(pos44); ser5 = a12.toInt(); Serial.print("Servo = "); Serial.println(ser5); pos5 = a13.toInt(); Serial.print("Position initiale = "); Serial.println(pos5); pos55 = a14.toInt(); Serial.print("Position finale = "); Serial.println(pos55); ser6 = a15.toInt(); Serial.print("Servo = "); Serial.println(ser6); pos6 = a16.toInt(); Serial.print("Position initiale = "); Serial.println(pos6); pos66 = a17.toInt(); Serial.print("Position finale = "); Serial.println(pos66); multimove(ser1,pos1,pos11,ser2,pos2,pos22,ser3,pos3,pos33,ser4,pos4,pos44,ser5,pos5,pos55,ser6,pos6,pos66);// Exécution des mouvements des servomoteurs //reinitialisation des variables a0 =""; a1 =""; a2 =""; a3 =""; a4 =""; a5 =""; a6 =""; a7 =""; a8 =""; a9 =""; a10 =""; a11 =""; a12 =""; a13 =""; a14 =""; a15 =""; a16 =""; a17 =""; t = 0; //Si d'autres infos sont présentent dans le fichier, on retourne au début, sinon on referme le fichier} else{ //Servo1 if(t == 0){ a0 += data;} else if(t == 1){ a1 += data;} else if (t == 2){ a2 += data;} //Servo2 else if(t == 3){ a3 += data;} else if (t == 4){ a4 += data;} else if(t == 5){ a5 += data;} //Servo3 else if(t == 6){ a6 += data;} else if (t == 7){ a7 += data;} else if(t == 8){ a8 += data;} //Servo4 else if(t == 9){ a9 += data;} else if (t == 10){ a10 += data;} else if(t == 11){ a11 += data;} //Servo5 else if(t == 12){ a12 += data;} else if (t == 13){ a13 += data;} else if(t == 14){ a14 += data;} //Servo6 else if(t == 15){ a15 += data;} else if (t == 16){ a16 += data;} else if(t == 17){ a17 += data; }}}
// On ferme le fichier robot.txt une fois tout son contenu lu et exécuté myFile.close(); //On actualise les données du Robot afin de continuer à programmer et enregistrer des données dans la carte Micro-SD vs1 = pos11; vs10 = pos11; vs2 = pos22; vs20 = pos22; vs3 = pos33; vs30 = pos33; vs4 = pos44; vs40 = pos44; vs5 = pos55; vs50 = pos55; vs6 = pos66; vs60 = pos66; } else { Serial.println("erreur ouverture robot.txt");}}}}
//Exécution des mouvements des servomoteurs avec numéro de Servo, Position de départ, Position d'arrivée int multimove(int servo1, int position1, int position11, int servo2, int position2, int position22,int servo3, int position3, int position33, int servo4, int position4, int position44, int servo5, int position5, int position55,int servo6, int position6, int position66){ // Servo 1, Position de départ, Position d'arrivée, Servo 2,Position de départ, Position d'arrivée while(position1 != position11 || position2 != position22 || position3 != position33 || position4 != position44 || position5 != position55 || position6 != position66){ if(position1 > position11){ p[servo1].write(position1); position1--; } if(position1 < position11){ p[servo1].write(position1); position1++; } if(position2 > position22){ p[servo2].write(position2); position2--; } if(position2 < position22){ p[servo2].write(position2); position2++; } if(position3 > position33){ p[servo3].write(position3); position3--; } if(position3 < position33){ p[servo3].write(position3); position3++; } if(position4 > position44){ p[servo4].write(position4); position4--; } if(position4 < position44){ p[servo4].write(position4); position4++; } if(position5 > position55){ p[servo5].write(position5); position5--; } if(position5 < position55){ p[servo5].write(position5); position5++; } if(position6 > position66){ p[servo6].write(position6); position6--; } if(position6 < position66){ p[servo6].write(position6); position6++; } delay(arm_speed2); }
if (!SD.begin(10)) { Serial.println("initialisation KO!"); while (1); } Serial.println("initialization Faite."); p[1].write(90); p[2].write(90); p[3].write(90); p[4].write(90); p[5].write(90); p[6].write(90); delay(3000);
}
void loop() {
if (Serial.available()) { // Si donnée Bluetooth reçue... BluetoothData = Serial.readString(); Serial.println(BluetoothData); a = BluetoothData.charAt(0); if (BluetoothData == "S1F") { //Rotation Base vers la droite // Serial.println("servo1 actif"); while(b != 'S'){ b = Serial.read(); if (vs10 > 0){ vs10 = vs10 - 1; p[1].write(vs10); delay(arm_speed); //Serial.println(vs10); } } b = 'A'; } if (BluetoothData == "S1R") { //Rotation Base vers la gauche // Serial.println("servo1 actif"); while(b != 'S'){ b = Serial.read(); if (vs10 < 180){ vs10 = vs10 + 1; p[1].write(vs10); delay(arm_speed); //Serial.println(vs10); } } b = 'A'; } if (BluetoothData == "S2F") { // Rotation du bras vers le Bas while(b != 'S'){ b = Serial.read(); if (vs20 < 160){ vs20 = vs20 + 1; p[2].write(vs20); delay(arm_speed); //Serial.println(vs20); } } b = 'A'; } if (BluetoothData == "S2R") { //Rotation du bras vers le Haut while(b != 'S'){ b = Serial.read(); if (vs20 > 20){ vs20 = vs20 - 1; p[2].write(vs20); delay(arm_speed); //Serial.println(vs20); } } b = 'A'; } if (BluetoothData == "S3F") { //Rotation de l'avant bras vers le Bas while(b != 'S'){ b = Serial.read(); if (vs30 < 180){ vs30 = vs30 + 1; p[3].write(vs30); delay(arm_speed); //Serial.println(vs30); } } b = 'A'; } if (BluetoothData == "S3R") { //Rotation de l'avant bras vers le Haut while(b != 'S'){ b = Serial.read(); if (vs30 > 0){ vs30 = vs30 - 1; p[3].write(vs30); delay(arm_speed); //Serial.println(vs30); } } b = 'A'; } if (BluetoothData == "S4F") { //Rotation du poignet vers le Bas while(b != 'S'){ b = Serial.read(); if (vs40 < 180){ vs40 = vs40 + 1; p[4].write(vs40); delay(arm_speed); //Serial.println(vs40); } } b = 'A'; } if (BluetoothData == "S4R") { // Rotation du poignet vers le Haut while(b != 'S'){ b = Serial.read(); if (vs40 > 0){ vs40 = vs40 - 1; p[4].write(vs40); delay(arm_speed); //Serial.println(vs40); } } b = 'A'; } if (BluetoothData == "S5F") { //Rotation de la main vers le Bas while(b != 'S'){ b = Serial.read(); if (vs50 < 180){ vs50 = vs50 + 1; p[5].write(vs50); delay(arm_speed); //Serial.println(vs50); } } b = 'A'; } if (BluetoothData == "S5R") { // Rotation de la main vers le Haut while(b != 'S'){ b = Serial.read(); if (vs50 > 0){ vs50 = vs50 - 1; p[5].write(vs50); delay(arm_speed); //Serial.println(vs50); } } b = 'A'; } if (BluetoothData == "S6F") { //Fermeture de la Pince while(b != 'S'){ b = Serial.read(); if (vs60 < 180){ vs60 = vs60 + 1; p[6].write(vs60); delay(arm_speed); //Serial.println(vs60); } } b = 'A'; } if (BluetoothData == "S6R") { // Ouverture de la Pince while(b != 'S'){ b = Serial.read(); if (vs60 > 0){ vs60 = vs60 - 1; p[6].write(vs60); delay(arm_speed); //Serial.println(vs60); } } b = 'A'; } if (BluetoothData == "P1F") { //Déplacement du Stepper 1 vers l'avant while(b != 'S'){ b = Serial.read(); if (pas10 < 7){ digitalWrite(dirPin, HIGH); for (int i = 0; i < stepsPerRevolution; i++) { // These four lines result in 1 step: digitalWrite(stepPin, HIGH); delayMicroseconds(1000); digitalWrite(stepPin, LOW); delayMicroseconds(1000);} pas10 += 1; delay(1000); //Serial.println(vs60);}} b = 'A'; } if (BluetoothData == "P1R") { //Déplacement du Stepper 1 vers l'arriere while(b != 'S'){ b = Serial.read(); if (pas10 > 0){ digitalWrite(dirPin, LOW); for (int i = 0; i < stepsPerRevolution; i++) { // These four lines result in 1 step: digitalWrite(stepPin, HIGH); delayMicroseconds(1000); digitalWrite(stepPin, LOW); delayMicroseconds(1000);} pas10 -= 1; delay(1000);}} b = 'A';} if (BluetoothData == "P2F") { //Déplacement du Stepper 2 vers l'avant while(b != 'S'){ b = Serial.read(); if (pas20 > 0){ digitalWrite(dirPin2, HIGH); for (int i = 0; i < stepsPerRevolution; i++) { digitalWrite(stepPin2, HIGH); delayMicroseconds(1000); digitalWrite(stepPin2, LOW); delayMicroseconds(1000);} pas20 -= 1; delay(1000);}} b = 'A';} if (BluetoothData == "P2R") { // Déplacement du Stepper 2 vers l'arriere while(b != 'S'){ b = Serial.read(); if (pas20 > 0){ digitalWrite(dirPin2, LOW); for (int i = 0; i < stepsPerRevolution; i++) { digitalWrite(stepPin2, HIGH); delayMicroseconds(1000); digitalWrite(stepPin2, LOW); delayMicroseconds(1000);} pas20 -= 1; delay(1000);}} b = 'A';} if (a == 'T') { // Enregistrement du temps dans la carte Micro-SD BluetoothData.remove(0,1); temps = BluetoothData.toInt(); temps = temps * 1000; myFile = SD.open("robot.txt",FILE_WRITE); //Ouverture du fichier robot.txt en mode écriture
if (myFile) { Serial.print("Ecriture dans Robot.txt..."); myFile.print("T,"); myFile.println(temps); myFile.close(); Serial.println(temps);}} if (a == 'G') { // Enregistrement du Déplacement des Steppers dans la carte Micro-SD
delay(2000); //Mis à jour des positions des Servomoteurs vs1 = vs10; vs2 = vs20; vs3 = vs30; vs4 = vs40; vs5 = vs50; vs6 = vs60;} if (BluetoothData == "P") { // Lecture et Exécution des données de la carte Micro-SD
myFile = SD.open("robot.txt");//Ouverture du fichier Robot.txt en mode lecture p[1].write(90);//Pour commencer on réinitialise la position des servomoteurs p[2].write(90); p[3].write(90); p[4].write(90); p[5].write(90); p[6].write(90); if (myFile) { pasInit = pas10; if(pasInit > 0){// Et on réinitialise la position des Steppers for (int x = pasInit; x > 0; x--){ digitalWrite(dirPin, LOW); for (int i = 0; i < stepsPerRevolution; i++) { digitalWrite(stepPin, HIGH); delayMicroseconds(1000); digitalWrite(stepPin, LOW); delayMicroseconds(1000);} pasInit--;}} Serial.println("robot.txt:");
while (myFile.available()) { data = myFile.read(); if (data == ','){ t = t + 1;} else if(data == 'T'){//Extraction de la valeur Temps Serial.print("delay en attente"); data = myFile.read(); while(data != 'r'){ data = myFile.read(); tempo += data;} tempus = tempo.toInt(); Serial.println(tempus); tempo = ""; delay(tempus);// Exécution de la pause du robot } else if (data == 'M'){//Lecture et exécution des données Steppers data = myFile.read(); while(data != 'r'){ data = myFile.read(); if(data == ','){ t = t + 1;} else{ if(t == 0){ a0 += data;} else if(t == 1){ a1 += data;} else if (t == 2){ a2 += data;} //Servo2 else if(t == 3){ a3 += data;}}} M1D = a0.toInt(); Serial.println(M1D); M1A = a1.toInt(); Serial.println(M1A); M2D = a2.toInt(); Serial.println(M2D); M2A = a3.toInt(); Serial.println(M2A);
int multimove(int servo1, int position1, int position11, int servo2, int position2, int position22,int servo3, int position3, int position33, int servo4, int position4, int position44, int servo5, int position5, int position55,int servo6, int position6, int position66){ // Servo 1, Position de départ, Position d'arrivée, Servo 2,Position de départ, Position d'arrivée while(position1 != position11 || position2 != position22 || position3 != position33 || position4 != position44 || position5 != position55 || position6 != position66){ if(position1 > position11){ p[servo1].write(position1); position1--;} if(position1 < position11){ p[servo1].write(position1); position1++;} if(position2 > position22){ p[servo2].write(position2); position2--;} if(position2 < position22){ p[servo2].write(position2); position2++;} if(position3 > position33){ p[servo3].write(position3); position3--;} if(position3 < position33){ p[servo3].write(position3); position3++;} if(position4 > position44){ p[servo4].write(position4); position4--;} if(position4 < position44){ p[servo4].write(position4); position4++;} if(position5 > position55){ p[servo5].write(position5); position5--;} if(position5 < position55){ p[servo5].write(position5); position5++;} if(position6 > position66){ p[servo6].write(position6); position6--;} if(position6 < position66){ p[servo6].write(position6); position6++;} delay(arm_speed2);}}
4.6 ASSISTANCE
Pour toute demande d'assistance, vous pouvez nous contacter sur PROJET@EAGLE-ROBOTICS.COM sans oublier la phrase magique: "SVP OH GRAND MAÎTRE DE LA ROBOTIQUE..." puis formulez votre requête, ajoutez-y quelques flatteries et superlatifs, sinon votre requête ne sera pas traitée...Je plaisante (ou pas, à vous de voir!)