Offline
Newbie
Karma: 0
Posts: 19
|
 |
« on: January 05, 2012, 09:35:57 am » |
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 
|
|
|
|
|
Logged
|
|
|
|
|
Napoli
Offline
Edison Member
Karma: 1
Posts: 1219
Here we go!!!
|
 |
« Reply #1 on: January 05, 2012, 11:18:45 am » |
|
|
|
|
|
Logged
|
L'impossibile...richiede solo piu' tempo!
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 19
|
 |
« Reply #2 on: January 05, 2012, 11:28:48 am » |
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 
|
|
|
|
|
Logged
|
|
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10229
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #4 on: January 05, 2012, 05:44:22 pm » |
Ciao Fabrizio, avresti il datasheet di quegli aggeggini? Tu li hai presi in Cina da questi qui? tempi di consegna, qualità delle schede?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 19
|
 |
« Reply #5 on: January 05, 2012, 06:15:00 pm » |
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
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16440
Don't know what I do
|
 |
« Reply #6 on: January 05, 2012, 06:16:37 pm » |
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
Newbie
Karma: 0
Posts: 19
|
 |
« Reply #7 on: January 05, 2012, 06:39:46 pm » |
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
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16440
Don't know what I do
|
 |
« Reply #8 on: January 05, 2012, 07:01:19 pm » |
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
Shannon Member
Karma: 386
Posts: 10229
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #9 on: January 05, 2012, 07:07:17 pm » |
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
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 19
|
 |
« Reply #10 on: January 06, 2012, 04:20:44 am » |
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/DigitalReadSerialInoltre, potreste spiegarmi, perlomeno superficialmente, come avviene la comunicazione tra Arduino e PC (via USB), con applicazioni C++? Grazie ancora!
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16440
Don't know what I do
|
 |
« Reply #11 on: January 06, 2012, 06:33:08 am » |
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++ 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 19
|
 |
« Reply #12 on: January 06, 2012, 11:34:39 am » |
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++  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 
|
|
|
|
|
Logged
|
|
|
|
|
Parma
Offline
Edison Member
Karma: 10
Posts: 2104
|
 |
« Reply #13 on: January 06, 2012, 12:18:53 pm » |
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
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16440
Don't know what I do
|
 |
« Reply #14 on: January 06, 2012, 02:31:21 pm » |
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  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. 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
|
|
|
|
|
|