Info moduli TX/RX radio

Salve a tutti vorrei dei chiarimenti su questi moduli che ho acquistato:

http://www.ebay.com/itm/330908570273?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649

A quanto letto in giro devo usare questa libreria: <VirtualWire.h> ma non ho ben chiaro come funziona, l'esempi sono questi:

TX:

// transmitter.pde
//
// Simple example of how to use VirtualWire to transmit messages
// Implements a simplex (one-way) transmitter with an TX-C1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: transmitter.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $

#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);	  // Debugging only
    Serial.println("setup");

    // 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";

    digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);
    delay(200);
}

e RX:

// receiver.pde
//
// Simple example of how to use VirtualWire to receive messages
// Implements a simplex (one-way) receiver with an Rx-B1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: receiver.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $

#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);	// Debugging only
    Serial.println("setup");

    // 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(" ");
	}
	Serial.println("");
        digitalWrite(13, false);
    }
}

non capisco se questa libreria è adatta per questi moduli, se si non riesco a decifrare il linguaggio.

Io vorrei che il TX collegato ad arduino collegato a sua volta a un GPS mi mandi i dati delle coordinate in un RX collegato ad un altro arduino collegato a sua volta al pc per leggere le coordinate sul monitor.

non capisco la tua richiesta... non capisci come funziona? non ti funziona? non capisci cosa vogliono dire * e &?

danyevo:
Io vorrei che il TX collegato ad arduino collegato a sua volta a un GPS mi mandi i dati delle coordinate in un RX collegato ad un altro arduino collegato a sua volta al pc per leggere le coordinate sul monitor.

Forse è meglio fare un passo alla volta. Prima devi capire come usare la libreria. Al link che hai fornito allegano in zip la libreria VirtualWire.
Quei due esempi, 1) transmitter.pde spedisce di continuo "hello" e l'altro 2) receiver.pde spara su Monitor Seriale tutto quello che riceve in valori esadecimali, carattere per carattere

... magari, per capire la VirtualWire, potresti cominciare con lo studiarti tutto quello che è riportato in questa pagina : http://www.airspayce.com/mikem/arduino/ :wink:

Guglielmo

Ok ma se volessi codificare i messaggi inviati o protegerli in qualche modo?

Comunque non riesco a capire il codice degli esempi, se mi spiegate un po?

la libreria invia una stringa, che sia codificata o meno.

La codifica/decodifica la devi duqnue fare a parte e varia molto da che tipo di codifica vuoi fare.

Molto probabilmente è assai complicato implementare una criptazione "forte" (vedi gpg), anzi, le criptazioni che puoi fare in modo semplie sono moolto deboli (twofish è oensato per i micro 8bit).

inizia a farlo funzionare, poi ci pensi

danyevo:
Comunque non riesco a capire il codice degli esempi, se mi spiegate un po?

che cosa non capisci? hai provato a leggere la guida che ho in firma?

La loop() della send:

1    const char *msg = "hello";

2    digitalWrite(13, true); // Flash a light to show transmitting
3    vw_send((uint8_t *)msg, strlen(msg));
4    vw_wait_tx(); // Wait until the whole message is gone
5    digitalWrite(13, false);
6    delay(200);
  1. dichiara un puntatore costante a una stringa; poteva anche scriverlo come char msg[]="hello";
  2. accende led 13
  3. spedisce il contenuto della variabile msg; strlen(msg) calcola la lunghezza della frase contenuta
  4. lo dice il commento.
  5. spegne il led 13
  6. attesa 200 millisecondi

La loop() del receive:

1.    uint8_t buf[VW_MAX_MESSAGE_LEN];
2.    uint8_t buflen = VW_MAX_MESSAGE_LEN;
3.    if (vw_get_message(buf, &buflen)) // Non-blocking
4.    { int i;
5.      digitalWrite(13, true); // Flash a light to show received good message
6.      Serial.print("Got: "); // Message with a good checksum received, dump it.
7. 	for (i = 0; i < buflen; i++)
9.	{   Serial.print(buf[i], HEX);
8.	    Serial.print(" ");
10.	}
11.	Serial.println("");
12.   digitalWrite(13, false);
13.  }
  1. dichiara una stringa buf di elementi di tipo u8int, ovvero unsigned int a 8 bit ovvero unsigned char;
    VW_MAX_MESSAGE_LEN è un numero definito nella libreria
  2. dichiara una variabile buflen inizializzata al valore VW_MAX_MESSAGE_LEN
  3. verifica se arrivato un msg; passa 2 parametri: la stringa msg (che è un puntatore) e l'indirizzo della variabile buflen
    da 7. a 8. fa un ciclo per ogni elemento della stringa buf; per ogni elemento stampa su seriale il valore in esadecimale più uno spazio di separazione

MA PERCHE SUL MONITOR RICEVO IL CODICE DECIMALE?

104 101 108 108 111

nid69ita:
da 7. a 8. fa un ciclo per ogni elemento della stringa buf; per ogni elemento stampa su seriale il valore in esadecimale più uno spazio di separazione

lesto:
la libreria invia una stringa, che sia codificata o meno.

esistono caratteri che non sono visibili (vedi tabella ascii), quindi meglio lavorare così

danyevo:
MA PERCHE SUL MONITOR RICEVO IL CODICE DECIMALE?

104 101 108 108 111

Prova a modificare:

Serial.print(buf[i], HEX);

in

Serial.print((unsigned char)buf[i], HEX);

nid69ita:

danyevo:
MA PERCHE SUL MONITOR RICEVO IL CODICE DECIMALE?

104 101 108 108 111

Prova a modificare:
Serial.print(buf*, HEX);*
in
Serial.print((int)buf*, HEX);*
[/quote]
Serial.print( (char)buf*); è la soluzione*

CON:

Serial.print( (char)buf);

MI DA QUESTO ERRORE:

receiver.pde: In function 'void loop()':
receiver:40: error: cast from 'uint8_t*' to 'char' loses precision

CON QUESTO:

Serial.print((int)buf*, HEX);*
MI DA:
8D6 8D6 8D6 8D6 8D6

scusa hgai ragione
Serial.print( (char)(buf*) );*

Grazie ma non va mi da questo errore:

receiver.pde: In function 'void loop()':
receiver:40: error: cast from 'uint8_t*' to 'char' loses precision

lesto:
scusa hgai ragione
Serial.print( (char)(buf*) );*
[/quote]
Il problema è che Lesto ... si è scordato il tag "code" e l'editor si è mangiato un pezzo XD XD XD
Voleva scrivere :
* *Serial.print( (char)(buf[i]) );* *
Guglielmo
P.S. : ... e se ti soffermassi un po' a ragionare sugli errori ci saresti dovuto arrivare da solo ... buf è un array ... quindi ...

Grazie cosi va.
Mi dispiace ma è da poco che lavoro con arduino e ancora non capisco gli errori

Posso fare questo:

#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);	// Debugging only
    Serial.println("setup");

    // 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;
        int parola;
        
       
	// Message with a good checksum received, dump it.
	Serial.print("Got: ");
	
	for (i = 0; i < buflen; i++)
	{
            Serial.print( (char)(buf[i]) );
	    Serial.print(" ");
	}
	Serial.println("");
         parola = ( (char)(buf[i]) );     
        
        if (parola = P r o v a);
        {
        digitalWrite(13, false);
        }
        else{
        
        digitalWrite(13, true);
        }
    }
}

Anzi correggo in:

// receiver.pde
//
// Simple example of how to use VirtualWire to receive messages
// Implements a simplex (one-way) receiver with an Rx-B1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: receiver.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $

#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);	// Debugging only
    Serial.println("setup");

    // 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;
        int parola;
        
       
	// Message with a good checksum received, dump it.
	Serial.print("Got: ");
	
	for (i = 0; i < buflen; i++)
	{
            parola = ( (char)(buf[i]) );
	    Serial.print(parola);
            Serial.print(" ");
	}
	Serial.println("");
            
        
        if (parola = P r o v a);
        {
        digitalWrite(13, false);
        }
        else{
        
        digitalWrite(13, true);
        }
    }
}

danyevo:
Posso fare questo:

      parola = ( (char)(buf[i]) );        

if (parola = P r o v a);
       {
       digitalWrite(13, false);
       }
       else{
       digitalWrite(13, true);
       }
   }
}

No, devi usare strcmp() ovvero compare (confronto) fra stringhe:

        if( strcmp(buf,"Prova")==0)  // 0 sono uguali
        { digitalWrite(13, LOW);
        }
        else
        { digitalWrite(13, HIGH);
        }

Poi sarebbe meglio dichiarare all'inizio
const byte ledPin=13;
e usare al posto del 13 ledPin

P.S. = assegnazione == per il confronto