[Autre] [Projet] Télécommande infrarouge pour Vélux
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

[Projet] Télécommande infrarouge pour Vélux



  1. #1
    invitea0b9e65b

    [Projet] Télécommande infrarouge pour Vélux


    ------

    Bien le bonjour,

    Comme la télécommande du vélux de ma copine est à la limite de la mort, j'ai décidé de lui créer une copie.
    J'ai utilisé un module arduino nano.

    J'ai d'abbord regardé avec Audacity et un petit montage utilisant un capteur infrarouge pour identifier le signal de la télécommande originel, avec une petite représentation sous isis ça donne :

    SchemaSequenceTelecommandeDoudou.png

    Puis pour l'émetteur, j'ai utilisé :

    #Trois boutons :
    *ouvrir
    *stop
    *fermer

    #Un détecteur de flamme (la sorte de DEL noir sur la photo) (pour ouvrir le veux en cas de feu... (oui, il me restait ce composant que j'avais envie d'utiliser...))
    #Un potentiomètre pour régler sa sensibilité.

    #Une LED infrarouge

    Et puis c'est tout.

    On obtient le schéma suivant (je n'ai pas mis les les des boutons poussoir ni le détecteur de flamme ni le potentiomètre, et j'ai mi une led bleu au lieux d'une led infrarouge, et j'ai mis une résistance de 280 ohm au lieu de 190 ohm pour une led infrarouge) :

    Capture d'écran 2016-11-09 22.09.10.png

    Voici le code utilisé :

    Code:
    //telecommande pour le velux de doudou
    
    const int button1Pin =2;
    const int button2Pin =3;
    const int button3Pin =4;
    const int UVLedPin=5;
    const int flameDetectorPin=A1;
    const int potar1Pin =A0;
    const int led1Pin =6;
    const int led2Pin =7;
    const int led3Pin =8;
    int button1State;
    int button2State;
    int button3State;
    int flameDetectorValue;
    int potar1Value;
    int i;
    
    //sequences de cliniotement de la led UV : temps en microseconde
    //positif : led allumee
    //negatif : led eteinte
    int sequenceUp[95]={516, -1156, 533, -1128, 1327, -317, 510, -1151, 533, -1122, 1355, -317, 499, -1156, 505, -1162, 499, -1162, 522, -1139, 505, -1162, 510, -1151, 1338, -323, 1344, -317, 499, -1151, 510, -1156, 1344, -317, 1338, -317, 1338, -323, 1344, -306, 1338, -323, 499, -1156, 505, -1151, 539, -25879, 624, -1128, 505, -1162, 1361, -295, 499, -1162, 510, -1156, 1349, -306, 499, -1168, 522, -1139, 505, -1162, 505, -1156, 510, -1156, 499, -1162, 1338, -317, 1349, -306, 510, -1139, 539, -1139, 1344, -317, 1361, -283, 1344, -317, 1344, -312, 1338, -312, 510, -1151, 539, -1122, 510};
    int sequenceStop[95]={1344, -317, 505, -1156, 1349, -306, 505, -1162, 505, -1156, 1349, -306, 505, -1156, 510, -1156, 539, -1122, 510, -1151, 510, -1156, 505, -1162, 1344, -312, 1366, -289, 505, -1156, 499, -1156, 1349, -317, 1372, -283, 1344, -312, 1366, -283, 510, -1151, 539, -1134, 1344, -312, 499, -25998, 1332, -317, 510, -1156, 1349, -312, 499, -1162, 533, -1128, 1349, -312, 499, -1156, 510, -1156, 510, -1139, 516, -1162, 510, -1156, 533, -1128, 1344, -317, 1344, -312, 499, -1151, 516, -1156, 1344, -312, 1338, -323, 1344, -312, 1338, -312, 510, -1156, 533, -1128, 1349, -312, 505};
    int sequenceDown[95]={510, -1162, 1344, -312, 1395, -261, 499, -1162, 510, -1156, 1366, -289, 499, -1156, 539, -1128, 533, -1134, 505, -1156, 510, -1156, 505, -1156, 1349, -312, 1372, -283, 499, -1156, 510, -1162, 1338, -323, 1327, -317, 1338, -323, 1338, -317, 1332, -323, 1327, -323, 505, -1156, 1344, -25136, 516, -1145, 1349, -323, 1355, -289, 505, -1156, 505, -1168, 1338, -317, 505, -1156, 505, -1162, 505, -1151, 510, -1156, 527, -1139, 510, -1151, 1349, -312, 1366, -289, 505, -1151, 533, -1134, 1344, -317, 1344, -306, 1372, -289, 1344, -312, 1366, -289, 1338, -317, 499, -1156, 1349};
    
    //test
    //int sequenceUp[95]={2650, -800, 400, -950, 400, -550, 300, -550, 400, -850, 800, -550, 400, -450, 400, -500, 350, -500, 400, -550, 350, -500, 300, -500, 450, -450, 400, -500, 400, -450, 350, -500, 350, -600, 800, -450, 400, -950, 350, -500, 350};
    //int sequenceUp[39]={2750, -750, 550, -750, 550, -350, 550, -300, 1450, -1200, 550, -300, 550, -350, 550, -300, 550, -300, 600, -300, 550, -300, 550, -350, 550, -300, 550, -350, 550, -300, 550, -350, 1000, -300, 550, -750, 550, -350, 550};
    
    
    void setup() {
      pinMode(button1Pin, INPUT);
      pinMode(button2Pin, INPUT);
      pinMode(button3Pin, INPUT);
      pinMode(flameDetectorPin, INPUT);
      pinMode(potar1Pin, INPUT);
      pinMode(UVLedPin, OUTPUT);
      pinMode(led1Pin, OUTPUT);
      pinMode(led2Pin, OUTPUT);
      pinMode(led3Pin, OUTPUT);
      digitalWrite(UVLedPin, LOW);
      //Serial.begin(9600);
    }
    
    void loop() {
      
      // on lit l'etat des boutons
      button1State = digitalRead(button1Pin);//prend 114 microsecondes a s'executer d'apres ISIS
      button2State = digitalRead(button2Pin);
      button3State = digitalRead(button3Pin);
      flameDetectorValue = analogRead(flameDetectorPin);
      potar1Value = analogRead(potar1Pin);
      
      //si on appuie sur le boutton 1
      /*Serial.println("\nflameDetectorValue");
      Serial.println(flameDetectorValue);
      Serial.println("potar1Value");
      Serial.println(potar1Value);*/
      if(((button1State == HIGH || flameDetectorValue >= potar1Value) && button2State == LOW && button3State == LOW))
      {
        //on allume la led1
        digitalWrite(led1Pin, HIGH);
        //on fait clinioter la led UV a la frequence du bouton 1
        for(i=0;i<95;i++)
        {
          if(sequenceUp[i]>0)//on allume la led le temps voulu
          {
            digitalWrite(UVLedPin, HIGH);
            delayMicroseconds(sequenceUp[i]);
          }
          else//on eteint la led le temps voulu
          {
            digitalWrite(UVLedPin, LOW);
            delayMicroseconds(-sequenceUp[i]);
          }
        }
        digitalWrite(UVLedPin, LOW);//on eteint la led quand on a fini le dernier allumage de led
      }
    
      //si on appuie sur le boutton 2
      if(button2State == HIGH && button3State == LOW && button1State == LOW)
      {
        //on allume la led2
        digitalWrite(led2Pin, HIGH);
        //on fait clinioter la led UV a la fréquence du bouton 2
        for(i=0;i<95;i++)
        {
          if(sequenceStop[i]>0)//on allume la led le temps voulu
          {
            digitalWrite(UVLedPin, HIGH);
            delayMicroseconds(sequenceStop[i]);
          }
          else//on eteint la led le temps voulu
          {
            digitalWrite(UVLedPin, LOW);
            delayMicroseconds(-sequenceStop[i]);
          }
        }
        digitalWrite(UVLedPin, LOW);//on eteint la led quand on a fini le dernier allumage de led
      }
    
      //si on appuie sur le boutton 3
      if(button3State == HIGH && button1State == LOW && button2State == LOW)
      {
        //on allume la led1
        digitalWrite(led3Pin, HIGH);
        //on fait clinioter la led UV a la fréquence du bouton 3
        for(i=0;i<95;i++)
        {
          if(sequenceDown[i]>0)//on allume la led le temps voulu
          {
            digitalWrite(UVLedPin, HIGH);
            delayMicroseconds(sequenceDown[i]);
          }
          else//on eteint la led le temps voulu
          {
            digitalWrite(UVLedPin, LOW);
            delayMicroseconds(-sequenceDown[i]);
          }
        }
        digitalWrite(UVLedPin, LOW);//on eteint la led quand on a fini le dernier allumage de led
      }
      digitalWrite(led1Pin, LOW);
      digitalWrite(led2Pin, LOW);
      digitalWrite(led3Pin, LOW);
      delay(140);
    }
    J'ai d'abord utilisé le logiciel ISIS pour vérifier mon code, puis j'ai fait le tout sur une breadboard.

    J'ai fini par passer à une plaque de prototype soudable.
    IMG-20161109-WA0008.jpg
    IMG-20161109-WA0010.jpg

    J'ai vérifié mon montage avec un oscilloscope, qui m'a permis de relever un temps de monté en tension et de descente en tension au niveau de la LED de 40microseconde. Je vais donc devoir modifier mon code en conséquence, mais sinon ça fonctionne.
    Et je crains que la lumière émise par la led ne soit pas exactement de la bonne longueur d'onde car le détecteur utilisé précédemment a du mal à detecter le signal... A moins que ce soit à cause du problème de timing... A moins que ce soit la resistance de la led qui soit trop élevée (pourtant calculée pour avoir 20mA)...

    Si vous avez des avis je suis preneur...
    Si vous refaite mon projet, je suis aussi preneur de vos photos

    A+

    -----

  2. #2
    paulfjujo

    Re : [Projet] Télécommande infrarouge pour Vélux

    bonjour,

    40µS pour pour passer de 0 à 1 ou de 1 à 0 ?
    c'est enorme ! ou la durée d'un bit ?

    le delayMicrosecond accepte-il un entier 16 bits comme argument ?

    il faut peut-etre envisager de passer en 100% asm .

    As-tu essayer d'envoyer plusieurs trames de commande au lieu d'une seule..
    Le recepteur ayant surement un systeme de controle CAG (automatique de gain), il faut un signal qui dure suffisament longtemps pour qu'il s'autoadjust.

    quelle frequence moyenne de la trame ?

    coté recepteur est-ce un capteur genre TSOP38 (periode porteuse 26,3µS) ?
    Dernière modification par paulfjujo ; 10/11/2016 à 15h01.

  3. #3
    paulfjujo

    Re : [Projet] Télécommande infrarouge pour Vélux

    J'ai fait le contraire , recepteur d'une telecommande inconnue.. et j'avais utilisé ce logiciel :
    http://www.ostan.cz/IR_protocol_analyzer/

    il me reste à faire aussi la copie de cette telecommande , comme cela est ton cas

  4. #4
    invitea0b9e65b

    Re : [Projet] Télécommande infrarouge pour Vélux

    Citation Envoyé par paulfjujo Voir le message
    bonjour,

    40µS pour pour passer de 0 à 1 ou de 1 à 0 ?
    c'est enorme ! ou la durée d'un bit ?
    40µS pour passer de 0 à 1 et de 1 à 0.
    Oui, c'est énorme, je trouve aussi, et je ne comprends pas bien pourquoi... Etait-ce l'oscilloscope que j'ai utilisé ?... Pourtant il tourne en 20MHz je crois, ce qui fait T=50nanoseconde... donc il devrait être assez précis...


    Citation Envoyé par paulfjujo Voir le message
    le delayMicrosecond accepte-il un entier 16 bits comme argument ?
    delayMicrosecond prend en argument un "unsigned int", donc 2 octets minimum, donc bien 2*8=16 bits.
    cf. ici

    Citation Envoyé par paulfjujo Voir le message
    il faut peut-etre envisager de passer en 100% asm .
    Je ne connais pas ASM, et google ne m'aide pas beaucoup.

    Citation Envoyé par paulfjujo Voir le message
    As-tu essayer d'envoyer plusieurs trames de commande au lieu d'une seule..
    Le recepteur ayant surement un systeme de controle CAG (automatique de gain), il faut un signal qui dure suffisament longtemps pour qu'il s'autoadjust.
    Oui, j'envois des paires de trames : les paires séparées de 25998µS, et les groupes de paires séparées de 140ms.
    J'imagine bien que le signal doit durer assez longtemps, mais je ne connais pas ce système.

    Citation Envoyé par paulfjujo Voir le message
    quelle frequence moyenne de la trame ?
    Je n'ai pas utilisé de fréquence moyenne, j'ai juste mesuré (avec audacity) une à une les longueurs des impulsions.

    Citation Envoyé par paulfjujo Voir le message
    coté recepteur est-ce un capteur genre TSOP38 (periode porteuse 26,3µS) ?
    Oui, j'utilise un TSOP38 pour mes tests, mais le récepteur final sera une chose inconnue...


    Ma copine a testé lundi, et le résultat est négatif.
    Par contre, j'ai utilisé une library IRRemote d'arduino, et j'ai pu enregistré le signal du bouton mute de la télécommande de ma chaine hifi, et en utilisant la fonction qui permet d'envoyer le signal ça fonctionnait. Mon hardware est donc OK .

    Je vais donc surement aller sur place pour enregistrer une nouvelle fois le signal de la télécommande originelle, mais cette fois ci avec la library IRRemote.

    Sinon, si vous avez des idées pour utiliser les données (temps des impulsion) que j'ai déjà mesuré, je suis preneur.


    Question : serait-ce possible que l'imprecision de la mesure des impulsion ait fait que le signal se décale et ne respecte pas la période porteuse de 26,3µs ?
    Sinon, je vais faire, dans mon prochain temps libre, une modification de mes données pour faire des multiples de 26,3µs ; qu'en pensez vous ?

    Cordialement,

    Nicolas

    PS : pour ce qui est de faire la copie du récepteur, j'attends que cette partie du velux tombe en panne

  5. A voir en vidéo sur Futura
  6. #5
    paulfjujo

    Re : [Projet] Télécommande infrarouge pour Vélux

    Question : serait-ce possible que l'imprecision de la mesure des impulsion ait fait que le signal se décale et ne respecte pas la période porteuse de 26,3µs ?
    si en face , le recepteur est TSOP36 ou TSOP40, il y aura une attenuation du signal compromettante ...
    voir utilisation impossible.

    il faut peut etre envisager un "reglage " de porteuse ..
    un potar -> entree ana -> valeur ADC pour corriger la periode de base, generee par un timer
    ou une commutation 36,38,40Khz via 2 entrees pour modifier la periode de base..

Discussions similaires

  1. télécommande infrarouge pour une voiture télécommandez
    Par invite9857cea4 dans le forum Électronique
    Réponses: 1
    Dernier message: 02/07/2012, 18h46
  2. Réponses: 1
    Dernier message: 17/07/2011, 17h33
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...