433 Mhz réception non décodée

Bonjour

Depuis deux jours, j'essaye sans succès de jouer avec des petits modules 433 Mhz standards.
J'ai une uno avec un émetteur, une autre avec un récepteur.
Il existe deux bibliothèques de référence : virtualWire et RCSwitch
Mais ni l'une ni l'autre ne fonctionne avec les exemples de base : la uno émettrice envoie un simple signal mais la uno côté réception ne décode rien.

En analysant plus en détail, je tombe sur un truc que je n'arrive pas à expliquer :

Lorsque je branche un oscillo (Hantec 6022BE) sur la sortie DATA du récepteur 433 Mhz, j'observe bien les trames attendues. Le signal a l'air propre : niveau bas à 0V, niveau haut à 3,6V, pas de parasites apparents sur la restitution (filtres ?). Visuellement, on le décode très bien.
Mais lorsque je relie cette sortie DATA à une pin de l'arduino, le signal lu a l'air parasité à haute fréquence (je branche soit l'oscillo, soit l'arduino, mais pas les deux simultanément).

virtualWire est basée sur une interruption du timer, pour lire la pin par un digitalRead à fréquence constante
RCSwitch est basée sur une interruption liée à la pin (CHANGE), sans utiliser digitalRead()
Ces deux bibliothèques ont des traitements assez complexes d'analyse du signal, pour assurer une synchronisation temporelle et filtrer les parasites, mais visiblement ni l'une ni l'autre n'arrive à retomber sur ses pieds.

J'ai développé plusieurs petits programmes sans utiliser ces libs, pour voir ce qui se passe sur la pin.
Certains basés sur des lectures en rafale (environ 500.000 digitalRead par seconde), d'autres basés sur des interruptions.
Le résultat est sans appel : il y a plein de variations à haute fréquence sur la lecture arduino.
Et même dans le cas d'une interruption CHANGE, dans laquelle j'effectue immédiatement un digitalRead(), il arrive que deux interruptions successives lisent la même valeur, comme si la tension changeait entre le déclenchement de l'interruption et le digitalRead().
Et même lorsque l'émetteur n'émet rien du tout, et que la sortie DATA du récepteur est a priori stable à 0V (d'après l'oscillo).

J'ai remplacé les uno, les modules 433 Mhz (j'en ai deux jeux issus de la même commande), les 3 fils, ... sans effet.

Ce qui me perturbe, c'est la différence d'observation de la sortie DATA du récepteur, selon que j'utilise un oscillo ou une arduino.

Une idée de ce qui pourrait expliquer ce phénomène ?

Bonjour pepe,

Ou as tu pris la valeur de 3.5V? Sur la datasheet avr on voit que, avec une alim 5V, les entrées sont au niveau haut au dessus de 2.6V et au niveau bas en dessous de 2.2V (sauf erreur de ma part).

C'est un peu étrange, les valeurs données dans le tableau de la datasheet sont assez différentes des valeurs des courbes à la fin de cette même datasheet.

Mais effectivement plus on est loin de Vcc à l'état haut plus on augmente les risques d'une mauvaise détection.

Bonjour,

As-tu essayé de baisser la vitesse de transmission?
Y-a-t 'il dans les environs, d'autres modules émetteurs genre thermomètre sans fil?

bonjour
tu a un seul couple E/R ?
ce sont les modules cheap genre çà ?

Artouste:
bonjour
tu a un seul couple E/R ?
ce sont les modules cheap genre çà ?

Oui c'est exactement ça

bricoleau:
Oui c’est exactement ça

meme à proximité (qq cms) tu n’ a pas reussi à obtenir une communication ?
colle ça sur ton arduino recepteur (data en pin2 sur uno)
et regarde si tu a de l’activité lorsque tu envoie une emission (avec ton autre arduino)
ça ne decodera rien , mais au moins tu verra si y a de l’activité “recuperée”

enum PinAssignments {
  encoderPinA = 2,

};

unsigned long Tparc=0; //  temps de parcours du secteur
unsigned long Tact=0; // Test pour  micros() en entrée 
unsigned long ParcMax=3000000; // delai max en µs pour parcourir un secteur, si > arret theorique 
unsigned long Tparct[256] ; // tableau de long stockant les valeurs micros() à chaque interruption
byte Eparc; // etat du 1er creneau

byte Iparc=0; // indice pour parcourir Tparct

boolean Sint=false; // passé par l'interruption oui/non
void setup() {

  pinMode(encoderPinA, INPUT);

  attachInterrupt(0, doEncoderA, CHANGE); // // encoder pin on interrupt 0 (pin 2)

  Serial.begin(115200);
}

void loop(){
  Eparc=digitalRead(encoderPinA); // recup de l'etat pin à l'init
  if (Sint==true)
  {

    Serial.print(">"); // pour test d'entre/sortie de secteur ,indique passage par int0 

    Sint=false;
    
  }

  if (micros()-Tact > ParcMax) { // tempo en µsecondes pour test si pas eu d'interruption 

    Tact=micros();
    Serial.println();
    Serial.print("-- passe tempo --> ETATS=");  
    
    Serial.print(Iparc-1);
    Serial.print(" ");
    
    Serial.print(millis());
    Serial.print("=millis ");
    Serial.print("Etat init=");
    Serial.print(Eparc);
    Serial.print(" ");
    for (byte i=1; i < Iparc; i++){
      
  
      Tparc=Tparct[i]-Tparct[i-1];
      
      
      Serial.print(Tparc); 
      Serial.print(","); // delimiteur pour log tableur

    } 

    Serial.println();

    Iparc=0;
  }

}

// Interrupt on A changing state
void doEncoderA(){

  Tparct[Iparc]=micros(); // plus rapide 
    
  Iparc ++;
  Sint=true;
}

Merci pour le coup de main

Ce soir c'est la cata : émetteur éteint, avec juste l'oscillo sur la sortie DATA, je capte plein de signaux parasites.

J'ai du modifier un poil ton programme car pour compter le nombre d'interruptions déclenchées en 3 secondes, un pauvre octet n'est pas suffisant (variable Iparc) ;D
J'en ai environ 3000 en 3 secondes !

C'est-à-dire à peu près 500 impulsions chaque seconde, d'une durée a peu près aléatoire comprise entre 10 et 500 us, et distribuées de manière aussi aléatoire.

Je n'ai pas retrouvé de signal "propre" comme ce week end.

Donc là, soit c'est le récepteur qui délire plein tube, soit je suis en environnement radio très parasité.

Tiens pendant que j'écris je fais un dernier test qui me semble plus conclusif = les deux récepteurs 433 Mhz branchés et restitués simultanément sur les deux canaux de l'oscillo.

Clairement, les sorties des deux récepteurs n'ont pas du tout le même profil de signal.
Aussi parasitées l'une que l'autre, mais les largeurs d'impulsion, ainsi que leur distribution, ne sont pas du tout les mêmes.
Le signal en sortie du second récepteur ressemble beaucoup plus à un bruit blanc.

J'aurais donc tendance à dire que ces deux vilains petits canards sont le risque inhérent (mais assumé) à un achat à (très) bon marché auprès du premier revendeur chinois trouvé sur ebay.

bricoleau:
...

Donc là, soit c'est le récepteur qui délire plein tube, soit je suis en environnement radio très parasité.

Tiens pendant que j'écris je fais un dernier test qui me semble plus conclusif = les deux récepteurs 433 Mhz branchés et restitués simultanément sur les deux canaux de l'oscillo.

donc tu a dispo deux ensembles E/R ?
émetteurs alimentés "par quoi/comment" ?
ces "modules cheaps" , ce n'est variment pas l'ideal , mais "en general" au moins sur des distances "tres,tres faibles" ça "cause toujours dans le poste" 8)

Oui deux ensembles E/R issus du même achat.

Dans les tests de ce soir, j’ai laissé les émetteurs hors tension.
J’utilisais juste les récepteurs pour tenter d’écouter le bruit radio ambiant.

Récepteur alimenté depuis le GND et 5V d’une carte arduino, elle-même alimentée en usb depuis mon PC.

Dans ce contexte, les deux récepteurs mis sur la même breadboard me délivrent simultanément des signaux très différents.

Bonjour,

Il y a quelque temps, j'avais essayé ces modules et je n'avais rien pu en tirer.

Suite à ton post, je les ai ressorti de leur tiroir pour les essayer à nouveau.
Emetteur coupé, à l'oscillo je vois que je reçois des tas de parasites. Je ne vois pas de différence significative sur ces parasites suivant que le récepteur est raccordé ou non à l'arduino.
J'ai essayé avec virtualwire avec l'émetteur et le récepteur placés à 15 cm l'un de l'autre et, selon le bon vouloir des deux bestioles, je reçois entre un message sur 2 et un message sur 10.

Je les ai remis dans leur tiroir.

Bonjour à tous,
Je fais un petit up pour expliquer mes tribulations...
De mon côté, je cherche à décoder le signal de mes télécommandes RF pour prises de courant.
J'ai un couple E/R exactement identique à celui présenté plus haut.
Le récepteur est câble en GND, 5V, quant aux 2 pins Data, ils ont l'air d'avoir tous les 2 le même effet, j'en relie un des 2 au pin 2 de l'arduino.

Avec ma télécommande Phenix, aucun problème, protocole détecté par la lib RCswitch.
Cependant, j'ai aussi une télécommande Advisen, qui utilise le protocole Blyss de Castorama, qui n'est pas référencé dans la lib RCswitch.
J'ai voulu tenter de décoder le signal directement moi même, et j'ai rencontré le même problème : l'interruption se déclenche tout le temps... avec grosso modo les mêmes espacements. Au point où je demande comment est-ce que RCswitch arrive à retrouver ses petits dans tout ce bruit ambiant !!

Par contre, là où ça devient étrange, je dirais même TRES étrange, c'est que lorsque je déconnecte le PIN, je continue à avoir mes interruptions !!! Donc juste en ayant GND et VCC+5 de branchés, j'ai le pin 2 qui s'excite dans tous les sens. Curieux.
Je vais tenter de bricoler une antenne de réception, ça me permettra peut-être d'améliorer le RSB.

Au passage, question bonus : je débute en Arduino, et pour mes besoins de test j'ai modifié RCSwitch.cpp.
Par contre, bizarrement, lorsque je recompile mon projet (Verify ou Upload), mes modifs ne sont pas prises en compte, l'IDE n'a pas l'air de recompiler rcwitch.cpp. Une idée de comment corriger ça ? Merci :slight_smile:

cozimix:
Cependant, j'ai aussi une télécommande Advisen, qui utilise le protocole Blyss de Castorama, qui n'est pas référencé dans la lib RCswitch.
J'ai voulu tenter de décoder le signal directement moi même,

bonjour
Blyss est un protocole particulier
A plusieurs il y qq années "on" s'est amusé avec
lire ce long topic

Oui je suis tombé sur l'article Wordpress expliquant la chose :slight_smile:
Ca m'a l'air très intéressant et j'ai hâte de tester votre petite lib pour voir si j'arrive effectivement à lire les trames RF de l'Advisen dans tout le bruit que je reçois.

Au fait, pourquoi relier DATA du récepteur à la fois sur l'interruption D2 et sur D12 ?
Est-ce que cela permettrait de justement stabiliser quelque chose et limiter le bruit sur l'interruption ?