bonjour,
je fais ce post car j'ai un projet de bras robotisé j'utilise donc des moteurs pas à pas avec des drivers A4988 il ont fonctionnes au début mais la plus rien alors je sais pas si y a une erreur dans le code dans le montage des drivers pour info je possède un arduino mega, une alimentation de laboratoire, des drivers de ce type et un moteur pas à pas de ce type
#define pinEnable 10 // Activation du driver/pilote
#define pinStep 9 // Signal de PAS (avancement)
#define pinDir 8 // Direction
void setup(){
Serial.begin(9600);
Serial.println("Test A4988");
pinMode( pinEnable, OUTPUT );
pinMode( pinDir , OUTPUT );
pinMode( pinStep , OUTPUT );
}
void loop(){
int i = 0;
digitalWrite( pinDir , HIGH); // Direction avant
digitalWrite( pinStep , LOW); // Initialisation de la broche step
// Avance de 200 pas
for( i=0; i<2000; i++){
Serial.println( i );
digitalWrite( pinStep, HIGH );
delay( 10 );
digitalWrite( pinStep, LOW );
delay( 10 );
}
// Changer de direction
digitalWrite( pinDir , LOW); // Direction avant
// Refaire 200 pas dans l'autre sens
for( i=0; i<2000; i++){
Serial.println( i );
digitalWrite( pinStep, HIGH );
delay( 10 );
digitalWrite( pinStep, LOW );
delay( 10 );
}
// Pas de step et pas d'ordre...
// l'axe du moteur est donc bloqué
Serial.println("Axe bloqué + attendre 5 sec");
delay( 5000 );
// déblocage de l'axe moteur
Serial.println("Deblocage axe");
digitalWrite( pinEnable, HIGH ); // logique inversée
// Fin et blocage du programme
// Presser reset pour recommander
Serial.println("Fin de programme");
while( true );
}
le code sort d'internet j'en ai essayé plusieurs mais plus aucun ne marche , mais j'ai déjà fait tourné le moteur sans brancher les pin ms1, ms2 et ms3 car comme elle ne sont pas connectées elle sont en LOW donc une full step, j'ai juste débranché la carte et modifié un peu le programme et ça n'a plus marché j'ai donc remis le code à zéro mais ça n'a pas remarché. sur mon alimentation de labos quand je branche tous le voltage est a 12 mais l'ampère reste à zéro et le driver chauffe
j'ai celui ci que j'ai fait il y a environ 1 an. de mémoire il fonctionnait mais les commentaires ne sont peut etre pas à jour.
attention la liaison avec le moniteur est à 115200
/*
Test moteur PAP (pas entier)
Carte Pololu avec puce A4988 + régulateur de tension > http://www.pololu.com/catalog/product/1183
http://www.pololu.com/product/1182
UNO platine micro pas
5 MS1
6 MS2
7 MS3
11 direcion
12 Step
13 Enable
reset shunté avec sleep
puis raccordé à Vcc via une R de 12 K
GND GND de la cde
5 Vcc VCC de la cde
A1 et B1 sur l'enroulement 1 du moteur
A2 et B2 sur l'enroulement 2 du moteur
VDM alimentation 12 V pour moteur
GDN masse alimentation 12 V pour moteur
ne pas oublier le condo electrolytique sur l'alim 12 V moteur ( 100 micro farads )
*/
const int dirPin = 11; // DIR
const int stepPin = 12; // STEP
const int enablePin = 13; // ENABLE
int var = 0;
int essai = 0;
long resolutio = 0;
int mili = 0;
int micropulse = 0;
long micro = 0;
long tour = 240;
void setup()
{
DDRD = B11100010; // port D, les 1 sont en sortie 5,6,7 sont MS1 à 3
Serial.begin(115200);
pinMode(enablePin, OUTPUT); // broche Enable en sortie
digitalWrite(enablePin, HIGH); // ensuite on met un niveau haut sur Enable pour relacher le moteur
pinMode(dirPin, OUTPUT); // broche Dir en sortie
digitalWrite(dirPin, HIGH); // Tourner à droite (selon branchements !)
pinMode(stepPin, OUTPUT); // broche Step en sortie
delayMicroseconds(2); // on donne un très court délais par précaution avant de tourner
}
void loop()
{
Serial.println("debut de boucle");
digitalWrite(enablePin, LOW); // active le moteur (il ne sera plus possible de le tourner à la main et l'intensité sera à son MAX !!
for (int f = 0; f <= 4 ; f++)
{
resolution ( f );
test();
}
digitalWrite(enablePin, HIGH); // active le moteur (il sera plus possible de le tourner à la main et l'intensité sera à zéro !!
Serial.println("tempo 3 secondes fin de boucle");
delay ( 3000);
}
void test() // faire tourner le moteur de 5 tours de 48 pas
{
int j;
for(j=0; j<=(tour*5); j++) // ajuster le nb. de pas (ici 48 pas soit un tour. On compte le zéro !)
{
digitalWrite(stepPin, HIGH);
delayMicroseconds(micropulse); // à ajuster selon moteur, on peut essayer de diminuer à 2 us
digitalWrite(stepPin, LOW);
delayMicroseconds(micro); // fréquence à ajuster selon moteur (contrôle la vitesse et le couple)
}
}
void resolution ( int reso )
{
Serial.print("resolution = ");
Serial.println(reso,DEC);
switch (reso)
{
case 1: // 1/2 pas
PORTD &= B00011111;
delayMicroseconds(10);
PORTD |= B10000010; //128
tour = (48*2);
Serial.print("nombre de pas pour un tour = ");
Serial.println(tour,DEC);
micropulse = 10;
micro = 2500;
Serial.println("1/2 pas");
resolutio=PIND & B11100000;
Serial.print("port D, bits 7, 6 et 5 = ");
Serial.println(resolutio,DEC);
break;
case 2: // 1/4 pas
PORTD &= B00011111;
delayMicroseconds(10);
PORTD |= B01000010; //64
tour = (48*4);
Serial.print("nombre de pas pour un tour = ");
Serial.println(tour,DEC);
micropulse = 10;
micro = 1250;
Serial.println("1/4 pas");
resolutio=PIND & B11100000;
Serial.print("port D, bits 7, 6 et 5 = ");
Serial.println(resolutio,DEC);
break;
case 3: // 1/8 pas
PORTD &= B00011111;
delayMicroseconds(10);
PORTD |= B11000010; //192
tour = (48*8);
Serial.print("nombre de pas pour un tour = ");
Serial.println(tour,DEC);
micropulse = 5;
micro = 625;
Serial.println("1/8 pas");
resolutio=PIND & B11100000;
Serial.print("port D, bits 7, 6 et 5 = ");
Serial.println(resolutio,DEC);
break;
case 4: // 1/16 pas
PORTD &= B00011111;
delayMicroseconds(10);
PORTD |= B11100010; //224
tour = (48*16);
Serial.print("nombre de pas pour un tour = ");
Serial.println(tour,DEC);
micropulse = 2;
micro = 312;
Serial.println("1/16 pas");
resolutio=PIND & B11100000;
Serial.print("port D, bits 7, 6 et 5 = ");
Serial.println(resolutio,DEC);
break;
default: // full pas
PORTD &= B00011111;
// PORTD |= B00000010;
tour = 48;
Serial.print("nombre de pas pour un tour = ");
Serial.println(tour,DEC);
micropulse = 10;
micro = 5000;
Serial.println("full pas");
resolutio=PIND & B11100000; //00
Serial.print("port D, bits 7, 6 et 5 = ");
Serial.println(resolutio,DEC);
break;
}
}