Le forum a migré vers l'adresse suivante:

Forum

Masquer ce message

Simple-Duino Forum Index



Utilisation d'une télécommande IR


 
Post new topic   Reply to topic    Simple-Duino Forum Index -> Arduino & Électronique -> Questions
Previous topic :: Next topic  
Author Message
Guid0
Débutant

Offline

Joined: 29 Oct 2013
Posts: 16
Masculin
Niveau d'éléctronique: Débutant

PostPosted: Wed 13 Nov - 18:36 (2013)    Post subject: Utilisation d'une télécommande IR Reply with quote

PublicitéSupprimer les publicités ?
Bonjour,
Le kit robot Dagu 'miniHexaPod' que j'utilise pour m'initier dispose d'une télécommande IR. Je suis en train d'essayer de comprendre comment il est codé dans le programme d'exemple fourni. J'ai un peu de mal à m'y retrouver.

Voici ce que j'ai vu dans le code.

En début de code, des constantes sont définies pour repérer les pins IR.

Quote:

// ==== IR COMS PINS ====
#define IRIpin          3  // digital pin  3 - IR Interrupt
#define IRXpin          0  // digital pin  0 - IR RX
#define ITXpin          1  // digital pin  1 - IR TX
#define ITMpin          4  // digital pin  4 - IR TX modulate (38KHz)



ITMpin n'est jamais utilisée dans la suite du code.

Dans le setup(), il y a ces lignes :
Quote:

  digitalWrite(IRIpin,1);                                       // turn on D3 pullup resistor for IR receiver interrupt pin
...
  attachInterrupt(1,IRdetect,FALLING);


Bon, si je comprend bien, on place la pin D3 (IRIpin) en état 'HIGH', et le attachInterrupt déclenche la fonction IRdetect() lorsque la pin D3 (interrupt 1 sur les UNO(cf reference), je suppose que la carte du robot y ressemble beaucoup) passe de 'HIGH' à 'LOW'.
Le code de la fonction IRdetect() passe simplement une variable volatile flag de '0' à '1'.
Je suppose donc que lors de la reception d'un code IR de la télécommande, le récepteur fait passer momentanément IRIpin (pin D3) sur 'LOW'.

Dans le code du loop() apparaît plusieurs fois le code :

Quote:

  if(flag==1)
  {
    flag=0;
    if(pulseIn(IRXpin, LOW,Speed) >1800) IRcommand();             // if start bit is greater than 1900uS then read remote control. Timeout value controls robot speed
  }



Donc en cas d'interrupt (réception d'un IR sur pin D3) on teste la durée (pulseIn) sur IRXpin cette fois (la pin D0, soit) jusqu'à ce que la pin IRXpin soit de nouveau 'LOW'. Si elle est de plus de 1800 microseconde, c'est bien une commande IR et on lance IRcommand() dont voici le code.
Quote:

void IRcommand()
{//----------------------------------------- Receive IR commands from remote control ----------------------------------

  digitalWrite(LEDpin,HIGH);                                    // Turn on red indication LED to show signal received
  IRC=0;                                                        // reset Infra Red Command variable
  int j=1;                                                      // reset binary multiplier
  for(int k=0;k<7;k++)                                          // read 7 data bits (ignore 5 bit device ID)
  {                               
    pulse = pulseIn(IRXpin, LOW,2500);                          // measure pulse from IR receiver
    if(pulse > 900)                                             // a pulse greater than 900uS is considered to be a 1
    {                               
      IRC+=j;                                                   // if it is a 1 then add 2 to the power of i
    } 
    j*=2;
  }


La suite est un switch sur IRC.

Bon, je comprend bien que l'idée est de mesurer les durée des 7 pulsations suivantes correspondant à 7 bits, 1 si la pulsation dure plus de 900 microseconde et 0 si plus court.

Ce que j'en comprend, c'est que le codage du message de la télécommande est fait avec les pulsations en durée. Il y a tout de même quelque chose qui me surprend, puisque le codage est en durée, comment est on sur de ne pas avoir raté de bit entre deux itérations de la boucle for (int k...) ?

Si vous avez des exemples de code de réception de commande IR, ou si vous connaissez le principe de ces transmission de données, je suis preneur de toute information, car, personnellement, je n'y connais rien, je ne fais que réfléchir à comment peut fonctionner un code.
Merci d'avance.
____________________________
Projet en cours :
Reécriture programme robot
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Sat 16 Nov - 21:29 (2013)    Post subject: Utilisation d'une télécommande IR Reply with quote

Il y a une librairie qui prend en charge la communication IR 
c'est IRremote disponible ici http://www.pjrc.com/teensy/td_libs_IRremote.html
Avec un petit tuto en dessous
____________________________
http://simple-duino.com
Back to top
Guid0
Débutant

Offline

Joined: 29 Oct 2013
Posts: 16
Masculin
Niveau d'éléctronique: Débutant

PostPosted: Fri 22 Nov - 09:28 (2013)    Post subject: Utilisation d'une télécommande IR Reply with quote

Oui,oui,oui...
Je suis allé voir les solutions en utilisant des lib toutes prêtes. Mais vu la carte lowCost du petit robot que je reprogramme (NG ATmega8) je suis extrêmement limité (max de 7 168 octets). Du coup, la library et un simple appel à une fonction explose la mémoire disponible...
Ce n'est pas pour rien que le programme n'utilise pas tone()...
Ok, je pourrais passer à une carte plus moderne, mais il faudrait refaire tout le robot. Et comme j'aime bien les défis, je vais un peu creuser.
Rien que parce que des trucs comme voyager me font encore rêver...
____________________________
Projet en cours :
Reécriture programme robot
Back to top
Display posts from previous:   
Post new topic   Reply to topic    Simple-Duino Forum Index -> Arduino & Électronique -> Questions All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  

Index | Xooit.com free forum | Free support forum | Free forums directory | Report a violation | Cookies | Charte | Conditions générales d'utilisation
Powered by phpBB
Propulsé par Simple-Duino