Moduli 433mhz

Ciao a tutti,
ho comprato questi modulini a 433mhz: RF-LINK RF ASK OOK Wireless Transmitter Receiver Pair [Frequency] – ElectroDragon

oggi sono arrivati (insieme ad altre cose) in 8 giorni dalla cina!!!!
volevo capire come si usano con arduino, ho provato via seriale prima a 9600 baud e dopo a 300 baud, ma non cambia nulla, qualche anima pia mi darebbe una mano? :grin:

scordati di spedire stringhe o dati nel formato ascii o umanamente leggibili con lo standard rs232.
per trasmettere e ricevere dati impiegando modulazione OOK (On Off Keying) visto che si tratta di modulini AM-saw, hai necessità di implementare un encoder manchester in trasmissione e un decoder sempre dello stesso tipo in ricezione. Inoltre è ncessario un codice detto di preambolo che precede il dato da trasmettere normalmente 10101010 (AA) per sincronizzare la rice/trasmisione.

al massimo potrai andare a 4000bps ma ti conviene scendere a 2k.... per assicurare un basso rate-error.

cyclone:
scordati di spedire stringhe o dati nel formato ascii o umanamente leggibile.
per trasmettere e ricevere dati impiegando modulazione OOK (On Off Keying) visto che si tratta di modulini AM, hai necessità di implementare un encoder manchester in trasmissione e un decoder sempre dello stesso tipo in ricezione.

al massimo potrai andare a 4000bps ma ti conviene scendere a 2k.... per assicurare un basso rate-error.

tradotto in una lingua umanamente capibile :smiley:

Ciao,
anch'io recentemente ho avuto a che fare con questi moduli.

Per il test che ho condotto, ho usato oltre all'Arduino (per ricevere) anche un secondo Atmega328 in standalone (in trasmissione).

Ho utilizzato la libreria VirtualWire con i seguenti codici:

Per la trasmissione (sull'Atmega in standalone)
#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_set_tx_pin(12); // Transmitter Data Pin
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(1000);
}

Per la ricezione (sull'Arduino, così puoi veder bene cosa ricevi)
#include <VirtualWire.h>
char received[100];
void setup()
{
Serial.begin(9600); // Debugging only
Serial.println("setup");
// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_set_rx_pin(11); // Receiver Data Pin
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;
for (i = 0; i < buflen; i++)
{
received_=buf*;_
_
}_
_
Serial.println(received);_
_
}_
_
}*_
Vedi se riesci a far funzionare il tutto.
Un saluto,
Tredipunta.

grazie tredipunta, pensavo che fosse leggermente + semplice usare quei modulini, ma x 90 centesimi l'uno va più che bene, ti ringrazio e ringrazio anche cyclone per l'impegno che ha dimostrato a spiegarmi le cose (probabilmente le ha spiegate semplicemente ma io avendo 13 anni non sono riuscito ad afferrarle bene) :slight_smile:
Faccio i test e scrivo i risultati.
Ciaooo XD

mmmm, ho installato la libreria virtual wire ma ho problemi sia con la ide 1.0.1 che con la 0022.
Questo è l'errore della 1.0.1:

In file included from sketch_sep12a.cpp:2:
/Users/cesare/Documents/Arduino/libraries/VirtualWire/VirtualWire.h:54: error: variable or field 'vw_set_tx_pin' declared void
/Users/cesare/Documents/Arduino/libraries/VirtualWire/VirtualWire.h:54: error: 'uint8_t' was not declared in this scope
/Users/cesare/Documents/Arduino/libraries/VirtualWire/VirtualWire.h:58: error: variable or field 'vw_set_rx_pin' declared void
/Users/cesare/Documents/Arduino/libraries/VirtualWire/VirtualWire.h:58: error: 'uint8_t' was not declared in this scope
/Users/cesare/Documents/Arduino/libraries/VirtualWire/VirtualWire.h:62: error: variable or field 'vw_set_ptt_pin' declared void
/Users/cesare/Documents/Arduino/libraries/VirtualWire/VirtualWire.h:62: error: 'uint8_t' was not declared in this scope
/Users/cesare/Documents/Arduino/libraries/VirtualWire/VirtualWire.h:66: error: variable or field 'vw_set_ptt_inverted' declared void
/Users/cesare/Documents/Arduino/libraries/VirtualWire/VirtualWire.h:66: error: 'uint8_t' was not declared in this scope
/Users/cesare/Documents/Arduino/libraries/VirtualWire/VirtualWire.h:71: error: variable or field 'vw_setup' declared void
/Users/cesare/Documents/Arduino/libraries/VirtualWire/VirtualWire.h:71: error: 'uint16_t' was not declared in this scope
/Users/cesare/Documents/Arduino/libraries/VirtualWire/VirtualWire.h:90: error: 'uint8_t' does not name a type
/Users/cesare/Documents/Arduino/libraries/VirtualWire/VirtualWire.h:96: error: 'uint8_t' does not name a type
/Users/cesare/Documents/Arduino/libraries/VirtualWire/VirtualWire.h:99: error: 'uint8_t' does not name a type
/Users/cesare/Documents/Arduino/libraries/VirtualWire/VirtualWire.h:104: error: 'uint8_t' does not name a type
sketch_sep12a.cpp: In function 'void setup()':
sketch_sep12a:7: error: 'vw_set_ptt_inverted' was not declared in this scope
sketch_sep12a:8: error: 'vw_set_tx_pin' was not declared in this scope
sketch_sep12a:9: error: 'vw_setup' was not declared in this scope
sketch_sep12a.cpp: In function 'void loop()':
sketch_sep12a:15: error: 'vw_send' was not declared in this scope

cece99,
scusami per averti scambiato per una persona più grande.... ma questo non significa nulla.
anche io alla tua età iniziai a appassionarmi all'elettronica e di sicuro neppure io avrei capito quello che ti ho spiegato oggi.

Ti spiego meglio:
sai che il micro ha una porta detta seriale attraverso la quale vengono ricevuti e trasmessi dati formati da una successione di bit 0 e 1. OK?
ora, se ad esempio il codice che dobbiamo trasmettere è formato da tutti zero es: 00000000 non ci sarebbe nessuna variazione sui bit da trasmettere e quindi il trasmettitore non cambierebbe il livello della radio-frequenza.... non ci sarebbe la cosidetta modulazione di ampiezza....

il codice manchester fa si che anche se il dato da trasmettere è 00000000 lo cambierà in una successione di 16 bit introducendo zeri e uno, es: 10110011_00110100 (codice scritto a caso) in modo che ci sia una variazione continua di modulazione (spiegato in parole poverissime).

lo so che è un concetto abbastanza complicato ma.... avendo pazienza e soprattutto studiando un giorno capirai molto di più.

cyclone:
cece99,
scusami per averti scambiato per una persona più grande.... ma questo non significa nulla.
anche io alla tua età iniziai a appassionarmi all'elettronica e di sicuro neppure io avrei capito quello che ti ho spiegato oggi.

Ti spiego meglio:
sai che il micro ha una porta detta seriale attraverso la quale vengono ricevuti e trasmessi dati formati da una successione di bit 0 e 1. OK?
ora, se ad esempio il codice che dobbiamo trasmettere è formato da tutti zero es: 00000000 non ci sarebbe nessuna variazione sui bit da trasmettere e quindi il trasmettitore non cambierebbe il livello della radio-frequenza.... non ci sarebbe la cosidetta modulazione di ampiezza....

il codice manchester fa si che anche se il dato da trasmettere è 00000000 lo cambierà in una successione di 16 bit introducendo zeri e uno, es: 10110011_00110100 (codice scritto a caso) in modo che ci sia una variazione continua di modulazione (spiegato in parole poverissime).

lo so che è un concetto abbastanza complicato ma.... avendo pazienza e soprattutto studiando un giorno capirai molto di più.

sai che mi hai fatto capire tutto :smiley: grazie mille!
Domani quando torno da scuola (ho 13 anni, ho sbagliato a scrivere e faccio la 3a media) mi studio un po' il codice manchester e se ho tempo nei prossimi giorni vedo di fare un abbozzo di libreria per usare al meglio i modulini.
Grazie a tutti e due, ciaooo

il manchester è anche nelle linee dati ove non c'è un segnale di clock a parte,es. ethernet..
ogni bit viene rappresentato da "due bit" consecutivi opposti e ci sono due convenzioni:
1^ 0=basso-alto 1=alto-basso
2^ 0=alto-basso 0=basso-alto

qualcuno sa dirmi come ovviare al problema della compilazione :grin:

purtroppo secondo me il programma che vuoi compilare non ti servirà a nulla.... non risolverai il problema della trasmissione se non converti in manchester....
magari ogni tanto riceverai qualche dato esatto.... ma solo per casualità di sequenza di bit.

ciao

allora, qualche gentiluomo mi darebbe uno straccio di sketch per sto codice manchester (possibilmente sia tx che rx?) :grin: :grin: :grin:

Per trasmettere basta fare uno XOR col clock del segnale..
Per ricevere il codice diventa un pò più complesso.. ma non impossibile da scrivere, in una mezz'ora dovresti farcela

Ciao

flz47655:
Per trasmettere basta fare uno XOR col clock del segnale..
Per ricevere il codice diventa un pò più complesso.. ma non impossibile da scrivere, in una mezz'ora dovresti farcela

Ciao

ho paura che per un ragazzo di 13 anni quella mezz'ora diventi 7 giorni.
Comunque, non c'è nessun chip che si collega via seriale ad arduino e ci pensa lui alla modulazione?

cece99:

flz47655:
Per trasmettere basta fare uno XOR col clock del segnale..
Per ricevere il codice diventa un pò più complesso.. ma non impossibile da scrivere, in una mezz'ora dovresti farcela

Ciao

ho paura che per un ragazzo di 13 anni quella mezz'ora diventi 7 giorni.
Comunque, non c'è nessun chip che si collega via seriale ad arduino e ci pensa lui alla modulazione?

xbee o nrf24l01+ hanno una librerie dedicata :grin:

Madwriter:

cece99:

flz47655:
Per trasmettere basta fare uno XOR col clock del segnale..
Per ricevere il codice diventa un pò più complesso.. ma non impossibile da scrivere, in una mezz'ora dovresti farcela

Ciao

ho paura che per un ragazzo di 13 anni quella mezz'ora diventi 7 giorni.
Comunque, non c'è nessun chip che si collega via seriale ad arduino e ci pensa lui alla modulazione?

xbee o nrf24l01+ hanno una librerie dedicata :grin:

gli nrf24l04+ ce gli ho già, gli xbee non mi piacciono: troppo costosi.

Vorrei semplicemente usare i modulini che ho già, non è che eseste un chip che codifica e decodifica i dati x mandarli al modulino?

@cece
visto che non demordi quello che posso fare per aiutarti è allegarti un semplicissimo stralcio di codice C che realizza l'algoritmo.
il codice Encode converte in manch un byte, mentre l'encode riporta il codice in un byte....

la parte encoder manchester:

void EncodeData(BYTE txbyte)
{
	int i,j,b,me; //me=manchester encode int
	b = txbyte;
	
	for (i=0; i<2; i++) {
		me = 0; // txbyte codificato manchester 
		for (j=0 ; j<4; j++) {
			me >>=2;
			if (bit_test(b,0) )
				me |= 0b01000000; // 1->0
			else
				me |= 0b10000000; // 0->1
				b >>=1;
	}
	putc(me);
	}
}

questa è la parte decoder manchester:

BYTE DecodeData(BYTE encoded)
{
	BYTE i,dec,enc,pattern;
	enc = encoded;
	
	if (enc == 0xf0) // start/end condition encountered
		return 0xf0;
		dec = 0;
		for (i=0; i<4; i++) {
			dec >>=1;
			pattern = enc & 0b11;
			if (pattern == 0b01) // 1
				bit_set(dec,3);
			else if (pattern == 0b10)
				bit_clear(dec,3); // 0
			else
				return 0xff; // codice illegale
				enc >>=2;
		}
	return dec;
}

esistono codici che ho scritto in altri linguaggi ..... ma questo è il più semplice che potresti utilizzare per la tua applicazione.
ciao

cyclone:
@cece
visto che non demordi quello che posso fare per aiutarti è allegarti un semplicissimo stralcio di codice C che realizza l'algoritmo.
il codice Encode converte in manch un byte, mentre l'encode riporta il codice in un byte....

la parte encoder manchester:

void EncodeData(BYTE txbyte)

{
int i,j,b,me; //me=manchester encode int
b = txbyte;

for (i=0; i<2; i++) {
	me = 0; // txbyte codificato manchester 
	for (j=0 ; j<4; j++) {
		me >>=2;
		if (bit_test(b,0) )
			me |= 0b01000000; // 1->0
		else
			me |= 0b10000000; // 0->1
			b >>=1;
}
putc(me);
}

}




questa è la parte decoder manchester:


BYTE DecodeData(BYTE encoded)
{
BYTE i,dec,enc,pattern;
enc = encoded;

if (enc == 0xf0) // start/end condition encountered
	return 0xf0;
	dec = 0;
	for (i=0; i<4; i++) {
		dec >>=1;
		pattern = enc & 0b11;
		if (pattern == 0b01) // 1
			bit_set(dec,3);
		else if (pattern == 0b10)
			bit_clear(dec,3); // 0
		else
			return 0xff; // codice illegale
			enc >>=2;
	}
return dec;

}




esistono codici che ho scritto in altri linguaggi ..... ma questo è il più semplice che potresti utilizzare per la tua applicazione.
ciao

cyclone, di dove sei, che ti devo proprio offrire una pizza?

scusa, cyclone ma non riesco a compilare :~
errore dell' encoder con l'ide 0022:

sketch_sep14a.cpp:18:9: error: macro "putc" requires 2 arguments, but only 1 given
sketch_sep14a:-1: error: variable or field 'EncodeData' declared void
sketch_sep14a:-1: error: expected )' before 'txbyte' sketch_sep14a:0: error: variable or field 'EncodeData' declared void sketch_sep14a:0: error: expected )' before 'txbyte'

@cece,
ti ricordi cosa avevi chiesto? se non ricordo male uno stralcio di codice.... io ne ho postati 2 XD
naturalmente scherzo e capisco le tue difficoltà :slight_smile:

il codice che ti ho postato è in formato standard C .... e si tratta del pseudo-codice per mostrarti l'agoritmo di
encode e decode manchester.... non puoi prenderlo e compilarlo senza adattarlo al tuo SV.

Hai capito come funziona?
Se SI allora prova a riadattarlo.... se è no, devi trovare altre soluzioni o scopiazzare dalla rete.