View All

Facebook Timeline

Programmer un robot sans Ordinateur: Un jeu d'enfant!

Posted On: avril 24, 2022

Seen by: 334

Categories: ROBOTS

Author: Christian Joseph

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.

SOMMAIRE:

  1. INTRODUCTION

  2. Présentation des cartes

    • La Carte Shield Joystick V3.0

    • La Carte Shield EAGLE V2.0

    • La Carte Shield STEPSER V1.0

  3. L'application ANDROID

  4. Les Programmes Arduino

    • Enregistrement des données dans la Carte Micro-SD

    • Lecture des données dans la Carte Micro-SD

    • Le Programme Arduino JOYSTICK V3.0

    • Le Programme Arduino EAGLE V2.0

    • Le Programme Arduino STEPSER V1.0

    • ASSISTANCE

1 - INTRODUCTION

Dans La vidéo suivante, les bras robots ont été transformés en marionnettes et ont été programmés sans ordinateur, ni codage: PROGRAMMER SANS ORDINATEUR, UN JEU D'ENFANT.

Et voici la vidéo du MAKING OF: KOKO et BORA, LE MAKING OF.

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 COMMANDE: 1 carte Shield Joystick V3.0  ou l' application Android Made by Eagle Robotics pour piloter le robot à distance, lancer l'enregistrement des mouvements moteurs et de délais d'attente, et lancer l'exécution des séquences enregistrées.

  • 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

2 - PRESENTATION DES CARTES

Les cartes sont accessibles  séparément mais sont également incluses dans les kits Bras robot 6 axes Arduino BluetoothBras robot 6 axes + Joystick Bluetooth Arduino et Bras robot Stepser + joystick Arduino

2.1 - LA CARTE SHIELD JOYSTICK 3.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.

Joystick Arduino Commands

ON SELECTIONNE LE MOTEUR DE NOTRE CHOIX: SERVOMOTEUR...

Joystick -selection -servo 1

Joystick selection servo 4

OU MOTEUR PAS-A-PAS (pour la carte STEPSER)

Joystick choix du stepper

ON BOUGE LE MOTEUR A NOTRE CONVENANCE

Joystick rotation du servomoteur

ON ENREGISTRE LA DONNEE DANS LA CARTE MICRO-SD DU ROBOT

Joystick enregistrement de la donnée

ON AJOUTE UN DELAI D'ATTENTE (ICI 6 SECONDES)

Joystick -elaboration délai

ON ENVOI LE TEMPS AU ROBOT POUR ENREGISTREMENT DANS LA CARTE MICRO-SD.

Joystick - Envoi délai attente au robot

ON ENVOI L'ORDRE AU ROBOT D'EXECUTER LE CONTENU DE SA CARTE MICRO-SD

Joystick Execution sequence

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.

Shield Arduino servo 2.0 Eagle

Shield Eagle V2 Arduino Uno

BRANCHEMENT DU BRAS ROBOT

Shield Eagle V2 Wiring

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.

Shield Eagle V2 Regulateur ON

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.

Shield Eagle V2 Regulateur OFF

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.0 peut 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)

Shield STEPSER Arduino

Shield STEPSER Arduino UNO

BRANCHEMENT DU BRAS ROBOT

Shield STEPSER Wiring

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.

Shield STEPSER Régulateur ON

Régulateur OFF:

Lorsque le régulateur est désactivé, les servomoteurs et les steppers sont alimentés séparément.

Shield STEPSER Regulateur OFF

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

Application Android robotic learning

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

Bras robot cobotique

OU IMAGE 2

bras robot cobotique

ET ENFIN L'IMAGE 3

Bras robot cobotique OM

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:

  1. Je sélectionne le servomoteur S2 sur l'écran du shield Joystick

  2. Je bouge le servomoteur vers le Bas

  3. J'appuie sur le bouton pour enregistrer le mouvement dans la carte micro-SD

  4. Je sélectionne le servomoteur S6 (pince) sur l'écran du shield Joystick

  5. Je bouge le servomoteur pour fermer la pince et saisir l'objet A

  6. J'appuie sur le bouton pour enregistrer le mouvement dans la carte micro-SD

  7. Je sélectionne le Temps sur l'écran du shield Joystick

  8. J'ajoute 3 secondes de délai (histoire de laisser le temps à la pince de saisir l'objet)

  9. J'appuie sur le bouton pour enregistrer le délai de 3 secondes dans la carte micro-SD

  10. Je sélectionne le servomoteur S2 sur l'écran du shield Joystick

  11. Je bouge le servomoteur vers le Haut

  12. Je sélectionne le servomoteur S3 sur l'écran du shield Joystick

  13. Je bouge le servomoteur vers le Haut

  14. 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)

  15. Je sélectionne le servomoteur S1 sur l'écran du shield Joystick

  16. Je bouge le servomoteur vers la droite

  17. J'appuie sur le bouton pour enregistrer le mouvement du servomoteur dans la carte micro-SD

  18. Je sélectionne le servomoteur S2 sur l'écran du shield Joystick

  19. Je bouge le servomoteur vers le Bas

  20. Je sélectionne le servomoteur S3 sur l'écran du shield Joystick

  21. Je bouge le servomoteur vers le Bas

  22. 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)

  23. Je sélectionne le servomoteur S6 (Pince) sur l'écran du shield Joystick

  24. Je bouge le servomoteur pour ouvrir la pince

  25. 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)

Fichier texte bras robot

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
*/

#include "SPI.h"
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SH1106.h"
#include "SoftwareSerial.h"

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SH1106 display(OLED_RESET);


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;


void setup() {
Serial.begin(115200);
BT.begin(9600);
pinMode (bt1, INPUT_PULLUP);
pinMode (bt2, INPUT_PULLUP);
pinMode (bt3, INPUT_PULLUP);
pinMode (bt4, INPUT_PULLUP);
pinMode(VRx, INPUT);
pinMode(VRy, INPUT);
pinMode(SW, INPUT_PULLUP);
pinMode(VRx2, INPUT);
pinMode(VRy2, INPUT);
pinMode(SW2, INPUT_PULLUP);

display.begin(SH1106_SWITCHCAPVCC, 0x3C);
display.display();
delay(2000);
display.clearDisplay();
delay(2000);
display.setTextSize(2); // Normal 1:1 pixel scale
display.setTextColor(WHITE); // Draw white text
display.setCursor(0,0);
display.println(F("EAGLE"));
display.setCursor(0,20);
display.println(F("ROBOTICS"));
display.setCursor(0,40);
display.println(F("INNOVATION"));
display.display();
display.clearDisplay();
delay(3000);
display.clearDisplay();
display.setCursor(50,20);
display.println((menu[0]));
display.display();
display.clearDisplay();
delay(3000);

}

void loop() {

buttons();

if (x2 > 400 && y2 > 130 && y2 < 380){ //Selection du moteur ou temps
tempus = 0;
if (u > 0){
u--;
display.clearDisplay();
display.setCursor(50,20);
display.println(menu[u]);
display.display();
display.clearDisplay();
}
while (x2 > 400 && y2 > 130 && y2 < 380){
buttons();
}
}
else if (x2 < 100 && y2 > 130 && y2 < 380){ //Selection du moteur ou temps
if (u <= 7){
u++;
display.clearDisplay();
display.setCursor(50,20);
display.println((menu[u]));
display.display();
display.clearDisplay();
}

while (x2 < 100 && y2 > 130 && y2 < 380){
buttons();
}
}

if( u < 8){
if (x1 > 130 && x1 < 380 && y1 > 400){
BT.print(menu[u]);
BT.write('R');
display.clearDisplay();
display.setCursor(0,0);
display.println(F("Rotation"));
display.setCursor(0,20);
display.println(F("Moteur"));
display.setCursor(0,40);
display.println(F("En Arriere"));
display.display();
while (x1 > 130 && x1 < 380 && y1 > 400){
buttons();
}
BT.write('S');
display.clearDisplay();
display.setCursor(50,20);
display.println((menu[u]));
display.display();
display.clearDisplay();
}
else if (x1 > 130 && x1 < 380 && y1 < 100){
BT.print(menu[u]);
BT.write('F');
display.clearDisplay();
display.setCursor(0,0);
display.println(F("Rotation"));
display.setCursor(0,20);
display.println(F("moteur"));
display.setCursor(0,40);
display.println(F("En Avant"));
display.display();
while (x1 > 130 && x1 < 380 && y1 < 100){
buttons();
}
BT.write('S');
display.clearDisplay();
display.setCursor(50,20);
display.println((menu[u]));
display.display();
display.clearDisplay();
}
else if (val1 == 1 && val2 == 1 && val3 == 0 && val4 == 1){//D6
while (val1 == 1 && val2 == 1 && val3 == 0 && val4 == 1){
buttons();
}
BT.write('W');
display.clearDisplay();
display.setCursor(0,0);
display.println(F("Donnee"));
display.setCursor(0,20);
display.println(F("Enregistre"));
display.setCursor(0,40);
display.println(F("SD"));
display.display();
display.clearDisplay();
delay(3000);
display.setCursor(50,20);
display.println((menu[u]));
display.display();
display.clearDisplay();

}
else if (val1 == 1 && val2 == 1 && val3 == 1 && val4 == 0){//D7
BT.write('P');
display.clearDisplay();
display.setCursor(0,0);
display.println(F("Execution"));
display.setCursor(0,20);
display.println(F("Sequence"));
display.setCursor(0,40);
display.println(F("SD"));
display.display();
while (val1 == 1 && val2 == 1 && val3 == 1 && val4 == 0){
buttons();
}
//BT.write('S');
u = 0;
display.clearDisplay();
delay(3000);
display.setCursor(50,20);
display.println((menu[u]));
display.display();
display.clearDisplay();
display.clearDisplay();

}
else if (val1 == 1 && val2 == 0 && val3 == 1 && val4 == 1){//D5
if (u > 5 && u < 8){
BT.write('G');
display.clearDisplay();
display.setCursor(0,0);
display.println(F("Donnee"));
display.setCursor(0,20);
display.println(F("Stepper"));
display.setCursor(0,40);
display.println(F("OK"));
display.display();
while (val1 == 1 && val2 == 0 && val3 == 1 && val4 == 1){
buttons();
}
// u = 0;
display.clearDisplay();
delay(3000);
display.setCursor(50,20);
display.println((menu[u]));
display.display();
display.clearDisplay();
display.clearDisplay();
}
}
}

else if (u == 8){
display.clearDisplay();
display.setCursor(50,20);
display.println((tempus));
display.display();
display.clearDisplay();
if (x1 > 130 && x1 < 380 && y1 > 400){
if(tempus > 0){
tempus--;
}
while (x1 > 130 && x1 < 380 && y1 > 400){
buttons();
}
}
else if (x1 > 130 && x1 < 380 && y1 < 100){
if(tempus < 3600){ // 3600 s = 60 min = 1h
tempus++;
}
while (x1 > 130 && x1 < 380 && y1 < 100){
buttons();
}

}
else if (val1 == 0 && val2 == 1 && val3 == 1 && val4 == 1){//D4
if( tempus > 0){
BT.write('T');
BT.print(tempus);
display.clearDisplay();
display.setCursor(30,0);
display.println(F("Temps"));
display.setCursor(30,20);
display.println(F("envoye"));
display.display();
}
while (val1 == 0 && val2 == 1 && val3 == 1 && val4 == 1){
buttons();
}
display.clearDisplay();

}
}
}

void buttons(){
val1 = digitalRead(bt1);
val2 = digitalRead(bt2);
val3 = digitalRead(bt3);
val4 = digitalRead(bt4);
xPos = analogRead(VRx);
yPos = analogRead(VRy);
SW_state = digitalRead(SW);
x1 = map(xPos, 0, 1024, 0, 512);
y1 = map(yPos, 0, 1024, 0, 512);
xPos2 = analogRead(VRx2);
yPos2 = analogRead(VRy2);
SW_state2 = digitalRead(SW2);
x2 = map(xPos2, 0, 1024, 0, 512);
y2 = map(yPos2, 0, 1024, 0, 512);

}

4.4 PROGRAMME ARDUINO SHIELD EAGLE V2.0
/*
Programme: Robot Learning - Shield Eagle V2.0
Auteur: Christian Joseph
Date: 20/03/2022
Help: Projet@eagle-robotics.com
Site: www.eagle-robotics.com
*/

#include "SPI.h"
#include "SD.h"
#include "Servo.h"


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);
}

}

4.5 PROGRAMME ARDUINO SHIELD STEPSER V1.0
/*
* Programme: Robot Steper Learning - Shield STEPSER V1.0
* Auteur: Christian Joseph
* Date: 20/03/2022
* Help: Projet@eagle-robotics.com
* Site: www.eagle-robotics.com
*/

#include "SPI.h"
#include "SD.h"
#include "Servo.h"

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
int pas1,pas2, pasInit;//Variables de départ des Steppers
int pas10,pas20;//Variables d'arrivée des Steppers
String BluetoothData; // Variable de reception donné bluetooth
int arm_speed,arm_speed2; //Vitesse du bras robot
char data;
char a,b;
int t = 0;
int w = 0;
int c;
int mvt, mvt1;
int ser1,pos1,pos11, ser2,pos2,pos22,ser3,pos3,pos33;
int ser4,pos4,pos44, ser5,pos5,pos55,ser6,pos6,pos66;
int M1D, M1A, M2D, M2A;//Variables Steppers
int temps = 0;
int tempus = 0;
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 ="";
const int dirPin = 2;
const int stepPin = 3;
const int dirPin2 = 8;
const int stepPin2 = 9;
const int stepsPerRevolution = 200;


void setup() {
p[1].attach(4);
p[2].attach(5);
p[3].attach(6);
p[4].attach(7);
p[5].attach(14);
p[6].attach(15);
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
pas1 = 0;
pas10 = 0;
pas2 = 0;
pas20 = 0;
arm_speed = 30; // Vitesse Robot en mode apprentissage
arm_speed2 = 1; //Vitesse Robot en mode Exécution
delay(100);
Serial.begin(9600);

pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(stepPin2, OUTPUT);
pinMode(dirPin2, OUTPUT);
while (!Serial) {
;
}


Serial.print("Initialisation carte SD...");

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

myFile = SD.open("robot.txt",FILE_WRITE);


if (myFile) {
Serial.print("Ecriture dans Robot.txt...");
myFile.print("M,");
myFile.print(pas1);
Serial.print(pas1);
myFile.print(",");
myFile.print(pas10);
Serial.print(pas10);
myFile.print(",");
myFile.print(pas2);
Serial.print(pas2);
myFile.print(",");
myFile.println(pas20);
Serial.println(pas20);
myFile.close();}
else {

Serial.println("erreur ouverture Robot.txt");}

delay(1000);
pas1 = pas10;
pas2 = pas20;}

if (BluetoothData == "W") { // // Enregistrement des données Servomoteurs dans la carte Micro-SD
myFile = SD.open("robot.txt",FILE_WRITE);

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(); //Fermeture du fichier robot.txt
Serial.println("Fait.");
}
else {

Serial.println("erreur ouverture Robot.txt");}

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);

while(M1D != M1A || M2D != M2A){
if(M1D < M1A){
digitalWrite(dirPin, HIGH);
for (int i = 0; i < stepsPerRevolution; i++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin, LOW);
delayMicroseconds(1000);}
M1D++;}
if(M1D > M1A){
digitalWrite(dirPin, LOW);
for (int i = 0; i < stepsPerRevolution; i++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin, LOW);
delayMicroseconds(1000);}
M1D--;}
if(M2D < M2A){
digitalWrite(dirPin2, HIGH);
for (int i = 0; i < stepsPerRevolution; i++) {
digitalWrite(stepPin2, HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin2, LOW);
delayMicroseconds(1000);}
M2D++;}
if(M2D > M1A){
digitalWrite(dirPin2, LOW);
for (int i = 0; i < stepsPerRevolution; i++) {
digitalWrite(stepPin2, HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin2, LOW);
delayMicroseconds(1000);}
M2D--;} }
a0 ="";
a1 ="";
a2 ="";
a3 ="";
t = 0;}
else if (data =='r'){
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
a0 ="";
a1 ="";
a2 ="";
a3 ="";
a4 ="";
a5 ="";
a6 ="";
a7 ="";
a8 ="";
a9 ="";
a10 ="";
a11 ="";
a12 ="";
a13 ="";
a14 ="";
a15 ="";
a16 ="";
a17 ="";
t = 0;}
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;}}
}
// Fermeture du fichier robot.txt
myFile.close();
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");
}}}}

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!)