/* Moteur pas à pas Permet de faire piloter un moteur moteur SANS utilisation de la librairie Stepper.h (moteur Bipolar) Functions Stepper(steps, pin1, pin2, pin3, pin4) setSpeed(rpm) step(steps) AUTEUR : Frédéric RALLO */ #include // inclusion de la librairie Timer2 // dépend du moteur const int nombreDePasParTour = 48; // -------------------------------------------------------------------------------------------------------------------------- // METHODES PRIVEES // -------------------------------------------------------------------------------------------------------------------------- // enable control (HIGH => Le moteur est pilotable) int enable = 0; // 4 fils du moteur pas à pas int bobineA = 0; int bobineB = 0; int bobineA_barre = 0; int bobineB_barre = 0; byte etat = 0; long nbInterruptions = 100; // mis à jour dans changerVitesse() long vitesse = 0; //nb de tours par minute calculé dans init() int nbInterruptionsParTour = 0; //calculé dans init() // -------------------------------------------------------------------------------------------------------------------------- // METHODES PUBLIQUES // -------------------------------------------------------------------------------------------------------------------------- void initMoteur(byte nombreDePasParTour, int filEN, int fil1, int fil2, int fil3, int fil4) { // filEN, fil1..fil4 : numméro des E/S carte ARDUINO pour connection du moteur // nombreDePasParTour est le nombre de pas par tour // enable=HIGH --> le moteur est pilotable // chaque tour, on active succéssivement : // . etat=0 --> bobineA, // . etat=1 --> bobineA + bobineB // . etat=2 --> bobineB, // . etat=3 --> bobineB + bobineA_barre // . etat=4 --> bobineA_barre, // . etat=5 --> bobineA_barre + bobineB_barre // . etat=6 --> bobineB_barre // . etat=7 --> bobineB_barre + bobineA enable = filEN; bobineA = fil1; bobineA_barre = fil2; bobineB = fil3; bobineB_barre = fil4; nbInterruptionsParTour = nombreDePasParTour * 8; } void changerVitesse(long v) { digitalWrite(enable, LOW); if ( (v>0) && (nbInterruptionsParTour>0) ) {//on doit avoir initialisé avant //nbInterruptions = 1000/(nbInterruptionsParTour*v/60); nbInterruptions = 3600/(nbInterruptionsParTour*v/60); vitesse = v; } Serial.print("vitesse="); Serial.print(vitesse); Serial.print(" nombre_De_Pas_Par_Tour="); Serial.print(nombreDePasParTour); Serial.print(" frequence_interruption="); Serial.println(nbInterruptions); digitalWrite(enable, HIGH); } void avancerUnPas() { switch (etat) { case 0: //Serial.print("bobineA :"); digitalWrite(bobineA, HIGH); digitalWrite(bobineB, LOW); digitalWrite(bobineA_barre, LOW); digitalWrite(bobineB_barre, LOW); break; case 1: //Serial.print("bobineA bobineB :"); digitalWrite(bobineA, HIGH); digitalWrite(bobineB, HIGH); digitalWrite(bobineA_barre, LOW); digitalWrite(bobineB_barre, LOW); break; case 2: //Serial.print("bobineB :"); digitalWrite(bobineA, LOW); digitalWrite(bobineB, LOW); digitalWrite(bobineA_barre, HIGH); digitalWrite(bobineB_barre, LOW); break; case 3: //Serial.print("bobineA_barre bobineB :"); digitalWrite(bobineA, LOW); digitalWrite(bobineB, HIGH); digitalWrite(bobineA_barre, HIGH); digitalWrite(bobineB_barre, LOW); break; case 4: //Serial.print("bobineA_barre :"); digitalWrite(bobineA, LOW); digitalWrite(bobineB, LOW); digitalWrite(bobineA_barre, HIGH); digitalWrite(bobineB_barre, LOW); break; case 5: //Serial.print("bobineA_barre bobineB_barre :"); digitalWrite(bobineA, LOW); digitalWrite(bobineB, LOW); digitalWrite(bobineA_barre, HIGH); digitalWrite(bobineB_barre, HIGH); break; case 6: //Serial.print("bobineB_barre :"); digitalWrite(bobineA, LOW); digitalWrite(bobineB, LOW); digitalWrite(bobineA_barre, LOW); digitalWrite(bobineB_barre, HIGH); break; case 7: //Serial.print("bobineB_barre bobineA :"); digitalWrite(bobineA, HIGH); digitalWrite(bobineB, LOW); digitalWrite(bobineA_barre, LOW); digitalWrite(bobineB_barre, HIGH); //Serial.println("-------------> 1 pas"); break; }//end Case etat = (etat+1) % 7; } // -------------------------------------------------------------------------------------------------------------------------- // INITIALISATION // -------------------------------------------------------------------------------------------------------------------------- void setup() { pinMode(enable, OUTPUT); Serial.begin(9600); initMoteur(nombreDePasParTour, 13,8,9,10,11); pinMode(enable, OUTPUT); pinMode(bobineA, OUTPUT); pinMode(bobineB, OUTPUT); pinMode(bobineA_barre, OUTPUT); pinMode(bobineB_barre, OUTPUT); //rend le moteur devient pilotable digitalWrite(enable, HIGH); //définit la vitesse du moteur changerVitesse(60); MsTimer2::set(nbInterruptions, avancerUnPas); // période (ms) MsTimer2::start(); // active Timer2 // initialise le port serie } // -------------------------------------------------------------------------------------------------------------------------- // BOUCLE INFINIE // -------------------------------------------------------------------------------------------------------------------------- void loop() { //avance de 1 pas //avancerUnPas(); }