Demande d'aide débutant

Bonjour je voudrais savoir si il est possible que l'arduino fasse deux action en même temps, dans mon exemple je veux une led qui clignote tout le temps et quand on appui sur un bouton l'état de celui-ci change tout de suite, le problème c'est qu'avec les delay de la led le bouton ne devient actif qu'après les 4 secondes. là c'est un exemple, mais je veux créer un flipper avec gestions des contacts , du son et des led , donc faudra t'il plusieurs arduino où il existe un moyen de modifier ce code pour avoir des taches en fond et le loop qui continu sans attendre.
merci

void setup()
{
pinMode(7, OUTPUT);
pinMode(4, INPUT_PULLUP);
Serial.begin(9600);
}
void led()
{
digitalWrite(7, HIGH);
delay(2000); // Wait for 1000 millisecond(s)
digitalWrite(7, LOW);
delay(2000); // Wait for 1000 millisecond(s)
}
void loop()
{
//led();
Serial.println(digitalRead(4));
}

Bonjour,
bienvenue.

Des remarques pour commencer :
A lire :

A respecter impérativement : mettre le code entre balise code → image
Et avant de le copier il faut l'indenter dans l'IDE en faisant "control T".

Tel qu'il est présenté, il est illisible surtout à partir d'une tablette ou d'un téléfone.

Déjà il faudrait connaître ce que tu utilises comme carte microcontrôleur de marque Arduino, ou d'une autre marque.
Arduino ne fabrique pas le microcontrôleur, le nom de la carte nous donnera le nom du microcontrôleur qui est sur la carte. C'est le seul renseignement qui compte.

Pour répondre à ta question, un microcontrôleur ne peut pas faire deux actions "strictement" en même temps comme on peut le faire en électronique.

Les ordres s’enchaînent un par un.
Mais ils s’enchaînent tellement vite que les actions paraissent simultanées → Oui, ce que tu veux faire est possible.

La fonction delay() est bloquante : le micro ne peut rien faire d'autre que d'attendre.
La solution est dans l'usage de la fonction millis().
Millis() donne le nombre de millisecondes qui se sont écoulées depuis le démarage du micro.

Important :
Pour comprendre l'usage de millis(), dans l'IDE il y a un exemple qui s'appelle "Blink without delay". Charges le et regardes comment le code fonctionne.

Conseils :
Il n'y a pas de langage Arduino, il n'y a que des bibliothèques de fonctions et de classes écrites en C/C++.
Un tuto de C/C++ ne peut pas faire de mal.

Il existe aussi les tutos d'Eskimon, eskimon.fr.
Eskimon explique en français les fonctions et classes des bibliothèques arduino.
Eskimon explique aussi comment gérer le matériel : boutons, servo, horloges.........

PS : si tu ne veux pas que le programme lambine, ne gardes pas Serial.begin(9600).
9600 c'était bon il y a 50 ans !
Passe au minimum à 115200 ou 250000.
Attention il ne faut pas oublier de régler aussi le moniteur de l'IDE.

Merci beaucoup pour la réponse, je vais regarder cette voie, je connaissais un peu le langage C++, mais ce qui est nouveau pour moi sont les cartes arduino uno, mega et esp32, j'ai acheté des livres sur leur programmation et je bloquais sur cette histoire de rapidité d'action. Bonne soirée

Un point qui peut être intéressant pour ton projet : la machine à état.

@J-M-L a écrit un tuto qui se trouve dans le sous-répertoire Tuto et Cours

Bonjour.

Sur un arduino mono coeur (uno, mini, micro, nano, stm32, esp8266, …) il ne faut pas bloquer la fonction loop par des appels à la fonction delay mais utiliser millis pour réaliser des tâches à une fréquence fixe. Mais il n’est pas possible d’exécuter plusieurs tâches exactement au même moment.

J’ai fais une librairie non bloquante sur ce principe qui permet d’appeler des fonctions utilisateur (callback) à une fréquence fixe.

Pour la gestion des boutons tu peux utiliser des interruptions, mais attention au rebonds. Je te conseille plutôt d’utiliser une librairie comme bounce2 ou ezButton qui permet de gérer efficacement l’anti-rebond en polling.

Sur un esp32 qui intègre FreeRTOS tu peux faire du faire du multi-tâches et ne pas utiliser la fonction loop.

Bien sûr avec une bibliothèque cela fonctionne, mais pourquoi ne jamais parler de la solution qui n'utilise aucune ligne de code, et qui consiste tout simplement à souder un condensateur de 100 nF en parallèle sur le contact ?

Oui, pourquoi ne jamais citer cette solution ultra simple qui a l'avantage d'annuler la perturbation au lieu de cacher la poussière sous le tapis ?
Et laisser le choix au responsable du projet d'utiliser l'une ou l'autre solution ?

Comment sont gérés les rebonds du bouton Reset sur les cartes microcontrôleurs ?

1 Like

Sur le fond oui, il faudrait aussi citer cette solution matérielle.

D’un point de vue technique je dirai que c’est le condensateur qui planque la poussière sous le tapis : on ne voit plus la perturbation mais elle existe toujours - elle est juste filtrée.

➜ lors de l’appui - on reçoit le signal un peu plus tard - 5 à 20µs (lorsque la décharge en INPUT_PULLUP atteint le seuil LOW) versus quelques nano secondes sans le condensateur.

➜ Lors du relâchement - à chaque rebond, le contact redécharge le condensateur vers 0 V et ce n’est qu’après le dernier rebond, quand le bouton reste enfin ouvert, que le condensateur peut se recharger par la résistance de pull-up interne. Il faut alors environ 2 à 5 ms (selon la valeur réelle de cette résistance) pour que la tension atteigne le seuil de détection HIGH de l’Arduino. Autrement dit, le signal ne sera vu comme HIGH qu’environ 2 à 5 ms après le dernier rebond effectif.

La solution logicielle ne cache rien - vous voyez tous les rebonds et surtout vous recevez le premier front instantanément, ce qui dans bien des cas suffit pour déclencher une action mais les solutions soft voient le relâchement plus tard car elles vont attendre souvent 20ms après le dernier bounce .

Bon après faut mettre les choses en perspective, on parle d’une action humaine qui dure facilement plusieurs dizaines ou centaines de ms donc ces ordres de grandeur se réactivité ne sont pas significatifs.

J’imagine que ce n’est pas souvent mentionné non pas à cause de ce comportement mais parce qu’il y a plus de « softeux » (comme moi) qui répondent que de « hardeux » (les 2 termes n’étant pas péjoratifs) et puis ça oblige à rajouter des composants. Je me souviens aussi à mes débuts qu’un condensateur ça fait un peu peur à maîtriser - on se demande quelle valeur choisir, quel type (céramique, électrolytique, tantale, film, mica,..), polarisé ou pas et dans quel sens on le met s’il est polarisé, …).

Bonjour et merci pour toutes ces réponses, je pense que toute la partie contact sera réalisé par l'électronique (relais, électro, etc...), je vais utiliser je pense une carte pour la gestion des points qui seront incrémenté par des contacts auxiliaires et qui les afficherons sur un écran , et une autre pour la partie son avec un petit module MP3 et buzzers, pour les lumières certaines seront commandé par des contacts physique et les autres par une carte et c'est là que vos pistes sont intéressante , car hier soir j'ai déjà regardé pour la fonction millis() et c'est vrai que cela n'a rien à voir. Vu que j'ai pris de livres débutant, ils ne développent pas trop le sujet et sont orienté sur des sujets simple que je connais en prog (genre if, for, print, etc...) .Je suis en train de cibler ce que je vais faire pour ne pas être le meilleur client d'Ali express ! j'ai commandé pas mal de carte et module pour tester, pour le reste j'ai une imprimante 3d et suis très bricoleur. je vais regarder ta librairie et regarder la machine à état. bonne journée

Ah ces softeux !
Ce qui est perturbant, ”électromagnétistement” ce sont les fronts raides, riches en fréquences élevées, qui sont propagés dans le montage par la filasse de liaison.

Avec un condensateur qui est chargé par la résistance de pull-up (notez mon effort dans l’emploi de cet anglicisme), a l’ouverture du contact, le signal ne part pas de Vcc mais de 0 V.
Sa pente au démarrage ne vaut que 1/RC, elle est alors maximale et ne fera que diminuer.
C’est sans commune mesure avec celle de l’ouverture franche d’un contact qui envoie des diracs, dont la pente est juste freinée par les quelques pF des capacités parasites de l’entrée du micro et des contacts ouvert du relais ainsi que l’inductance série de la filasse. Tout ceci ne représente pas grand chose.

Je ne vois pas comment un condensateur cacherait la poussière sous le tapis.
Le condensateur modifie le fonctionnement pour que défaut (perturbation electro magnétique) ne de produise pas.
La bibliothèque ne modifie rien sur le fonctionnement.

Quand au type de condenateur cela fait belle lurette que pour cette gamme de valeur la technologie céramique s’est imposée.

Que l’on me dise : je ne veux pas souder, le risque n’est pas élevé, je le prend,je peux le comprendre.

1 Like

J'ai vu quelqu'un faire un flipper avec Arduino Méga, pour les électro aimant , cela crée un problème qui est, quand ils reviennent en position ils envoient un léger courant qui perturbe la carte , il s'annule en mettant une diode sur les bornes de l'électro et là plus de problème son flipper est fonctionnel

Nos arduinos gèrent cela plutôt bien non ?

Mais oui techniquement au niveau signal (et surtout si haute fréquence ou effet de self) vous avez raison (bien sûr)!

Je reste softeux mais c’est vrai que c’est sans doute plus propre si on peut considérer l’association bouton + Condo comme un actionneur parfait - ça simplifie les choses.

(Pourquoi les boutons ne sont pas vendus avec le condensateur intégré … )

Problème connu avec les bobinages.
Pour plus d’info technique voir loi de Lentz et diode de ”roue libre”.
Selon la valeur du bobinage, sans diode de roue libre, la perturbation peut etre létale pour l’electronique de commande.

C’est un sujet qui est discuté régulièrement.

Cette vidéo explique pourquoi ce n’est pas une bonne solution.

En résumé:

  • ça ne supprime pas tous les rebonds
  • au début de la fermeture du contact il circule un courant très élevé dans ce contact (l’auteur de la vidéo parle de 100A mais il a négligé la résistance du condensateur).

Bonjour,

Si on prend pour exemple les BP RESET des Arduino, on constate, au moins sur un UNO, que c'est un RC en paralléle au BP.

Par exemple si le BP est cablé avec un pullup de 10k, il y a un RC 1k 100nF en paralléle au BP.

Ainsi quand il y a un rebond sur le C chargé à 5V, la capa est mise au 0V via la R 1k et le contact du BP, donc I = environ 5ma et non 100A.

A mon avis le fait d’ajouter une résistance ne va pas améliorer le premier point:

il néglige aussi la résistance du PCB ou des fils et aussi il ne mentionne pas l’inductance parasite du circuit qui s'oppose à la création rapide de ce fort courant et donc la rapidité de la montée en courant est limitée (même si on atteint la valeur max) .

Au final, on va avoir ce pic de courant pendant 150 ou 200ns

La puissance instantanée est définie par P = I² · R et l’énergie dissipée pendant Δt est E = P · Δt = I² · R · Δt (avec I le courant en ampères, R la résistance en ohms et Δt la durée en secondes).

Si on applique la formule :
P = (100)2 × 0,05 = 1000 W ➜ C’est énorme instantanément, mais la durée est seulement Δt ≈ 200 ns = 2 × 10−7 s, donc l’énergie réellement dissipée est

E = P · Δt = 1000 × 2 × 10−7 = 0,2 mJ

C’est très faible, donc à mon avis aucun dommage thermique ne se produit sur le bouton ou la piste PCB.

➜ Le gars de la vidéo exagère sans doute un peu.

Après, le fait que l’on puisse voir des rebonds même avec un condensateur s’explique : lorsque le bouton se ferme, le contact vibre et oscille pendant quelques millisecondes. Le condensateur, placé entre la pin et la masse, se charge et se décharge rapidement à chaque oscillation du contact. Comme sa constante de temps RC est faible, il peut ne pas maintenir une tension stable pendant toute la durée des micro-oscillations, et la tension sur la pin peut encore franchir plusieurs fois les seuils HIGH et LOW, entraînant des lectures multiples.

➜ Donc, si on veut être ceinture-bretelles, il faut vraiment un circuit RC où la résistance détermine la constante de temps R × C, ce qui permet d’empêcher le courant instantané élevé lors de la fermeture du bouton et de limiter suffisamment les oscillations mécaniques pour que la tension sur la pin reste stable sans rebonds.

la 1K en série avec la capa n'est pas là pour la suppression des rebonds mais pour étouffer le courant de décharge de C dans le BP.
c'est la 10K qui permet l'anti-rebonds en empêchant la recharge trop rapide de C, et par conséquent le maintient d'un état bas "prolongé" sur OUT (pour reprendre le repère utilisé par @jef59 dans son schéma).


cette guéguerre "softeux VS hardeux" me désole pour ceux qui y participent avec de mauvais arguments et/ou raisons.
pour ma part je suis les 2, matériel et logiciel, et dans son titre @lefebvreb95 dit bien être débutant, je trouve donc très bien de lui enseigner les différentes méthodes possibles, mais sans parti pris : chacune possède son propre intérêt, personnellement j'utilise l'une (et/)ou l'autre suivant mes besoins, chaque montage (fonction de son utilisation) étant différent.

Rassurez vous, on ne se prend pas au sérieux, c'est plus un jeu qui revient de temps en temps dans la discussion ici.

alors dans ce cas pourquoi ne pas présenter chacun vos arguments sur un autre ton ? (ne réponds pas, inutile de lancer une nouvelle polémique)


j'en profite pour te répondre à ça :

pour une raison bien simple : toutes les utilisations d'un BP n'exigent d'anti-rebond, tout comme une baguette de pain n'a pas besoin d'être vendue déjà beurrée.

Si c'est pour la discussion entre @68tjs et moi, sérieusement il n'y a pas de conflit ou de problème de ton (enfin; je crois). Vous n'avez pas le contexte mais on se balance ça sans doute une fois par an mais c'est plus de l'humour potache quand je dis "softeux" pour moi et "hardeux" pour lui. Je pense qu'il le sait.

En fait je respecte ses connaissances côté hard que je n'ai absolument pas.