Code pour fraisage automatique

Bonjour a tous,
voila mon souci: j'ai réaliser banc pour fraiser deux pièces en série avec le même outil.
j'utilise 2 moteur Néma 17 avec un Arduino uno et sont Shield V3.
le 1er moteur et utiliser pour la fraise et le 2em pour l'axe z.
je n'arrive pas a crée un code pour les faire fonctionner et j'airais besoin d'une aide pour finir ce projet.
la ou ca se complique, c'est que je dois réaliser 1 chanfrein sur 2 pièces différente.
j'ai réaliser les support en impression 3D mais je dois abaisser la ma fraise de 0.10mm une fois en contacte avec la pièces.
je pensais donc a pouvoir faire comme pour le nivèlement des imprimantes 3D, une fois en contacte maitre le moteur un route pour réaliser ce chanfrein avec précision.
une petite photo pour mieux comprendre le sujet.
merci d'avance pour votre aide.

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Bonjour pascal-77

Oui, tu peux faire ainsi, à condition que ta pièce soit métallique et isolée du reste de la machine.
Ainsi, tu connectes ta pièce sur une pin de l'Arduino et la fraise à GND, tu fais descendre Z jusqu'à avoir LOW sur la pin de mesure.

Si tu veux un exemple... :wink:

Cordialement
jpbbricole

Merci jpbbricole,
je début en codage ou j'essaye également le no code mais c'est pas évidant. je prend des bout de code a droite et a gauche pour essayer de faire quelque chose. mais le résulta n'est pas du tout au RDV :frowning: (en même temps quand on comprend pas vraiment ce qu'on fait...)

Bonjour pascal-77

Ce sera un bon exemple pour débuter avec le "trouple" Shield CNC V3, A4988 et Nema 17.

Sur ton axe Z, quel est le pas de la vis?

A+
Bone journée
jpbbricole

Effectivement, tu peux aussi nous montrer tes essais de code, on pourra alors te coneiller au mieux sur ce qui ne va pas ou n'est pas correctement assimilé.
Cela à mon avis, beaucoup plus productif que d'essayer de lego(ter) des bout de codes plus ou moins adapté à ce que tu veux faire.

j'ai récupérer l'axe z sur une imprimante résine.
donc pour le pas je ne c'est pas encore j'ai pas regarder. pour le moment je suis sur un code mais ca ne marche pas. le moteur chauffe et vibre.

voila un des code que j'ai essayer.

const int stepX = 2;
const int dirX  = 5;
const int stepZ = 4;
const int dirZ  = 7;
const int enPin = 8;

void setup() {
  pinMode(stepX,OUTPUT);
  pinMode(dirX,OUTPUT);
  pinMode(stepZ,OUTPUT);
  pinMode(dirZ,OUTPUT);
  pinMode(enPin,OUTPUT);
  digitalWrite(enPin,LOW);
  digitalWrite(dirX,HIGH);
  digitalWrite(dirZ,HIGH);
}

void loop() {

  for(int x = 0; x < 800; x++) {
    digitalWrite(stepX,HIGH);
    delayMicroseconds(1000);
    digitalWrite(stepX,LOW);
    delayMicroseconds(1000);
  }
  
}

j'ai même essayer avec chat GPT mais ca ne fonctionne pas non plus

Bonjour,

Tu as un probléme de moteur qui chauffe et qui vibre, c'est électromécanique, veut tu bien nous présenter STP tes lignes de câblage en plus de celles de code parce que

for(int x = 0; x < 800; x++) {
    digitalWrite(stepX,HIGH);
    delayMicroseconds(1000);
    digitalWrite(stepX,LOW);
    delayMicroseconds(1000);
  }

Ce n'est pas trés parlant je trouve si on ne sait pas qui est derriére "stepX"

Bonjour pascal-77

Si tu veux faire une machine CNC, la première chose à faire, est d'utiliser une bibliothèque pour gérer tes moteurs, j'utilise AccelStepper

Je te prépare un bout de code pour "faire le zéro" sur ta machine.

A+
jpbbricole


je n'arrive donc pas a faire tourner les moteur en X et Z
X doit tourner dans le sens des aiguilles d'une montre (pour l'utilisation de la fraise)
et le Z devra pouvoir faire un home (comme les imprimante 3D) pour trouver sa position afin d'utiliser le fraise sur une hauteur de 0,10MM je nage plus je coule pour codé. après je ne connait vraiment rien au codage j'essaye de trouver des bout de code a droit et a gauche pour arriver a faire quelques chose.

voici le code obtenu par chat GPT mais qui ne fonctionne absolument pas

#include <AccelStepper.h>

// Définition des broches
#define X_STEP_PIN 3   // Broche pour STEP de l'axe X
#define X_DIR_PIN 4    // Broche pour DIR de l'axe X
#define Z_STEP_PIN 5   // Broche pour STEP de l'axe Z
#define Z_DIR_PIN 6    // Broche pour DIR de l'axe Z
#define Z_ENDSTOP_PIN 2 // Broche pour le fin de course de l'axe Z

// Initialisation des objets stepper
AccelStepper stepperX(AccelStepper::DRIVER, X_STEP_PIN, X_DIR_PIN);
AccelStepper stepperZ(AccelStepper::DRIVER, Z_STEP_PIN, Z_DIR_PIN);

void setup() {
  pinMode(Z_ENDSTOP_PIN, INPUT_PULLUP); // Configurer le fin de course comme entrée
  stepperX.setMaxSpeed(300); // Vitesse maximale pour l'axe X
  stepperX.setAcceleration(150); // Accélération pour l'axe X
  
  stepperZ.setMaxSpeed(200); // Vitesse maximale pour l'axe Z
  stepperZ.setAcceleration(100); // Accélération pour l'axe Z
}

void loop() {
  if (digitalRead(Z_ENDSTOP_PIN) == LOW) { // Vérifiez si le fin de course est activé
    // Déplacer l'axe Z vers le bas de 10 pas (0,10 mm)
    stepperZ.moveTo(-10);
    while (stepperZ.distanceToGo() != 0) {
      stepperZ.run();
    }

    // Lancer le fraisage : déplacer l'axe X de 1200 pas pour 6 tours
    stepperX.moveTo(1200);
    while (stepperX.distanceToGo() != 0) {
      stepperX.run();
    }

    // Remonter l'axe Z après le fraisage
    stepperZ.moveTo(0); // Remonter à la position d'origine
    while (stepperZ.distanceToGo() != 0) {
      stepperZ.run();
    }

    delay(1000); // Attendre avant de redémarrer
  } else {
    // Optionnel : Peut être utilisé pour réinitialiser l'axe Z
    stepperZ.moveTo(0); // Position d'origine si le fin de course n'est pas activé
    while (stepperZ.distanceToGo() != 0) {
      stepperZ.run();
    }
  }
}

Voici le code pour le homing:
Le bouton de démarrage de l'opération est sur 11 et est, d'un côté à GND.
Lsonde est sur 10 et est, d'un côté à GND.

Le programme:

/*
    Name:       AF_pascal_77_Zero_Z.ino
    Created:	08.02.2025
    Author:     jpbbricole
	Remarque:	Mize à zéro de l'axe Z d'une CNC
				https://forum.arduino.cc/t/code-pour-fraisage-automatique/1351668
	08.02.2025	Première version #12
	17.02.2025	Cosmétique #12
*/

#include <AccelStepper.h> // https://www.pjrc.com/teensy/td_libs_AccelStepper.html

//------------------------------------- Définitions du moteur
const float mpapSpeed = 800; // Vitesse maximum
const float mpapSpeedRecherche = mpapSpeed / 4; // Vitesse recherche
const float mpapAcceleration = 800; // Accélération

const int dirZpin = 7; // Broche du signal DIR (Brochage GRBL)
const int stepZpin = 4; // Broche du signal STEP (Brochage GRBL)
const int enaPin = 8; // Broche du signal ENA, commun à tout les axes (Brochage GRBL)

const long mpapPasTour = 200; // Nombre de pas/tour
const float visPasMm = 4.0; // Pas de la vis de l'axe
const float mpapPasMm = visPasMm / mpapPasTour; // Millimètres de chaque pas 
const float mpapVisRetraitMm = 1.0; // Une fois touché, retrait de la fraise

AccelStepper mpap(AccelStepper::DRIVER, stepZpin, dirZpin);

//------------------------------------- Bouton de démarrage
const int btnStartPin = 11; // Pin bouton de démarrage (Limit Z)
const int btnStartEtatOn = LOW; // Etat du bouton actif, un côté du bouton à GND

//------------------------------------- Sonde de zéro
const int sondetPin = 10; // Pin sonde (Limit Y)
const int sondeEtatOn = LOW; // Etat de la sonde active, un côté de la sonde à GND
const float sondeTick = 0.0; // öpaisseeur de la sonde en mm

void setup()
{
	Serial.begin(115200);

	pinMode(btnStartPin, INPUT_PULLUP); // Un côté du bouton à GND
	pinMode(sondetPin, INPUT_PULLUP); // Un côté du bouton à GND
	
	// Réglages du moteur
	mpap.setEnablePin(enaPin);
	mpap.setPinsInverted(false, false, true); // Inversion des signaux dir, step et ena
	mpap.setMaxSpeed(mpapSpeed); // Vitesse maximum
	mpap.setAcceleration(mpapAcceleration); // Accélération
	mpap.enableOutputs(); // Activation du moteur	
}

void loop()
{
	if (digitalRead(btnStartPin) == btnStartEtatOn) // Si bouton starrt pressé
	{
		toZeroStart();
		displayInfo();
		delay(500);
		displayInfo();
	}

}

void toZeroStart()
{
	Serial.println("Recherche du zero");
	
	mpap.setSpeed(-(mpapSpeedRecherche)); // Descendre en direction du fin de course vitesse de recherche
	
	while (digitalRead(sondetPin) != sondeEtatOn) 
	{
		mpap.runSpeed(); // Déplacement à vitesse constante
	}
	
	Serial.println("\t Zero atteint");
	mpap.stop(); // Moteur arrivé, arrêt du moteur
	mpap.setCurrentPosition(0); // Définir le zéro
	
	Serial.println("\t Retrait mm: " + String(mpapVisRetraitMm));
	mpapMoveMm(mpapVisRetraitMm); // Retrait de l'axe

	mpap.setMaxSpeed(mpapSpeed); // Remettre la vitesse maximum
	mpap.setAcceleration(mpapAcceleration); // Accélération
}

void mpapMoveMm(float mm) // Se déplacer de x mm
{
	Serial.println("Aller a mm: " + String(mm));
	long pasMm = mm / mpapPasMm; // Nombre de pas de déplacement
	
	mpap.move(pasMm);
	while (mpap.distanceToGo() != 0) 
	{
		mpap.run();
	}

//Serial.println(pasMm);		
}

void displayInfo() // Affichage d'informations
{
	Serial.println("L'axe se trouve a mm: " + String(mpap.currentPosition() * mpapPasMm));
}

Pour démarrer la recherche du zéro, presser sur le bouton btnStartPin, le moteur tourne tant que sondetPin n'est pas trouvé. Une fois trouvé, le moteur se dégage de la pièce de mpapVisRetraitMm.
Il y a des indications quant au fonctionnement du programme, dans le moniteur de l'IDE à 115200.

A+
Cordialement
jpbbricole

Dans la question, tu as oublié de spécifier l'usage du CNC shield V3.

Ne pas oublier, l'usage du CNC shield V3 impose un brochage à la "norme" GRBL.

Si ça persiste, dans un premier temps, tourne le potentiomètre d'un quart de tour dans le sens inverse des aiguilles d'une montre:


On affinera plus tard.

A+
jpbbricole

Merci jpbbricole pour le code (même si j'ai pas vraiment compris je vais essayer)

j'utilise la sheld V3 pour l'utilisation des 2 moteur néma 1 pour l'axe Z monter et décente et en 2 le moteur néma qui est brancher sur la partie X qui fait tourner la fraise.

j'ai réussi à les régler (normalement merci YouTube lol) il son régler a 0.75V

jpbbriole, impossible de le compiler:

C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino:2:14: error: too many decimal points in number
Created: 08.02.2025
^~~~~~~~~~
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino:4:17: error: stray '\303' in program
Remarque: Mize à zéro de l'axe Z d'une CNC
^
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino:4:18: error: stray '\240' in program
Remarque: Mize à zéro de l'axe Z d'une CNC
^
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino:4:21: error: stray '\303' in program
Remarque: Mize à zéro de l'axe Z d'une CNC
^
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino:4:22: error: stray '\251' in program
Remarque: Mize à zéro de l'axe Z d'une CNC
^
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino:1:5: error: found ':' in nested-name-specifier, expected '::'
Name: AF_pascal_77_Zero_Z.ino
^
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino:1:1: error: 'Name' does not name a type
Name: AF_pascal_77_Zero_Z.ino
^~~~
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino:23:1: error: 'AccelStepper' does not name a type; did you mean 'AccelStepper_h'?
AccelStepper mpap(AccelStepper::DRIVER, stepZpin, dirZpin);
^~~~~~~~~~~~
AccelStepper_h
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino: In function 'void setup()':
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino:42:2: error: 'mpap' was not declared in this scope
mpap.setEnablePin(enaPin);
^~~~
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino:42:2: note: suggested alternative: 'map'
mpap.setEnablePin(enaPin);
^~~~
map
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino: In function 'void loop()':
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino:54:3: error: 'displayInfo' was not declared in this scope
displayInfo();
^~~~~~~~~~~
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino: In function 'void toZeroStart()':
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino:66:2: error: 'mpap' was not declared in this scope
mpap.setSpeed(-(mpapSpeed / 4)); // Descendre en direction du fin de course 4 x moins vite
^~~~
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino:66:2: note: suggested alternative: 'map'
mpap.setSpeed(-(mpapSpeed / 4)); // Descendre en direction du fin de course 4 x moins vite
^~~~
map
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino: In function 'void mpapGotoMm(float)':
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino:89:2: error: 'mpap' was not declared in this scope
mpap.move(pasMm);
^~~~
C:\Users\delis\AppData\Local\Temp.arduinoIDE-unsaved202518-17328-ppxh5z.vd3t\MotorKnob\MotorKnob.ino:89:2: note: suggested alternative: 'map'
mpap.move(pasMm);
^~~~
map

exit status 1

Compilation error: too many decimal points in number

Bonsoir pascal-77
As tu bien copié le code en cliquant sur l'icône:

Bonne soirée
jpbbricole

c'est bon merci :slight_smile:
ca me bloque les 2 moteur mais il n'y en a aucun qui tourne :frowning:

Bonne soirée à tous

Oui, c'est normal, il sont mis sous courant par:
mpap.enableOutputs(); // Activation du moteur

As tu mis un bouton sur:

//------------------------------------- Bouton de démarrage
const int btnStartPin = 11; // Pin bouton de démarrage
const int btnStartEtatOn = LOW; // Etat du bouton actif, un côté du bouton à GND

et un contact de sonde sur:

//------------------------------------- Sonde de zéro
const int sondetPin = 10; // Pin sonde
const int sondeEtatOn = LOW; // Etat de la sonde active, un côté de la sonde à GND