Arduino, RF e un primo progetto

Ciao a tutti,
in questi giorni, stavo pensando come realizzare un piccolo progetto per comunicare, in maniera molto semplice, con un Software che gira su un PC, utilizzando un telecomando a onde radio (tipo quello per aprire cancelli, RF 433Mhz). Premetto che questa è la mia prima esperienza con Arduino.

Problema da Risolvere: In un particolare istante, devo poter inviare un segnale ad un Software che gira continuamente su un PC Windows: ricevuto il segnale il Software si comporta in un certo modo.
Nota: non mi importa il "contenuto" trasmesso, è sufficiente che il Software riceva un input prestabilito (per evitare input spuri dovuti ad interferenze)

Vincoli:

  • Il Software gira su un PC Windows 7
  • La notifica deve essere inviata "a distanza", utilizzando un telecomando (anche piccolo, tipo quello per cancelli)
  • Il raggio d'azione è limitato ad un appartamento
  • Il sistema deve essere sicuro (cioè non deve dare falsi positivi dovuti ad interferenze o altro)

In parole povere..: Voglio avere un telecomando in mano (anche con un solo tasto! tipo quello dei cancelli, non più grande) e ovunque mi trovi all'interno del mio appartamento, se premo il tasto, mi parte un certo software sul PC.

Quello di cui sono certo finora è di utilizzare un Arduino Duemilanove con semplice interfaccia USB (che utilizzerei sia per alimentare/programmare) visto il costo particolarmente basso su robot italia. D'altro canto però non so cosa affiancargli..
Dal momento in cui ho necessità di coprire l'intero appartamento non posso usare un telecomando IR a causa del ristretto raggio d'azione, per cui devo orientarmi su un radiocomando. In questo ambito, ho visto che esistono, oltre ai classici 433Mhz, quelli che lavorano a 2.4Ghz. Dal momento in cui voglio restringere i costi, credo che uno da 433Mhz sia più che sufficiente.
Il problema però è che non ho trovato nessun accoppiamento "pronto" per Arduino.
In giro, ho trovato diverse shield riceventi RF a 433Mhz ma, funzioneranno con un classico telecomando per cancelli a 433Mhz? Non è necessario che trasmettitore e ricevitore siano accoppiati per trasmettere, esattamente sulla stessa frequenza?

Per evitare "interferenze" in questo caso, potrei fare in modo che arduino decodifichi il segnale ricevuto e notifichi il software solo se il segnale ricevuto è sempre lo stesso per 3 volte successive (ho visto un implementazione di questo tipo in giro per la rete).

Inoltre, per far si che la mia applicazione (C++) sia notificata dell'evento (ricevo un segnale) è sufficiente utilizzare Firmata?

Grazie a tutti per eventuali risposte :slight_smile:

Per quanto riguarda i moduli, io riuscii ad utilizzare questi e funzionano fino a circa 20-30 mt (possibile anche di piu' ma non provai a suo tempo)

http://www.ebay.com/itm/433Mhz-RF-link-kit-Arduino-ARM-MCU-/270850727356?_trksid=p4340.m185&_trkparms=algo%3DSIC.NPJS%26its%3DI%252BC%26itu%3DUA%26otn%3D5%26pmod%3D270755096487%26ps%3D63%26clkid%3D5398274815223900879#ht_3237wt_1037

Inoltre dai un'occhiata a queste discussioni, puo' essere che ti aiutino:
http://arduino.cc/forum/index.php/topic,53157.0.html

http://arduino.cc/forum/index.php/topic,55324.0.html

Questa e' la mia in cui chiedo aiuto per l'utilizzo dei moduli e mi pare ci sia anche un po' di SOFTWARE gia' scritto:
http://arduino.cc/forum/index.php/topic,60741.45.html

Spero ti siano utili,

Fabrizio.

f.schiano:
Per quanto riguarda i moduli, io riuscii ad utilizzare questi e funzionano fino a circa 20-30 mt (possibile anche di piu' ma non provai a suo tempo)

http://www.ebay.com/itm/433Mhz-RF-link-kit-Arduino-ARM-MCU-/270850727356?_trksid=p4340.m185&_trkparms=algo%3DSIC.NPJS%26its%3DI%252BC%26itu%3DUA%26otn%3D5%26pmod%3D270755096487%26ps%3D63%26clkid%3D5398274815223900879#ht_3237wt_1037

Inoltre dai un'occhiata a queste discussioni, puo' essere che ti aiutino:
http://arduino.cc/forum/index.php/topic,53157.0.html

http://arduino.cc/forum/index.php/topic,55324.0.html

Questa e' la mia in cui chiedo aiuto per l'utilizzo dei moduli e mi pare ci sia anche un po' di SOFTWARE gia' scritto:
http://arduino.cc/forum/index.php/topic,60741.45.html

Spero ti siano utili,

Fabrizio.

Grazie per la risposta.
Il mio problema però è che non voglio comunicare in RF tra due Arduino ma semplicemente vorrei usare un ricevitore RF su Arduino e un telecomando vero e proprio come trasmettitore.
Nel modo da te citato, cioè utilizzando due arduino, dovrei creare da 0 un telecomando con un Arduino mini ad esempio, il che non è proprio nelle mie idee (perchè porterebbe via tempo e denaro!).
Quello che mi chiedo e se esiste un qualunque altro modo per mandare un input ad un arduino utilizzando un telecomando col vincolo della copertura da appartamento :
Grazie ancora :wink:

http://www.telecomandiuniversali.it/

Ti scegli un telecomando apricancello di quelli più semplici possibili, che lavorano a 433 MHz, ad esempio questo:
http://www.telecomandiuniversali.it/telecomandi/prodotto_660/marca_adyx_telecomando_adyx_ja_399_tm1_433.php
che ha la codifica del coedice a DIP switch. Poi però devi crearti il ricevente da collegare al PC per leggere il codice.

f.schiano:
Per quanto riguarda i moduli, io riuscii ad utilizzare questi e funzionano fino a circa 20-30 mt (possibile anche di piu' ma non provai a suo tempo)

http://www.ebay.com/itm/433Mhz-RF-link-kit-Arduino-ARM-MCU-/270850727356?_trksid=p4340.m185&_trkparms=algo%3DSIC.NPJS%26its%3DI%252BC%26itu%3DUA%26otn%3D5%26pmod%3D270755096487%26ps%3D63%26clkid%3D5398274815223900879#ht_3237wt_1037

Ciao Fabrizio, avresti il datasheet di quegli aggeggini? Tu li hai presi in Cina da questi qui? tempi di consegna, qualità delle schede?

leo72:
http://www.telecomandiuniversali.it/

Ti scegli un telecomando apricancello di quelli più semplici possibili, che lavorano a 433 MHz, ad esempio questo:
http://www.telecomandiuniversali.it/telecomandi/prodotto_660/marca_adyx_telecomando_adyx_ja_399_tm1_433.php
che ha la codifica del coedice a DIP switch. Poi però devi crearti il ricevente da collegare al PC per leggere il codice.

Come mi creo un ricevente per quel telecomando?
In realtà, io avrei già un'accoppiata telecomando e ricevitore. Quando aziono il telecomando, il ricevitore fa attivare un relè che mi accende lo stereo.
C'è qualche modo di sfruttare il relè, o il ricevitore già esistente con Arduino?
Cioè qualcosa del tipo: se passa corrente fai questo altrimenti stai in loop? Cioè attraverso uno degli ingressi Arduino è possibile leggere lo stato del relè ad esempio?

Grazie.

Se hai già il ricevente sei a posto, basta collegarlo al PC tramite una porta I/O e poi leggere lo stato col tuo programma.

leo72:
Se hai già il ricevente sei a posto, basta collegarlo al PC tramite una porta I/O e poi leggere lo stato col tuo programma.

Ma come faccio a collegare un ricevente RF ad una porta I/O? E' un semplice ricevente per telecomando!

Se mi dici che pilota un relé, quel ricevente darà un segnale alto o basso in uscita al ricevimento dell'impulso radio. Puoi leggere quell'impulso da un pin dell'Arduino e poi spedirlo via USB al PC e, tramite il tuo programma, leggerlo e fare le tue operazioni.

leo72:
Se mi dici che pilota un relé, quel ricevente darà un segnale alto o basso in uscita al ricevimento dell'impulso radio. Puoi leggere quell'impulso da un pin dell'Arduino e poi spedirlo via USB al PC e, tramite il tuo programma, leggerlo e fare le tue operazioni.

Oppure puoi usare direttamente i contatti del relé, se non devi usarli anche per lo stereo; un contatto ai 5V di Arduino, l'altro su un pin digitale (sul quale metti una R di pull-down da 10K verso massa; a quel punto leggi lo stato del pin con digitalRead, se è alto vuol dire che il relé è scattato in quanto è arrivato l'impulso, altrimenti Arduino legge "basso".

menniti:

leo72:
Se mi dici che pilota un relé, quel ricevente darà un segnale alto o basso in uscita al ricevimento dell'impulso radio. Puoi leggere quell'impulso da un pin dell'Arduino e poi spedirlo via USB al PC e, tramite il tuo programma, leggerlo e fare le tue operazioni.

Oppure puoi usare direttamente i contatti del relé, se non devi usarli anche per lo stereo; un contatto ai 5V di Arduino, l'altro su un pin digitale (sul quale metti una R di pull-down da 10K verso massa; a quel punto leggi lo stato del pin con digitalRead, se è alto vuol dire che il relé è scattato in quanto è arrivato l'impulso, altrimenti Arduino legge "basso".

Cioè in pratica dovrei realizzare questo? http://arduino.cc/en/Tutorial/DigitalReadSerial

Inoltre, potreste spiegarmi, perlomeno superficialmente, come avviene la comunicazione tra Arduino e PC (via USB), con applicazioni C++?
Grazie ancora!

CrAsHeR:
Cioè in pratica dovrei realizzare questo? http://arduino.cc/en/Tutorial/DigitalReadSerial

Diciamo di sì, devi leggere un valore alto o basso, l'implementazione varia poi a seconda dei casi.

Inoltre, potreste spiegarmi, perlomeno superficialmente, come avviene la comunicazione tra Arduino e PC (via USB), con applicazioni C++?
Grazie ancora!

Beh, qui tu usi Windows, quindi immagino che userai VisualQualcosa: il linguaggio ti metterà a disposizione dei metodi per gestire la comunicazione su seriale per la lettura dei dati. Come non so, ma non è neanche un problema affrontabile su questo forum, che parla di Arduino, non di programmazione Windows/C++ :wink:

leo72:

CrAsHeR:
Cioè in pratica dovrei realizzare questo? http://arduino.cc/en/Tutorial/DigitalReadSerial

Diciamo di sì, devi leggere un valore alto o basso, l'implementazione varia poi a seconda dei casi.

Inoltre, potreste spiegarmi, perlomeno superficialmente, come avviene la comunicazione tra Arduino e PC (via USB), con applicazioni C++?
Grazie ancora!

Beh, qui tu usi Windows, quindi immagino che userai VisualQualcosa: il linguaggio ti metterà a disposizione dei metodi per gestire la comunicazione su seriale per la lettura dei dati. Come non so, ma non è neanche un problema affrontabile su questo forum, che parla di Arduino, non di programmazione Windows/C++ :wink:

Grazie mille. Ho fatto qualche ricerca e credo di aver trovato quello che fa al caso mio.
Quello che mi domando adesso è: per rilevare correttamente il cambiamento di stato (il pin cambia valore e passa da alto o basso), è meglio utilizzare il classico polling o il meccanismo degli interrupt?

Tutto quello che dovrà fare il mio Arduino è semplicemente verificare continuamente se si verifica una variazione basso alto (per almeno 12 ore al giorno). A questo punto, è meglio sfruttare le pecularità della funzione loop() (e quindi sfruttare il polling, magari con un delay tra una iterazione e l'altra di 500ms), oppure giocare con gli interrupt e far eseguire del codice ad Arduino solo quando si verifica l'interruzione? (cambiamento di stato)

Grazie :slight_smile:

CrAsHeR:
Inoltre, potreste spiegarmi, perlomeno superficialmente, come avviene la comunicazione tra Arduino e PC (via USB), con applicazioni C++?
Grazie ancora!

La comunicazione viene vista come una seriale (chiamata es. COM6) che puoi leggere sotto Windows con l'API ReadFile e scrivere con WriteFile, l'utilizzo dell'api è complicato perchè di livello bassissimo quindi devi vedere su MSDN la documentazione ufficiale per utilizzarla correttamente.
Se usi il C/C++ puoi usare la funzione fopen, se lo usi con framework come MFC, BCL, QT o altro controlla quale classe esiste già pronta per semplificarti la vita.

Io sinceramente uso .NET per scrivere a livello enormemente più alto i programmi in tempi rapidissimi rispetto ai linguaggi di basso livello

Ciao

CrAsHeR:
Grazie mille. Ho fatto qualche ricerca e credo di aver trovato quello che fa al caso mio.
Quello che mi domando adesso è: per rilevare correttamente il cambiamento di stato (il pin cambia valore e passa da alto o basso), è meglio utilizzare il classico polling o il meccanismo degli interrupt?

Dipende dal tuo ricevente che uscita ti dà. Prendi un multimetro e misura intanto il voltaggio del comando radio e poi controlla alla ricezione che tensione prende il segnale in uscita.

Tutto quello che dovrà fare il mio Arduino è semplicemente verificare continuamente se si verifica una variazione basso alto (per almeno 12 ore al giorno). A questo punto, è meglio sfruttare le pecularità della funzione loop() (e quindi sfruttare il polling, magari con un delay tra una iterazione e l'altra di 500ms), oppure giocare con gli interrupt e far eseguire del codice ad Arduino solo quando si verifica l'interruzione? (cambiamento di stato)

Grazie :slight_smile:

Ti basta un loop semplicissimo:

void loop() {
  if DigitalRead(pin, segnale) {
    Serial.print("X");
  }
}

E lato PC leggi se sulla seriale arriva appunto il carattere prestabilito.

flz47655:

CrAsHeR:
Inoltre, potreste spiegarmi, perlomeno superficialmente, come avviene la comunicazione tra Arduino e PC (via USB), con applicazioni C++?
Grazie ancora!

CrAsHeR:
Io sinceramente uso .NET per scrivere a livello enormemente più alto i programmi in tempi rapidissimi rispetto ai linguaggi di basso livello

Scusa, ma se ho interpretato bene questa tua frase, la situazione è opposta a come la descrivi tu: un linguaggio a basso livello è sempre più enormemente veloce rispetto ad uno di alto livello. Se parliamo di"semplicità" è un conto, ma se parliamo di "velocità", il .NET non potrà mai raggiungere la velocità del C o dell'assembly puro.

Fin qui tutto chiaro; quello che mi domando è devo utilizzare anche la resistenza da 10KOhms come nello schema linkato precedentemente? (sia nel caso in cui collego direttamente il ricevitore, sia se sfrutto il relè già così com'è?)

Per quanto riguarda .NET e la questione sulla velocità, flz47655 intendeva dire che scrivere programmi sfruttando il framework .NET è enormemente più veloce rispetto, ad esempio, ad utilizzare solo C++. Effettivamente, se volessi comunicare con la seriale, con C++ ci vogliono un bel pò di righe di codice mentre .NET mette già a disposizione la classe serial e servono solo poche righe per la comunicazione. Non c'è ombra di dubbio che i linguaggi di basso livello come ASM, siano enormemente più veloci di quelli ad alto livello, ma non era questo ciò a cui l'utente faceva riferimento :slight_smile:

menniti:

f.schiano:
Per quanto riguarda i moduli, io riuscii ad utilizzare questi e funzionano fino a circa 20-30 mt (possibile anche di piu' ma non provai a suo tempo)

moduli rf

Ciao Fabrizio, avresti il datasheet di quegli aggeggini? Tu li hai presi in Cina da questi qui? tempi di consegna, qualità delle schede?

Ciao Michele, scusami ma leggo solo ora (causa esami :slight_smile: ) comunque i datasheet specifici non li trovai, ma usai un qualcosa del genere e con un po' di tempo riuscii a farli funzionare:

Ho usato la libreria VirtualWire:

Qui il download:
http://www.open.com.au/mikem/arduino/VirtualWire-1.5.zip

Poi a suo tempo trovai queste specifiche:
TX Technical Specifications:
A?Working voltage: 3V?12V
B?Working current: max?40mA (12V), min?9mA(3V)

RX Technical Specifications:
A?Working voltage: 5.0V +0.5V
B?Working current:?4.5mA (5.0VDC)

Spero che ti siano utili queste info.

Se te ne servissero altre basta contattarmi (anche in pvt) e per quello che posso cerco di aiutarti!

Ciao,

Fab.

p.s. Ti ripeto che la discussione di riferimento in cui ci sono le mie "scoperte" e smentite e' questa:
DISCUSSIONE RF

Grazie Fabrizio :wink:

Ciao io avevo una soluzione più pratica usa l'arduino per leggere lo stato del relè che chiude a massa, metti una res da 1k 1\4w e ed vedi quando il segnale una volta che il relè é chiuso passa da 5v a gnd e in seriale 232 fai il polling del tuo Arduino quando ti restituisce ad es 00 il relè è chiuso quando è in FF è aperto e da li ti apri o comandi il PC....poi se hai bisogno io ci sono