Hack d'un émetteur et puce SC5262S

Bonjour à tous,

Je viens tout juste de m'inscrire car je découvre peu à peu l'univers de l'Arduino, et en parcourant ce forum j'ai vu des sujets vraiment utiles et intéressants. Comme vous vous en doutez je rencontre actuellement un petit soucis, tout bête je pense, mais qui me prend la tête depuis 2 jours.

Pour résumer la situation j'essaye actuellement d'allumer une lampe à distance à l'aide de ce dispositif : http://i4.instantgallery.de/s/su/sui/400/a3cc219426884.jpg

J'ai donc branché la partie "prise" du matos et démonté la télécommande. J''ai regardé sur internet et suis tombé sur la librarie RCSwitch, qui facilite grandement l'utilisation de ce genre de dispositif (ça permet de générer des bits très facilement à partir d'un code binaire, décimal etc.).

Egalement on peut récupérer quelques infos concernant l'émission des données. Tout est expliqué là en fait : GitHub - sui77/rc-switch: Arduino lib to operate 433/315Mhz devices like power outlet sockets.

Pour la récupération, aucun soucis ! Je branche le pin 2 de mon Arduino UNO au pin DOUT de cette puce SC5262S : http://doc.chipfind.ru/html/silan/sc5262sir.html qui est incorporée dans la télécommande.

Le problème est que je n'arrive pas à envoyer des données, la lampe ne s'allume jamais et la LED (qui signale lorsqu'il y a émission de données) ne s'allume jamais...

Mon code Arduino pour la réception :

/*
  Example for receiving
  
  http://code.google.com/p/rc-switch/
  
  If you want to visualize a telegram copy the raw data and 
  paste it into http://test.sui.li/oszi/
*/

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  Serial.println("initialisation");
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
}

void loop() {
  if (mySwitch.available()) {
    output(mySwitch.getReceivedValue(), mySwitch.getReceivedBitlength(), mySwitch.getReceivedDelay(), mySwitch.getReceivedRawdata(),mySwitch.getReceivedProtocol());
    mySwitch.resetAvailable();
  }
}

(output :

void output(unsigned long decimal, unsigned int length, unsigned int delay, unsigned int* raw, unsigned int protocol) {

  if (decimal == 0) {
    Serial.print("Unknown encoding.");
  } else {
    char* b = dec2binWzerofill(decimal, length);
    Serial.print("Decimal: ");
    Serial.print(decimal);
    Serial.print(" (");
    Serial.print( length );
    Serial.print("Bit) Binary: ");
    Serial.print( b );
    Serial.print(" Tri-State: ");
    Serial.print( bin2tristate( b) );
    Serial.print(" PulseLength: ");
    Serial.print(delay);
    Serial.print(" microseconds");
    Serial.print(" Protocol: ");
    Serial.println(protocol);
  }
  
  Serial.print("Raw data: ");
  for (int i=0; i<= length*2; i++) {
    Serial.print(raw[i]);
    Serial.print(",");
  }
  Serial.println();
  Serial.println();
}


static char* bin2tristate(char* bin) {
  char returnValue[50];
  int pos = 0;
  int pos2 = 0;
  while (bin[pos]!='\0' && bin[pos+1]!='\0') {
    if (bin[pos]=='0' && bin[pos+1]=='0') {
      returnValue[pos2] = '0';
    } else if (bin[pos]=='1' && bin[pos+1]=='1') {
      returnValue[pos2] = '1';
    } else if (bin[pos]=='0' && bin[pos+1]=='1') {
      returnValue[pos2] = 'F';
    } else {
      return "not applicable";
    }
    pos = pos+2;
    pos2++;
  }
  returnValue[pos2] = '\0';
  return returnValue;
}

)

Et le code pour l'envoi :

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

 
void setup () {

  Serial.begin(9600);
 
  
  mySwitch.enableTransmit(10); // pin #10
  mySwitch.setRepeatTransmit(20);
  
    delay(700);


// Optional set pulse length.
// mySwitch.setPulseLength(320);

// Optional set number of transmission repetitions.
// mySwitch.setRepeatTransmit(15);

}

void loop () {

  // 0FFF -> groupe 1
 // 0FFF -> switch
  // FF -> ON
 // F0 -> OFF
 
  
 mySwitch.sendTriState("0FFF0FFFFFFF");
  
  // mySwitch.switchOn(1, 1); 
   
delay(1000);
    


}

Voilà, si quelqu'un a une idée je prends volontiers !!

Merci de m'avoir lu :slight_smile:

Loris1634:
...
Le problème est que je n'arrive pas à envoyer des données,.. la LED (qui signale lorsqu'il y a émission de données) ne s'allume jamais...

quelle led ? implantée où/sur quoi ?

Bonjour, merci de ta réponse :slight_smile:

La LED, et désolé de mon manque de précision, est celle installée sur la télécommande.

Image :

http://cl.ly/image/3d3I2v2K0r1d

Elle s'allume lorsqu'on appuie "manuellement", c'est à dire avec les boutons normaux de la télécommande, signalant que les données sont bien en train d'être envoyées. Mais lorsque je branche la pin 10 de mon arduino à la pin DOUT de la puce elle ne s'allume jamais, et aucune donnée n'est envoyée, la lampe ne s'allume donc pas.

J'espère avoir été un peu plus clair :slight_smile:

Loris1634:
Bonjour, merci de ta réponse :slight_smile:

La LED, et désolé de mon manque de précision, est celle installée sur la télécommande.

Image :

http://cl.ly/image/3d3I2v2K0r1d

Elle s'allume lorsqu'on appuie "manuellement", c'est à dire avec les boutons normaux de la télécommande, signalant que les données sont bien en train d'être envoyées. Mais lorsque je branche la pin 10 de mon arduino à la pin DOUT de la puce elle ne s'allume jamais, et aucune donnée n'est envoyée, la lampe ne s'allume donc pas.

J'espère avoir été un peu plus clair :slight_smile:

ok
Donc tu veux "jouer" à partir de la télécommande ?
si oui :
il faut oublier la led de la telco , elle est générée (blink) par le contrôleur de la telco qui génère aussi la trame pour l’émetteur , mais ce sont deux choses bien différentes.

Pour ce qui concerne le piquage sur l'émetteur , déjà voir si il n'y a pas un pull-up ou down interne qui perturberait le soft .

incidemment lire ce topic , pour sniffer et spoofer
http://arduino.cc/forum/index.php/topic,109892.0.html

C'est ça, j'aimerai faire en sorte d'envoyer un signal à la prise branchée plus loin qui lui indiquerait de laisser passer le courant, et passer par la télécommande fournie avec me semble une bonne solution, je ne sais pas si yen a des meilleures.

Merci du conseil et du lien, j'avais déjà regardé mais je n'ai pas tout tout compris, c'est vraiment complexe :fearful:

Je vais tout de même tout relire j'espère y trouver quelque chose qui me permettra de continuer. Si tu as d'autres idées / liens n'hésites pas :stuck_out_tongue:

Loris1634:
C'est ça, j'aimerai faire en sorte d'envoyer un signal à la prise branchée plus loin qui lui indiquerait de laisser passer le courant, et passer par la télécommande fournie avec me semble une bonne solution, je ne sais pas si yen a des meilleures.

Merci du conseil et du lien, j'avais déjà regardé mais je n'ai pas tout tout compris, c'est vraiment complexe :fearful:

Je vais tout de même tout relire j'espère y trouver quelque chose qui me permettra de continuer. Si tu as d'autres idées / liens n'hésites pas :stuck_out_tongue:

bonsoir
avant d’émettre les trames brutes, il faut déjà acquérir les trames brutes.
je n'ai pas vu dans tes programmes où tu récupère la/les trames brutes et où tu les réinjecte.
dans ton cas si tu n'a qu'un canal à commander en ON/OFF et si tu est pret à cannibaliser ta telco, le plus simple est surement de te repiquer directement sur les pistes "boutons" ON/OFF ça ne nécessite pour une prise à commander que 2 pins sur l'arduino. (ON/OFF)

j'ai "decapsulé" une telco basique avec le meme principe
evoqué ici

Bonsoir merci de ta réponse :slight_smile:

"il faut déjà acquérir les trames brutes.
je n'ai pas vu dans tes programmes où tu récupère la/les trames brutes et où tu les réinjecte"

En effet, car je dois avouer ne pas savoir exactement de quoi il s'agit :~

"le plus simple est surement de te repiquer directement sur les pistes "boutons" ON/OFF"

Cela signifie t'il a "rediriger" le ON / OFF sur l'arduino c'est bien cela ?

Merci beaucoup pour votre aide, j'adore vraiment bidouiller et l'arduino est vraiment fantastique :slight_smile:

EDIT.

Je viens de regarder sur internet ce qu'étaient exactement des trames. Si j'ai bien compris de quoi vous parliez, ces "trames" sont envoyées par la librarie RCSwitch qui s'occupe de cela comme ceci :

/**
 * Sends a Tri-State "0" Bit
 *            _     _
 * Waveform: | |___| |___
 */
void RCSwitch::sendT0() {
  this->transmit(1,3);
  this->transmit(1,3);
}

/**
 * Sends a Tri-State "1" Bit
 *            ___   ___
 * Waveform: |   |_|   |_
 */
void RCSwitch::sendT1() {
  this->transmit(3,1);
  this->transmit(3,1);
}

/**
 * Sends a Tri-State "F" Bit
 *            _     ___
 * Waveform: | |___|   |_
 */
void RCSwitch::sendTF() {
  this->transmit(1,3);
  this->transmit(3,1);
}

/**
 * Sends a "Sync" Bit
 *                       _
 * Waveform Protocol 1: | |_______________________________
 *                       _
 * Waveform Protocol 2: | |__________
 */
void RCSwitch::sendSync() {

    if (this->nProtocol == 1){
		this->transmit(1,31);
	}
	else if (this->nProtocol == 2) {
		this->transmit(1,10);
	}
}

etc.

Est ce bien cela dont vous parlez ? Ou suis je completement à côté de la plaque ? ^^

Bonjour, je me permets de up le topic en donnant quelques nouvelles.

Tout d'abord j'ai suivi les quelques pistes qui m'ont été données. J'ai donc compris que pour que ma télécommande envoie les signaux il fallait que des "trames" de tension exactes soient envoyées.

Sauf que pour connaitre ces trames il fallait d'abord les récupérer via l'arduino, pour ensuite les réenvoyer spécifiquement (selon ce qu'on veut faire -> On ou Off).

Malheureusement là où je ne comprends c'est pourquoi mon cas ne marche pas. Car, même sans le savoir, j'ai déjà récupéré ces informations (capture d'image : http://cl.ly/image/1t3c29312E28 )

Dès lors j'utilise la librarie RCSwitch qui permet, à partir du décimal ou du binaire récupéré dans l'image ci dessus, d'émettre des trames de tensions spécifiques.

D'où mon code :

 mySwitch.sendTriState("0FFF0FFFFFF0");

Ce qui donne :

void RCSwitch::sendTriState(char* sCodeWord) {
  for (int nRepeat=0; nRepeat<nRepeatTransmit; nRepeat++) {
    int i = 0;
    while (sCodeWord[i] != '\0') {
      switch(sCodeWord[i]) {
        case '0':
          this->sendT0();
        break;
        case 'F':
          this->sendTF();
        break;
        case '1':
          this->sendT1();
        break;
      }
      i++;
    }
    this->sendSync();    
  }
}

Avec ces méthodes :

/**
 * Sends a Tri-State "0" Bit
 *            _     _
 * Waveform: | |___| |___
 */
void RCSwitch::sendT0() {
  this->transmit(1,3);
  this->transmit(1,3);
}

/**
 * Sends a Tri-State "1" Bit
 *            ___   ___
 * Waveform: |   |_|   |_
 */
void RCSwitch::sendT1() {
  this->transmit(3,1);
  this->transmit(3,1);
}

/**
 * Sends a Tri-State "F" Bit
 *            _     ___
 * Waveform: | |___|   |_
 */
void RCSwitch::sendTF() {
  this->transmit(1,3);
  this->transmit(3,1);
}

Qui elles mêmes donnent :

void RCSwitch::transmit(int nHighPulses, int nLowPulses) {
    
    boolean disabled_Receive = false;
    int nReceiverInterrupt_backup = nReceiverInterrupt;
    if (this->nTransmitterPin != -1) {
        if (this->nReceiverInterrupt != -1) {
            this->disableReceive();
            disabled_Receive = true;
        }
        digitalWrite(this->nTransmitterPin, HIGH);
        delayMicroseconds( this->nPulseLength * nHighPulses);
        digitalWrite(this->nTransmitterPin, LOW);
        delayMicroseconds( this->nPulseLength * nLowPulses);
        if(disabled_Receive){
            this->enableReceive(nReceiverInterrupt_backup);
        }
    }
    
    
}

Du coup je ne comprends pas ce qui ne marche pas ? Qu'ai je mal compris ?

Merci de m'avoir lu :slight_smile: