Pages: [1] 2   Go Down
Author Topic: Arduino, RF e un primo progetto  (Read 2752 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
Logged

Germany
Offline Offline
Edison Member
*
Karma: 2
Posts: 1363
Here we go!!!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

L'impossibile...richiede solo piu' tempo!

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 524
Posts: 12338
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 524
Posts: 12338
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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".
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Quote
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++  smiley-wink
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Quote
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++  smiley-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 smiley
Logged

Parma
Offline Offline
Edison Member
*
Karma: 20
Posts: 2359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Quote
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 smiley
Ti basta un loop semplicissimo:
Code:
void loop() {
  if DigitalRead(pin, segnale) {
    Serial.print("X");
  }
}
E lato PC leggi se sulla seriale arriva appunto il carattere prestabilito.

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

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.
Logged


Pages: [1] 2   Go Up
Jump to: