Ricevitore 433 MHz

Salve a tutti. Sono sul finire di un progetto in cui voglio comandare cinque lampade esterne piazzate lungo il vialetto di casa attraverso il telecomando apricancello. Tale telecomando ha due pulsanti, uno che apre il cancello, l'altro che non ha affetti. Ciò che voglio è che quando viene premuto il pulsante che apre il cancello le luci si accendano per tre minuti e poi si spengano, quando invece premo il pulsante inutilizzato dal cancello voglio che le lampade restino accese fino a che non lo ripremo.

Per fare questo ho usato questo ricevitore:

http://www.ebay.it/itm/2-pz-moduli-RF-433-Mhz-trasmettitore-ricevitore-arduino-pic-shield-ART-CI02-/261233706163

Non sapendo che messaggio venisse inviato dal telecomando di casa ho connesso il ricevitore al mio oscilloscopio e ho scoperto che si tratta di un segnale lungo 13 ms con ciascun bit di 330 microsecond. Ho quindi fatto campionare il segnale del ricevitore da arduino e nel caso in cui il segnale campionato corrisponda a quello letto con l'oscilloscopio faccio eseguire le varie azioni.

questo è lo sketch:

void setup() {                
  pinMode(rel, OUTPUT);     
  pinMode(rec, INPUT);    
  for(int i=0; i<37; i++){
           data[i] = 0;
  }
}


void loop() {
 
//Campiono il segnale ogni 330 microsecondi e lo salvo il data[i]

 if (digitalRead(rec)==HIGH){
     
     for(int i=0; i<37; i++){
       data[i] = digitalRead(rec); 
       delayMicroseconds(330); 
       
     }

 }
  
 lum_sens = analogRead(A0);   //Sensore di luminosità per non farle accendere di giorno
    
//cod_1_scoo è il codice del pulsante utilizzato per aprire il cancello emesso dal telecomando attaccato alle chiavi dello scooter
//cod_1_mer è il codice del pulsante utilizzato per aprire il cancello emesso dal telecomando attaccato alle chiavi di una macchina e così via per le altre macchine che dovranno usare questo dispositivo

 if((data[2]==code_1_scoo[2] && data[3]==code_1_scoo[3] && data[5]==code_1_scoo[5] && data[10]==code_1_scoo[10] && data[13]==code_1_scoo[13] && data[23]==code_1_scoo[23] && data[25]==code_1_scoo[25] && data[29]==code_1_scoo[29] && data[32]==code_1_scoo[32] && data[34]==code_1_scoo[34] && data[35]==code_1_scoo[35]) || 
  (data[2]==code_1_mer[2] && data[5]==code_1_mer[5] && data[8]==code_1_mer[8] && data[11]==code_1_mer[11] && data[13]==code_1_mer[13] && data[14]==code_1_mer[14] && data[20]==code_1_mer[20] && data[25]==code_1_mer[25] && data[29]==code_1_mer[29] && data[32]==code_1_mer[32] && data[34]==code_1_mer[34] && data[35]==code_1_mer[35]) ||
  (data[2]==code_1_nonn[2] && data[8]==code_1_nonn[8] && data[11]==code_1_nonn[11] && data[14]==code_1_nonn[14] && data[18]==code_1_nonn[18] && data[20]==code_1_nonn[20] && data[25]==code_1_nonn[25] && data[27]==code_1_nonn[27] && data[29]==code_1_nonn[29] && data[33]==code_1_nonn[33] && data[35]==code_1_nonn[35])||
  (data[2]==code_1_clio[2] && data[9]==code_1_clio[9] && data[11]==code_1_clio[11] && data[13]==code_1_clio[13] && data[14]==code_1_clio[14] && data[18]==code_1_clio[18] && data[20]==code_1_clio[20] && data[23]==code_1_clio[23] && data[32]==code_1_clio[32] && data[33]==code_1_clio[33] && data[35]==code_1_clio[35])){    
      if(lum_sens < lum_sens_th){
                
           switch(status_lamp){       
           case 0:
           digitalWrite(rel, HIGH);
           delay(acc_time);         
           digitalWrite(rel, LOW);
           for(int i=0; i<37; i++){
             data[i] = 0;
           }   
           break;

           case 1:
           //Serial.println("falso cancello da acceso");
           for(int i=0; i<37; i++){
             data[i] = 0;  
           }
           break;
         
     }  
  }
 }

//code_2_scoo è il codice del pulsante inutilizzato emesso dal telecomando attaccato alle chiavi dello scooter 
    
if((data[2]==code_2_scoo[2] && data[3]==code_2_scoo[3] && data[5]==code_2_scoo[5] && data[10]==code_2_scoo[10] && data[13]==code_2_scoo[13] && data[23]==code_2_scoo[23] && data[25]==code_2_scoo[25] && data[29]==code_2_scoo[29] && data[32]==code_2_scoo[32] && data[34]==code_2_scoo[34] && data[35]==code_2_scoo[35]) || 
   (data[2]==code_2_mer[2] && data[5]==code_2_mer[5] && data[8]==code_2_mer[8] && data[11]==code_2_mer[11] && data[13]==code_2_mer[13] && data[14]==code_2_mer[14] && data[20]==code_2_mer[20] && data[25]==code_2_mer[25] && data[29]==code_2_mer[29] && data[32]==code_2_mer[32] && data[34]==code_2_mer[34] && data[35]==code_2_mer[35]) ||
   (data[2]==code_2_nonn[2] && data[8]==code_2_nonn[8] && data[11]==code_2_nonn[11] && data[14]==code_2_nonn[14] && data[18]==code_2_nonn[18] && data[20]==code_2_nonn[20] && data[25]==code_2_nonn[25] && data[27]==code_2_nonn[27] && data[29]==code_2_nonn[29] && data[33]==code_2_nonn[33] && data[35]==code_2_nonn[35])||
   (data[2]==code_2_clio[2] && data[9]==code_2_clio[9] && data[11]==code_2_clio[11] && data[13]==code_2_clio[13] && data[14]==code_2_clio[14] && data[18]==code_2_clio[18] && data[20]==code_2_clio[20] && data[23]==code_2_clio[23] && data[32]==code_2_clio[32] && data[33]==code_2_clio[33] && data[35]==code_2_clio[35])){    
  if(lum_sens < lum_sens_th){       
      
     switch(status_lamp){ 
        case 0:       
          digitalWrite(rel, HIGH);
          delay(500);
          status_lamp=1;
          for(int i=0; i<37; i++){
           data[i] = 0;
         }
         break;

        case 1:
          digitalWrite(rel , LOW);
         delay(500);
         status_lamp=0;
         for(int i=0; i<37; i++){
           data[i] = 0;
         }      
         break;
      }
    }
 } 
}

FUNZIONA TUTTO MA..
L'unico problema è che ho bisogno di un raggio d'azione di almeno 500m, utilizzando un antenna e alimentando a 6V il ricevitore sono riuscito ad avere un raggio d'azione di circa 150m.

La domanda è:
é colpa del ricevitore o del modo di acquisizione?
Visti i test che ho fatto sarei propenso a credere che sia colpa del ricevitore ma non so verso cosa orientarmi per cambiarlo.
Ho cercato di informarmi un po' su internet ma non sono riuscito a capire come leggere il parametro sensitività. Come si calcola? Esiste un grafico Sensitività vs. ragio d'azione?

Il ricevitore da me uilizzato ha sensitività di -105dB, è questo il parametro che devo guardare per scegliere un ricevitore con maggior raggio d'azione?

questo (-111dB) potrebbe migliorare le cose?

Grazie mille per il vostro aiuto.
Voglio finire questo progetto a tutti i costi!!!
Grazie!!! :stuck_out_tongue: :%

Probabilmente non hai a disposizione abbastanza potenza per trasmettere, è tanto già che fa i 150.
Credo che dovresti cambiare trasmettitore e ricevitore con qualcosa per eroe modellismo,, in quel caso sei sicuro che funziona.

Ciao,
il trasmettitore è poco potente e non puoi aumentarla a meno di riprogettare lo stadio finale cambiando il transistor finale.
Inoltre l'antenna integrata ha un rendimento basso.
Se lo usi dalla macchina puoi mettere un'antenna a stilo x 433Mhz, la trovi nei negozi x radioamatori ed è unga circa 70 cm.
Meglio cambiare modello
Franco

Grazie per le risposte!!

Il trasmettitore che uso è l'apricancello, (allegato in foto) non posso cambiarlo altrimenti non mi si accenderebbero le luci mentre si apre. Oltretutto il segnale da lui inviato viene correttamente letto dalla centralina del cancello (scusate le ripetizioni!).

Credo quindi che per risolvere il problema debba cambiare il ricevitore. Della coppia ricevitore/trasmettitore che ho linckato sto usando solo il ricevitore.

Vi chiedo quindi: qualcuno ha già avuto esperienza con qualche ricevitore a 433 MHz compatibile con un atmega328 che possa leggere correttamente il codice del mio apricancello da circa 500m?
(ripeto: il trasmettitore sono certo che non limiti le prestazioni)

grazie e a presto!!

sei proprio certo della portata del trasmettitore?
io non ci metto la mano sul fuoco.
nonostante tutto sia inflazionato...500m sono sempre 500m e con tutto lo smog che c'è nell'etere, la vedo mooolto dura XD
comunque non mettiamo limiti alla fantasia, se ce la fai sono contento per te.
auguri
ciao

Alla faccia del sarcasmo!! Mi pari l'omino che mi vende i componenti e mi fa smattare tutte le volte che mi serve qualcosa!

Mea culpa comunque, non conoscendo la portata delle trasmissioni a 433MHz avevo detto 500 m esagerando, provo a porvi il problema in altri termini:

l'apricancello (di cui ho postato la foto) invia un segnale che viene letto correttamente dal ricevitore montato sulla centralina che fa aprire il cancello da una distanza massima D_1.
lo stesso segnale viene letto correttamente dal ricevitore di cui ho postato il link (impiegato nel mio progetto) da una distanza massima D_2.

il problema è che D_2<D_1!!

la domanda è:

qualcuno sa darmi delucidazioni sui parametri che dovrebbe avere il mio ricevitore per far si che D_1=D_2?
credo di aver capito che il parametro da controllare sia la sensitività, giusto?
a prescindere dalle condizioni di smog o ostacoli urbanistici che portata ha un ricevitore con una data sensitività?
è possibile rispondere a questa domanda o è mal posta?

ho tentato di capire che ricevitore sia montato sulla centralina del cancello ma non sono riuscito ad ottenere informazioni, se sapete indicarmi cosa cercare su tale scheda posso provare a controllare di nuovo.

Grazie per l'aiuto!!!

A distanze elevate probabilmente perdi bit per strada, ecco perché non ti funziona

Lascia stare le formule con quel cinesame.. è già un miracolo che tira oltre i 50m

Ok, è un miracolo!!
Qual'è un buon ricevitore!?!?!???

nessun sarcasmo.
puoi mettere il ricevitore che vuoi, se il segnale del tx non arriva, sei in braghe di tela.
se hai manico, potresti vedere di aumentare la potenza del trasmettitore (non è facile, ma nemmeno impossibile).
se non ti fosse chiaro, (colpa mia che non mi so spiegare), per il momento ignora il ricevitore, lavora sul tx
aggiungo che l'rx della centralina probabilmente è di tipo superreattivo (un solo transistor che funziona da ricevitore e da rivelatore (roba per palati sopraffini,non alla portata di tutti :blush:)
la chiudo qui.
rinnovo gli auguri e...buon lavoro :open_mouth:

ciao.
n.b. lascia stare l'omino che ti vende i componenti.....sant'uomo.
la prima cosa da fare con l'omino, è sapere bene quello che si vuole, e vedrai che lui....

Ok, questa è la tua opinione, secondo me stai sbagliando..
Qualche altra idea?!

La domanda è:
é colpa del ricevitore o del modo di acquisizione?

L'acquisizione sicuramente non è 330uS precisi, ma ha un grande errore temporale. Il ricevitore di sicuro non è per alte prestazioni.

Visti i test che ho fatto sarei propenso a credere che sia colpa del ricevitore ma non so verso cosa orientarmi per cambiarlo.

Prova a lavorare sull'antenna, una direzionale dovrebbe migliorare la situazione. Che antenna utilizzi?

Ho cercato di informarmi un po' su internet ma non sono riuscito a capire come leggere il parametro sensitività. Come si calcola? Esiste un grafico Sensitività vs. ragio d'azione?

No, non esiste. Il raggio d'azione dipende dalle caratteristiche dell'ambiente, nessun produttore serio indica il raggio d'azione nelle specifiche, quasi solo dei cinesi per accalappiare inesperti, con dei range irrealistici. La sensitività viene data da datasheet, calcolarla è abbastanza difficile e richieste apparecchiature molto $$$.
Tieni presente che varia col datarate, coi disturbi, etc.. 433 mhz sono una frequenza libera utilizzata da molti dispositivi.

Il ricevitore da me uilizzato ha sensitività di -105dB, è questo il parametro che devo guardare per scegliere un ricevitore con maggior raggio d'azione?

Le specifiche dei prodotti cinesi sono spesso di molta fantasia.. non hai garanzia che sia reale, potresti avere -80dB come -105dB.. non ci si può fidare dei cinesi per queste cose, così si muove il mercato da quelle parti purtroppo. Scegliere un altro modulino da pochi centesimi da -2000dB pensi che migliorerebbe la situazione? Io non penso.

Se vuoi muoverti da PRO guidato dalle specifiche, la sensibilità diventa un dato importante, però devi rivolgerti a distributori e produttori affidabili (digikey, futurlec, mouser, etc..)

questo (-111dB) potrebbe migliorare le cose?
https://www.futurashop.it/Allegato_PDF_IT/8110-RX-4MF1.pdf

Sembra più serio di sicuro, il produttore non è il cinese anonimo.

Grazie per la risposta, molto esauriente!
Sto già utilizzando un'antenna direzionale, simile a quella montata sulla centralina del cancello automatico, che ha migliorato decisamente le prestazioni.
Cercando in giro ho trovato anche questo ricevitore:

è della stessa ditta che produce quello di cui avevo postato il link come alternativa. Proverò a comprare questo e incrocerò le dita!
Ho anche trovato una definizione di sensitività, la posto nella foto!
Vi farò sapere come va con il nuovo acquisto!
ciao!

Dovevi dire subito che hai usato un'antenna direzionale, guarda che si credeva che usavi il modulino iniziale senza o con un filo alla buona come fanno molti esordienti.
Non ti resta che provare..

Salve a tutti!
Ho ricevuto e montato il nuovo ricevitore. Come detto in precedenza ho optato per questo:

Tutt'altra cosa rispetto a quello precedente!!

IN CONCLUSIONE:

Usando il nuovo ricevitore, connesso a questa antenna:

http://www.amazon.it/Came-Antenna-accordata-TOP-A433N/dp/B008D23H70 e con qualche modifica allo

sketch per limitare le false accensioni, sono riuscito ad ottenere un range di funzionamento di oltre 200 m

(con tutte le condizioni al contorno dettate dall'ambiente circostante!)

Riporto anche il codice definitivo utilizzato per il progetto:

void setup() {                
  pinMode(rel, OUTPUT);     
  pinMode(rec, INPUT);    
//  pinMode(ledPin, OUTPUT);
 // Serial.begin(9600); 
  for(int i=0; i<37; i++){
           data[i] = 0;
  }
}

boolean array_cmp(int *a, int *b){
     int n;

     // controllo se ci sono elementi diversi
     for(n=0; n<37; n++){
       if(a[n] != b[n]) return false;
     }
     //se non ce ne sono diversi sono tutti uguali!
     return true;
}


void loop() {
 
 //memorizzo ognoi codice quando arriva
 if (digitalRead(rec)==HIGH){
     
     for(int i=0; i<37; i++){
       data[i] = digitalRead(rec); 
       delayMicroseconds(330); 
       
     }
 }
  
 //controllo se giorno o notte 
 lum_sens = analogRead(A0);

//se premo il pulsante di apertura del cancello le luci si accendono per 150 secondi poi si spengono da sole

if(array_cmp(data, code_1_scoo) == true || array_cmp(data, code_1_mer) == true || array_cmp(data, code_1_nonn) == true || array_cmp(data, code_1_clio) == true){
     
      if(lum_sens < lum_sens_th){
                
           switch(status_lamp){       
           case 0:
           digitalWrite(rel, HIGH);
           delay(acc_time);         
           digitalWrite(rel, LOW);
           for(int i=0; i<37; i++){
             data[i] = 0;
           }   
           break;
           case 1:
           for(int i=0; i<37; i++){
             data[i] = 0;  
           }
           break;
         
     }  
    }
 }

//se premo il pulsante inutilizzato le luci si accendono e non si spengono fino a che non lo premo nuovamente
   
if(array_cmp(data, code_2_scoo) == true || array_cmp(data, code_2_mer) == true || array_cmp(data, code_2_nonn) == true || array_cmp(data, code_2_clio) == true){
  
      switch(status_lamp){ 
        
        case 0:  
         if(lum_sens < lum_sens_th){     
          digitalWrite(rel, HIGH);
          delay(500);
          status_lamp=1;
          for(int i=0; i<37; i++){
           data[i] = 0;
          }
         }
         break;
         
        case 1:
          digitalWrite(rel , LOW);
         delay(500);
         status_lamp=0;
         for(int i=0; i<37; i++){
           data[i] = 0;
         }      
         break;
      }
    } 
}

Grazie a tutti per l'aiuto, è stato molto bello vedere in quanti si sono adoperati per darmi una mano.
A presto!! :smiley:

Nico, se pensi quanto hai dovuto lavorare per ottenere una trasmissione a 200m immagina quando dichiarano che dei piccoli e semplici modulini possano raggiungere i 500m out of the box. :o