DRO Faire une Dro pour un tour

  • Auteur de la discussion midodiy
  • Date de début
M

midodiy

Compagnon
J'ai 2 règles verre qui pourrait être monté sur mon tour. Ancien modèle, je pense que c'est des 20micron par période de A . Le but etant d'afficher 5micron.
Je pensais faire un systeme simple d'affichage avec un ou deux arduino nano. Il me semble que sur un tour, pas besoin de fonction mathematique complexe, juste afficher le deplacement, un bouton de raz, c'est tout!
J'ai vu que le mieux est d'envoyer le A et le B des regles sur des entrées interruption, il faudrait donc un nano pour chaque règle. ça me vas.
Vous auriez un sketch tout fait, que je n'ai pas à galerer avec des pertes de pas ou autre et que je n'ai plus qu'a gerer l'affichage...
Merci
 
A

Alex31

Compagnon
Quelques recherches sur le forum




 
M

midodiy

Compagnon
Merci alex,
Les PAC ne sortent pas 2 signaux en quadrature comme les regles donc pas compatible.
Ton 1er lien --> PAC
Ton 2eme --> PAC
Ton 3eme --> STM32 pas nano et sortie bloutouss
 
S

saquet

Compagnon
bonjour

je suis sur un truc analogue,j ai récupéré un codeur 3600P/T
avec un axe rectifié qui frottera sur le banc et a affiner pour faire 36mm de déplacement par tour,ce qui devrai faire 1/100mm( la mécanique est faite)
un montage avec une vielle serie de 40xx
pour le moment essai sur des boites DEC

A et B sur deux trigers qui attaque des 4001 puis une bascule 4027
en sortie j ai le sens horaire et inverse( ça marche sur la boite d éssai)
ensuite en série 5 4029 vers 5 4543 sur 6 afficheurs 7segments pour faire "- ou rien"600.00mm
pour le moment c est sur le papier
j avait pensé a toi pour me faire le CI si ça marche
 
J

jpbbricole

Compagnon
Bonjour midodiy
J'ai vu que le mieux est d'envoyer le A et le B des regles sur des entrées interruption, il faudrait donc un nano pour chaque règle
C'est des encodeur rotatif en quadrature, pour les "lire", tu prends la bibliothèque Encoder.h, tu connectes A sur 2 et B sur 3, tu fais l'exemple Basic de la bibliothèque avec:
Encoder myEnc(2, 3); et la console à 9600 et tu aura déjà un résultat.

A+
Cordialement
jpbbricole
 
  • Réagir
Reactions: vax
M

midodiy

Compagnon
j avait pensé a toi pour me faire le CI si ça marche
:-D pourquoi pas...il va y avoir de la filasse...

Je vois que tu as bien revissé ta serie des 4000...

Bien sur, on peut faire en hard avec des compteurs/decompteurs, mais c'est plus trop dans l'air du temps.
Moi aussi, j'aime bien les 7 segments, je pensais à ça:
 
Dernière édition:
M

midodiy

Compagnon
Merci jpbbricole, je vais regarder.
Mais j'ai deja un resultat en m'inspirant du code:
 
B

benny1964

Apprenti
bonjour midodiy
si tu vas utiliser les interruptions de l'arduino tu aura des problèmes insurmontables; dés qu'un moteur démarre ou un variateur les ports concernés vont capter les parasites et les interférences et l'arduine va afficher n'importe quoi et ça même si les règles ne sont pas branchées (desactivés). l'arduino est très sensible aux parasites et agit entièrement comme une antenne et surtout quand on utilise les interruptions
 
J

jpbbricole

Compagnon
Bonjour benny1964
si tu vas utiliser les interruptions de l'arduino tu aura des problèmes insurmontables;
Heureusement pas!!!
Il y aurait beaucoup de montages Arduino qui ne fonctionneraient pas.
Pour ce type d'application, il faut justement utiliser les interruptions. Si l'environnement est perturbé, il suffit de mettre des résistances de pull_up suffisamment basses comme 2.2k.

Cordialement
jpbbricole
 
M

midodiy

Compagnon
J'ai essayé la bibliothèque encoder.h du post#5. Je rentre sur les 2 entrées interruption 2 et 3. Effectivement ça fonctionne mais on ne sais pas comment ça marche, ça utilise les interruptions ou pas?
On dirait que ça fonctionne mieux que le programme du post #7 oû j'ai parfois des "dérapages ", l'affichage saute d'un coup. J'ai essayé de filtrer le A et B avec 1k, 1 nF. Pas suffisant.
 
J

jpbbricole

Compagnon
Bonjour midodiy
mais on ne sais pas comment ça marche, ça utilise les interruptions ou pas?
Ca peut fonctionner sans, mais ça va pour un "bouton encodeur", mais pas pour une règle ou un codeur rotatif à quadrature, pour ces types il faut, au minimum, la sortie A sur pin à interruption. C'est expliqué ici.

Cordialement
jpbbricole
 
S

saquet

Compagnon
re
j ai des tiroirs de récup
j ai tout sauf manque un seul 4029
ça m amuse au bureau car sous sol a 15°
bonne bricole a plus
 
M

midodiy

Compagnon
J'ai quand même du mal à comprendre qu'il suffit d'envoyer le signal sur une entrée interrup pour que le programme utilise les interruptions. Sans le dire au programme !
En tout cas, ça fonctionne sur la console, j'ai essayé avec un rotatif 128, j'ai bien sur la console 512 pour un tour.
Ce soir, j'affiche et j'essai mes règles.
 
J

jpbbricole

Compagnon
Bonjour Bonjour midodiy
J'ai quand même du mal à comprendre qu'il suffit d'envoyer le signal sur une entrée interrup pour que le programme utilise les interruptions. Sans le dire au programme !
C'est le boulot de la bibliothèque, j'ai appris à faire abstraction de ce genre de questions et de "faire confiance". Le programme sait faire la différence et je suis bien incapable d'aller voir comment il fait ça, mais si tu est intéressé, va voir dans Encoder.h.

Et du moment que le résultat est là... :-D

Cordialement
jpbbricole
 
  • Réagir
Reactions: vax
S

speedjf37

Compagnon
Bonjour,

J'ai quand même du mal à comprendre qu'il suffit d'envoyer le signal sur une entrée interrup pour que le programme utilise les interruptions. Sans le dire au programme !
Il faut essayer les exemples fournis avec les LIB pour comprendre leur utilisation.
Utiliser les interruptions comme entrées est une mauvaise idée on va forcément louper des infos si l'on va vite et c'est bloquant pour le code global.


La meilleure gestion des encodeurs c'est la solution matérielle:
En interne un compteur programmable gère directement les entrées et déclenche une interruption logicielle sur les débordements du compteur.

C'est la solution employée par Pailpoe (STM32) que j'utilise aussi (arduino et ESP32).
Les limitations viennent des possibilités matérielles du microprocesseur utilisé.

les bibliothèques évoluées fonctionnent comme cela.

Cordialement JF
 
D

Doctor_itchy

Compagnon
un stm32 coute 3-4€ max , le code peu supporté different type de signal ( AB , serie , ect ) tu a juste besoin du stm32 et du dongle de programation et rien d'autre

j'ai une version codeur AB 4 axe et ça fonctionne tres tres bien :)
 
M

midodiy

Compagnon
C'est la solution employée par Pailpoe (STM32) que j'utilise aussi (arduino et ESP32).
Les limitations viennent des possibilités matérielles du microprocesseur utilisé.

les bibliothèques évoluées fonctionnent comme cela.
T'as un nom de bibliotheque qui fonctionne comme ça pour arduino?
 
M

midodiy

Compagnon
Ça marche avec la règle.
J'arrive quand même à louper des pas en déplaçant très vite ...Sur le tour, ça doit aller...
Screenshot_2022-11-29-00-19-13-12_99c04817c0de5652397fc8b56c3b3817.jpg
 
S

speedjf37

Compagnon
Bonjour,


En Arduino le seul qui a des compteurs hardware est le DUE (2 PCNT)

Pour ESP32 j'utilise:

Il y a 6 PCNT (compteurs hardware) (8 mais 2 réservé OS)

Pour la gestion du tour j'utilise 3 encodeurs
axe C vitesse broche (quadrature)
axe X dro (quadrature si règle sinon step/dir du moteur)
axe Z dro (quadrature si règle sinon step/dir du moteur)

Pour la gestion du tour j'utilise 3 steppers
axe C simulation vitesse broche (quadrature)
axe X step/dir du moteur
axe Z step/dir du moteur



Sinon les STM32 ont pratiquement la même structure (dépend du type) max 4 PCNT

Il faut tester les différentes LIB mais les possibilités en UNO et Nano sont vraiment limitées.

JF
 
Dernière édition:
S

speedjf37

Compagnon
J'arrive quand même à louper des pas en déplaçant très vite ...Sur le tour, ça doit aller...
Le souci c'est souvent l'affichage qui prends beaucoup trop de temps machine surtout en mode graphique.

JF
 
M

midodiy

Compagnon
Le souci c'est souvent l'affichage qui prends beaucoup trop de temps machine
Euh...je vois pas pourquoi. En envoyant A et B sur des interruptions, il y a priorité sur le comptage.
Il faut que je mesure la fréquence maxi...je sais pas comment faire...je vais essayer de comprendre comment ils font là:
J'ai compris qu'ils font un montage 555+4013 pour faire un générateur de A et B à fréquence variable par un ajustable, ils mesurent la fréquence. Le votmetre semble relié à une patte de l'arduino :7grat:
 
M

midodiy

Compagnon
Ils mesurent la tension moyenne produite par des impulsions avec le programme:

/* Encoder Library - SpeedTest - for measuring maximum Encoder speed
* http://www.pjrc.com/teensy/td_libs_Encoder.html
*
* This example code is in the public domain.
*/


// This SpeedTest example provides a simple way to verify how much
// CPU time Encoder is consuming. Connect a DC voltmeter to the
// output pin and measure the voltage while the encoder is stopped
// or running at a very slow speed. Even though the pin is rapidly
// pulsing, a DC voltmeter will show the average voltage. Due to
// software timing, it will read a number much less than a steady
// logic high, but this number will give you a baseline reading
// for output with minimal interrupt overhead. Then increase the
// encoder speed. The voltage will decrease as the processor spends
// more time in Encoder's interrupt routines counting the pulses
// and less time pulsing the output pin. When the voltage is
// close to zero and will not decrease any farther, you have reached
// the absolute speed limit. Or, if using a mechanical system where
// you reach a speed limit imposed by your motors or other hardware,
// the amount this voltage has decreased, compared to the baseline,
// should give you a good approximation of the portion of available
// CPU time Encoder is consuming at your maximum speed.

// Encoder requires low latency interrupt response. Available CPU
// time does NOT necessarily prove or guarantee correct performance.
// If another library, like NewSoftSerial, is disabling interrupts
// for lengthy periods of time, Encoder can be prevented from
// properly counting the intput signals while interrupt are disabled.


// This optional setting causes Encoder to use more optimized code,
// but the downside is a conflict if any other part of your sketch
// or any other library you're using requires attachInterrupt().
// It must be defined before Encoder.h is included.
//#define ENCODER_OPTIMIZE_INTERRUPTS

#include <Encoder.h>
#include "pins_arduino.h"

// Change these two numbers to the pins connected to your encoder
// or shift register circuit which emulates a quadrature encoder
// case 1: both pins are interrupts
// case 2: only first pin used as interrupt
Encoder myEnc(5, 6);

// Connect a DC voltmeter to this pin.
const int outputPin = 12;

/* This simple circuit, using a Dual Flip-Flop chip, can emulate
quadrature encoder signals. The clock can come from a fancy
function generator or a cheap 555 timer chip. The clock
frequency can be measured with another board running FreqCount
http://www.pjrc.com/teensy/td_libs_FreqCount.html

void setup() {
pinMode(outputPin, OUTPUT);
}

#if defined(__AVR__) || defined(TEENSYDUINO)
#define REGTYPE unsigned char
#else
#define REGTYPE unsigned long
#endif

void loop() {
volatile int count = 0;
volatile REGTYPE *reg = portOutputRegister(digitalPinToPort(outputPin));
REGTYPE mask = digitalPinToBitMask(outputPin);

while (1) {
myEnc.read(); // Read the encoder while interrupts are enabled.
noInterrupts();
*reg |= mask; // Pulse the pin high, while interrupts are disabled.
count = count + 1;
*reg &= ~mask;
interrupts();
}
}

Je comprends pas le principe...
 
J

jpbbricole

Compagnon
Ils mesurent la tension moyenne produite par des impulsions avec le programme :
Cette mesure ne rentre pas en ligne de compte avec la fonction de Encoder, ça sert, en conjonction avec le générateur, à trouver la limite, en vitesse, du décodage des impulsions de A et B, de ton Arduino.
Cala dit, je doute que les vitesses de déplacement de ton tour puissent saturer cette lecture. Combien de points au mm donnemt tes règles?

Cordialement
jpbbbricole
 
D

Doctor_itchy

Compagnon
le nano (si c'est un 328P !!! oublie le 168 .... ) est un peu limite en entrée interuption (2 en tout ) , plus la regle est précise plus il y auras de pulse et plus vite il sera saturé

si avec un axe il sature en allant trop vite , deux axe est impossible a moins de faire comme j'ai dit plus haut mais ça divise la résolution par 2

ou de passer par un décodeur quadrature qui la donneras un signal pulse unique et un signal "sens" comme du step dir mais il faut modifié le code pour ! (pas trop compliquer ) le signal pulse sera sur une interuption et le "sens" sur une pin classique c'est ce que j'ai expérimenté sur mes drivers servo dc sous arduino nano mais sans décodeur ! ça permet une rotation d'axe de 1500rpm (diametre de la roue codeuse 2cm dans mon cas avec 1000pulse/tour donc *2 car je n'ai pas mis de décodeur donc l'interuption "vois" 2000pulse tour a 1500tr/min et c'est le maximum ET j'ai du bien revoir le code pour y arriver ! surtout modifié les timer car c'est ceux la qui définisse la Vitesse max possible ( et gere les sortie pwm aussi dans mon cas vers deux sortie pwm pour les deux sens de rotation du moteur )

perso donc limité a 1500rpm , si je dépasse le nano se fige et le moteur par a fond dans un sens ou l'autre (bon toi ce sera juste une perte de pas ^^ ) j'ai adapté le code pour du stm32 ! , j'ai aussi hésité avec le stm32 mais finalement une fois configuré en "mode arduino" (y a des tuto) c'est comme un nano mais au lieu d'avoir une deuch ta une ferrari :) ça a résolut des soucis divers sur certain projet ou ça plantais pour pas grand chose et plus maintenant :)

donc sur ton nano vois avant tout comment sont géré les timer ! vois si tu peu pas les poussé un peu mais tu ne pourras lire que un seul axe a la fois (si tu en met plusieurs) sinon tu perdras des pas
 
M

midodiy

Compagnon
Oui, je pense faire un module un seul axe avec son nano et son afficheur, un bp de zero, un bp de rayon/diamètre (utile pour le transversal). J'aimerais si possible que l'affichage soit mémorisé lors de la mise hors tension. Ainsi, on peut arrêter un travail et reprendre le lendemain...
Du coup, ma visu aura 2 modules identiques.
Cette première étude m'a permis de vérifier que mes règles sont des 20 microns donc une précision d'affichage de 5 microns. C'est une précision qui me convient .
 
D

Doctor_itchy

Compagnon
c'est possible de mémorisé dans l'epprom avant coupure , faut rajouté un bouton , ou une consigne qui enregistre automatiquement la dernière position toute les X secondes mais l'épprom a une durée de vie ! , donc plutot mettre une ram en i2c avec une pile pour la garder allumée par exemple :)
 

Sujets similaires

fuma
Réponses
32
Affichages
1 360
Vapomill
Vapomill
A
Réponses
18
Affichages
1 138
Marc le Gaulois
M
N
Réponses
27
Affichages
733
Jean 47
J
2
Réponses
16
Affichages
2 435
Florent07
Florent07
Bilturn
Réponses
6
Affichages
1 240
O
T
Réponses
53
Affichages
3 683
Typirate
T
ctoutmoi
Réponses
35
Affichages
6 163
tournele
tournele
L
2 3 4
Réponses
91
Affichages
10 990
le débutant professionnel
L
O
Réponses
9
Affichages
4 589
OMalley56
O
B
Réponses
37
Affichages
3 155
Squal112
Squal112
V
Réponses
0
Affichages
989
v tec
V
Haut