Arduino UNO etc : Introduction aux interruptions - Détection un appui sur un bouton poussoir avec IT

Поделиться
HTML-код
  • Опубликовано: 12 сен 2024

Комментарии • 69

  • @antoinedevos3765
    @antoinedevos3765 3 года назад +1

    Merci Monsieur Peronnin pour cette vidéo. Arduino me parle beaucoup plus que les pages Web, le WiFi, etc.
    J'adore vos vidéo. C'est votre façon d'expliquer avec un (ou plusieurs) exemple concret.
    Par contre, je n'ai pas bien capté la déclaration de la variable en "Volatile". Je ne l'ai jamais utilisé car je ne connaît ce type de déclaration.
    Pouce en l'air, comme d'habitude, bien sûr.
    À très bientôt pour une autre vidéo.

    • @EricPeronnin
      @EricPeronnin  3 года назад +2

      Lorsque vous utilisez une variable dans des fonctions qui ne sont pas liées entre elles (ici, la fonction loop n'appelle jamais la fonction ISR_BP et réciproquement), le compilateur peut être amené à simplifier le code et faire disparaitre les évolutions d'une variable qui change en dans une autre fonction. La déclaration volatile oblige le compilateur à lire la valeur stockée en mémoire et non celle dont il peut disposer dans un de ces registres internes.

    • @antoinedevos3765
      @antoinedevos3765 3 года назад

      @@EricPeronnin C'est tout de suite plus clair pour moi.
      Merci d'avoir répondu avec précision. Merci pour toutes vos vidéo si bien expliquée.
      À très bientôt.

  • @user-bk3ze5jz3n
    @user-bk3ze5jz3n Год назад

    Bonjour Eric,
    Tous mes respects.
    Très bon pédagogue et passionné par ce qu'il fait.
    Cordialement.
    Jean-Luc.

  • @philippe5394
    @philippe5394 3 года назад +2

    Bonsoir Eric,
    je découvre votre chaîne, via un lien de la chaîne d'Heliox. Je viens de regarder cette vidéo d'introduction aux interruptions. C'est un délice! J'adore votre approche pédagogique, votre méthode et les aides visuelles mises en oeuvre, le rythme aussi. Moi ça me va bien, je vais passer de bons moments, car je suis également fan d'Arduino, de Raspberry. Merci à vous, merci pour cette belle pédagogie. Bonne continuation..........

    • @EricPeronnin
      @EricPeronnin  3 года назад

      Merci Philippe

    • @philippe5394
      @philippe5394 3 года назад +1

      @@EricPeronnin Eric, pour répondre à votre question, Héliox a mis un lien vers votre chaîne sous sa dernière vidéo, à savoir "Réalisations hors caméra : on teste des choses !" En plus du lien, elle en parle de vous dans la vidéo.
      Bonne journée,

    • @EricPeronnin
      @EricPeronnin  3 года назад

      @@philippe5394 Merci Philippe. Je suis allé voir. C'est vraiment chouette de sa part.

  • @julienlogeard
    @julienlogeard 2 года назад +1

    C'est ma première video chez vous et je me suis régalé. Des vieux souvenirs (positifs) de l'IUT et de mon prof d'automatisme. Merci mec t'es cool!

  • @jck7398
    @jck7398 3 года назад +1

    Bonjour
    Je croyais qu'il n'y avait que les plus de 70 ans, contemporains du MITRA 15 ou équivalent, qui employaient le terme "IT". Blague à part, excellente introduction au vaste sujet que sont les interruptions (j'ai regardé celle-ci après avoir visionné les suivantes).

  • @philippeguitton6670
    @philippeguitton6670 2 года назад +1

    Bravo, vos vidéos sont pertinentes et fort bien réalisées ! MERCI !

  • @jccr-mipmoi1599
    @jccr-mipmoi1599 3 года назад +2

    Très bien comme toujours ! Vivement la suite !

  • @fabricemotard4312
    @fabricemotard4312 3 года назад +3

    Encore une très bonne vidéo ! Je vais bien suivre cette série ! 😁 Un 👍 supplémentaire pour la série sur kucadque je viens de regardé complètement et j'ai appris beaucoup de choses que je ne connaissais pas encore merci pour toute vos vidéos vraiment très instructives !! 👏👏😉

  • @freeeflyer
    @freeeflyer 3 года назад +1

    J'avais jamais essayé les int sur arduino. Merci pour le tuto..

  • @EclisiaSong
    @EclisiaSong 3 года назад +1

    Encore bravo Eric pour cette très très bonne vidéo.

  • @sylvainmasson4457
    @sylvainmasson4457 3 года назад +2

    Un autre vidéo avec des explications bien claires. J’ai un petit souci cependant. Puisque nous travaillons avec un microcontrôleur 8 bit ici et que la variable compteurBP est sur 16 bit (donc deux accès 8 bit), avant d’imprimer cette variable dans la fonction loop(), la variable compteurBP devrait être copiée dans un variable temporaire en désactivant les interruptions pour éviter que ISR_BP() soit exécuter juste entre les deux accès 8 bit.

    • @EricPeronnin
      @EricPeronnin  3 года назад

      Oui, vous avez raison. La variable étant volatile, je pensais que le compilateur pouvait le gérer en procédant lui même à la désactivation/réactivation des IT mais ce n'est pas le cas et c'est donc au programmeur de désactiver les IT, copier la variable, réactiver les IT. C'est d'ailleurs ce qui est fait pour les fonctions millis() et micros().

  • @laurent9288
    @laurent9288 3 года назад +1

    Super ! On attend la partie 2 :-)

  • @jfmahe1407
    @jfmahe1407 3 года назад +1

    Super ! Très clair.

  • @pascaldegenne4002
    @pascaldegenne4002 2 года назад +1

    Bonjour Eric,
    Je suis votre chaîne avec grand intérêt ces dernières années depuis que je suis en retraite.
    Je ne comprends pas votre programme de debounce du Bouton Poussoir.
    Vous sauvegarder l'instant PrecedentIT en sortant de la fonction. Mais vous la réinitialiser à l'entrée dans la fonction.

    • @EricPeronnin
      @EricPeronnin  2 года назад

      Bonjour Pascal. La variable PrecedentIT est une variable static. Cela signifie que l'initialisation ne se fait qu'à la première exécution de la fonction dans laquelle elle se trouve. Pour les autres itérations de la fonction, la variable conserve la valeur qu'elle avait à l'itération précédente.

    • @pascaldegenne4002
      @pascaldegenne4002 2 года назад

      @@EricPeronnin Merci pour votre réponse. C'est clair. Je n'avais pas saisi la notion de variable static.

  • @gilleshenri9529
    @gilleshenri9529 3 года назад

    comme dab joli court simple et concis

  • @Victurf
    @Victurf 3 года назад +1

    Merci beaucoup!

  • @JoeLaFrite
    @JoeLaFrite 3 года назад +1

    Bonjour, merci pour la vidéo, elle est vraiment bien faite. Et j'apprécie le fait de ne pas couper au montage les petits moments de galère (problème du terminal par exemple). On rencontre nous aussi forcément un moment ou un autre ce genre de problème.
    Question sur le define. Je n'ai pas vraiment compris la nuance entre utiliser un #define et une constante. Vous parlez de l'intitulé...

    • @EricPeronnin
      @EricPeronnin  3 года назад

      Bonjour et merci pour le commentaire.
      Je ne fais aucun montage : tout est enregistré en 1 prise (enfin, je recommence parfois plusieurs fois avec que la prise soit bonne). Même en procédant ainsi, je gagne du temps car le montage c'est rapidement chronophage.
      Si vous regardez les codes proposés par les ingés d'application des fabricants de composants, ils utilisent la plupart du temps des #define. J'en fais un usage important aussi. Il y a un inconvénient, c'est que la définition peut aboutir à un remplacement dans le code dans des noms différents mais intégrant l'intitulé du define et là, c'est la cata et on peine en plus à voir d'où provient le problème. A ce titre les constantes peuvent être plus rigoureuses. Quand on sait ce qu'on fait et qu'on le choisit suffisamment détaillé pour éviter cet effet de bord, le define est très bien.

    • @MrArpSolina
      @MrArpSolina 3 года назад

      @@EricPeronnin Ce problème est évité avec un peu de rigueur : les noms de define sont toujours en majuscules, et les noms de variables avec au moins 1 minuscule. A éviter également : les noms de define trop courts. Exemple : #define A 1

  • @mohamedsalemfdahi3443
    @mohamedsalemfdahi3443 3 года назад +1

    Formidable job please série sur raspberry pi 4 Merci en avance votre Channel est top

    • @EricPeronnin
      @EricPeronnin  3 года назад +1

      Je suis totalement sec sur le raspberry pi. Qu'attendez-vous comme genre de tuto sur lui ?

    • @antoinedevos3765
      @antoinedevos3765 3 года назад

      @@EricPeronnin Est-ce que Raspberry n'est pas de la même trempe que Arduino (en plus complet et plus rapide bien sûr) ?

    • @JoeLaFrite
      @JoeLaFrite 3 года назад

      @@antoinedevos3765 Arduino et Raspberry n'ont rien à voir. Raspberry est un ordinateur sur carte simple (mémoire, proc, périphérique) qui possède un système d'exploitation (Linux, Windows...). Arduino est un microcontrôleur avec des capacités beaucoup plus limitées et qui ne peut donc pas faire tourner un système d'exploitation classique.
      La particularité du Raspberry est qu'il possède des ports GPIO directement accessible. Il faut juste considérer ces ports comme un périphérique classique (carte son, vidéo, souris, clavier...) avec son driver géré par l'OS.
      Dans un Arduino, on accède directement au ports IO

  • @benjamin3682
    @benjamin3682 2 года назад +1

    Bonjour,
    Encore merci pour cette présentation d’interruption. J'ai essayé de mettre cette fonction d’interruption sur le script des deux leds. Mon objectif est de faire un marche/arret avec l'appuie du bouton-poussoir. Un if(compteur_bp % 2 == 1) dans le void loop, et hop ça fait le job. Je n'arrive pas à enlever le premier appuyé qui si j'ai compris initialise le premier état de la fonction. Où ne comprend pas ce qu'il passe ?

    • @benjamin3682
      @benjamin3682 2 года назад +1

      Tout pour moi, le détail est corrigé dans la video suivante. J'ai bien mon on/off tout nickel.
      merci

  • @antoinedevos3765
    @antoinedevos3765 3 года назад +1

    Je vous souhaite une excellente fête de Pâques 🐇

    • @EricPeronnin
      @EricPeronnin  3 года назад

      Merci Antoine. J'espère que vous avez bien profité de ce long week-end

  • @martinefournier2185
    @martinefournier2185 3 года назад +1

    bonjour,
    super cet exemple d'utilisation des interruptions combiné au problème de rebond.
    ma question sera simple: pourquoi déclarer en première ligne : #include ?
    merci de vos précisions !

    • @EricPeronnin
      @EricPeronnin  3 года назад

      Bonjour. C'est nécessaire pour platformio. Avec l'IDE Arduino, Arduino le gère automatiquement.

    • @martinefournier2185
      @martinefournier2185 3 года назад

      @@EricPeronnin , merci pour cette précision.

  • @sammodelisme
    @sammodelisme 3 года назад +1

    Encore Merci pour cette vidéo. Question : Peut on déclarer plusieurs interruptions, dans le cas de 2 codeurs sur 2 moteurs ?

    • @danielroibert5631
      @danielroibert5631 3 года назад +1

      Le uC ATmega328 n’offre que deux entrées avec interruption. Ce sont les pins 2 et 3 de l’Arduino Uno. Je trouve que c’est une des principales limitations de l’ATmega328 par rapport à ses concurrents. Il existe bien évidemment des uC qui offrent bien plus d’entrée avec interruptions. Certains uC disposent même d’interruptions sur chaque entrée.

    • @EricPeronnin
      @EricPeronnin  3 года назад +1

      Bien sûr. Autant qu'il y a de sources d'interruptions dans le uC.

  • @danielbedez9724
    @danielbedez9724 2 года назад

    Bonjour,
    Très agréable de suivre les vidéos, surtout pour un novice comme moi, lol.
    Par contre, si j'ai bien compris on a 13 input ou output suivant la configuration sur le arduino uno.
    En changeant, de numéro de Pin, je me suis rendu compte que cela ne fonctionnait pas sur toutes les pins?
    Est-ce parce que j'ai utilisé le 3,3volts?
    Je n'ai pas fait l'essaie avec le 5volts, car mettre le + 5v à la masse, pour moi c'est un court circuit!
    Y a t'il une résistance sur toutes les Pins?
    Quelque réflexions qui me sont passé par l'esprit.
    Encore merci pour vos vidéos très instructives.
    Daniel

  • @jean-marccliche3457
    @jean-marccliche3457 3 года назад +2

    Très bonne vidéo ! Pour une télécommande comment on fait pour qu'une touche ai deux fontions ? Comme par exenple activé et désactivé un relais sur la même touche, ON/OFF Avec Arduino.

    • @EricPeronnin
      @EricPeronnin  3 года назад

      Lorsque la pression sur la touche est détectée, on regarde l'état du relais et on le complémente.
      relais = !relais;
      digitalWrite(PIN_RELAIS, relais);

  • @adamaadam8073
    @adamaadam8073 3 года назад +1

    bonjour, est ce que vous allez faire des video sur les registre ? (PINx, DDRx,PORTx)? Sinon superbe vidéo :)

    • @EricPeronnin
      @EricPeronnin  3 года назад

      Bonjour. C'est déjà fait : ruclips.net/video/WV_b9nrDDmg/видео.html

  • @kitsu5242
    @kitsu5242 Год назад

    Bonjour, merci pour vos tutos j’ai beaucoup appris. J’ai besoin d’aide pour un programme « a la escape game » je voudrai actionner un servo moteur (genre ouvrir une porte) seulement si une séquence donnée est entrée sur 5 bouton poussoir, séquence préprogrammée, exemples, 1-2-5-3-4 ou 1-2-3-2-1-5-4 … Je suis preneur de toute aide ! Merci

  • @cedricserieys9768
    @cedricserieys9768 3 года назад +2

    Bonjour, à la fin de la vidéo, le premier appui ne fonctionnera pas car la variable statique n'est pas encore initialisée. Il faudrait un mécanisme de prise en compte du premier appui ou, plus simple mettre la variable en global et mettre un délai d'au moins 100ms après sont init dans le setup afin de tout caler poile-poil.
    Bonnes vidéos en tout cas et bonne continuation.

    • @EricPeronnin
      @EricPeronnin  3 года назад +2

      Il faut initialiser _millis = 0 contrairement à ce que j'ai fait en corrigeant... Il est peu probable d'avoir un appui durant les 100 premières millisecondes.

    • @cedricserieys9768
      @cedricserieys9768 3 года назад +2

      @@EricPeronnin En effet c'est plus simple.

  • @eliegedeonbikieyoudonangou5728
    @eliegedeonbikieyoudonangou5728 3 года назад +1

    Très bonne vidéo ! J'ai une question cependant : pourquoi dans votre code la fonction "attachInterrupt" est déclarée dans le void setup ? On m'a appris que dans le void setup on ne déclarait que les fonctions qui ne s'exécutent qu'une seule fois, mais de ce que j'ai compris "attachInterrupt" est censée s'exécuter plusieurs fois, chaque fois que le bouton poussoir est à l'état bas. Donc ne doit-on pas la déclarer dans le void loop ? Je l'ai déclaré dans le void loop et ça fonctionne tout aussi bien, mais j'aimerai savoir pourquoi est ce que vous l'avez déclaré dans le void setup.

    • @EricPeronnin
      @EricPeronnin  3 года назад +2

      Bonsoir. AttachInterrupt ne s'exécute qu'une seule fois. C'est la fonction qui lui ai fournie sous forme de pointeur de fonction qui sera exécutée ensuite à chaque interruption. Donc tout est normal.

    • @eliegedeonbikieyoudonangou5728
      @eliegedeonbikieyoudonangou5728 3 года назад

      @@EricPeronnin D'accord, puisqu'elle ne s'exécute qu'une seule fois je comprend qu'elle doit être déclarée dans le Setup 👌. Mais alors... comment je peux expliquer le fait que ça fonctionne quand même lorsque je la déclare dans la boucle loop ?
      Merci

  • @danielroibert5631
    @danielroibert5631 3 года назад

    Bonjour, formidable et merci encore pour vos excellentes vidéos. Il est normal que le premier appui sur le bouton soit rejeté car les deux variables, precedenteIT et _millis, sont initialisées quasi en même temps. Personnellement, j’aurais placé la déclaration et l’initialisation de precedenteIT en global. De cette façon, on peut espérer qu’il se déroule le temps suffisant (délais d’anti rebond DELAI_SANS_REBOND ) avant que l’utilisateur appuie la première fois sur le bouton.

    • @EricPeronnin
      @EricPeronnin  3 года назад

      Bonjour Daniel. Effectivement. J'avais au départ initialisé à 0 et j'ai eu la mauvaise idée d'initialiser à millis ensuite... Car en fait, c'est le premier appui qui crée finalement la variable static. Donc quelque soit le temps écoulé avant le premier appui, le problème subsistera.

    • @danielroibert5631
      @danielroibert5631 3 года назад

      @@EricPeronnin Oui, vous avez raison, initialiser PrecedenteIT à 0 dans l’interruption, c’est plus simple et plus propre. (voilà entre autres, pourquoi je ne suis pas prof d’unif :-) )

    • @EricPeronnin
      @EricPeronnin  3 года назад

      @@danielroibert5631 Après avoir laissé une erreur comme celle que vous avez décelée, le prof ne fait pas le malin. Enfin là, je n'ai pas le courage de refaire la vidéo. Dommage que RUclips ne permette pas de mettre des stickers pour des annotations ultérieures.

    • @danielroibert5631
      @danielroibert5631 3 года назад

      @@EricPeronnin Oui, quand c’est vraiment important, certains RUclipsurs ajoutent un correctif dans la description sous la vidéo. C'est souvent bien suffisant.

  • @davidmaillot2253
    @davidmaillot2253 3 года назад

    Expliquée en toute simplicité. L'image à 6:36 secondes me pose cependant un problème. Si je considère que le temps est millis() , pourquoi le carré orange est au dessus de la ligne du temps?

  • @bouaitarached998
    @bouaitarached998 3 года назад +1

    bonjour, merci de m'indiquer comment utiliser cette fonction sur une carte ESP8266 V3.merci

    • @EricPeronnin
      @EricPeronnin  3 года назад

      De la même façon.

    • @bouaitarached998
      @bouaitarached998 3 года назад

      le programme est le suivant:
      # include
      # define PIN_BP 2
      volatile int compteurBP = 0;
      void ISR_BP(){
      compteurBP++;
      }
      void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      pinMode (PIN_BP, INPUT_PULLUP) ;
      attachInterrupt(digitalPinToInterrupt(PIN_BP), ISR_BP, RISING);
      }
      void loop() {
      // put your main code here, to run repeatedly:
      Serial.println (compteurBP);
      }

    • @MsFireroll
      @MsFireroll 2 года назад

      Cela n'a pas fonctionné pour mon ESP8266 NodeMCU ni pour mon Mini D1-> j'avais une erreur "ISR not in IRAM!"
      Par contre en rajoutant "void ICACHE_RAM_ATTR ISR_BP(); " au début, le code était fonctionnel (avec GPIO14 pour mon Mini D1)

    • @MaxVlasic-u9c
      @MaxVlasic-u9c Год назад

      @EricPeronnin Bonjour Monsieur et tout d'abord merci beaucoup pour votre contenu d'excellentes qualité.
      Cependant je ne comprends malheureusement pas comment vous pouvez vous servir de millis()au coeur d'une ISR() contrairement à ce que l'on prêche sur plusieurs forums. Où il est expliqué que attaches interrupts désactive ce type de fonction a part la fonction micros() ....qui si j'ai bien compris ne serai pas sur le même Timer....
      Si vous pouviez m'éclairer sur ce point , je vous en remercie.
      Voilà des jours que je recherche et je tourne en rond sur ce point
      Merci pour votre aide.
      Bonne journée.

  • @tanguymarion6368
    @tanguymarion6368 3 года назад

    RIP la capa de filtrage sur le bouton poussoir :'(