bonjour a tous, je suis ici car j'ai besoin de conseils, je possede un moteur pas a pas NEMA 42 et un driver DQ2722MA. je souhaite realiser un guidage lineaire, par exemple dire au moteur d'avancer de 200pas et le moteur se deplace de 200pas, sur ce point je n'ai pas de probleme mon probleme est que je n'arrive pas a trouver le code pour que le moteur prenne en compte sa position actuelle par exemple je dit d'avancer de 400 pas, ensuite je dit 600pas etant donné qu'il as deja avancer de 400 pas avant il ne devrais avancer a nouveau de 200 pas.je ne sais pas si c'est tres clair, si ce n'est pas le cas n'hesitez pas.
concernant le programe que j'utilise vous le trouverez ci joint. comme je dit il fonctionne bien si je tape 200 et A pour valider il avance bien de 200 pas et si je tape *(-) 200 et A pour valider il recule bien vous verrez aussi dans le code que j'ai essayer d'attribuer le touche B pour revenir a une position "home" mais la non plus ca ne marche pas tres bien car quand j'appuis sur B le moteur revient bien du nombre de pas que j'ai demander precedament mais ne quitte ne revient pas au debut de la boucle (B reste affiché sur l'ecran) la solution "home etais une solution de secour, je prefere que le moteur prenne en compte sa position actuelle je precise que je ne peut pas utiliser de laser ou autre capteur de position etant donné que la longueur est de 6ml pour une precision au mm. merci d'avance pour votre aide. bonne journée
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 | #include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD #include <Keypad.h> // inclusion de la librairie pour clavier matriciel #include <Stepper.h> // librairie pour moteurs pas à pas // --- Déclaration des constantes --- //--- Constantes utilisées avec le clavier 4x4 const byte LIGNES = 4; // 4 lignes const byte COLONNES = 4; //4 colonnes const int NombrePas=200; // Nombre de pas du servomoteur // --- constantes des broches --- const int C4=44; //declaration constante de broche const int C3=42; //declaration constante de broche const int C2=40; //declaration constante de broche const int C1=32; //declaration constante de broche const int RS=43; //declaration constante de broche const int E=51; //declaration constante de broche const int D4=45; //declaration constante de broche const int D5=47; //declaration constante de broche const int D6=49; //declaration constante de broche const int D7=53; //declaration constante de broche const int L4=52; //declaration constante de broche const int L3=50; //declaration constante de broche const int L2=48; //declaration constante de broche const int L1=46; //declaration constante de broche // --- Déclaration des variables globales --- //--- Définition des touches char touches[LIGNES][COLONNES] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; // tableaux de lignes et colonnes byte BrochesLignes[LIGNES] = {L1, L2, L3, L4}; //connexions utilisées pour les broches de lignes du clavier byte BrochesColonnes[COLONNES] = {C1, C2, C3, C4}; //connexions utilisées pour les broches de colonnes du clavier char touche; // variable de stockage valeur touche appuyée long valeur; // --- Déclaration des objets utiles pour les fonctionnalités utilisées --- LiquidCrystal Lcd(RS, E, D4, D5, D6, D7);// Création d'un objet LiquidCrystal = initialisation LCD en mode 4 bits // création d'un objet keypad = initialisation clavier Keypad clavier = Keypad( makeKeymap(touches), BrochesLignes, BrochesColonnes, LIGNES, COLONNES ); // les broches de lignes sont automatiquement configurées en ENTREE avec pullup interne activé // les broches de colonnes sont automatiquement configurées en SORTIE Stepper stepper(NombrePas, 12,13); // crée un objet Stepper pour contrôler le moteur pas à pas // Pas_1 et Pas_3 commandent la 1ère phase, Pas_2 et Pas_4 la 2ème phase //**************** FONCTION SETUP = Code d'initialisation ***** // La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme void setup() { // debut de la fonction setup() // --- ici instructions à exécuter au démarrage --- Lcd.begin(20,4); // Initialise le LCD avec 20 colonnes x 4 lignes delay(10); // pause rapide pour laisser temps initialisation // Test du LCD Lcd.print("LCD OK") ; // affiche la chaîne texte - message de test delay(2000); // pause de 2 secondes Lcd.clear(); // // efface écran et met le curseur en haut à gauche delay(10); // pour laisser temps effacer écran // initialise la vitesse de rotation du moteur pas à pas en tour par minute stepper.setSpeed(400); // les broches de lignes et d'entrée sont configurées automatiquement lors de l'initialisation du clavier // ------- Broches en sortie ------- // ------- Broches en entrée ------- // ------- Activation du rappel au + interne des broches en entrée si nécessaire ------- } // fin de la fonction setup() // ******************************************************************************** //*************** FONCTION LOOP = Boucle sans fin = coeur du programme ************* // la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension void loop(){ // debut de la fonction loop() // --- ici instructions à exécuter par le programme principal --- valeur=SAISIE_LONG(); Lcd.setCursor(0,1);// positionne curseur 2ème ligne, 1ère colonne Lcd.print(valeur); stepper.step(valeur); // fait tourner le moteur du nombre pas indiqués - sens + et - Lcd.clear(); // // efface écran et met le curseur en haut à gauche delay(1000); // pour laisser temps effacer écran // touche = clavier.getKey(); // lecture de la touche appuyée //if (touche != NO_KEY){ // si une touche a été frappée -- gestion de la touche appuyée //} // fin gestion de la touche appuyée } // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin // ******************************************************************************** //*************** Autres Fonctions du programme ************* long SAISIE_LONG (){ // fonction qui renvoie une valeur long signé (32bits) //---- variables locales utilisées dans la fonction long saisie_long[11]={0,0,0,0,0,0,0,0,0,0,0}; // crée un tableau de variables pour saisir valeur - long maxi = 10 chiffres + signe char compt_touche; // variable de comptage du nombre de touches saisies long nombre_saisi; // variable de calcul du nombre saisi //float valeurf; // variable de caclul de la valeur convertie char touche_long; // variable locale pour valeur touche appuyée de 0 à 15 //---- initialisation des variables utilisées ---- compt_touche=0; // aucune touche saisie au démarrage nombre_saisi=0; // initialise la variable //-------- initialisation curseur -------- //// mode clignotant //------ gestion appui touche sur clavier while (compt_touche<11) { // tant que pas appuis maxi = 11 touches pour long + signe (valeur maxi=+2 147 483 647) touche_long= clavier.getKey(); // lecture de la touche appuyée if (touche_long!= NO_KEY){ // si une touche a été frappée -- gestion de la touche appuyée Lcd.print(touche_long); // debug if (compt_touche==0) { // au premier passage if (touche_long=='*') { // si appui signe - saisie_long[10]=-1; // mémorise -1 dans le 11ème caractère continue; // poursuit while comme si pas de premier passage } else { if (saisie_long[10]==0)saisie_long[10]=1; // mémorise le signe + dans le 11ème caractère si pas déjà à -1 } } // fin if compt_touche==0 if (touche_long=='A') break; // sort du while si appui sur A //---- calcul valeur numérique touches 0 à 9 (3ères lignes x 3ères colonnes) //--- à partir lignes colonnes --- for (byte i=0;i<3;i++) { for (byte j=0; j<3;j++){ if (touche_long==touches[i][j]) touche_long=(j+1)+(i*3);//calcul de la valeur numérique } } //---- à patir valeur ascii --- // touche 0 if (touche_long=='0') touche_long=0; //---- calcul valeur numériques autres touches if (touche_long=='A') touche_long=10; if (touche_long=='B')stepper.step(-valeur); if (touche_long=='C') touche_long=12; if (touche_long=='D') touche_long=13; saisie_long[compt_touche]=touche_long; //enregistre le caractère dans tableau code_saisi compt_touche=compt_touche+1; // on incrémente la variable compt qui mémorise le nombre de caractères saisis //delay () } //---- fin gestion appui clavier }// fin du While = fin de la lecture du clavier //--------- calcul valeur saisie en fonction du nombre de chiffres saisis et x signe (saisie_long[10]) --------- if (compt_touche==0)nombre_saisi=0; // si aucun chiffre saisi if (compt_touche==1)nombre_saisi=(saisie_long[0]); // si 1 seul chiffre saisi if (compt_touche==2)nombre_saisi=(saisie_long[0]*10)+(saisie_long[1]*1); // si 2 chiffres saisi if (compt_touche==3)nombre_saisi=(saisie_long[0]*100)+(saisie_long[1]*10)+(saisie_long[2]*1); // si 3 chiffres saisi if (compt_touche==4)nombre_saisi=(saisie_long[0]*1000)+(saisie_long[1]*100)+(saisie_long[2]*10)+(saisie_long[3]*1); // si 4 chiffres saisi if (compt_touche==5)nombre_saisi=(saisie_long[0]*10000)+(saisie_long[1]*1000)+(saisie_long[2]*100)+(saisie_long[3]*10)+(saisie_long[4]*1); // si 5 chiffres saisi if (compt_touche==6)nombre_saisi=(saisie_long[0]*100000)+(saisie_long[1]*10000)+(saisie_long[2]*1000)+(saisie_long[3]*100)+(saisie_long[4]*10)+(saisie_long[5]*1); // si 6 chiffres saisi if (compt_touche==7)nombre_saisi=(saisie_long[0]*1000000)+(saisie_long[1]*100000)+(saisie_long[2]*10000)+(saisie_long[3]*1000)+(saisie_long[4]*100)+(saisie_long[4]*10)+(saisie_long[5]*1); // si 6 chiffres saisi if (compt_touche==8)nombre_saisi=(saisie_long[0]*10000000)+(saisie_long[1]*1000000)+(saisie_long[2]*100000)+(saisie_long[3]*10000)+(saisie_long[4]*1000)+(saisie_long[5]*100)+(saisie_long[6]*10)+(saisie_long[7]*1); // si 7 chiffres saisi if (compt_touche==9)nombre_saisi=(saisie_long[0]*100000000)+(saisie_long[1]*10000000)+(saisie_long[2]*1000000)+(saisie_long[3]*100000)+(saisie_long[4]*10000)+(saisie_long[5]*1000)+(saisie_long[6]*100)+(saisie_long[7]*10)+(saisie_long[8]*1); // si 8 chiffres saisi if (compt_touche==10)nombre_saisi=(saisie_long[0]*1000000000)+(saisie_long[1]*100000000)+(saisie_long[2]*10000000)+(saisie_long[3]*1000000)+(saisie_long[4]*100000)+(saisie_long[5]*10000)+(saisie_long[6]*1000)+(saisie_long[7]*100)+(saisie_long[8]*10)+(saisie_long[9]*1); // si 9 chiffres saisi //Serial.println(int(saisie_long[10])); // debug - affiche signe nombre_saisi=nombre_saisi*long(saisie_long[10]); // prise en compte du signe //------ à réaliser en sortie de lecture du clavier ---- compt_touche=0; // réinitialise le nombre de touche saisies //-------- initialisation curseur -------- //// désactive mode clignotant //----- renvoi de la valeur saisie ---- return (nombre_saisi); // renvoie la valeur - sortie de la fonction } // --- Fin programme --- |