int dirPin=4; //broche de direction
int pasPin=3; //broche de contrôle de pas
void setup(){
pinMode(dirPin,OUTPUT); //configuration des broches en "SORTIE"
pinMode(pasPin,OUTPUT);
}
void loop()
{
//utiisation de la fonction "positionnement" pour bouger le moteur 500 pas dans le sens horaire
positionnement(dirPin,pasPin,500);
//attendre une seconde
delay(1000);
//utiisation de la fonction "positionnement" pour bouger le moteur 500 pas dans le sens antihoraire
positionnement(dirPin,pasPin,-500);
//attendre une seconde
delay(1000);
}
//fonction de positionnement
void positionnement(int dir,int pas,int dist)
{
//on détermine la direction du moteur
if(dist>0)
digitalWrite(dir,HIGH); //"DIR" = 5V
else
digitalWrite(dir,LOW); //"DIR" = 0V
//tant que x ne depasse pas la distance
for(int x=0;x<abs(dist);x++)
{
//on envoit une pulsation qui fait avancer le moteur d'un pas
digitalWrite(pas,HIGH);
delay(1);
digitalWrite(pas,LOW);
delay(1);
}
}
/*
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;
}
}
Pensez vous que ce type de driver convient à ce type de moteur?
Car ça chauffe à fort!
Le montage est bon car ca marche bien avec NEMA17 avec ce programme :
int dirPin=4; //broche de direction
int pasPin=3; //broche de contrôle de pas
void setup(){
pinMode(dirPin,OUTPUT); //configuration des broches en "SORTIE"
pinMode(pasPin,OUTPUT);
}
void loop()
{
//utiisation de la fonction "positionnement" pour bouger le moteur 500 pas dans le sens horaire
positionnement(dirPin,pasPin,500);
//attendre une seconde
delay(10000);
//utiisation de la fonction "positionnement" pour bouger le moteur 500 pas dans le sens antihoraire
positionnement(dirPin,pasPin,-500);
//attendre une seconde
delay(10000);
}
//fonction de positionnement
void positionnement(int dir,int pas,int dist)
{
//on détermine la direction du moteur
if(dist>0)
digitalWrite(dir,HIGH); //"DIR" = 5V
else
digitalWrite(dir,LOW); //"DIR" = 0V
//tant que x ne depasse pas la distance
for(int x=0;x<abs(dist);x++)
{
//on envoit une pulsation qui fait avancer le moteur d'un pas
digitalWrite(pas,HIGH);
delay(4);
digitalWrite(pas,LOW);
delay(40);
}
}