arduino ricevere segnale apricancello 433 MHz

Salve a tutti,

Ho utilizzato:
-1 arduino Nano v3.0 (ricevitore)
-1 Arduino UNO (trasmettitore)
-1 Ricevitore/Trasmettitore RF http://www.icstation.com/433mhz-transmitter-receiver-arduino-project-p-1402.html?aid=10
-1 telecomando apri-cancello (identico a quello del tutorial http://www.amazon.it/Telecomando-autoapprendente-copritasti-duplicazione-Nero-Argento/dp/B00H1XK30G?ie=UTF8&psc=1&redirect=true&ref_=oh_aui_detailpage_o01_s00)

Dunque sono partito per gradi e, dopo aver saldato un piccolo cavo a spirale sul ricevitore e trasmettitore come antenna, sono riuscito a inviare la classica stringa "Hello World".

Trasmettitore:

/**
Questo programma va caricato sul TX e permette di inviare una stringa ad un altro Arduino
*/
 
#include <VirtualWire.h>


int ledPin = 13;
char Sensor1CharMsg[21];// The string that we are going to send trought rf 
int counter = 0;
 
void setup()
{
    Serial.begin(9600);   // Debugging only
    Serial.println("setup");
    
    // initialize the digital pin as an output.
    pinMode(ledPin, OUTPUT);  
    
    vw_set_tx_pin(2);
    // Initialise the IO and ISR
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);  // Bits per sec
}
 
void loop() {
    //const char *msg = "hello";
    sprintf(Sensor1CharMsg, "Hello world: %d", counter);
 
    digitalWrite(ledPin, HIGH); // Flash a light to show transmitting
    vw_send((uint8_t *)Sensor1CharMsg, strlen(Sensor1CharMsg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(ledPin, LOW);
    counter++;
    delay(20);
}

RICEVITORE:

/**
Questo programma va caricato sul RX e permette di ricevere una stringa che è stata inviata da un altro Arduino
Pin (5V,GDN, D2)
*/
#include <VirtualWire.h>

char StringReceived[22]; 
  
void setup()
{
 Serial.begin(9600); // Debugging only
 Serial.println("setup");
 vw_set_rx_pin(2);
 // Initialise the IO and ISR
 vw_set_ptt_inverted(true); // Required for DR3100
 vw_setup(2000); // Bits per sec
  
 vw_rx_start(); // Start the receiver PLL running
}
  
void loop()
{
 uint8_t buf[VW_MAX_MESSAGE_LEN];
 uint8_t buflen = VW_MAX_MESSAGE_LEN;
  
 if (vw_get_message(buf, &buflen)) { // Non-blocking
   int i;
    
   digitalWrite(13, true); // Flash a light to show received good message
   // Message with a good checksum received, dump it.
   Serial.print("Got: ");
    
   for (i = 0; i < buflen; i++) {
     Serial.print(buf[i], HEX);
     Serial.print(" ");
     // Fill Sensor1CharMsg Char array with corresponding 
     // chars from buffer.   
     StringReceived[i] = char(buf[i]);
   }
   Serial.println("");
   Serial.println("StringReceived:" + String(StringReceived));
   Serial.println("");
   digitalWrite(13, false);
 }
 memset( StringReceived, 0, sizeof( StringReceived));// This line is for reset the StringReceived

}

Pieno di entusiasmo ho provato a seguire il seguente tutorial:

Risultato nullo :confused: nemmeno un segno.
Notavo che dal tutorial sembra che il telecomando lavori a 24bit, mentre dalla descrizione su Amazon riporta 36bit.

Ho aperto il telecomando e all'interno c'è un componente "bxr433a" che se non ho capito male lavora alla stessa frequenza del ricevitore in mio possesso.

La mia idea sarebbe quella di ricevere i segnali legati ai 4 tasti del telecomando.

Qualcuno ha già sperimentato qualcosa di simile o ha qualche idea da suggerire?

Il tuo telecomando è un modello ad auto apprendimento: lo hai già programmato usando il telecomando originale?

buongiorno,
si il telecomando l'ho programmato con tutti e 4 i tasti del telecomando Myo C4.
Utilizzando la seguente libreria RFControl sono riuscito a riceve alcuni dati:

TASTO A
b: 384 1192 25068 0 0 0 0 0 
t: 01010010110100101011010100110010101100101011010101010101010010110100110101010101010101010101010101010101010102

b: 380 1196 25080 0 0 0 0 0 
t: 01010010110100101011010100110010101100101011010101010101010010110100110101010101010101010101010101010101010102

TASTO B
b: 380 1196 25052 0 0 0 0 0 
t: 01010010110100101011010100110010101011001011010101010101010010110100110101010101010101010101010101010101010102

b: 380 1196 25060 0 0 0 0 0 
t: 01010010110100101011010100110010101011001011010101010101010010110100110101010101010101010101010101010101010102

TASTO C
b: 380 1192 25060 0 0 0 0 0 
t: 01010010110100101011010100110010101010110011010101010101010010110100110101010101010101010101010101010101010102

b: 384 1192 25048 0 0 0 0 0 
t: 01010010110100101011010100110010101010110011010101010101010010110100110101010101010101010101010101010101010102

TASTO D
b: 384 1192 25080 0 0 0 0 0 
t: 01010010110100101011010100110010101010101101010101010101010010110100110101010101010101010101010101010101010102

b: 380 1192 25092 0 0 0 0 0 
t: 01010010110100101011010100110010101010101101010101010101010010110100110101010101010101010101010101010101010102

Ma a questo punto come utilizzare tali informazioni?
Inserendo i dati in un excel e confrontando la coppia di risultati T: di ogni tasto sono identiche.
Purtroppo passando lo sketch da Arduino UNO a Arduino Nano i codici cambiano ????

Avevo pensato di attaccare 2 LED da accendere a seconda del tasto premuto impostando come costante la serie binaria, di seguito riporto lo sketch. Peccato che non funziona :frowning:

#include <RFControl.h>

int pinLedA = 8; 
int pinLedB = 6;
const String codeButtonA = "01010010110100101011010100110010101100101011010101010101010010110100110101010101010101010101010101010101010102";
const String codeButtonB = "01010010110100101011010100110010101011001011010101010101010010110100110101010101010101010101010101010101010102";

void setup() {
  Serial.begin(9600);
  RFControl::startReceiving(0);
  pinMode(pinLedA, OUTPUT);
  pinMode(pinLedB, OUTPUT);
}

void loop() {
  if(RFControl::hasData()) {
    
    unsigned int *timings;
    unsigned int timings_size;
    RFControl::getRaw(&timings, &timings_size);
    unsigned int buckets[8];
    RFControl::compressTimings(buckets, timings, timings_size);
    Serial.print("b: ");
    for(int i=0; i < 8; i++) {
      unsigned long bucket = buckets[i] * RFControl::getPulseLengthDivider();
      Serial.print(bucket);
      Serial.write(' ');
    }
    Serial.print("\nt: ");
    String binaryCode = "0";
    for(int i=0; i < timings_size; i++) {
      Serial.write('0' + timings[i]);
      binaryCode += timings[i];
    }

    // Test button A
    if (binaryCode == codeButtonA){
    Serial.print("Button A pressed... ");  
     digitalWrite(pinLedA, HIGH);
      }

    // Test button B
  if (binaryCode == codeButtonA){
    Serial.print("Button B pressed... ");  
     digitalWrite(pinLedB, HIGH);
      }
    
    Serial.write('\n');
    Serial.write('\n');
    RFControl::continueReceiving();
    digitalWrite(pinLedA, LOW);
    digitalWrite(pinLedB, LOW);
  }
}

Salve,
sono riuscito ad eseguire alcune prove e con una piccola modifica al codice adesso pare funzionare.
Non mi sembra però una soluzione molto elegante, soprattutto è un po' lenta nel ricevere i comandi.

Di seguito riporto il codice del ricevitore corretto:

#include <RFControl.h>

int pinLedA = 8; 
int pinLedB = 6;
const String codeButtonA = "01010010110100101011010100110010101100101011010101010101010010110100110101010101010101010101010101010101010102";
const String codeButtonB = "01010010110100101011010100110010101011001011010101010101010010110100110101010101010101010101010101010101010102";

void setup() {
  Serial.begin(9600);
  RFControl::startReceiving(0);
  pinMode(pinLedA, OUTPUT);
  pinMode(pinLedB, OUTPUT);
}

void loop() {
  if(RFControl::hasData()) {
    
    unsigned int *timings;
    unsigned int timings_size;
    RFControl::getRaw(&timings, &timings_size);
    unsigned int buckets[8];
    RFControl::compressTimings(buckets, timings, timings_size);
    Serial.print("b: ");
    for(int i=0; i < 8; i++) {
      unsigned long bucket = buckets[i] * RFControl::getPulseLengthDivider();
      Serial.print(bucket);
      Serial.write(' ');
    }
    Serial.print("\nt: ");
    String binaryCode = "";
    for(int i=0; i < timings_size; i++) {
      Serial.write('0' + timings[i]);
      binaryCode += timings[i];
    }
    Serial.print("\nbinaryCode:");
    Serial.println(binaryCode); 

    // Test button A
    if (binaryCode == codeButtonA){
     Serial.println("Button A pressed... ");  
     digitalWrite(pinLedA, HIGH);
      }

    // Test button B
  if (binaryCode == codeButtonB){
    Serial.print("Button B pressed... ");  
     digitalWrite(pinLedB, HIGH);
      }
    
    Serial.write('\n');
    Serial.write('\n');
    delay(100);
    RFControl::continueReceiving();
    digitalWrite(pinLedA, LOW);
    digitalWrite(pinLedB, LOW);
  }
}

Buongiorno,
credo di aver raggiunto un qualcosa di funzionante.
Per quanto riguarda la mappatura dei PIN ci sono stati non pochi problemi.

Di seguito riporto la configurazione funzionante:

  • pin 5: striscia LED di sinistra
  • pin 10: striscia LED di destra
  • pin 2: ricevitore 433Mhz
  • pin 11: buzzer

Il pin 9 se non ho capito male è riservato alla libreria per la gestione dei ricevitori.
Il pin 6 e 3 creavano delle anomalie di comportamento nel PWM sia per i LED sia per il buzzer.

Giusto per conoscenza, qualcuno sa dirmi il motivo?

Rimango ancora perplesso sulla gestione delle codifiche del telecomando, ma al momento funziona :slight_smile:

In allegato a chi fosse interessato ho inserito lo sketch utilizzato.

Buona giornata

rcControlLEDStrip.ino (6.06 KB)