Bonjour
une petite présentation d'un de mes projets, terminé, fonctionnel et évolutif qui peut aussi servir de base a certains, en privilégiant simplicité et rapidité de la machine, sans PC, sans modification structurelle de la fraiseuse (Vis d'origine etc...)
Le but n'était pas d'en faire une CNC car j'en ai déjà une mais de motoriser les axes pour les pièces assez importantes ou pour les ébauches a finir sur la CN.
Gestion Arduino sur Mega2560 / Accelstepper.
Machine Weiss WBM45L :Grande table et visu, Fraiseuse de gamme supérieure pour un atelier indépendant- de bricoleur comme moi
Motorisation des axes : PAP 6Nm Xet Y, 12 Nm pour le Z , surmultiplication poulie et courroie 1/3 pour concilier vitesse encombrement et couple.
Manque un peu de silicone autour des toles pour eviter les vibrations sur les vidéos.
Photo machine :
Mise en route :
Mise en route
Deux curseur pour chaque axes un pour la vitesse, l'autre pour la distance a parcourir
interruption par bouton stop (rouge) avec décélération.
Mise a zero des axes par bouton rouge si tous les curseurs sont a Zero (A venir installation de FDC pour faire les POM)
Deplacement : Deplacement A vide
Ce n'est pas une CN donc pas de recherche de rapidité extrême surtout sur queue d'aronde
Je limite la vitesse des axes ils peuvent aller beaucoup plus vite mais au risque de perte de pas et cela n'aurait pas grande utilité pour mon utilisation.
Usinage :
Le premier depuis la modif , le contour alu de l'ecran du boitier.
Usinage contour ecran
Les axes se deplacent de 1/100 eme de millimètres jusqu'a 50 cm donc on peut travailler avec precision.
Le code (sans prétention car très amateur !!! mais fonctionnel, utilisation abusive des variables globales, des if a la place des case etc etc ) encore a developper pour la répétitivité des mouvements ou la création de points.
/*
Motorissation fraiseuse WBM45L
*/
#include <Stepper.h>
#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>
#include <SoftwareSerial.h>
SoftwareSerial maConnection(10, 11); //RX|TX
LiquidCrystal_I2C lcd(0x27, 20, 4);
long PosX;
const double PosXMax = 69420;
double PosXMin = 0;
double PasAFaireX = 0;
int SpeedX = 2500;
int AccelX = 300;
int SpeedXMax = 2500;
int ManuelX;
long PosXToGo = 0;
double PosXV;
long PosY;
const double PosYMax = 29370;
double PosYMin = 0;
double PasAFaireY = 0;
int Ytemp;
int SpeedY = 3000;
int AccelY = 3000;
int SpeedYMax = 300;
int ManuelY;
long PosYToGo = 0;
String PasLcdY;
String PasLcdZ;
String PasLcdX;
String PasLcdYOld;
String PasLcdZOld;
String PasLcdXOld;
int VitLcdY;
int VitLcdZ;
int VitLcdX;
int VitLcdYOld;
int VitLcdXOld;
int VitLcdZOld;
int Cote;
double PosYV;
long PosZ;
const double PosZMax = 69420;
double PosZMin = 0;
double PasAFaireZ = 0;
int SpeedZ = 2000;
int AccelZ = 1000;
int SpeedZMax = 2000;
int ManuelZ;
double PosZToGo = 0;
double PosZV;
String XLong;
//variables Joy
const int JoyGH = A10;
int VJoyGH;
const int JoyGB = A11;
int VJoyGB;
const int JoyGG = A15;
int VJoyGG;
const int JoyGD = A9;
int VJoyGD;
const int JoyDH = A14;
int VJoyDH;
const int JoyDB = A12;
int VJoyDB;
const int JoyDG = A13;
int VJoyDG;
const int JoyDD = A8;
int VJoyDD;
const int Cur1 = A7;
int VCur1;
const int Cur2 = A6;
int VCur2;
const int Cur3 = A5;
int VCur3;
const int Cur4 = A3;
int VCur4;
const int Cur5 = A2;
int VCur5;
const int Cur6 = A1;
int VCur6;
const int VarD = A4;
int VVarD;
const int VarG = A0;
int VVarG;
const int BtnStop = 23;
int VBtnStop;
int VBtnStopOld;
const int Rien2 = 25; //jaune
const int LedJD = 27; //Bleu
const int LedRD = 29; //noir
const int LedVD = 31; //blanc
const int LedRG = 33; //Rouge
const int LedVG = 35; //vert
const int LedJG = 37; //jaune
byte StepperXDir = 28;
byte StepperXPul = 26;
byte StepperYDir = 32;
byte StepperYPul = 30;
byte StepperZDir = 38;
byte StepperZPul = 36;
AccelStepper StepperX(1, 26, 28);
AccelStepper StepperY(1, 30, 32);
AccelStepper StepperZ(1, 36, 38);
int Potard;
int Vit = 801;
//Diverse
char msg = ' ';
char key;
int CodeCh;
int Compteur = 1;
int stepCount = 0;
void PotardSelect() {
Potard = analogRead(A0);
if (Potard < 20) { Vit = 1; }
if (Potard < 50) { Vit = 10; }
if (Potard < 80) { Vit = 100; }
if (Potard < 100) { Vit = 1000; }
if (Potard < 110) { Vit = 1500; }
if (Potard < 100) { Vit = 2000; }
}
void setup() {
// Init Joystick Physique
pinMode(JoyGH, INPUT_PULLUP);
pinMode(JoyGB, INPUT_PULLUP);
pinMode(JoyGG, INPUT_PULLUP);
pinMode(JoyGD, INPUT_PULLUP);
pinMode(JoyDH, INPUT_PULLUP);
pinMode(JoyDB, INPUT_PULLUP);
pinMode(JoyDG, INPUT_PULLUP);
pinMode(JoyDD, INPUT_PULLUP);
pinMode(23, OUTPUT);
digitalWrite(BtnStop, HIGH);
pinMode(25, OUTPUT);
pinMode(27, OUTPUT);
pinMode(29, OUTPUT);
pinMode(31, OUTPUT);
pinMode(33, OUTPUT);
pinMode(35, OUTPUT);
pinMode(37, OUTPUT);
pinMode(36, OUTPUT);
pinMode(38, OUTPUT);
Serial.begin(9600); // default baud rate
//initialise LCD
lcd.begin(16, 2);
lcd.init(); // initialisation de l'afficheur
lcd.backlight();
}
void MoteurXD() {
StepperX.setMaxSpeed(SpeedX);
StepperX.setAcceleration(SpeedX / 5);
PosXToGo = PosX + (PasAFaireX);
if (PosXToGo > PosXMax) { PosXToGo = PosXMax; }
StepperX.moveTo(PosXToGo);
while (StepperX.isRunning() > 0) {
StepperX.run();
BoutonStop();
}
PosX = PosXToGo;
StepperX.setCurrentPosition(PosXToGo);
lcd.setCursor(5, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("VitX:");
lcd.setCursor(5, 0);
lcd.print(VitLcdX);
lcd.setCursor(15, 0);
lcd.print(" ");
lcd.setCursor(10, 0);
lcd.print("PasX:");
lcd.setCursor(15, 0);
lcd.print(PasLcdX);
lcd.setCursor(0, 3);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(PosX);
return;
}
void MoteurXG() {
StepperX.setMaxSpeed(SpeedX);
StepperX.setAcceleration(SpeedX / 5);
PosXToGo = PosX - PasAFaireX;
if (PosXToGo < PosXMin) { PosXToGo = PosXMin; }
StepperX.moveTo(PosXToGo);
while (StepperX.isRunning() > 0) {
StepperX.run();
BoutonStop();
}
PosX = PosXToGo;
StepperX.setCurrentPosition(PosXToGo);
lcd.setCursor(5, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("VitX:");
lcd.setCursor(5, 0);
lcd.print(VitLcdX);
lcd.setCursor(15, 0);
lcd.print(" ");
lcd.setCursor(10, 0);
lcd.print("PasX:");
lcd.setCursor(15, 0);
lcd.print(PasLcdX);
PosX = StepperX.currentPosition();
lcd.setCursor(0, 3);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(PosX);
return;
}
void MoteurYAR() {
StepperY.setMaxSpeed(SpeedY);
StepperY.setAcceleration(SpeedY / 5);
PosYToGo = PosY + (PasAFaireY);
if (PosYToGo > PosYMax) { PosYToGo = PosYMax; }
StepperY.moveTo(PosYToGo);
while (StepperY.isRunning() > 0) {
StepperY.run();
BoutonStop();
}
PosY = PosYToGo;
StepperY.setCurrentPosition(PosYToGo);
lcd.setCursor(5, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("VitY:");
lcd.setCursor(5, 1);
lcd.print(VitLcdY);
lcd.setCursor(15, 1);
lcd.print(" ");
lcd.setCursor(10, 1);
lcd.print("PasY:");
lcd.setCursor(15, 1);
lcd.print(PasLcdY);
lcd.setCursor(7, 3);
lcd.print(" ");
lcd.setCursor(7, 3);
lcd.print(PosY);
return;
}
void MoteurYAV() {
StepperY.setMaxSpeed(SpeedY);
StepperY.setAcceleration(SpeedY / 5);
PosYToGo = PosY - PasAFaireY;
if (PosYToGo < PosYMin) { PosYToGo = PosYMin; }
StepperY.moveTo(PosYToGo);
while (StepperY.isRunning() > 0) {
StepperY.run();
BoutonStop();
}
PosY = PosYToGo;
StepperY.setCurrentPosition(PosYToGo);
lcd.setCursor(5, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("VitY:");
lcd.setCursor(5, 1);
lcd.print(VitLcdY);
lcd.setCursor(15, 1);
lcd.print(" ");
lcd.setCursor(10, 1);
lcd.print("PasY:");
lcd.setCursor(15, 1);
lcd.print(PasLcdY);
PosY = StepperY.currentPosition();
lcd.setCursor(7, 3);
lcd.print(" ");
lcd.setCursor(7, 3);
lcd.print(PosY);
return;
}
void MoteurZH() {
StepperZ.setMaxSpeed(SpeedZ);
StepperZ.setAcceleration(SpeedZ / 5);
PosZToGo = PosZ + (PasAFaireZ);
StepperZ.moveTo(PosZToGo);
while (StepperZ.isRunning() > 0) {
StepperZ.run();
BoutonStop();
}
PosZ = PosZToGo;
StepperZ.setCurrentPosition(PosZToGo);
lcd.setCursor(5, 2);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print("VitZ:");
lcd.setCursor(5, 2);
lcd.print(VitLcdZ);
lcd.setCursor(15, 2);
lcd.print(" ");
lcd.setCursor(10, 2);
lcd.print("PasZ:");
lcd.setCursor(15, 2);
lcd.print(PasLcdZ);
lcd.setCursor(13, 3);
lcd.print(" ");
lcd.setCursor(15, 3);
lcd.print(PosZ);
return;
}
void MoteurZB() {
StepperZ.setMaxSpeed(SpeedZ);
StepperZ.setAcceleration(SpeedZ / 5);
PosZToGo = PosZ - PasAFaireZ;
if (PosZToGo < PosZMin) { PosZToGo = PosZMin; }
StepperZ.moveTo(PosZToGo);
while (StepperZ.isRunning() > 0) {
StepperZ.run();
BoutonStop();
}
PosZ = PosZToGo;
StepperZ.setCurrentPosition(PosZToGo);
lcd.setCursor(5, 2);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print("VitZ:");
lcd.setCursor(5, 2);
lcd.print(VitLcdZ);
lcd.setCursor(15, 2);
lcd.print(" ");
lcd.setCursor(10, 2);
lcd.print("PasZ:");
lcd.setCursor(15, 2);
lcd.print(PasLcdZ);
lcd.setCursor(15, 3);
lcd.print(" ");
lcd.setCursor(15, 3);
lcd.print(PosZ);
return;
}
void BoutonStop() {
if (digitalRead(BtnStop) == LOW) {
StepperX.stop();
StepperY.stop();
StepperZ.stop();
}
}
void EffaceLcd() {
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(" ");
}
void loop() {
//EffaceLcd();
if (Serial.available()) { msg = Serial.read(); }
VJoyDH = analogRead(JoyDH);
VJoyDB = analogRead(JoyDB);
VJoyDG = analogRead(JoyDG);
VJoyDD = analogRead(JoyDD);
VJoyGH = analogRead(JoyGH);
VJoyGB = analogRead(JoyGB);
VJoyGG = analogRead(JoyGG);
VJoyGD = analogRead(JoyGD);
VBtnStop = digitalRead(BtnStop);
//remise a 10000
if (VBtnStop == 0 && PasAFaireX > 500 && SpeedX > 500) {
PosXMin = -30000;
PosYMin = -30000;
PosZMin = -30000;
digitalWrite(27, HIGH);
digitalWrite(29, HIGH);
digitalWrite(31, HIGH);
digitalWrite(33, HIGH);
digitalWrite(35, HIGH);
digitalWrite(37, HIGH);
delay(1000);
digitalWrite(27, LOW);
digitalWrite(29, LOW);
digitalWrite(31, LOW);
digitalWrite(33, LOW);
digitalWrite(35, LOW);
digitalWrite(37, LOW);
lcd.setCursor(0, 3);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(PosX);
lcd.setCursor(7, 3);
lcd.print(" ");
lcd.setCursor(7, 3);
lcd.print(PosY);
lcd.setCursor(14, 3);
lcd.print(" ");
lcd.setCursor(14, 3);
lcd.print(PosZ);
}
//remise a 0
if (VBtnStop == 0 && PasAFaireX < 500 && SpeedX < 500) {
PosX = 0;
PosY = 0;
PosZ = 0;
PosXMin = 0;
PosYMin = 0;
PosZMin = 0;
digitalWrite(27, HIGH);
digitalWrite(29, HIGH);
digitalWrite(31, HIGH);
digitalWrite(33, HIGH);
digitalWrite(35, HIGH);
digitalWrite(37, HIGH);
delay(1000);
digitalWrite(27, LOW);
digitalWrite(29, LOW);
digitalWrite(31, LOW);
digitalWrite(33, LOW);
digitalWrite(35, LOW);
digitalWrite(37, LOW);
lcd.setCursor(0, 3);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(PosX);
lcd.setCursor(7, 3);
lcd.print(" ");
lcd.setCursor(7, 3);
lcd.print(PosY);
lcd.setCursor(14, 3);
lcd.print(" ");
lcd.setCursor(14, 3);
lcd.print(PosZ);
}
//ZoneX
if (VJoyDG < 300) {
digitalWrite(35, HIGH);
MoteurXG();
}
if (VJoyDD < 300) {
digitalWrite(31, HIGH);
MoteurXD();
}
digitalWrite(31, LOW);
digitalWrite(35, LOW); //MoteurX desactivé
VCur6 = analogRead(Cur6);
if (VCur6 < 50) {
PasAFaireX = 1;
PasLcdX = "1 CEN";
}
if (VCur6 > 51 && VCur6 < 150) {
PasAFaireX = 12;
PasLcdX = "1 DIX";
}
if (VCur6 > 151 && VCur6 < 300) {
PasAFaireX = 135;
PasLcdX = "1 MM";
}
if (VCur6 > 301 && VCur6 < 450) {
PasAFaireX = 1335;
PasLcdX = "1 CM";
}
if (VCur6 > 451 && VCur6 < 600) {
PasAFaireX = 6675;
PasLcdX = "5 CM";
}
if (VCur6 > 601 && VCur6 < 750) {
PasAFaireX = 13350;
PasLcdX = "10 CM";
}
if (VCur6 > 751 && VCur6 < 900) {
PasAFaireX = 26700;
PasLcdX = "20 CM";
}
if (VCur6 > 901 && VCur6 < 1030) {
PasAFaireX = 66750;
PasLcdX = "50 CM";
}
VCur5 = analogRead(Cur5);
if (VCur5 < 50) {
SpeedX = 1;
VitLcdX = 1;
}
if (VCur5 > 50 && VCur5 < 199) {
SpeedX = 10;
VitLcdX = 10;
}
if (VCur5 > 200 && VCur5 < 399) {
SpeedX = 100;
VitLcdX = 100;
}
if (VCur5 > 400 && VCur5 < 599) {
SpeedX = 500;
VitLcdX = 500;
}
if (VCur5 > 600 && VCur5 < 799) {
SpeedX = 1000;
VitLcdX = 1000;
}
if (VCur5 > 800 && VCur5 < 999) {
SpeedX = 1500;
VitLcdX = 1500;
}
if (VCur5 > 1000) {
SpeedX = 2800;
VitLcdX = 2800;
}
//ZoneY2
if (VJoyDH < 300) {
digitalWrite(37, HIGH);
MoteurYAR();
}
if (VJoyDB < 300) {
digitalWrite(27, HIGH);
MoteurYAV();
}
digitalWrite(27, LOW);
digitalWrite(37, LOW); //Moteur Y desactivé
//Dplacement Y
VCur2 = analogRead(Cur2);
if (VCur2 < 50) {
PasAFaireY = 1;
PasLcdY = "1 CEN";
}
if (VCur2 > 51 && VCur2 < 150) {
PasAFaireY = 12;
PasLcdY = "1 DIY";
}
if (VCur2 > 151 && VCur2 < 300) {
PasAFaireY = 135;
PasLcdY = "1 MM";
}
if (VCur2 > 301 && VCur2 < 450) {
PasAFaireY = 1335;
PasLcdY = "1 CM";
}
if (VCur2 > 451 && VCur2 < 600) {
PasAFaireY = 6675;
PasLcdY = "5 CM";
}
if (VCur2 > 601 && VCur2 < 750) {
PasAFaireY = 13350;
PasLcdY = "10 CM";
}
if (VCur2 > 751 && VCur2 < 900) {
PasAFaireY = 26700;
PasLcdY = "20 CM";
}
if (VCur2 > 901 && VCur2 < 1030) {
PasAFaireY = 66750;
PasLcdY = "50 CM";
}
//Vitesse Y
VCur1 = analogRead(Cur1);
if (VCur1 < 50) {
SpeedY = 1;
VitLcdY = 1;
}
if (VCur1 > 50 && VCur1 < 199) {
SpeedY = 10;
VitLcdY = 10;
}
if (VCur1 > 200 && VCur1 < 299) {
SpeedY = 100;
VitLcdY = 100;
}
if (VCur1 > 300 && VCur1 < 399) {
SpeedY = 500;
VitLcdY = 500;
}
if (VCur1 > 400 && VCur1 < 499) {
SpeedY = 1000;
VitLcdY = 1000;
}
if (VCur1 > 500 && VCur1 < 599) {
SpeedY = 1500;
VitLcdY = 1500;
}
if (VCur1 > 600) {
SpeedY = 2000;
VitLcdY = 2000;
}
//
//ZoneZ
if (VJoyGH < 300) {
digitalWrite(29, HIGH);
MoteurZH();
}
if (VJoyGB < 300) {
digitalWrite(33, HIGH);
MoteurZB();
}
digitalWrite(29, LOW);
digitalWrite(33, LOW); //Moteur Z desactivé
VCur4 = analogRead(Cur4);
if (VCur4 < 50) {
PasAFaireZ = 1;
PasLcdZ = "1 CENT";
}
if (VCur4 > 51 && VCur4 < 100) {
PasAFaireZ = 10;
PasLcdZ = "1 DIX";
}
if (VCur4 > 101 && VCur4 < 200) {
PasAFaireZ = 139;
PasLcdZ = "1 MM";
}
if (VCur4 > 201 && VCur4 < 400) {
PasAFaireZ = 1390;
PasLcdZ = "1 CM";
}
if (VCur4 > 401 && VCur4 < 600) {
PasAFaireZ = 13900;
PasLcdZ = "10 CM";
}
if (VCur4 > 601 && VCur4 < 800) {
PasAFaireZ = 27800;
PasLcdZ = "20 CM";
}
if (VCur4 > 801 && VCur4 < 1000) {
PasAFaireZ = 69700;
PasLcdZ = "50 CM";
}
if (VCur4 > 1000) {
PasAFaireZ = 50000;
PasLcdZ = 75000;
}
VCur3 = analogRead(Cur3);
if (VCur3 < 50) {
SpeedZ = 1;
VitLcdZ = 1;
}
if (VCur3 > 50 && VCur3 < 200) {
SpeedZ = 100;
VitLcdZ = 10;
}
if (VCur3 > 200 && VCur3 < 400) {
SpeedZ = 500;
VitLcdZ = 100;
}
if (VCur3 > 400 && VCur3 < 600) {
SpeedZ = 1000;
VitLcdZ = 500;
}
if (VCur3 > 600 && VCur3 < 800) {
SpeedZ = 1500;
VitLcdZ = 1500;
}
if (VCur3 > 800 && VCur3 < 1000) {
SpeedZ = 2000;
VitLcdZ = 2000;
}
if (VCur3 > 1000) {
SpeedZ = 2500;
VitLcdZ = 2500;
VitLcdZ = 2500;
}
if (VitLcdXOld != VitLcdX) {
lcd.setCursor(5, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("VitX:");
lcd.setCursor(5, 0);
lcd.print(VitLcdX);
VitLcdXOld = VitLcdX;
}
if (PasLcdXOld != PasLcdX) {
lcd.setCursor(15, 0);
lcd.print(" ");
lcd.setCursor(10, 0);
lcd.print("PasX:");
lcd.setCursor(15, 0);
lcd.print(PasLcdX);
lcd.print(XLong);
PasLcdXOld = PasLcdX;
}
if (VitLcdYOld != VitLcdY) {
lcd.setCursor(5, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("VitY:");
lcd.setCursor(5, 1);
lcd.print(VitLcdY);
VitLcdYOld = VitLcdY;
}
if (PasLcdYOld != PasLcdY) {
lcd.setCursor(15, 1);
lcd.print(" ");
lcd.setCursor(10, 1);
lcd.print("PasY:");
lcd.setCursor(15, 1);
lcd.print(PasLcdY);
PasLcdYOld = PasLcdY;
}
if (VitLcdZOld != VitLcdZ) {
lcd.setCursor(5, 2);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print("VitZ:");
lcd.setCursor(5, 2);
lcd.print(VitLcdZ);
VitLcdZOld = VitLcdZ;
}
if (PasLcdZOld != PasLcdZ) {
lcd.setCursor(15, 2);
lcd.print(" ");
lcd.setCursor(10, 2);
lcd.print("PasZ:");
lcd.setCursor(15, 2);
lcd.print(PasLcdZ);
PasLcdZOld = PasLcdZ;
}
// if (VBtnStop!=VBtnStopOld){lcd.setCursor (5, 3);lcd.print(" ");lcd.setCursor (0, 3); lcd.print("BtnS:"); lcd.setCursor (5, 3);lcd.print(VBtnStop);VBtnStopOld=VBtnStop;}
msg = "";
}