
aide programation CNC
#61
Posté 09 octobre 2016 - 07:37
#62
Posté 09 octobre 2016 - 07:49
En principe tu branches PU+ à un pin de l'arduino, par exemple 31, et DR+ à un autre pin de l'adruino, par exemple 29. PU- et DR- sont reliés à la masse (GND) de l'arduino.
Déjà, avec un branchement correct ...
Edit : oups, je n'avais pas tout lu
Je regarde pour la configuration des switchs, le 6 doit être sur OFF
Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega + Tronxy VEHO 600 PRO
#63
Posté 09 octobre 2016 - 08:09
#64
Posté 09 octobre 2016 - 08:11
Cet après-midi j'ai vu une autre solution de faire tourner le moteur et quand je regarde ton driver, je me demande si ce ne serait pas mieux.
Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega + Tronxy VEHO 600 PRO
#65
Posté 09 octobre 2016 - 08:14
#66
Posté 09 octobre 2016 - 08:17
Pour les branchements de ton moteur, j'ai un doute car pour la bobine B, les deux fils seraient inversé : https://fr.aliexpres...oryId=100007155
Je vais essayé de t'écrire un petit programme pour tester ça (en fonction de ce que j'ai trouvé cet après-midi.
Je vais aussi te donner la configuration des switchs telle que je pense être correct.
Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega + Tronxy VEHO 600 PRO
#67
Posté 09 octobre 2016 - 08:21
#68
Posté 09 octobre 2016 - 08:53
Essaie ce code :
int smDirectionPin = 29; //Direction pin int smStepPin = 31; //Stepper pin void setup(){ /*Sets all pin to output; the microcontroller will send them(the pins) bits, it will not expect to receive any bits from thiese pins.*/ pinMode(smDirectionPin, OUTPUT); pinMode(smStepPin, OUTPUT); Serial.begin(9600); } void loop(){ digitalWrite(smDirectionPin, HIGH); //Writes the direction to the EasyDriver DIR pin. (HIGH is clockwise). /*Slowly turns the motor 1600 steps*/ for (int i = 0; i < 1600; i++){ digitalWrite(smStepPin, HIGH); delayMicroseconds(700); digitalWrite(smStepPin, LOW); delayMicroseconds(700); } delay(1000); //Pauses for a second (the motor does not need to pause between switching direction, so you can safely remove this) digitalWrite(smDirectionPin, LOW); //Writes the direction to the EasyDriver DIR pin. (LOW is counter clockwise). /*Turns the motor fast 1600 steps*/ for (int i = 0; i < 1600; i++){ digitalWrite(smStepPin, HIGH); delayMicroseconds(70); digitalWrite(smStepPin, LOW); delayMicroseconds(70); } delay(1000); }
C'est le code que j'ai trouvé (ici), j'ai remplacé les pin d'origine par ceux indiqué plus haut -> Pulse : 31 et Dir :29.
Pour les switch, je mettrais (sans certitude) :
D1 : ON
D2 : ON
D3 : ON
D4 : ON
D5 : OFF
D6 : OFF
Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega + Tronxy VEHO 600 PRO
#69
Posté 09 octobre 2016 - 08:59
Édit: a quoi correspond serial.begin? Bonne soiree
#70
Posté 09 octobre 2016 - 09:10
C'est ça, c'est juste pour un essai et concernant le serial.begin, je me suis posé la question mais je n'ai pas trouvé de réponse, donc essaies avec et si ça fonctionne essaies sans et tu me diras le résultat.
Ici, le nombre de pas est 1600.
Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega + Tronxy VEHO 600 PRO
#71
Posté 10 octobre 2016 - 08:38
bonjour, pour commencer merci a toi levend car ca a l'air de fonctionner mais pas avec le code que tu m'a donner.
voici le resultat du code que tu m'as donner il tourne bien dans un sens mais quand il doit changer de sens le moteur emet un bip.
une video vaut mieux que des explication (img_1599.mov)
et quand je rentre le code suivant ca fonctionne bien par contre une chose que je ne comprend pas c'est que je doit mettre +800 ou -800 pour que le moteur effectue un tour complet alors que dans le descriptif (avant setup) je met bien que le moteur fait 200pas, ce n'est pas vraiement genant en sois (enfin je pense) mais je me demande pourquoi (video img_1600.mov)
#include <Stepper.h> #define NombrePas 200 #define Pulse 12 #define Dir 13 Stepper stepper(NombrePas, Pulse, Dir); void setup() { stepper.setSpeed(400); // put your setup code here, to run once: } void loop() { stepper.step(+800); // put your main code here, to run repeatedly: delay(1000); stepper.step(-800); // put your main code here, to run repeatedly: delay(1000); }
bonne journee.
edit: vous remarquerez que j'ai remis le cablage prevu a l'origine.
Fichier(s) joint(s)
#72
Posté 10 octobre 2016 - 11:27
Tu aurais mis 400, je n'aurais pas été surpris, mais 800 je ne vois pas pourquoi.
As-tu configurer les switchs comme je l'avais indiqué ?
Ce serait bien de comprendre pourquoi avant de calculer le nombre de pas nécessaires.
Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega + Tronxy VEHO 600 PRO
#73
Posté 10 octobre 2016 - 11:47
oui switch 1 2 3 4 sur on et 5 et 6 sur off
#74
Posté 10 octobre 2016 - 04:44
bonjour, bon alors voici mon code pour le deplacement du moteur, ca fonctionne je regarderai demain pour faire une boucle comme tu me le suggere pour faire avancer le moteur pas par pas pour la prise ne compte des fins de course, tu verra que j'ai changer la valeur de conversion d'un pas en mm (je me suis basé sur le fait qu'un tour faisait 800pas) ce qui n'est pas plus mal car plus precis non? ensuite j'ai 2 probleme je n'arrive pas a enregistrer dans l'eeprom, ca ne veut pas prendre en compte, comme c'est la ca fonctionne tres bien il prend en compte la position du moteur mais si je coupe l'alimentation de l'arduino, il repart de 0 je me demande si c'est vraiement un probleme etant donné que le moteur n'a pas de frein donc quand il est hors tension il est libre donc sujet a etre dereglé par contre quand il est sous tension meme a l'arret je n'arrive pas a le tourner a la main ce qui est une bonne chose. si je laisse le code comme ca il me suffirai de ramener le chario a 0 a la main avant de mettre sous tension. ensuite autre probleme je n'arrive pas a faire prendre en compte:
{ if (valeur < 300); else (lcd.clear()); lcd.setCursor(0,5); lcd.print ("ERREUR"); lcd.setCursor(1,2); lcd.print ("long mini 300"); } { if (valeur > 6000); else (lcd.clear()); lcd.setCursor(0,5); lcd.print ("ERREUR"); lcd.setCursor(1,2); lcd.print ("long max 6000"); }
si je le met dans le loop ca plante et si je met dans autre fonction du programe ca ne prend pas en compte.
voici le programe
#include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD #include <Keypad.h> // inclusion de la librairie pour clavier matriciel #include <Stepper.h> // librairie pour moteurs pas à pas int position_actuelle=0; // --- Déclaration des constantes --- //--- Constantes utilisées avec le clavier 4x4 const byte LIGNES = 4; // 4 lignes const byte COLONNES = 4; //4 colonnes const int NombrePas=200; // Nombre de pas du moteur // --- constantes des broches --- const int C4=44; //declaration constante de broche const int C3=42; //declaration constante de broche const int C2=40; //declaration constante de broche const int C1=32; //declaration constante de broche const int RS=43; //declaration constante de broche const int E=51; //declaration constante de broche const int D4=45; //declaration constante de broche const int D5=47; //declaration constante de broche const int D6=49; //declaration constante de broche const int D7=53; //declaration constante de broche const int L4=52; //declaration constante de broche const int L3=50; //declaration constante de broche const int L2=48; //declaration constante de broche const int L1=46; //declaration constante de broche // --- Déclaration des variables globales --- //--- Définition des touches char touches[LIGNES][COLONNES] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; // tableaux de lignes et colonnes byte BrochesLignes[LIGNES] = {L1, L2, L3, L4}; //connexions utilisées pour les broches de lignes du clavier byte BrochesColonnes[COLONNES] = {C1, C2, C3, C4}; //connexions utilisées pour les broches de colonnes du clavier char touche; // variable de stockage valeur touche appuyée long valeur; // --- Déclaration des objets utiles pour les fonctionnalités utilisées --- LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// Création d'un objet LiquidCrystal = initialisation LCD en mode 4 bits // création d'un objet keypad = initialisation clavier Keypad clavier = Keypad( makeKeymap(touches), BrochesLignes, BrochesColonnes, LIGNES, COLONNES ); // les broches de lignes sont automatiquement configurées en ENTREE avec pullup interne activé // les broches de colonnes sont automatiquement configurées en SORTIE Stepper stepper(NombrePas, 12,13); // crée un objet Stepper pour contrôler le moteur pas à pas // Pas_1 et Pas_3 commandent la 1ère phase, Pas_2 et Pas_4 la 2ème phase //**************** FONCTION SETUP = Code d'initialisation ***** // La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme void setup() { // debut de la fonction setup() // --- ici instructions à exécuter au démarrage --- lcd.begin(20,4); // Initialise le LCD avec 20 colonnes x 4 lignes delay(10); // pause rapide pour laisser temps initialisation // Test du LCD lcd.print("BIENVENUE") ; // affiche la chaîne texte - message de test delay(5000); // pause de 2 secondes lcd.clear(); // // efface écran et met le curseur en haut à gauche delay(10); // pour laisser temps effacer écran // initialise la vitesse de rotation du moteur pas à pas en tour par minute stepper.setSpeed(800); // les broches de lignes et d'entrée sont configurées automatiquement lors de l'initialisation du clavier // ------- Broches en sortie ------- // ------- Broches en entrée ------- // ------- Activation du rappel au + interne des broches en entrée si nécessaire ------- } // fin de la fonction setup() // ******************************************************************************** //*************** FONCTION LOOP = Boucle sans fin = coeur du programme ************* // la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension void loop(){ // debut de la fonction loop() // --- ici instructions à exécuter par le programme principal --- lcd.setCursor(0,0); lcd.print("LONGUEUR MM"); lcd.setCursor (0,1); valeur=SAISIE_LONG(); lcd.setCursor (0,1); lcd.print(valeur); stepper.step((valeur-position_actuelle)/0.157075); // fait tourner le moteur du nombre pas indiqués - sens + et - position_actuelle=valeur; lcd.clear(); // // efface écran et met le curseur en haut à gauche delay(1000); // pour laisser temps effacer écran // touche = clavier.getKey(); // lecture de la touche appuyée //if (touche != NO_KEY){ // si une touche a été frappée -- gestion de la touche appuyée //} // fin gestion de la touche appuyée } // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin // ******************************************************************************** //*************** Autres Fonctions du programme ************* long SAISIE_LONG (){ // fonction qui renvoie une valeur long signé (32bits) //---- variables locales utilisées dans la fonction long saisie_long[11]={0,0,0,0,0,0,0,0,0,0,0}; // crée un tableau de variables pour saisir valeur - long maxi = 10 chiffres + signe char compt_touche; // variable de comptage du nombre de touches saisies long nombre_saisi; // variable de calcul du nombre saisi //float valeurf; // variable de caclul de la valeur convertie char touche_long; // variable locale pour valeur touche appuyée de 0 à 15 //---- initialisation des variables utilisées ---- compt_touche=0; // aucune touche saisie au démarrage nombre_saisi=0; // initialise la variable //-------- initialisation curseur -------- //// mode clignotant //------ gestion appui touche sur clavier while (compt_touche<11) { // tant que pas appuis maxi = 11 touches pour long + signe (valeur maxi=+2 147 483 647) touche_long= clavier.getKey(); // lecture de la touche appuyée if (touche_long!= NO_KEY){ // si une touche a été frappée -- gestion de la touche appuyée lcd.print(touche_long); // debug if (compt_touche==0) { // au premier passage if (touche_long=='*') { // si appui signe - saisie_long[10]=-1; // mémorise -1 dans le 11ème caractère continue; // poursuit while comme si pas de premier passage } else { if (saisie_long[10]==0)saisie_long[10]=1; // mémorise le signe + dans le 11ème caractère si pas déjà à -1 } } // fin if compt_touche==0 if (touche_long=='A') break; // sort du while si appui sur A //---- calcul valeur numérique touches 0 à 9 (3ères lignes x 3ères colonnes) //--- à partir lignes colonnes --- for (byte i=0;i<3;i++) { for (byte j=0; j<3;j++){ if (touche_long==touches[i][j]) touche_long=(j+1)+(i*3);//calcul de la valeur numérique } } //---- à patir valeur ascii --- // touche 0 if (touche_long=='0') touche_long=0; saisie_long[compt_touche]=touche_long; //enregistre le caractère dans tableau code_saisi compt_touche=compt_touche+1; // on incrémente la variable compt qui mémorise le nombre de caractères saisis //delay () } //---- fin gestion appui clavier }// fin du While = fin de la lecture du clavier //--------- calcul valeur saisie en fonction du nombre de chiffres saisis et x signe (saisie_long[10]) --------- if (compt_touche==0)nombre_saisi=0; // si aucun chiffre saisi if (compt_touche==1)nombre_saisi=(saisie_long[0]); // si 1 seul chiffre saisi if (compt_touche==2)nombre_saisi=(saisie_long[0]*10)+(saisie_long[1]*1); // si 2 chiffres saisi if (compt_touche==3)nombre_saisi=(saisie_long[0]*100)+(saisie_long[1]*10)+(saisie_long[2]*1); // si 3 chiffres saisi if (compt_touche==4)nombre_saisi=(saisie_long[0]*1000)+(saisie_long[1]*100)+(saisie_long[2]*10)+(saisie_long[3]*1); // si 4 chiffres saisi if (compt_touche==5)nombre_saisi=(saisie_long[0]*10000)+(saisie_long[1]*1000)+(saisie_long[2]*100)+(saisie_long[3]*10)+(saisie_long[4]*1); // si 5 chiffres saisi if (compt_touche==6)nombre_saisi=(saisie_long[0]*100000)+(saisie_long[1]*10000)+(saisie_long[2]*1000)+(saisie_long[3]*100)+(saisie_long[4]*10)+(saisie_long[5]*1); // si 6 chiffres saisi if (compt_touche==7)nombre_saisi=(saisie_long[0]*1000000)+(saisie_long[1]*100000)+(saisie_long[2]*10000)+(saisie_long[3]*1000)+(saisie_long[4]*100)+(saisie_long[4]*10)+(saisie_long[5]*1); // si 6 chiffres saisi if (compt_touche==8)nombre_saisi=(saisie_long[0]*10000000)+(saisie_long[1]*1000000)+(saisie_long[2]*100000)+(saisie_long[3]*10000)+(saisie_long[4]*1000)+(saisie_long[5]*100)+(saisie_long[6]*10)+(saisie_long[7]*1); // si 7 chiffres saisi if (compt_touche==9)nombre_saisi=(saisie_long[0]*100000000)+(saisie_long[1]*10000000)+(saisie_long[2]*1000000)+(saisie_long[3]*100000)+(saisie_long[4]*10000)+(saisie_long[5]*1000)+(saisie_long[6]*100)+(saisie_long[7]*10)+(saisie_long[8]*1); // si 8 chiffres saisi if (compt_touche==10)nombre_saisi=(saisie_long[0]*1000000000)+(saisie_long[1]*100000000)+(saisie_long[2]*10000000)+(saisie_long[3]*1000000)+(saisie_long[4]*100000)+(saisie_long[5]*10000)+(saisie_long[6]*1000)+(saisie_long[7]*100)+(saisie_long[8]*10)+(saisie_long[9]*1); // si 9 chiffres saisi //Serial.println(int(saisie_long[10])); // debug - affiche signe nombre_saisi=nombre_saisi*long(saisie_long[10]); // prise en compte du signe //------ à réaliser en sortie de lecture du clavier ---- compt_touche=0; // réinitialise le nombre de touche saisies //-------- initialisation curseur -------- //// désactive mode clignotant //----- renvoi de la valeur saisie ---- return (nombre_saisi); // renvoie la valeur - sortie de la fonction } // --- Fin programme ---
bonne soiree
#75
Posté 10 octobre 2016 - 10:13
Ta saisie au clavier est trop longue, tu n'as que 4 chiffres à entrer, pas besoin d'aller jusqu'à 9, je sais, c'est du copier coller pour tester.
Autre remarque, comme je te l'ai dis il y a quelques jours il faut pouvoir annuler la saisie, sur le code que je t'ai mis page précédente, la fonction de saisie retournait la valeur saisie ou 'False' si la saisie était annulée.
Aussi, il est inutile de choisir le type 'long' pour la valeur, le type 'unsigned int' est largement suffisant vu que tu va jusqu'à 6000.
Maintenant que tu as fait le plus gros boulot pour le moteur pas à pas, je vais essayer de la remettre dans le code que j'ai mis ce weekend.
Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega + Tronxy VEHO 600 PRO
#76
Posté 10 octobre 2016 - 10:18
#77
Posté 11 octobre 2016 - 12:15
Le code pour le positionnement de la scie mobile :
{ // positionnement de la scie mobile EEPROM.get(1,PositionActuelle); // lire position_actuelle dans l'EEPROM if (valeur>PositionActuelle) // si valeur > position_actuelle { Deplacement = valeur - PositionActuelle; // deplacement = valeur - position_actuelle NbPas = Déplacement / PAS; // NbPas = deplacement / PAS i=0; // PAS = 0.157 do // Tourner de NbPas dans le sens horaire { stepper.step(1); i++; }while( i<NbPas or FDC1 == LOW); //FDC1 = fin de course côté 6m } if (valeur>PositionActuelle) // si valeur < position_actuelle { Deplacement = PositionActuelle - valeur; // deplacement = position_actuelle – valeur NbPas = Déplacement / PAS // NbPas = deplacement / PAS i=0; // PAS = 0,157 do // Tourner de NbPas dans le sens antihoraire { stepper.step(-1); i++; }while( i<NbPas or FDC2 == LOW); //FDC1 = fin de course côté 30cm } EEPROM.put (1,valeur); // Ecrire valeur dans l'EEPROM }
J'ai ajouté une ligne dans Setup, sinon il n'y aura aucune valeur à lire quand on demande à la position actuelle :
EEPROM.put (1,600); // valeur de la position initiale pour test
En ce qui concerne la lecture et l'écriture dans l'EEPROM, j'ai pris ce que tu avais fait.
Ah oui, j'oubliais si tu regardes la fonction que j'ai définit pour les touches, tu verras que je prévois une initialisation, ce qui permettra de redonner la position actuelle de la scie au programme au cas où tu l'aurais déréglé. C'est cette fonction qui mettra la valeur de la position actuelle dans l'EEPROM.
Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega + Tronxy VEHO 600 PRO
#78
Posté 11 octobre 2016 - 11:44
bonjour, bon alors j'ai un probleme concernant le bouton tournant en fait si je laisse le code prevu c'est a dire:
while (digitalRead(BA)==LOW && digitalRead(BM)==LOW)
ca ne fonctionne pas pour que ca fonctionne je doit relier BA et BM a une masse ou au gnd comme si il restais du courrant dans le bouton j'ai donc essayer de changer le code, le voici:
while (digitalRead(BA)!=HIGH && digitalRead(BM)!=HIGH) // interrupteur rotatif sur position Réglage
et la ca fonctionne, j'avais deja le probleme avec les boutons poussoir c'est pourquoi j'ai dut brancher les contact no sur le 5v et le nc sur je gnd afin qu'il y ai toujours un signal qui passe que ce soit gnd ou 5v. je verrai peut etre pour changer le code de la meme maniere pour les poussoirs. ca ne pose pas de probleme? je ne comprend pas vraiement c'est comme si il y avais une position intermediaire. bonne journee
#79
Posté 11 octobre 2016 - 12:14
as tu mis une résistance de pull up ou de pull down au niveau de la broche de ta arduino qui lit la valeur du bouton ?
( J'ai une page du tome 2 pour les débutant en arduino qui va parler de cela. en attendant ne pas hésiter à lire et à faire des commentaires sur le Tome 1 )
En attendant je te laisse regarder comment mettre ta résistance ( 10Kohm ou plus ) et faire un essais
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#80
Posté 11 octobre 2016 - 12:20
bonjour non je n'ai pas mis de resistance, je regarge a ca. merci. bonne journee
1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users