Joystick / arduino / step moteur . Aide pour le programme a integrer dans l arduino

Bonjour,

Alors voila je suis chaudronnier .... etonnant je suppose mais bon voila dans une demarche de preserver mon dos de certaines taches usante de mon metier j ai decider de fabriquer une machine CNC pour decouper mes debit de metal ( Credit : Create for curiosity, Decoupe assister par ordinateur ) .

Cependant je me retrouve avec un probleme technique . l accumulation de decoupe sur ma tole en acier creer de la deformation ( previsible )

or, la distance entre ma torche de decoupe et la matiere a decouper est critique pour que l arc electrique se fasse dans de bonne condition

. Je souhaiterai donc pouvoir changer ma hauteur de torche dynamiquement a l aide d un joystick . Alors autant faire le cablage c est dans mes cordes, autant la programmation en C, je ne suis juste pas apte :stuck_out_tongue_winking_eye:

Si quelqu un aurait un peu de temps pour me filer un coup de main j apprecierai grandement .

Pas de facteur d acceleration necessaire . Uniquement une variable Y c est une histoire de pouvoir monter et descendre la torche ( forward backward sur le moteur ) . Pas de limite backstop a installer . une variable Int avec 3 positions possible Up Down et 0 lorsque le joystick n est ni up ni down . La pin utiliser par le joystick est A0 . Vitesse lente . Mon axe Z (torche ) est gerer par un nema 17 moteur stepper . mon shield pour le stepper est une xc4472 monter sur une arduino UNO .

J avoue etre un peu demuni sur ou chercher de l aide pour cette partie de mon projet . j ai plus un entourage d ouvriers que de dev parmis mon entourage .

Merci d avance pour les gens qui prendront le temps de lire ce message.
Flo

Bonsoir fleow

Est ce que tu as déjà réussi à faire tourner ton moteur de l'axe Z au moyen de ce shield?

A+
Cordialement
jpbbricole

Bonjour,
non, pour le moment mon axe Z est gerer par mon ordinateur via une CnC shield monter sur une autre carte arduino .

J ai des pieces en stock du coup j essaye de faire le montage via des pieces que j ai en stock de coter pour voir si j arrive a faire ce que je veux pour l adapter par la suite sur ma machine .

Merci
Flo

Bonsoir fleow

Quel est ce CNC Shield et quel programme tourne sur cet Arduino.
Je n'ai pas ce xc4472, mais je ne suis pas sûre qu'il soit adapté pour piloter ton Nema 17.

Cordialement
jpbbricole

le CNC shield est le suivant

le programme sur mon arduino est GRBL 1.1,

D apres la doc technique du XC4472, ce shield peut controler 4 moteurs en continue ou 2 steppers ainsi que 2 servos .

mais vu que je suis une tanche en code, je ne sais pas comment adapter le tout :stuck_out_tongue_winking_eye: .
Maintenant si il y a un autres shield plus simple a utiliser cela me derange pas d acheter ce qui est necessaire .

Merci
Flo

Apres dans l'idee,
Je penser purement deconnecter l axe Z de l arduino qui a le cnc shield pour le monter sur un second arduino avec la XC4472. Mon axe Z serait donc uniquement gerer avec le joystick .

Bonsoir fleow

Vu qu'il y a GRBL, tu ne peut pas modifier l'axe "par dessus" celui-ci avec un montage supplémentaire. Il y a des possibilités, dans GRBL pour régler cet axe.
Quel programme tu utilises pour faire tes découpes?

Même un Nema 17, cherches des exemples sur le net.

A+
Cordialement
jpbbricole

Quand tu démarres une nouvelle coupe tu mets bien X et Y à zéro, si oui, comment?

Mon programme de decoupe est LightBurn,

Exemple d utilisation de nema via le shield XC4472 :

Le soucis c est que le programme GRBL genere un Gcode machine pour la cnc. Une fois ce code generer et lancer sur la machine il n est pas modifiable ( possibiliter de pause ou arret ) . Mon axe Z n est pas gerer par le Gcode machine, je le regle en amont avant de lancer la coupe. Mes axes X et Y sont memoriser sur mon Homing machine .

Je ne peux pas pre-coder le positionnement de mon axe Z car je ne peux pas predire la deformation qu il y aura sur la taule .

Via le logiciel de decoupe, j ai mis un delais de 10 seconde avant et apres la decoup qui me permet de me laisser le temps d ajuster la hauteur de ma torche et accessoirement de pas faire sauter les plombs de la maison :stuck_out_tongue_winking_eye:

Mon idee etant de 'Disable' l axe Z via mon logiciel de decoupe et connecter mon axe Z sur un systeme externe a ma CNC avec un joystick qui gerera la hauteur de torche separement .

Bonsoir fleow

OK, je vais voir les détails de la vidéo pour t'indiquer comment procéder, demain.

Cordialement
jpbbricole

Merci beaucoup ;p
j ai 12h de decallage horaire avec la france du coup je peux repondre tot le matin avant de travailler ce qui correspond au debut de soiree en france .

cordialement
Florian

hello fleow,
bonjour JPB,
je pense à un palpeur qui assurerait le suivi du profil de la tôle d'une façon automatique.
imagine un petit tube vertical fixé à la tête laser. dans ce petit tube coulisse librement une tige qui est poussée du haut vers le bas par un ressort. elle traine donc sur la tole.
cette tige par un système mécanique ( pignons, poulie ficelle,...) entraine un potentiomètre multitours ( 10 tr) de 10 kOhms linéaire.
utilisation: descente en Z, la tige touche la tôle, la buse est encore trop haute, le Z descend encore et comprime le ressort de la tige palpeur. la buse arrive à la bonne distance de la tôle. le potentiomètre du palpeur donne par exemple ( :innocent: ) une valeur de 512
ensuite, en cours de travail, la surveillance de cette valeur,qui peut varier dans un sens ou dans l'autre, permettra de compenser automatiquement le suivi de la tôle par action sur le Z.

Bonjour dfgh

Je vois qu'îl y a de l'imagination :wink:, oui j'adorerai faire un truc comme ça, mais pas sûre que @fleow soit partant.
Sur le principe, ta proposition est tout à fait valable, mais je ferai ça avec un TOF ou similaire, qui simplifierai la chose.

Une toute bonne après-midi, ici, la chaleur baisse.
jpbbricole

hello, oui, ces TOF semblent très bien. je ne vois pas la distance mini d'utilisation, en as tu une idée?
j'ai trouvé: 2 et 3 cm minimum

Bonsoir dfgh

Non, mais je vais faire des essais, j'ai un GY-VL53L0XV2.
Maintenant, si l'on cherche LA précision, il y a ça:
image

qui s'interface assez facilement à un Arduino.

Cordialement
jpbbricole

Bonjour fleow

Voilà une façon de faire, je n'ai pas ta carte, donc je ne peux pas développer "jusqu'au bout".
Il faut un joystick sur A0, la pin qui règle la direction est mpapDirPin (5), la pin des impulsions est mpapStepPin (6). La variable qui règle le sens de rotation du moteur est mpapDirEtatCw.

Le débattement du joystick va de -10 à +10 (joySubdivisions), plus tu pousses ou tires le joystick, plus le moteur va vite, les variables:

const int mpapAccelFacteur = 200;     // Facteur d'accélération
unsigned long mpapStepTempo = 2000;     // Periode des impulsions de pas  en microsecondes

permettent de jouer avec ça.

J'ai mis un maximum de remarques dans le programme, mais n'hésites pas à poser des questions.

Le programme:

/*
    Name:       ARDFR_fleow_AxeZetJoystick.ino
    Created:	14.09.2023
    Author:     jpbbricoler/fleow
	https://forum.arduino.cc/t/joystick-arduino-step-moteur-aide-pour-le-programme-a-integrer-dans-l-arduino/1168268

	Commander l'axe Z d'une CNC avec un joystick
*/

//------------------------------------- Joystick (joy)
const int joyPin = A0;     // Pin du joystick
const int joySubdivisions = 10;     // Nombre de subdivisions de -sub. 0, +sub
const int joySubMoveLimite = 2;     // Subdivisions de début du mouvement
int joyPosition = 0;     // Position du joystick

//------------------------------------- Moteur pas à pas (mpap)
const int mpapDirPin = 5;     // Pin de commande de la direction
const int mpapDirEtatCw = HIGH;     // Etat pour direction CW (sens des aiguille d'une montre)

const int mpapStepPin = 6;     // Pin de commande des pas
const int mpapStepEtatOn = HIGH;     // Etat pour impulsion pas

unsigned long mpapStepPulseWidth = 50;     // Durée d'impulsion en microsecondes
unsigned long mpapStepMicros = 0;     // Periode des impulsions de pas, chrono

const int mpapAccelFacteur = 200;     // Facteur d'accélération
unsigned long mpapStepTempo = 2000;     // Periode des impulsions de pas  en microsecondes

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

	pinMode(mpapDirPin, OUTPUT);     // Initialisation de la pin de direction
	digitalWrite(mpapDirPin, mpapDirEtatCw);

	pinMode(mpapStepPin, OUTPUT);     // Initialisation de la pin des pas
	digitalWrite(mpapStepPin, !mpapStepEtatOn);     // Mettre la pin off
}

void loop()
{
	// Calcul de la position du joystick https://www.arduino.cc/reference/en/language/functions/math/map/
	joyPosition = map(analogRead(joyPin), 0, 1024, -joySubdivisions, joySubdivisions);
	//Serial.println(joyPosition);
	
	// https://www.arduino.cc/reference/en/language/functions/math/abs/
	if (abs(joyPosition) >= joySubMoveLimite)     // Si l'on est au seuil de mouvement
	{
		if (joyPosition > 0)
		{
			digitalWrite(mpapDirPin, mpapDirEtatCw);     // Mpap sens des aiguilles d'une montre (CW)
		}
		else
		{
			digitalWrite(mpapDirPin, !mpapDirEtatCw);     // Mpap sens inverse des aiguilles d'une montre (CCW)
		}

		if (micros() - mpapStepMicros >= (mpapStepTempo - (abs(joyPosition) * mpapAccelFacteur)))     // Si moment de l'impulsion / Accélération
		{
			digitalWrite(mpapStepPin, mpapStepEtatOn);     // Impulsion ON
			delayMicroseconds(mpapStepPulseWidth);     // Temps de l'impulsion
			digitalWrite(mpapStepPin, !mpapStepEtatOn);     // Impulsion OFF

			mpapStepMicros = micros();
		}
	}

}

A+
Bonne journée
jpbbricole

Bonjour,
haha j adore ce genre de forum, 45 idees a la seconde .
merci pour le code je vais tester cet apres midi .
Pour le palpeur c est ce qui s utilise dans l industrie . avant la sequence de decoupe la torche descend . lorsque le sensor est en contact, la torche remonte de X mm . le fait que ma taule ondule autant c est que je n ai pas de system de refroidissement et que mes decoupe se font avec un compresseur et non du CO2 .

Vu que je peux me permettre des ecarts de quelques mm avec le jeu de soudure, je ne suis pas trop inquiet .

Merci beaucoup du temps passer, je vais essayer le tout :stuck_out_tongue_winking_eye:
Bonne soiree

Flo

Du coup j ai regarder le code, 2 questions .
Si je comprends bien, sur le moteur nema, les 4 fils sont rouge (+) noir (-) puis vert et bleu gere l impulsion et la direction ? si oui, quelle couleurs fait quoi ?
juste pour etre sur que je met le bon fil dans le bon pin )

autres point, sur le shield, j ai acces uniquement de a0 a a5 (il faut que je soude des ports male supplementaires ) . si je change juste les intituler des pin ( attribuer au pin 6 le pin 3 par exemple ) cela posera t il un probleme ?

Merci
Flo

Bonjour fleow

Non, ce n'est pas tout à fait ça :wink:, regardes ici pour connecter le moteur.
Pour le joystick, c'est A0, pour les autres, il faut que je voie la documentation de ta carte.

Ce n'est pas si simple, il faut voir le schéma de la carte.

A+
Cordialement
jpbbricole

Bonsoir. alors du coup j espere comprendre de quoi tu me parles ;p

il y a un petit tableau UNO compatible board . cependant je suis clairement en eaux troubles aucune idee de ce que je raconte ;p

autres questions, ( plus theorique) j ai fait les connections sur les borgners comme sur la doc que tu m as envoyer . si dans ton code tu assign le pin Lambda pour la direction . ce pin lambda n est pas supposer etre connecter a un des cables du moteur ? ou c est juste une pin de comunication entre mon arduino vers ma shield ?

Merci
Flo