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.
![]()
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... ![]()
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
(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
c'est bon merci ![]()
ca me bloque les 2 moteur mais il n'y en a aucun qui tourne ![]()
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





