Page 1 sur 1

Affichage arduino

Publié : 23 août 2017, 20:59
par Canou
Bonjour.
Pour ma scie kity je souhaitais réaliser un affichage de la hauteur de lame mais cette réalisation à base d'arduino UNO est adaptable à tous type de machines à partir du moment ou vous avez la possibilité de positionner un encodeur rotatif.

25/08/2017 : Je vais mettre à jour l'ensemble de la réalisation sur le POST initial, ce sera plus simple
Réalisation en cours : projet non finalisé

Matériel (<20€):

Un afficheur LCD
https://www.banggood.com/IIC-I2C-2004-2 ... 08616.html
Un arduino uno compatible
https://www.banggood.com/Wholesale-Ardu ... 68537.html
Son alimentation
http://www.ebay.fr/itm/9V-1A-AC-DC-Plug ... 2618602494
Un codeur rotatif
https://www.banggood.com/KY-040-Rotary- ... 14010.html
2 boutons poussoirs
https://www.banggood.com/20Pcs-Tactile- ... 64789.html
Une solution mécanique pour asservir le volant/axe à asservir pour ma part j'ai rajouté en bout d'arbre une poulie sur l'axe de l'arbre de monté de la scie et sur le codeur le tout raccordé avec une poulie.
2 Poulies
https://www.banggood.com/GT2-Timing-Pul ... 06314.html
Courroie
https://www.banggood.com/3Pcs-GT2-Timin ... 09460.html

Fonctions :

Un bouton de remise à zero de la position.
La sauvegarde de la position sera automatique (périodiquement) afin de prévenir la perte de l'information en cas de coupure électrique et de minimiser l'usure de l'EEPROM de la carte.
Un paramètre dans le code permettra de changer le ratio en fonction de la mécanique en place (Faire correspondre les déplacements du codeur avec le déplacement de l'objet à mesurer.

Schéma du prototype :
Arduino.png
Environnement pour programmer l'Arduino:
https://www.arduino.cc/download_handler ... indows.exe

La bibliothèque MSTIMER2 http://playground.arduino.cc/uploads/Main/MsTimer2.zip à ajouter dans l'IDE
(Croquis/Inclure une bibliothèque/Ajouter la bibliothèque.zip)

Code de préparation de l'EEPROM
Un grand merci à Aeth pour son aide, sa pédagogie et son code

C'est le premier fichier à téléverser sur l'arduino

Code : Tout sélectionner

#include <EEPROM.h>

struct ROM_MEMORY_MAP
{
int addr;
int writeCnt;
};



void setup ()
{
struct ROM_MEMORY_MAP encoderMemMap;
int xencoderPosCount = 0;

encoderMemMap.addr = sizeof(struct ROM_MEMORY_MAP); // Défini l'adresse de xencoderPosCount a la suite de la structure ROM_MEMORY_MAP
encoderMemMap.writeCnt = 0x0000;

EEPROM.put(0x0000, encoderMemMap);
EEPROM.put(encoderMemMap.addr, xencoderPosCount);

}

void loop ()
{
}

Re: Affichage arduino

Publié : 23 août 2017, 21:27
par JeanJ
Bonjour.
Projet très intéressant, j'envisage de faire ceci pour la hauteur de lame, la hauteur de toupie et la hauteur de rabotage de ma combinée.
J'ignorais l'existence de ces mini codeurs à bas prix, comment réalisez vous l'accouplement ? Merci d'avance

Re: Affichage arduino

Publié : 23 août 2017, 21:49
par keitofu
joli projet !
ca me rappelle ça : https://www.youtube.com/watch?v=pEl-th8ty2k

Re: Affichage arduino

Publié : 24 août 2017, 07:16
par Balbu
Bonjour Canou,
Tu peux rajouter quelques photos, si le montage est déjà opérationnel?

Re: Affichage arduino

Publié : 24 août 2017, 07:35
par meles
Canou a écrit :un bouton de remise à zero de la position et un de sauvegarde de la position
code et raccordement des éléments à disponibilité ( je les rajouterais si ça vous intéresse)
Ohh que oui, ça nous intéresse ! Avec un petite photo du montage et de l’utilisation si possible. On est pas tous doués pour ce genre de chose :D

@+

Re: Affichage arduino

Publié : 24 août 2017, 14:26
par Canou
JeanJ a écrit :comment réalisez vous l'accouplement ?
Non encore réalisé je vais fixer une poulie en bout d'arbre du volant de monté et descente de la scie kity, fixer l'autre poulie sur le codeur lui même fixé sur le châssis. les deux poulies raccordées par la courroie.
Pas encore de photo mais je posterais dès que réalisé.

le code
sketch_aug24a.ino.txt
(3.56 Kio) Téléchargé 108 fois
(Une future version à suivre sans bouton de sauvegarde, automatique mais je veux faire des tests sur le nombre d'écriture sur l'EEPROM qui est limité à 100 000).
L'injection du code dans l'arduino est simple à réaliser via le cordon USB et l'IDE arduino que l'on télécharge sur le site arduino.
Je peux aider aussi sur ce point.

NB : Le code n'intègre pas le rapport entre les pas du codeur et la valeur en cm ou mm du déplacement je ferais un update du code.
NB2 : je mettrais à jour code et schèma en fonction de l'évolution du projet et de vos suggestion. Ce n'est donc pas la version finale. mais ça fonctionne...

Re: Affichage arduino

Publié : 24 août 2017, 16:30
par Aeth
Avec une extinction par jour (donc une écriture par jour), ça te laisse quasiment 274 ans de durée de vie pour ton EEPROM. Ensuite, tu peux incrémenter le pointeur d'écriture de la valeur, en sauvegardant le pointeur à une adresse fixe et là tu n'auras quasiment plus de problème de durée de vie (un peu à la manière d'un système de fichier) ;)

Ensuite, pour éviter d'écrire la valeur en EEPROM à chaque montée/descente de la table, tu peux détecter la perte d'alimentation (passage d'un seuil de comparaison de tension) et profiter d'une petite réserve de courant dans une capa pour écrire la valeur en mémoire non-volatile.

Re: Affichage arduino

Publié : 24 août 2017, 18:57
par Canou
le brochage:
Arduino.png

Re: Affichage arduino

Publié : 24 août 2017, 19:00
par Canou
Aeth a écrit :Avec une extinction par jour (donc une écriture par jour), ça te laisse quasiment 274 ans de durée de vie pour ton EEPROM. Ensuite, tu peux incrémenter le pointeur d'écriture de la valeur, en sauvegardant le pointeur à une adresse fixe et là tu n'auras quasiment plus de problème de durée de vie (un peu à la manière d'un système de fichier) ;)

Ensuite, pour éviter d'écrire la valeur en EEPROM à chaque montée/descente de la table, tu peux détecter la perte d'alimentation (passage d'un seuil de comparaison de tension) et profiter d'une petite réserve de courant dans une capa pour écrire la valeur en mémoire non-volatile.
Je suis preneur d'info le code est dispo si tu veux apporter des modification ainsi que sur ta solution avec une capacité pour la coupure de tension, tu peux me contacter ou mettre le schéma à jour.

Re: Affichage arduino

Publié : 24 août 2017, 19:49
par mcop2
C'est intéressant, merci de nous faire partager ça.

Re: Affichage arduino

Publié : 24 août 2017, 21:18
par Aeth
Canou a écrit :Je suis preneur d'info le code est dispo si tu veux apporter des modification ainsi que sur ta solution avec une capacité pour la coupure de tension, tu peux me contacter ou mettre le schéma à jour.
Juste pour situer, quel est ton niveau en électronique et en code ?

Je vois quelques axes d'amélioration sur le schéma :

- Ca manque un peut de résistances de tirages à l'état haut + capa de filtrage (debouncing) sur les lignes DATA, CLK du codeur et des switchs, des résistances de tirage à l'état haut sur les signaux SCL et SDA de l'afficheur, ainsi que des capas de découplages sur les alimentations du LCD et de l'arduino.

- Pour la perte de tension, on peut imaginer une alimentation en +12V en entrée d'un 7805 qui fournirait le +5V de l'arduino. Un comparateur entre la ligne +12V et une zener de 7..9V, dès que la tension +12V passe sous la tension de la zener, la sortie du comparateur indique à l'arduino qu'il faut sauvegarder en EEPROM. Une grosse capa en sortie du 7805 continuera de fournir l'énergie à l'arduino le temps de sauver la position en EEPROM.

Pour l'idée du pointeur de sauvegarde en EEPROM, je pensais à quelque chose comme ça :

Code : Tout sélectionner

struct ROM_MEMORY_MAP
{
int addr;
int writeCnt;
}

struct ROM_MEMORY_MAP encoderMemMap;

void setup ()
{
...
// La structure est toujours stockee a l'adresse 0 de l'EEPROM
EEPROM.get(0, encoderMemMap);

// Recupere la valeur de la position dans l'EEPROM
EEPROM.get(encoderMemMap.addr, xencoderPosCount);
...
}

void loop ()
{
...
// Autorise 10 000 ecriture a la meme adresse de l'EEPROM
if(encoderMemMap.writeCnt > 10000)
{
// incrémente l'adresse en EEPROM de la taille de la variable xencoderPosCount
encoderMemMap.addr+= sizeof(xencoderPosCount);

// Remet à 0 le compteur d'écriture
encoderMemMap.writeCnt = 0;

// Sauvegarde la structure dans l'EEPROM
EEPROM.put(0, encoderMemMap);
}

// Sauvegarde la valeur du codeur en EEPROM
EEPROM.put(encoderMemMap.addr, xencoderPosCount);
}

Re: Affichage arduino

Publié : 25 août 2017, 01:35
par Canou
Aeth a écrit :Juste pour situer, quel est ton niveau en électronique et en code ?
Je ne suis pas un programmeur mais j'ai codé un temps en PERL+PHP
J'ai programmé dans le cadre de mon boulo pas mal de script, base de donnée pour de l'analyse de config, alarm, traffic etc sur des routeurs essentiellement du multithreading en perl
J'ai une formation de base en C++, me suis intéressé un temps au JAVA

En électronique j'ai une formation théorique assez poussé mais rien de concret...

Mon prototype sur breadboard fonctionne bien, mais si tu penses que certaines modifications sont préférables pour minimiser le risque de dysfonctionnement, peut t'on y travailler ensemble sachant qu'il faut à la base que ça reste simple et réalisable par tous?
Aeth a écrit : Ca manque un peut de résistances de tirages à l'état haut + capa de filtrage (debouncing) sur les lignes DATA, CLK du codeur
a priori le codeur KY-040 possède déjà 2 résistances de tirages 10kohm sur les sorties DT et CLK mais pas de capa.
https://github.com/Billwilliams1952/KY- ... ---Arduino conseille effectivement un capa de 0.47uF entre Clk et la masse. mais c'est contredit sur la page http://henrysbench.capnfatz.com/henrys- ... er-manual/ si on utilise les transitions High -> Low (dixit kbellco)
=> Nécessaire?
Aeth a écrit :des résistances de tirage à l'état haut sur les signaux SCL et SDA de l'afficheur.
https://arduino-info.wikispaces.com/LCD-Blue-I2C à priori déjà sur le composant I2C "BACKPACK" au dos de l'afficheur 10kohm
Aeth a écrit :ainsi que des capas de découplages sur les alimentations du LCD et de l'arduino.
Pour l'alimentation je comptais utiliser http://www.ebay.fr/itm/9V-1A-AC-DC-Plug ... 2618602494 j'imagine peut être à tord qu'il y a déjà un filtrage...
Mais effectivement ça ne permet pas la détection de la coupure d'alimentation...

Pour les switch l'ajout de la capa a pour rôle de supprimer les rebonds? Je n'en constate pas sur mon montage après réglage de la tempo... => Nécessaire?
Aeth a écrit : - Pour la perte de tension, on peut imaginer une alimentation en +12V en entrée d'un 7805 qui fournirait le +5V de l'arduino. Un comparateur entre la ligne +12V et une zener de 7..9V, dès que la tension +12V passe sous la tension de la zener, la sortie du comparateur indique à l'arduino qu'il faut sauvegarder en EEPROM. Une grosse capa en sortie du 7805 continuera de fournir l'énergie à l'arduino le temps de sauver la position en EEPROM.
Complique un peut la réalisation, mais je n'écarte pas la solution..
Aeth a écrit :Pour l'idée du pointeur de sauvegarde en EEPROM, je pensais à quelque chose comme ça :

Code : Tout sélectionner

struct ROM_MEMORY_MAP....[/quote]

A quoi correspond l'instruction struct? sinon très bonne idée merci pour le code.
En le lisant je pensais à une autre piste supplémentaire si pas de changement de position après quelques secondes on enregistre la position qu'en pense tu?

Merci pour ton aide

Re: Affichage arduino

Publié : 25 août 2017, 09:18
par Aeth
Canou a écrit : Je ne suis pas un programmeur mais j'ai codé un temps en PERL+PHP
J'ai programmé dans le cadre de mon boulo pas mal de script, base de donnée pour de l'analyse de config, alarm, traffic etc sur des routeurs essentiellement du multithreading en perl
J'ai une formation de base en C++, me suis intéressé un temps au JAVA

En électronique j'ai une formation théorique assez poussé mais rien de concret...

OK nickel, ça me permettra d'adapter mon discours ;)
Canou a écrit : Mon prototype sur breadboard fonctionne bien, mais si tu penses que certaines modifications sont préférables pour minimiser le risque de dysfonctionnement, peut t'on y travailler ensemble sachant qu'il faut à la base que ça reste simple et réalisable par tous?
Je suis complètement pour la démarche, pas besoin de connaitre toute la théorie pour souder quelques composants ensembles, j'ai moi-même commencé comme ça ;)
Canou a écrit : a priori le codeur KY-040 possède déjà 2 résistances de tirages 10kohm sur les sorties DT et CLK mais pas de capa.
https://github.com/Billwilliams1952/KY- ... ---Arduino conseille effectivement un capa de 0.47uF entre Clk et la masse. mais c'est contredit sur la page http://henrysbench.capnfatz.com/henrys- ... er-manual/ si on utilise les transitions High -> Low (dixit kbellco)
=> Nécessaire?
Effectivement, sur la seconde page 2 résistances de pull-up de 100k sont présentes. 470nF ça peut effectivement être assez élevée comme valeur : avec la 100k de tirage, ça donne une constante de temps de 47ms, donc un temps de montée de 235ms. Ca peut pas mal limiter la vitesse de rotation du codeur (au delà d'une certaine vitesse, des pas seront loupés). Quelques centaines des pF voir quelques nF seraient suffisant pour éviter les rebonds.
Canou a écrit : https://arduino-info.wikispaces.com/LCD-Blue-I2C à priori déjà sur le composant I2C "BACKPACK" au dos de l'afficheur 10kohm
Nickel !
Canou a écrit : Pour l'alimentation je comptais utiliser http://www.ebay.fr/itm/9V-1A-AC-DC-Plug ... 4j'imagine peut être à tord qu'il y a déjà un filtrage...
Mais effectivement ça ne permet pas la détection de la coupure d'alimentation...
De manière générale, on aime bien ajouter du filtrage au plus près du consommateur ;) 10...100µF sur une capa aluminium + 100nF suffisent à éviter bien des problèmes.
Canou a écrit : Pour les switch l'ajout de la capa a pour rôle de supprimer les rebonds? Je n'en constate pas sur mon montage après réglage de la tempo... => Nécessaire?
Exactement. En général on en place sur tous les éléments de commutation mécaniques puisqu'ils peuvent produire des rebonds. C'est loin d'être systématique, ça dépend des switchs et surtout de leur usure ;) Traditionnellement j'utilise des résistances de 10...100k de pull-up et 100...470nF de capa d'anti-rebond.
Canou a écrit : Complique un peut la réalisation, mais je n'écarte pas la solution..
Complètement et c'est loin d'être nécessaire. La solution logicielle que je t'ai présenté limite quand même grandement les risques pour l'EEPROM ;)

Canou a écrit : A quoi correspond l'instruction struct? sinon très bonne idée merci pour le code.
"struct" permet de définir un nouveau type, de type "structure de données" : basiquement, un type composé de variables de types divers et variés (voir ici)
Canou a écrit : En le lisant je pensais à une autre piste supplémentaire si pas de changement de position après quelques secondes on enregistre la position qu'en penses tu?
C'est une solution tout à fait classique ;)

Re: Affichage arduino

Publié : 25 août 2017, 09:28
par diomedea
Canou a écrit :
JeanJ a écrit :comment réalisez vous l'accouplement ?
Non encore réalisé je vais fixer une poulie en bout d'arbre du volant de monté et descente de la scie kity, fixer l'autre poulie sur le codeur lui même fixé sur le châssis. les deux poulies raccordées par la courroie.
Pas encore de photo mais je posterais dès que réalisé...
Comme ça?
Image

++
JP

Re: Affichage arduino

Publié : 25 août 2017, 10:41
par Canou
Bonjour,
c'est bien l'idée. et comme toujours les conceptions de Diomedea illustre une réalisation parfaite..

Re: Affichage arduino

Publié : 25 août 2017, 10:50
par grim_lokason
ahah ! pas mal,

J'avais songé à faire un truc du genre pour la distance d'un guide de découpe // pour scie sous table mais avec des lasers. j'ai vite abandonner en voyant le prix des lasers ^^'
Ta base pourrais donc être une solution pour ce que j'envisageais de faire ^^'

Re: Affichage arduino

Publié : 25 août 2017, 11:04
par diomedea
Canou a écrit :Bonjour,
c'est bien l'idée. et comme toujours les conceptions de Diomedea illustre une réalisation parfaite..
Merci!
Le dessin montre le moteur pas à pas qui actionne la table de ma raboteuse.