Aide Aide programmation Arduino

F

furynick

Compagnon
En programmation un peu plus avancée, la partie BP pourrait être gérée par des interruptions mais je ne sais pas si tes cours t'ont déjà initié à cet aspect
 
D

Dudulle

Compagnon
J'ai regardé rapidement mais en dehors du code lui même je donnerai le conseil de "s'approprier" le nom des variables plutôt que de reprendre ceux des tutos. Ca permet déjà d'avoir une vision plus claire de ce que l'on fait (de diminuer la "charge mentale", pour reprendre une expression chère à notre époque).

Sinon sur la forme elle même personnellement je trouve qu'il ne faut pas se restreindre sur les fonctions, plutôt que de chercher à tout caler dans la boucle principale ; j'aurai plutôt écris une fonction pour faire tourner la moteur dans un sens, et une seconde pour l faire tourner dans l'autre sens.
 
M

midodiy

Compagnon
s'approprier" le nom des variables plutôt que de reprendre ceux des tutos. Ca permet déjà d'avoir une vision plus claire
C'est pas les 1er exercices que l'on fait, on a eu le temps de s'habituer aux noms. Pour vous, bien sûr...
 
M

midodiy

Compagnon
Les interrogations, c'est la semaine prochaine.
Wika n'a pas besoin de tempo sur la commande des BP, il utilise la mise en mémoire de l'état d'avant avec le if qui va bien. Ça supprime les rebonds.(on l'a vu dans le cours).
 
W

wika58

Compagnon
@furynick et @Dudulle
Merci pour avoir pris le temps de toutes vos réponses.:prayer:

Je suis au courant du problème des rebonds pour avoir travaillé par mal dans l'instrumentation et l'automatisation dans l'industrie.

Comme le dit Midodiy, j'ai utilisé l'option du flag pour ne passer qu'une fois dans le test du bouton et éviter les rebonds...
MAIS c'est vrai que je ne filtre pas les perturbations qui pourraient être prises comme un appui BP.
Et donc ca je dois l'intégrer. Surtout quand je ferais de petites machines pour mon atelier...
Que recommandez-vous comme "boucle/fonction" de détection de BP appuyé.
J'ai bien compris que les "delay" sont à proscrire et qu'il faut travailler avec les mills()...
Mais dans tous les exemples que je vois, ils mettent tout de même des petits "Delay" (20...50) :7hus5:

Je sais que c'est mieux de travailler sur les registres qu'avec les DigitalWrite mais ce travail avec les registres m'est vraiment indigeste et je viens de galérer/ramer 15 jours sur la semaine 4 du MOOC qui traite de ce sujet... :oops: :hang:

Pour le nom des variables, c'est vrai que vu qu'on a du faire une petite platine avec 2 BP, 4 LED et un buzzer qu'on utilise pour chaque Exo, je reprends les déclarations d'un exo sur l'autre et qu'une fois c'est la LED à l'entrée d'un parking, et la fois suivante une bobine de MPAP...
Quand je ferai une application bien spécifique, je veillerai à nommer mes variables le plus clairement possible... comme @jpbbricole l'a maintes fois recommandé.:wink:

On n'a pas encore vu les interruptions.
Je comprends très bien que si on veut traiter les impulsions venant d'un codeur, c'est impératif... Mais pour un BP est-ce vital/critique ?

Je vais essayer de refaire mon programme sur base de vos conseils (antirebond et fonctions) et vous le soumettrai pour voir si j'ai bien tout assimiler.

C'est sûr que le code de Midodiy est plus concis...:smt023

Encore merci de vos conseils.:smileJap:
 
Dernière édition:
D

Dudulle

Compagnon
Comme le dit Midodiy, j'ai utilisé l'option du flag pour ne passer qu'une fois dans le test du bouton et éviter les rebonds...
MAIS c'est vrai que je ne filtre pas les perturbations qui pourraient être prises comme un appui BP.
Et donc ca je dois l'intégrer. Surtout quand je ferais de petites machines pour mon atelier...
Que recommandez-vous comme "boucle/fonction" de détection de BP appuyé.

Moi j'utilise la librairie Button2 : https://github.com/LennartHennigs/Button2
Elle gère le click, double et triple click, ainsi que la problématique de rebond.
 
F

furynick

Compagnon
Les interrogations, c'est la semaine prochaine.
Wika n'a pas besoin de tempo sur la commande des BP, il utilise la mise en mémoire de l'état d'avant avec le if qui va bien. Ça supprime les rebonds.(on l'a vu dans le cours).

Faux

Le flag est réinitialisé au 1er retour de tension (pull-up), tu peux aussi avoir un rebond au décollement (même si c'est plus rare).

Dans ce cas tu sors de ton if, flag réinitialisé donc tu retournes dans ton if illico autant de fois qu'il y a de rebond.

C'est aussi vrai dans l'autre sens. Le rebond au collage de la lame fait croire que le BP est relâché donc ton flag est réinitialisé.

Une fréquence d'horloge de 16MHz signifie un temps de 62,5ns. Même s'il faut une dizaine de cycles pour lire l'état d'un pin ça ne fait que dans le 700ns. La fréquence des rebonds est de quelques microsecondes, largement assez pour que l'uC les captes.
 
F

furynick

Compagnon
Je ne comprends pas bien ton code ...
Aurais-tu la gentillesse de developper...
J'essaierai de faire ça demain, sur le tel ça va être un peu compliqué de coder.

En gros, la 1ère fonction lit l'état des BP en s'assurant qu'ils sont pressés puis relâchés en se protégeant des rebonds (en général de 10 à 30ms). C'est grosso modo ce que font toutes les libs de gestion des BP.

La seconde fonction positionne les bits de pins de sortie en fonction du paramétre (soit CW soit CCW).
 
F

furynick

Compagnon
Pour les rebonds vous pouvez essayer de constater les rebonds avec le code suivant :

Appuyez sur le BP connecté sur le pin 2 rapidement et lentement. Comptez les pressions successives et votre console affichera plus du double. Selon la qualité du BP ça interviendra plus ou moins rapidement.
 
M

midodiy

Compagnon
Ah oui, je viens de relire mes notes du cours.
Le fait de mettre en mémoire l’état d’avant et de faire un if permet de voir un changement d’état du BP mais il faut rajouter un delay(20) dans le if a cause des rebonds...
On l’a vu dans la vidéo du cours 4.2 gérer les entrees.
 
F

furynick

Compagnon
Concernant la problématique qui t'occupe, perso j'aurais fait deux parties distinctes dans le loop, voire deux fonctions :
Je complète pour que le programme soit un peu plus complet (et je corrige le typage incorrect de BPstate ainsi que la logique du code de retour pour que ce soit plus efficace) :

Pour la fonction de pilotage je pense à qqch comme ça :
 
W

wika58

Compagnon
Merci pour les codes...
Mais malheureusement je n'y comprends rien du tout...

Pas encore assez formé le Padawan in Arduino...

Quand je serai Jedi of Arduino j'espère que j'arriverai à pondre des codes comme ca...
 
F

furynick

Compagnon
Le driveStepper peut paraître un peu obscur j'en conviens. Le checkBP t'arrives à le comprendre ou pas ?
 
W

wika58

Compagnon
Attention je suis envieux de pouvoir sortir des codes aussi concis...

C'est juste moi qui ne comprend pas...
Les deux exemples.
Et à la 5° lecture je crois que je comprends mieux le driverStepper que le checkBP...

Je vais encore essayer et je te demanderai les lignes où je bloque vraiment...

.
 
Dernière édition:
S

speedjf37

Compagnon
Bonjour,

Je ne suis pas très fan du code proposé ,
Je le perçois plutôt hermétique et pas naturellement compréhensible.
Que se passe t'il si on appuie sur les 2 boutons en même temps ?

Ps) l'essentiel est que l'on puisse se relire facilement longtemps après l'avoir écrit.

Jf
 
W

wika58

Compagnon
Ca me rassure un peu...

Aurais-tu la gentilesse de proposer la facon dont tu le ferais....

Ca permettrait aux non-sachants d'apprendre...

D'avance merci.
 
D

Dudulle

Compagnon
Pour commencer il faudrait utiliser des noms explicites de procédures et variables, ainsi que des commentaires en clair ; par là j'entend "en français".
De plus pour un message qui se veut "didactique" il faudrait peut être commenter un peu plus...
 
F

furynick

Compagnon
Que se passe t'il si on appuie sur les 2 boutons en même temps ?
La simultanéité n'existe pas en programmation, ça dépend donc de l'ordre dans lequel les boutons sont appuyés et relâchés, c'est un choix pour simplifier le code car faire un code détaillé et lisible est immanquablement inefficace, long à écrire et lent (c'est mon point de vue qui n'engage que moi).
Ceci dit, l'appui "simultané" est un non-sens et est le résultat d'une mauvaise utilisation de l'interface, en résulte donc un comportement aléatoire qui doit être sous la seule responsabilité de l'utilisateur.
Je préfères donc écrire un code qui soit générique, réutilisable et facilement modifiable.

C'est vrai que c'est limpide pour moi donc je n'ai pas commenté abondamment, j'ai aussi fait ça un peu rapidement entre deux réu du boulot donc c'est un peu spartiate j'en conviens. J'ai beaucoup l'habitude de raisonner en anglais quand je code donc j'ai tendance à nommer les variables en anglais et à commenter dans la même langue.

Je reprends donc le code en intégralité pour qu'il soit un peu plus compréhensible (mais ne l'ai pas testé donc il y a probablement des erreurs qui trainent) :
 
F

furynick

Compagnon
fail :
index = 0
direction = -1
index += direction ( = 0b11111111)
index &= 0b11 ( = 0b11111111)
val &= seq[0b11111111] ==> out of range/memory exception

Les seules valeurs possibles pour index sont 0, 1, 2 et 3.
 
F

furynick

Compagnon
Exact, ce qui est pire parce que tu shoot le statut de tous les autres pins, s'il y en a en OUTPUT l'état est modifié.

J'avais consciemment évité l'affectation directe de PINB pour que ce soit un peu plus compréhensible mais en effet, c'est dans l'optique d'un code simple et rapide mais qui dit simple dit moins lisible.
 
W

wika58

Compagnon
Merci Messieurs les Sachants pour vos codes respectifs.:smileJap:
Je vais étudier cela à tête reposée ce W-E.:tumbsupe:

Ajdh c'était copeaux...:lol:
 
Dernière édition:
W

wika58

Compagnon
Ceci dit, l'appui "simultané" est un non-sens et est le résultat d'une mauvaise utilisation de l'interface, en résulte donc un comportement aléatoire qui doit être sous la seule responsabilité de l'utilisateur.
Quand je faisais de l'API (automate programmable) je passais pas mal de temps à faire des IHM "à l'épreuve des cons" ... qui prenaient souvent presque autant de temps à développer que l'application elle-même.:roll:
 
S

speedjf37

Compagnon
C'est bien plus simple que cela !
Laissez un individu quelconque tester votre interface il fera toujours la manipulation improbable qui plante tout.
Cela sans mauvaise intention, juste parce qu'il ne pense pas comme vous !
Ajoutez le syndrome de la démo et vous avez la famille Murphy au complet.

Pour les touches/claviers il y longtemps que j'utilise des lib qui gère les rebonds , les appuis ( longs courts),les doubles touches etc.
Quitte a les modifier/adapter au besoin présent.

Jf
 
W

wika58

Compagnon
Oui mais si tu pilotes le chargement d'un Haut-fourneau, tu as intérêt à ce que si le premier gugusse qui passe près du pupitre de commande et appuie sur 2 touches en même temps ne t'ouvre pas une vanne de 300 mm qui te met le HF à l'atmosphère...

Expérience vécue...
 
F

furynick

Compagnon
Restons cohérents, on parle de bobines d'un moteur PàP, développer une usine à gaz pour sécuriser l'utilisation de deux boutons poussoirs dans le cadre d'un exercice de cours de codage est totalement hors de propos.

La gestion d'un Haut Fourneau ne vous sera pas confié tout comme une Arduino ne sera pas adaptée pour cette tâche donc il n'est pas nécessaire de partir dans ces délires.

En programmation comme dans tous les domaines il faut garder la mesure des choses, c'est du bon sens.
 
W

wika58

Compagnon
Tout a fait d'accord.
C'etait juste une parenthèse au sujet des IHM "Idiot proofed"...
L'avantage sur les projets discutés ici c'est que derrières les manettes il y a qqun de responsable...
 
Dernière édition:

Sujets similaires

W
Réponses
122
Affichages
9 634
Philippe85
Philippe85
N
Réponses
3
Affichages
770
jpbbricole
jpbbricole
lolo
Réponses
0
Affichages
408
lolo
D
Réponses
0
Affichages
223
dodochef
D
osiver
Réponses
14
Affichages
36 185
osiver
osiver
D
Général langage MMBASIC
Réponses
8
Affichages
876
Dudulle
D
P
Réponses
33
Affichages
16 155
wika58
W
T
Réponses
2
Affichages
25 530
Tristan l'apprenti
T
altitude
Réponses
21
Affichages
2 779
laboureau
laboureau
esloch
Réponses
0
Affichages
278
esloch
esloch
laurenttanguy
Réponses
0
Affichages
486
laurenttanguy
laurenttanguy
Haut