Aide Butée positionnement pour SCIE PANNEAU sur base arduino et codeur incremental ?

  • Auteur de la discussion dubois
  • Date de début
C

cyrdes

Nouveau
Bonjour,
Désolé mais je reviens sur mon problème.
je reviens sur la procédure pour être plus claire :
1-demarrage de la machine = alimentation de l'Arduino
2-récupration de l'ancien valeur de position-------------------> (ce que je n'arrive pas a faire)
3-attente et acquisition de requête opérateur pour position demandé via KEYPAD
4-2gestion des relais pour alimentation 24v du moteur de butée jusqu'a nouvelle position.
4-1utilisation de codeur pour calculer la nouvelle position.
4-3 gestion des relais pour arrêt alimentation butée.
5-1 attente nouvelle requête
5-2 si inactivité requete durant "X secondes"
5-21 sauvegarde de la position actuelle.-------------------> (ce que je n'arrive pas a faire)

J’espère avoir correctement exposé mon problème.
Merci à tous.
 
C

cyrdes

Nouveau
je joint le projet , si ça interesse
j'ai essayé avec l' EEPROM .
j ai une valeur en eeprom que je récupéré:supz: emais pas moyen d'injecter la valeur lu dans l'eeprom :sad::smt022

Est-ce que quelqu'un peu sait me dire pourquoi?
 

Fichiers joints

  • USIN_ButeeScieRotEncD.zip
    4.6 KB · Affichages: 65
J

jpbbricole

Compagnon
Bonjour cyrdes
Est-ce que quelqu'un peu sait me dire pourquoi?
Oui :wink:

Ton programme:

Il faut savoir qu'une écriture ou lecture ne concerne qu'un byte (8 bits), en aucun cas une float.C'est mieux de sauver et lire la variable rotenc.posSteps (long) et de retransformer, à la lecture, en mm dans rotenc.posMm.
Regardes comment sauver et restituer cette variable long (32 bits) donc 4 "cases" EEPROM.

Cordialement
jpbbricole
 
C

cyrdes

Nouveau
Bonjour Jpbbricole ,
Je ne maitrise pas du tout l'affaire mais je ne comprend pas pourquoi j'ai le bon retour d'info de l'eeprom sur le moniteur avec un Serial.print (dans mon cas 500.00) et que par la suite je perde la valeur .
Pour l'écriture j'ai lu :
EEPROM.get()
Cette fonction permet de lire une structure de donnée complexes en une seule instruction (plutôt qu’un seul octet à la fois).
ici: https://www.locoduino.org/spip.php?article72
Dois-je vraiment décomposé.
Je voulais mettre en EEPROM la position en mm pour les raison suivante:
-lecture direct de la position avant démarrage de l’Arduino sur la machine.
-injecter facilement cette donné lu avec un petit programme avant de téléverser le programme final.

Je ne vais pas dans la bonne direction?
Encore merci
Salutations
Cyrille
 
J

jpbbricole

Compagnon
Bonjour Cyrille
Je ne vais pas dans la bonne direction?
Que oui, tu as tout à fait raison, à ma grande honte, je ne connaissait pas put et get avec l'EEPROM :smileyvieux: :smt021
J'ai fait l'essai:
ça simplifie grandement les choses, mais attention à l'adresse mémoire qui débute à 0. Si tu n'as qu'une variable ou structure à sauver, pas de problème. Su tu en as plus, il faut gérer l'adresse en EEPROM où doit débuter cette variable suivante. Ainsi, si tu sauves une float (4 octets) la première float sera à 0, la suivante à 4 etc.

Cordialement
jpbbricole
 
C

cyrdes

Nouveau
J'ai essayé en incrémentant rotenc.posStepsNew mais j'ai toujours 0.0 mm en réponse? :smt017:smt013
je joint le nouveau code si vous avez le temps d'y jeter un oeil, je n'ai plus d'idée...:hang:

merci

//--------------------------------- lecture EEPROM
float f;
EEPROM.get(0, f);
posmmold=(float)f;
//float posmmold=EEPROM.get(0,f); //--en remplacement des deux ligne supérieur

Serial.println(posmmold);
float possave=posmmold;
lcdPrintLength("LECTURE EEPROM",3,1,14);
//--------------------------------ancienne position vers nombre de pas
long posStepOld=(posmmold*100/rotenc.lapMm100)*rotenc.lapSteps;
Serial.println(posStepOld);

}
void loop()
{
//---------------------routine lecture codeur-------------------------------
rotenc.posStepsNew = rotEncQuad.read() + posStepOld;
 

Fichiers joints

  • prog en cour.zip
    899.3 KB · Affichages: 57
J

jpbbricole

Compagnon
Bonjour Cyrille

Tout d'abord, la variable de la structure rotencDef.posMm a passé de float à int !!, il faut la remettre à float, ce qui évitera
float g=(float)rotenc.posMm;
Ce (float) posmmold=(float)f; //----------------------------------------------------test recup eeprombase
est également inutile puisque f est déjà déclaré en tant que tel juste au-dessus.

L'erreur est
EEPROM.update (0,g);
c'est
EEPROM.put (0,g);

De la façon dont est faite le programme, il ne travaille qu'en pas de l'encodeur, alors ça ne sert à rien de sauver posMm, puisqu'elle est mise à jour à chaque changement de posSteps, ainsi:

Le mieux à faire est, pour sauver la position:
EEPROM.put (0,rotenc.posSteps);
et pour retrouver le position, mettre à la fin de setup():

et tout le reste se fait automatiquement.

Cordialement
jpbbricole
 
C

cyrdes

Nouveau
Bonjour Jpbbricole,
Avant tout merci pour tout , ça faisait un moment que je pataugais :smt023.
Puis-je utilisé le bouton offset pour justement fixer une valeur : machine en position je reset l'arduino puis push bouton et j'ai le bon nombre de pas calculé à la position..
j'ai suivi tes instructions et la valeur revient à 0 apres la première boucle .
la 1ere ligne de la boucle est-elle en cause ; rotenc.posStepsNew = rotEncQuad.read() ;

Salutations
Cyrille
 
J

jpbbricole

Compagnon
Bonsoir Cyrille
Puis-je utilisé le bouton offset pour justement fixer une valeur : machine en position je reset l'arduino...
Je n'ai pas tout à fait compris ce que tu veux faire avec le bouton offset.

Cordialement
jpbbricole
 
C

cyrdes

Nouveau
Bonjour Jpbbricole,
Je voudrais avec un BP donner une valeur autre que 0 :je mets en mode manuel la butée sur une position défini et informe avec le BP l’Arduino que je suis à cette position (en nombre de pas de codeur).
Salutations
Cyrille.
 
C

cyrdes

Nouveau
Bonjour,
J'ai réussis à récupérer les données en EEPROM et à les exploiter en sorte les calculs de position de la condition .
L'Arduino plante quand je déplace la butée par à-coup et au moment de la sauvegarde.
Pour la sauvegarde je pense savoir gérer l’intervalle mais j'ai qu'elle se face quand il n'y a pas de déplacement hors après la premier condition:
rotenc.posSteps = rotenc.posStepsNew est-ce dérangeant si je place les conditions de sauvegarde (justement
rotenc.posSteps = rotenc.posStepsNew) avant ou y a-til un moyen plus "classe" de vérifier de mouvement?
je vous ferais une video du montage finale si cela vous intéresse .
Merci
Salutations
Cyrille
 
J

jpbbricole

Compagnon
Bonjour Cyrille

Pour les plantés du programme, mets ton code en ligne.
Pour la sauvegarde de la position, c'est pas la bonne place, il y a trop de variation, je pense qu'il faut un timer et sauver après un temps d'inactivité. Je regarde ça.

Cordialement
jpbbricole
 
C

cyrdes

Nouveau
c'est justement ce que n'arrive pas a organiser: détection d'inactivité pour démarrer une durée
Dans mon programme je calcule un intervalle de 30 seconde ( c'est ma premier condition) mais comment puis-je vérifier l'inactivité?
Je mets mon code en ligne lundi matin.
Salutations
Cyrille
 
J

jpbbricole

Compagnon
Bonjour Cyrille

J'ai repris le code de l'article #162 et ai ajouté la surveillance d'inactivité.
Les ajouts, modifications et suppresions sont marqués par un //+++.
Le temps qui décide d'une inactivité, est défini par la variable rotencPosNoActTime.

A+
Cordialement
jpbbricole
 
S

speedfender

Compagnon
Bonjour,
Je suis bien content de tomber sur ce sujet. Je suis en train de concevoir un petite scie à panneaux et je dois dire que l'idée d'avoir une butée numérique me plait bien.
J'aimerai adapter vos programmes pour piloter la butée en fonction d'une distance de coupe choisie, qui serait saisie sur clavier. La position serait affichée. J'aimerai aussi pouvoir faire des décalages de la butée par incréments ; ainsi qu'une prise d'origine automatique.
Dans mon idée la butée se déplacerait grâce à une tige filetée, une crémaillère ou même une chaine pour ne pas avoir à brider la butée pour ne pas qu'elle bouge. Je ne sais pas encore si la scie pivotera et sera donc réglable en hauteur.
J'ai pas mal de pièce que j'avais acheté pour faire une imprimante 3d, mais je suis néophyte en arduino du coup je n'en ai rien fait.
Pour la prise d'origine, j'ai donc un capteur de proximité que je voulais mettre sur ma cnc mais je ne l'ai pas fait, je me demande si c'est précis ; sinon j'ai aussi un capteur à diode. Je suis curieux d'avoir des précisions sur le capteur magnétique utilisé dans vos tests (en terme de précision et couts). J'ai aussi relais, arduinos uno, shield grbl, clavier 5x4 des petits drivers, un lcd 1602a 16x2 et une platine avec afficheur-bouttons-leds, plaque à essais alim, .. je met une petite photo..

J'ai fait un montage pour tester les programmes éventuels, avec un petit pas à pas que j'ai du récupéré d'une imprimante...

Je viens de réussir à faire marcher mon lcd 1602a (au bout de deux heures ça tient du miracle). Il y a beaucoup de fils qui le relie à l'arduino.. Est-ce qu'il faut que j'en achète un autre avec une liaison i2c pour que ce soit réalisable sur un Arduino uno ?
Estce qu'il serait aussi interessant que je commande un codeur ou est-ce que le pas a pas en boucle ouverte suffirait ?
Je vais tenter de faire marcher les programmes du forum, histoire d'essayer de cerner un peu les choses..

A+

arduino.jpg
 
Dernière édition:

Sujets similaires

F
Réponses
6
Affichages
25 594
fraiddy
F
lion10
Réponses
35
Affichages
33 066
lion10
lion10
M
Réponses
15
Affichages
22 368
FTX
grouch
Réponses
5
Affichages
2 513
grouch
grouch
M
Réponses
185
Affichages
24 592
wika58
wika58
N
Réponses
62
Affichages
10 340
Yakov TOPRAK
Y
Haut