Partage
  • Partager sur Facebook
  • Partager sur Twitter

temporisations sérielles programmables.

    4 octobre 2020 à 11:27:29

    Bonjour 'le soudeur'

    Je ne connais rien au Arduino , ou un Rasperry pi, mais je comprends que tu souhaites:

    Pour chaque soudure, avoir des impulsion de 10, puis 20, puis 30, puis 60 ms.

    Pour les longueurs des impulsion:

    void loop {
      ....
      send_pulse(10, 100);
      send_pulse(20, 200);
      send_pulse(30, 300);
      send_pulse(60, 600);
    }

    Maintenant; il faudrait un 'Top' début de soudure (bouton poussoir ou autre) que tu câbles sur un port d'entré de l'Arduino.

    J'ai trouvé ce site (https://arduino.blaisepascal.fr/le-bouton-poussoir/) et ça a l'air d’être bon (capa de filtrage anti-rebond, ...). Il donne aussi un exemple de logiciel.

    Pour le câblage, j'ai trouvé ça (https://arduino-fr.site/led-avec-bouton/#1) (par contre pas de pull up, pas de capa ... Pas cool), mais il donne le lien, c'est la 3eme pin en haut a droite.

    Et là, tu remplaces mes "..." par une procédure qui attends que l'on appuie sur le bouton (donc un changement d'état du discret d'entré) --> je fais un essai (me taper pas sur les doigts si c'est pas bon !).

    const int CHARGER_PIN = 13;
    const int PIN_BOUTTON = 2; // port numérique lié au bouton poussoir
     
    void setup( ) {
     pinMode(CHARGER_PIN, OUTPUT);
     pinMode(PIN_BOUTTON, INPUT); // réglage du port du bouton en mode ENTREE
    }
     
    void send_pulse(long ms_on, long ms_off) {
      digitalWrite(CHARGER_PIN, HIGH);                           
      delay(ms_on);
      digitalWrite(CHARGER_PIN, LOW);                              
      delay(ms_off);
    }
     
    void loop(  )   {
      while (digitalRead(PIN_BOUTTON) == LOW) {
        delay (1);
      }
      send_pulse(10, 100);
      send_pulse(20, 200);
      send_pulse(30, 300);
      send_pulse(60, 600);
    }

    Si quelqu'un d'autre peut vérifier ...

    Cordialement.

    (PS: Je suis allé sur le forum usinages.com, ... On s'amuse bien, à ce que je vois !)

    -
    Edité par Dedeun 4 octobre 2020 à 11:45:25

    • Partager sur Facebook
    • Partager sur Twitter
      4 octobre 2020 à 13:56:16

      Salut Michel ...et Dedeun 

      Merci , j'étudie  vos "logiciels "  pour essayer de comprendre .

      Je debugue les 2  et ferais  un essai avec mon logiciel de simulation .

      Merci à  vous deux  .

      Jac .

      -
      Edité par JacquesVergneau 4 octobre 2020 à 14:01:38

      • Partager sur Facebook
      • Partager sur Twitter
        5 octobre 2020 à 14:18:40

        Salut Michel.

        Comme je ne voyais que 2 delay programmés  dans ton code , je me suis douté  qu'il y aurait  bien 5 impulsions , mais de même largeur .

        Et cela fut vérifié ( ton programme tourne  bien une fois débugué) ...car sur Tinkercard , j'ai bien 5 impulsions  à l'oscillo ,  de même largeur .

        Or je veux programmer un nombre d'impulsions ( 3 à 6 probablement ) ...de largeurs différentes .

         Cela est dû au fait qu'il faut une chauffe progressive des tôles d'aluminium...pour les souder ....sans trous ni éclaboussures .

        Bon je vais essayer en mettant le nombre  que je veux de digitalWrite  qui sont sous void run_task .

        Si j'y arrive pas je te rappelle .

        Amicalement .

        jac

        • Partager sur Facebook
        • Partager sur Twitter
          5 octobre 2020 à 16:14:00

          PS évidemment que le code marche, c'est testé, pardi



          C'était un exemple d'utilisation des interruptions pour déclencher une action.

          Si on veut avoir un tableau de durées d'impulsions, on peut faire comme ça

          typedef struct {
            int ms_on, ms_off;
          } pulse_t;
          
          
          pulse_t program[] = {
            { 100, 100},
            { 200, 200},
            { 400, 400},
            { 100, 100},
            { 100, 100},
            { 100, 0},
            { 0, 0}           // valeur sentinelle pour la fin
          };
          

          et

          /* envoyer les impulsions du programme */
          
          void run_task() {
            for (pulse_t *p = program; p->ms_on != 0; p++) {
              digitalWrite(led_pin, HIGH);
              delay(p->ms_on);
              digitalWrite(led_pin, LOW);
              delay(p->ms_off);
            }
          }


          Maintenant on peut faire mieux que des attentes avec delay(), - en jouant avec time() - ce qui permettrait de piloter indépendamment plusieurs trucs en parallèle.


          Ou d'avoir un bouton de sécurité qui arrête immédiatement la séquence (sans attendre la fin d'un délai).



          -
          Edité par michelbillaud 5 octobre 2020 à 16:19:41

          • Partager sur Facebook
          • Partager sur Twitter
            5 octobre 2020 à 18:44:30

            Salut Michel.

            Bon je suppose que tu insères , ces 2 codes successiifs ( ci dessus )   de la ligne 22 à la ligne 33  , et que tu vires de 23 à 32 .

            Je vois que tu as une carte Arduino Uno ...cool ....et que tu peux tester entrées , ( via poussoirs) , et sorties ( via leds ).

            Merci à toi.

            Si tu as un bouquin à m'indiquer pour la programmation Arduino ,  dont tu te sers , ......merci .

            Cordialement .

            Jac .

            -
            Edité par JacquesVergneau 6 octobre 2020 à 20:49:52

            • Partager sur Facebook
            • Partager sur Twitter
              11 octobre 2020 à 21:18:53

              JacquesVergneau a écrit:

              Salut à tous .

              Notre pote Abimen du forum "usinages.com" me transmet ce bout de programme en C pour un Arduino .

              Quelqu'un peut-il vérifier .

              Merci de votre attention . 

              Void setup( ) {

               pinMode(13,output);                                     // met la patte 13 en mode sortie .

              }

              void loop(  )   {

              digitalWrite(13, HIGHT);                                // patte 13 à 5 Volts .

              delay (20) ;                                                   //attente 20 ms

              digitalWrite(13,LOW);                                   // patte 13 à 0   Volt .

              delay(300);                                                  //attente 300ms.

              digitalWrite(13,Hight) ;                                 //etc...

              delay(50);

              digitalWrite(13,LOW);

              delay(200);

              }                                                                // et ça reboucle ...


              Merci de me dire si c'est bon .

              Ici on aurait la génération d'un signal à "1"sur 20ms , suivi d'une mise à"o"sur 300ms , d'une mise à"1"sur 50ms et d'une mise à "0" sur 200 ms ..et le cycle se répète .

              Amicalement .

              Jac .

              -
              Edité par JacquesVergneau 15 septembre 2020 à 12:08:03


              Le code que j'ai passé ne comportait pas ces fautes :-)

              Abimen

              -
              Edité par AlineHoufty 11 octobre 2020 à 21:19:16

              • Partager sur Facebook
              • Partager sur Twitter
                13 octobre 2020 à 10:52:18

                AlineHoufty a écrit:

                JacquesVergneau a écrit:

                Salut à tous .

                Notre pote Abimen du forum "usinages.com" me transmet ce bout de programme en C pour un Arduino .

                Quelqu'un peut-il vérifier .

                Merci de votre attention . 

                const int _PIN=13 ;  /<== avec cette déclaration en tête  ça tourne  sans problème ...merci Abimen .

                Void setup( ) {

                 pinMode(13,output);                                     // met la patte 13 en mode sortie .

                }

                void loop(  )   {

                digitalWrite(13, HIGHT);                                // patte 13 à 5 Volts .

                delay (20) ;                                                   //attente 20 ms

                digitalWrite(13,LOW);                                   // patte 13 à 0   Volt .

                delay(300);                                                  //attente 300ms.

                digitalWrite(13,Hight) ;                                 //etc...

                delay(50);

                digitalWrite(13,LOW);

                delay(200);

                }                                                                // et ça reboucle ...


                Merci de me dire si c'est bon .

                Ici on aurait la génération d'un signal à "1"sur 20ms , suivi d'une mise à"o"sur 300ms , d'une mise à"1"sur 50ms et d'une mise à "0" sur 200 ms ..et le cycle se répète .

                Amicalement .

                Jac .

                -
                Edité par JacquesVergneau 15 septembre 2020 à 12:08:03


                Le code que j'ai passé ne comportait pas ces fautes :-)

                Abimen

                -
                Edité par AlineHoufty 11 octobre 2020 à 21:19:16

                Juste une déclaration de constante oubliée en début de programme ...une paille .

                Milles excuses Abimen .

                Jacques .

                -
                Edité par JacquesVergneau 13 octobre 2020 à 10:53:04

                • Partager sur Facebook
                • Partager sur Twitter
                  13 octobre 2020 à 11:53:02

                  oui enfin bon avec Void à la place de void,  HIGHT au lieu de HIGH, etc., on veut pas savoir qui est le coupable, mais il y avait d'autres erreurs. Les programmes, faut copier-coller, pas retaper.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 octobre 2020 à 13:23:04 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


                      14 octobre 2020 à 21:03:34

                      michelbillaud a écrit:

                      Bref, tu veux que ça lance une série d'impulsions quand on appuie sur un bouton.

                      Et cette série serait définie par un "tableau" indiquant leur durée, et le délai avant de lancer la suivante.

                      Pour faire ça bien, on s'arrange pour que l'appui sur le bouton déclenche une interruption. Dans la boucle loop(), cette interruption démarre (si ce n'est pas déjà fait), une tâche consistant à envoyer les impulsions.

                      Voila un exemple de tâche déclenchée par un bouton (faire cligner la led intégrée un certain nombre de fois). Il y a un délai de sécurité au départ pour que la mise en route du pullup ne déclenche pas une interruption par inadvertance (saleté de machin).

                      const int led_pin = LED_BUILTIN;
                      const int button_pin  = 2;
                      
                      const int SAFETY_DELAY = 1000;
                      
                      volatile bool button_was_pressed = false;
                      
                      void when_button_is_pressed() {
                        button_was_pressed = true;
                      }
                      
                      void setup() {
                        pinMode(led_pin, OUTPUT);
                        pinMode(button_pin, INPUT_PULLUP); 
                        attachInterrupt(digitalPinToInterrupt(button_pin), when_button_is_pressed, FALLING);
                      
                        // sécurité au démarrage
                        delay(SAFETY_DELAY);
                        button_was_pressed = false;
                        
                      }
                      
                      /* tache : envoyer 5 impulsions */
                      
                      void run_task() {
                        for (int i=0; i < 5; i++) {
                           digitalWrite(led_pin, HIGH);
                           delay(200);
                           digitalWrite(led_pin, LOW);
                           delay(200);
                        }
                      }
                      
                      void loop() {
                        if (button_was_pressed) {
                          run_task();
                          button_was_pressed = false;
                        }
                        
                      }
                      

                      Dans loop, on s'arrange pour que l'appui sur le bouton PENDANT que la tache s'effectue soit ignoré.



                      -
                      Edité par michelbillaud 4 octobre 2020 à 11:52:08

                      Lors de la mise sous tension d'un Arduino, la patte 13, celle de la Led_Built_In, flashe sans qu'on lui ait rien demandé(1), ce qui déclenche le processus. Il faut donc éviter de l'utiliser. Si cette mise sous tension se fait via un port USB-serie ... c'est pire encore(??init série??). Tester avec un pro mini CH340. Il suffit de mettre un Arduino 'vide' sous tension pour s'en rendre compte ... et pourtant !

                      Aline
                      (1) rien à voir avec les tempo

                      -
                      Edité par AlineHoufty 14 octobre 2020 à 21:04:36

                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 octobre 2020 à 2:46:40

                        const int _PIN=13;
                        
                        void setup() {
                          pinMode(13,OUTPUT);
                        }
                        void loop(){
                          digitalWrite(13,HIGH);
                          delay(20);
                          digitalWrite(13,LOW);
                          delay(300);
                          digitalWrite(13,HIGH);
                          delay(50);
                          digitalWrite(13,LOW);
                          delay(200);
                        }

                         Salut .

                        Enfin voici le code ... en tout début de ce sujet ... , comme solution d'essai ,  d'Abimen qui m'a convaincu de l'utilité soft  d'une temporisation sérielle ....

                        Amicalement .

                        Jacques .

                        -
                        Edité par JacquesVergneau 20 octobre 2020 à 11:22:37

                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 octobre 2020 à 9:11:03

                          Heu, c'était un exemple pour montrer l'utilisation d'interruption dans le code arduino, sans avoir à brancher des tas de trucs et de machins, juste un bouton poussoir.

                          Certainement pas une application industrielle, oû il y aura effectivement des précautions materielles à prendre pour que la mise sous tension de l'ensemble se fasse en sécurité. Genre relai pour transmettre les sorties avec retard au démarrage, le temps que l'arduino soit bien réveillé et de bonne humeur.

                          Ici pour la démo j'etais obligé de faire un délai logiciel au début pour éviter la prise en compte d'une demande d'interruption intempestive au début, alors que je n'ai meme pas appuyé sur le bouton.

                          -
                          Edité par michelbillaud 15 octobre 2020 à 9:12:18

                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 octobre 2020 à 19:40:01

                            michelbillaud a écrit:

                            Heu, c'était un exemple pour montrer l'utilisation d'interruption dans le code arduino, sans avoir à brancher des tas de trucs et de machins, juste un bouton poussoir.

                            Certainement pas une application industrielle, oû il y aura effectivement des précautions materielles à prendre pour que la mise sous tension de l'ensemble se fasse en sécurité. Genre relai pour transmettre les sorties avec retard au démarrage, le temps que l'arduino soit bien réveillé et de bonne humeur.

                            [/quote]

                            Ici pour la démo j'etais obligé de faire un délai logiciel au début pour éviter la prise en compte d'une demande d'interruption intempestive au début, alors que je n'ai meme pas appuyé sur le bouton.

                            -
                            Edité par michelbillaud il y a environ 10 heures

                            Dans mon exemple 0, j'utilisais aussi la patte D13 et pour simplifier, j'utilisais même le bouton Reset de l'Arduino pour relancer le processus, il s'agissait de convaincre avec un code le plus simple possible et remplacer un système complexe de portes logiques. Et n'avais pas pensé à l'utilisation de cette patte par le ?Bootloader? et lors de l'initialisation de du port série/USB et ...

                            Abimen

                            -
                            Edité par AlineHoufty 15 octobre 2020 à 19:41:31

                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 octobre 2020 à 1:15:01

                              Salut l.

                              Bon, au moins  les gars , cette remarque  (éviter d'utiliser la pin 13 à cause de la pulse de mise sous tension au démarrage )  pourra servir aux amateurs comme moi  ...même si elle est  sans doute connue des pros .

                              A+ .

                              Jac 

                              -
                              Edité par JacquesVergneau 20 octobre 2020 à 11:25:11

                              • Partager sur Facebook
                              • Partager sur Twitter

                              temporisations sérielles programmables.

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown