Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Faisceau IR

Comment faire deux choses a la fois ?

Sujet résolu
    15 novembre 2012 à 23:28:27

    Bonjour tout le monde !

    Voila j'ai un petit problème ^^" Je voudrai en effet exécuter deux commandes en même temps sauf que je sais vraiment pas comment faire, déjà parce que j'ai pas appris les threads sur d'autres langages et en plus que je sais que l'Arduino est pas tout a fait en C.
    Je dispose de la bibliothèque IRremote et ce que je veux faire c'est d'un coté envoyer un signal avec une diode IR et de l'autre coté recevoir ce signal sur un TSOP 34838. Tout le materiel marche très bien. Enfait ce que je veux c'est faire une sorte de faisceau, dont on peut récupérer l'état.
    Sauf que c'est soit j'envoie le signal, soit je recois le signal et j'ai pas vraiment trouvé comment faire les deux en même temps, ca serait pas possible ? Ou je me trompe de piste sur l'émission du signal peut être ? Mais un simple signal sorti du PWM je sais pas si ca serait efficace vu que le recepteur est fait pour les 38kHz

    Merci beaucoup si vous pouvez m'aider ^^
    • Partager sur Facebook
    • Partager sur Twitter
      16 novembre 2012 à 10:38:08

      Si le signal doit être émis constamment pourquoi le faire via Arduino ? Un simple NE555 pourrait te générer un créneau à la bonne fréquence.
      • Partager sur Facebook
      • Partager sur Twitter

      Retrouvez moi sur mon blog et ma chaine Youtube !

        16 novembre 2012 à 21:58:03

        Utilise un des périphériques PWM de l'arduino pour générer le 38 kHz sans intervention du processeur.
        • Partager sur Facebook
        • Partager sur Twitter
          17 novembre 2012 à 14:06:29

          Merci pour vos réponses ! :D

          Alors effectivement je pense que je vais utiliser un NE555, si je l'utilise avec un montage astable est-ce que ca ira ? (En faisant ce montage http://www.robot-maker.com/index.php?/tutorials/article/13-composant-le-ne555/page___st__3) J'ai fait les calculs et je devrai utiliser deux resistances de 125 Ohms(je metterai 120 et 5.6 en série) et un condensateur de 100nF. Après je sais pas vraiment si c'est vraiment ce dont tu voulais parler Eskimon ^^"

          Mais Lord pour le PWM je peux pas changer la fréquence en 38kHz pour générer le signal si ?

          Citation : Tuto

          Pour votre carte Arduino elle est de environ 490Hz.


          Enfin si tu me dit comment faire c'est peut être plus facile que d'ajouter une composant ^^"
          • Partager sur Facebook
          • Partager sur Twitter
            17 novembre 2012 à 19:31:57

            En fait pour changer la fréquence du PWM tu peux, mais il faut aller tripoter des notions plus "avancés" dans les registres du microcontrolleur (chose qui ne sont pas proposé dans les fonctions de bases d'arduino)

            Ou alors tu utilises la fonction Tone() (je te réoriente vers la doc pour savoir comment l'utiliser et sur le sujet suivant pour en connaitre une limite)
            • Partager sur Facebook
            • Partager sur Twitter

            Retrouvez moi sur mon blog et ma chaine Youtube !

              17 novembre 2012 à 20:33:33

              Citation : CortmanEhf

              Mais Lord pour le PWM je peux pas changer la fréquence en 38kHz pour générer le signal si ?



              Si, c'est fait pour, l'unité pwm ne fait pas que du pwm, elle peut aussi sortir un signal carré à peu près à n'importe quelle fréquence, il suffit de la configurer, donc à 38 kHz dans ton cas.

              Ensuite, je suppute que tu vas vouloir moduler ce signal en on/off vers 250-500 Hz pour que ton TSOP te sorte du 500 Hz quand la barrière n'est pas interrompue :

              - tu configures un timer pour déclencher une interruption 1000 fois par seconde
              - cette interruption regarde la sortie du TSOP
              - ensuite, elle gère le on/off sur la sortie à 38 kHz

              Genre, en pseudocode :

              // variable globale pour communication entre interruption et main
              static int passages = 0;
              
              // fonction d'interruption qui est appelee 1000x par seconde (ou moins selon tes goûts)
              void mytimer()
              {
                // variables d'état
                static int temps_coupure = 0;
                static bool emission = false;  // si true on a déclenché l'émission au cycle précédent
              
                bool reception = (état de la pin qui reçoit le signal du TSOP)
              
                if( emission )
                {
                  // au cycle precedent on a emis, check si le TSOP a reçu
                  if( reception )
                  {
                    // si on a reçu ce qu'on a émis, y'a personne devant
                    if( temps_coupure > un certain temps ) passages++;
                    temps_coupure = 0;
                  }
                  else
                  {
                    // on émet mais on ne reçoit pas : y'a quelqu'un
                    if( temps_coupure < maximum ) temps_coupure++;
                  }
                }
                else if( reception )
                {
                  // on emet pas mais on reçoit, signaler un bug !...
                }
                
                // change l'etat du pwm
                emission = !emission;
                // configure le pwm pour émettre ou pas.
                ...
                    
              }
              


              bon, le nom des variables devrait etre assez explicite, la on détecte les coupures de barriere lumineuse qui durent plus qu' "un certain temps".
              • Partager sur Facebook
              • Partager sur Twitter
                18 novembre 2012 à 20:17:22

                Oui Lord pour la suite c'est a peu près ca que je ferai ^^ Après je veux bien mais faut juste que je sache comment changer la fréquence du PWM :)

                Eskimon j'ai bien lu tout ce que tu m'as envoyé mais du coup ca veut dire que la fonction tone() sera pas une solution pour moi vu que je veux un signal a 38kHz et que la limite est 2^15 parce que la fonction prend un int :/

                Après j'ai regardé des topics pour voir comment changer la fréquence du PWM, mais ca parle de timer et pleins d'autre trucs qui interfèrent en plus sur la gestion du temps. Ca poserai problème parce que mon projet est basé sur cette gestion du temps :/

                Donc je fais quoi, PWM ou utilisation du 555(ca me dérangerai pas parce que j'ai stock de matos presque a volonté)? xD (N'empèche merci de m'aider je serai pommé si non ^^)
                • Partager sur Facebook
                • Partager sur Twitter
                  18 novembre 2012 à 21:00:35

                  Il y a plusieurs unités timers* dans ton uC, l'un d'eux doit être utilisé pour la gestion du temps par le framework arduino, les autres sont dispo.

                  Je ne connais pas les commandes spécifiques arduino pour configurer ça, mais bon, comme pour tout uC il suffit de paramétrer les registres suivant les conseils de la datasheet (chez Atmel c'est très bien expliqué).

                  * = une unité timer/counter contient un compteur (ici 16 bits).
                  Le compteur peut compter des tops d'horloge (mode timer) fournis par un prescaler (qui te permet de diviser l'horloge du uC par une valeur de ton choix) ou bien des événements sur une broche (mode counter). Il y a d'autres modes utiles, par exemple la capture de la valeur du compteur quand une broche change d'état, utile pour mesurer une durée par exemple.

                  En mode compteur, tu peux mettre par exemple une horloge à 1 MHz avec le prescaler. Ton compteur va s'incrémenter 1 million de fois par seconde. Il y a un registre qui donne la période : si tu mets 2000 dedans, le compteur fera un tour tous les 2000 incréments, donc 500 fois par seconde.

                  Ensuite, il y a des registres de contrôle de PWM, à configurer, par exemple si tu actives le PWM et que tu mets dans le registre PWM la valeur 1000, quand le compteur est de 0 à 999 tu auras 1 en sortie sur la broche, de 1000 à 1999 tu auras 0 en sortie, tu as donc ton signal carré.

                  Le timer peut aussi activer une interruption (à configurer) pour appeler ta routine à chaque retour à zéro du compteur (parfois la valeur est aussi configurable).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 novembre 2012 à 21:46:53

                    Cette librairie elle correspond a ce que tu me dis non ? Ca peut m'aider a faire facilement les reglages et la sortie pwm je crois ^^"
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 novembre 2012 à 22:23:19

                      D'après la description, ça a l'air de convenir.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 novembre 2012 à 22:38:16

                        Et ca interferera pas du tout avec les fonctions comme delay() et millis() ? :)
                        (Désolé si je suis un parano sur ca, tout mon projet repose sur un traitement du durées)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 novembre 2012 à 23:37:20

                          Ça dépend quel timer ces fonctions utilisent, vérifie...
                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 novembre 2012 à 23:55:49

                            Selon ce site

                            Citation : Arduino 101

                            Timer0:
                            Timer0 is a 8bit timer.
                            In the Arduino world timer0 is been used for the timer functions, like delay(), millis() and micros(). If you change timer0 registers, this may influence the Arduino timer function. So you should know what you are doing.

                            Timer1:
                            Timer1 is a 16bit timer.
                            In the Arduino world the Servo library uses timer1 on Arduino Uno (timer5 on Arduino Mega).

                            Timer2:
                            Timer2 is a 8bit timer like timer0.
                            In the Arduino work the tone() function uses timer2.



                            Donc voila parfait vu que j'utilise pas la librairie Servo :D Si j'arrive a bien me servir de la libraire tout sera résolu je pense :) Je reviens vers vous une fois que j'ai fait tout ca ^^
                            Encore merci !

                            Yeah !! :soleil: Ca y est ca marche, donc ce que j'ai fait c'est avec la librairie un signal PWM d'une période de 26µs (~= 38461 Hz) ca rentre dans la plage du TSOP et je récupère l'état du faisceau simplement avec un digitalRead :D
                            Merci beaucoup de m'avoir aidé ! ^^
                            • Partager sur Facebook
                            • Partager sur Twitter

                            [Arduino] Faisceau IR

                            × 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