Août 2017 , par Techno_fabrik
Projet : Traceur commandé par joystick
LE PROJET
Commander un traceur 3 axes avec un manette comportant 2 joystick ( 1 XY et 1 Z).
Chaque axes sera finalisé par deux interrupteurs de fin de course qui permettront de conditionner le déplacement . Lorsqu'un interrupteur est actionné, une LED témoin s'allume.
Matériel
3 moteurs pas-à-pas NEMA 17
3 drivers A4988
6 interrupteurs de fin de courses
6 LEDs
résistances
3 condensateurs 47uF
2 Joysticks
carton
pistolet à colle
PRÉREQUIS :
Connaissance des risques électriques. Montage réalisable par tous. Notion d'électronique et bases en programmation.
RÉALISATION
ETAPE 1 : Moteurs pas-à-pas NEMA 17 + Driver A4988
Connecter le moteur au driver associé.
Alimenter en +12V les moteurs avec un condensateur en parallèle de 47uF. Alimenter le driver avec le +5V de l'arduino.
Connecter les liaisons step et dir qui contrôleront le pas du moteur et le sens de rotation.
ETAPE 2 : Joysticks
On connecte le joystick à une résistance et le point milieu est acheminé vers une entrée analogique.
ETAPE 3 : Interrupteurs de fin de course
On connecte un interrupteur avec une LED et des résistances . Le point milieu est amené vers une entrée analogique.
Programme (codé en C)
// 10/08/2017 - Programme C - Traceur X Y commande par joystick
// MATERIEL : 3 moteurs pas a pas NEMA 17
// 3 drivers A4988
// 1 alimentation 12 V 1A + alimentation arduino
// resistances
// 6 leds
// Ce programme a pour objectif de :
// - commander les moteurs pas a pas avec les joysticks pour ecrire sur un support papier
// - lorsqu'un fin de course est actionné, une led s'allume et le joystick ne permet plus d'aller dans la direction du fin de course
//
// Programme réalisé par Techno_Fabrik
//********************BIBLIOTHEQUES****************************
//********************DECLARATIONS****************************
int A4988_pas2 = 6; // moteur pas a pas nema 17 commande par le pas ( nombre de tours ) et la direction ( HIGH ou LOW)
int A4988_direction2 = 7;
int A4988_pas = 9;
int A4988_direction = 10;
int A4988_pas1 = 11;
int A4988_direction1 = 12;
int joystick1,joystick2,joystick3;// valeur des joysticks
int findecourseGD, findecourseHB, findecoursestylo;
int findecourseHB_bug_H=0, findecourseHB_bug_B=0, findecoursestylo_bug_B=0, findecoursestylo_bug_H=0, findecourseGD_bug_G=0, findecourseGD_bug_D=0; // permet de ne pas prendre en compte les faux contacts
//********************SETUP***********************************
void setup() // On initialise les pins 2 et 3 en sortie
{
pinMode(A4988_pas,OUTPUT);
pinMode(A4988_direction,OUTPUT);
pinMode(A4988_pas1,OUTPUT);
pinMode(A4988_direction1,OUTPUT);
pinMode(A4988_pas2,OUTPUT);
pinMode(A4988_direction2,OUTPUT);
Serial.begin(250000);
}
//************************** FONCTIONS ***********************************
// *********** BLOQUER LE MOTEUR LORS DE L'ACTIVATION DES FIN DE COURSE *******************
int fdcbug (int x,int fdc, int mini, int maxi)// fonction permettant d'éviter les faux contacts
{
if ( (fdc>mini) && (fdc < maxi) )
{
x = 30;
}
else
{
x = x-1;
if (x<0) x=0;
}
return x;
}
int interrupteur_max (int fdc_bug, int joystick, int joystickmax)
{
if (fdc_bug>1)
{
if ( joystick>joystickmax )
{
joystick = joystickmax;
}
}
return joystick;
}
int interrupteur_min (int fdc_bug, int joystick, int joystickmin)
{
if (fdc_bug>1)
{
if ( joystick<joystickmin )
{
joystick = joystickmin;
}
}
return joystick;
}
// *********** COMMANDER LES MOTEURS GRACE AUX JOYSTICKS *******************
void moteur ( int J, int J_min, int J_max, int dir_pap, int step_pap )
{
if( J > J_max)
{
digitalWrite(dir_pap,HIGH);
for(int x = 0; x < 1; x++)
{ // Permet de faire un PAS à une certaine allure. Pour tourner plus vite, changer le delay jusqu'à 1 , pour ralentir, le changer jusqu'à 30
digitalWrite(step_pap,HIGH); // On fait un tour avec 200 pas pour le Nema 17
delay(5);
digitalWrite(step_pap,LOW);
delay(5);
}
}
if( J < J_min)
{
digitalWrite(dir_pap,LOW);
for(int x = 0; x < 1; x++)
{ // Permet de faire un PAS à une certaine allure. Pour tourner plus vite, changer le delay jusqu'à 1 , pour ralentir, le changer jusqu'à 30
digitalWrite(step_pap,HIGH); // On fait un tour avec 200 pas pour le Nema 17
delay(5);
digitalWrite(step_pap,LOW);
delay(5);
}
}
}
// **************************** BOUCLE **************************
void loop() {
// *********** LECTURE DES ENTREE ANALOGIQUES : joystick + capteur de fin de course ***************
joystick1=analogRead(A0);
joystick1=map(joystick1,0,525,0,100);
joystick2=analogRead(A1);
joystick2=map(joystick2,0,525,0,100);
joystick3=analogRead(A2);
joystick3=map(joystick3,290,1025,0,100);//5 95
findecourseGD=analogRead(A3);
findecourseHB=analogRead(A4);
findecoursestylo=analogRead(A5);
// *********** BLOQUER LE MOTEUR LORS DE L'ACTIVATION DES FIN DE COURSE *******************
findecoursestylo_bug_H= fdcbug(findecoursestylo_bug_H,findecoursestylo,300,500);
findecoursestylo_bug_B=fdcbug(findecoursestylo_bug_B,findecoursestylo,15,300);
joystick3=interrupteur_max(findecoursestylo_bug_H,joystick3,59);
joystick3=interrupteur_min(findecoursestylo_bug_B, joystick3,11);
findecourseGD_bug_D= fdcbug(findecourseGD_bug_D,findecourseGD,100,200);
findecourseGD_bug_G= fdcbug(findecourseGD_bug_G,findecourseGD,230,500);
joystick2=interrupteur_max(findecourseGD_bug_G,joystick2,65);
joystick2=interrupteur_min(findecourseGD_bug_D,joystick2,65);
findecourseHB_bug_H= fdcbug(findecourseHB_bug_H,findecourseHB,200,500);
findecourseHB_bug_B= fdcbug(findecourseHB_bug_B,findecourseHB,30,200);
joystick1=interrupteur_max(findecourseHB_bug_H,joystick1,65);
joystick1=interrupteur_min(findecourseHB_bug_B,joystick1,65);
// *********** COMMANDER LES MOTEURS GRACE AUX JOYSTICKS *******************
moteur(joystick3,10,60,A4988_direction2,A4988_pas2);
moteur(joystick1,40,80,A4988_direction,A4988_pas);
moteur(joystick2,40,80,A4988_direction1,A4988_pas1);
}