Salve a tutti,
ho finalmente intrapreso un progetto definitivo con arduino (nulla di che, un piccolo carro armato radiocomandato) ma mi sono bloccato sul metodo di trasmissione dei comandi, per ora solo avanti e indietro e destra e sinistra.
Per ora sto utilizzando un semplice telecomando di una vecchia TV e un sensore IR riciclato da un decoder che avevo in casa, ma volevo passare a qualcosa di più avanzato.
In casa ho già due ESP8266-01, ho provato a combinarci qualcosa ma con scarsi risultati (sono riuscito solo a settare le impostazioni basilari coi comandi AT) .
In questi giorni di vacanza ho pensato un po' e mi sono chiesto se è possibile costruire un radiocomando base, e relativa ricevente, senza comprare moduli nRF24L01 o simili.
Ho costruito una piccola trasmittente FM da collegare al telefono per trasmettere la musica alla radio (se cercate su youtube Spy bug trovate centinaia di video) e volevo chiedere se era possibile realizzare una cosa simile che inviasse un segnale digitale che poteva poi essere ricevuto e trasformato in una serie di bit da inviare ad un pin digitale di arduino.
Volevo trasportare quello che avviene nella tecnologia IR (vengono trasmessi codici a 32 bit da un diodo led che "lampeggia" molto velocemente) ma con le RF.
So come funziona una trasmittente FM fin quando si parla di trasmettere segnali analogici ma non so come funziona un radiocomando che deve trasmettere un codice che poi arduino trasforma in un movimento dei motori attraverso un'opportuna programmazione.
Ho paura di essermi dilungato troppo e sono quasi certo che mi rispondere di comprarmi un nRF2401, ma volevo fare qualcosa io per imparare qualcosa di nuovo.
Grazie in anticipo e spero di essermi spiegato.
Benvenuto. Essendo il tuo primo post, nel rispetto del regolamento, ti chiediamo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO... Grazie.
Qui una serie di link utili, non inerenti al tuo problema:
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- qui le pinout delle varie schede by xxxPighi: Pinout
- qui una serie di link generali utili: Link Utili
Ok, mi sono presentato e anche dato una rilettura al regolamento dato che mi era sfuggita la presentazione.
Mi sono stupito di quanto sia attivo il forum!
realizzare un trasmettitore non è molto difficile come hai già visto realizzandone uno in FM, un po' più complicato è realizzarne uno che stia "inchiodato" sulla frequenza scelta, mentre è davvero molto più difficile fare un ricevitore che sia accordato sulla giusta frequenza e non faccia entrare qualsiasi portante RF nelle vicinanze, a questo punto tanto vale comprarsi due modulini tarati e funzionanti senza uscire pazzi e di moduli ce ne sono parecchi, con dei pic per radiocomandare un modellino di R2D2 ho usato dei moduli HC11 che sono semplicissimi da usare, oppure ci sono gli HC12 che hanno una portata fino al chilometro (teoricamente almeno)
credo di aver capito il problema della mia idea, ma quello che non riuscivo a capire era come fa il ricevitore a trasformare il segnale demodulato proveniente dal trasmettitore in una sequenza di bit leggibile da un arduino e viceversa a trasmetterlo.
Non so avviene realmente così in una ricevente già fatta.
Il suono essendo un onda sinusoidale viene mixata alla portante per essere trasmessa, ma un segnale digitale (bottone aperto o chiuso che fa avanzare o fermare il mio modellino) come viene trasmesso?(viene mixata un onda quadra alla portante contenete la sequenza di bit? e poi viene demodulata come in una normale ricevente FM? )
Io pensavo di mettere un arduino in un telecomando che alla pressione di un bottone generava una sequenza di bit che poi veniva trasmessa, una volta ricevuto il segnale l'arduino "principale" montato sul modellino, sapeva a cosa corrispondeva ed eseguiva il comando.
I problemi sono 2:
-come passare dalla sequenza di bit in uscita dal pin dell'arduino "trasmittente" ad un'onda che viaggia nell'etere, e poi come trasformare il segnale ricevuto da un'antenna ad una sequenza di bit da far interpretare all'arduino sul modellino.
-il secondo problema, credo più semplice del primo, invece è: come faccio a leggere con l'arduino una sequenza di bit in rapida successione? servirebbe una libreria tipo IR remote dove metti il codice esadecimale del comando in una condizione con if, e se viene ricevuta la sequenza fa accendere un led o muovere un motore oppure qualsiasi cosa messa nella condizione. (credo che esista qualche libreria che fa questo senza troppi problemi).
Ribadisco che non ho la minima idea di come funzioni un radiocomando e quindi quello che ho scritto sopra potrebbe essere completamente sbagliato, ma appunto per questo ho chiesto a voi.
Grazie mille per la tua risposta zef!
nicobigio01:
In casa ho già due ESP8266-01, ho provato a combinarci qualcosa ma con scarsi risultati (sono riuscito solo a settare le impostazioni basilari coi comandi AT) .
Lascia perdere i comandi AT e usa una buona libreria.
Sinceramente non ricordo bene, ma mi sembra che avevo avuto problemi con l'FTDI breakout, stavo cercando di cambiare la frequenza del modulo per renderla non troppo veloce da gestire da una porta virtuale di arduino.
tanto per avere un idea base di come si può trasmettere un segnale digitale dai un'occhiata QUI
per leggere una sequenza di bit la via più semplice è usare la seriale, i moduli di cui ti accennavo prima si collegano ad arduino proprio sulla seriale per inviare/ricevere i byte
Metodo "grossolano" ma funzionante ... leggi un registro shift, moduli AM (non ti impegolare con le FM, che con un quarzo ed un paio di transistor, per la distanza che serve a te', le AM sono migliori) un piccolo trasmettitore (aggiungendo opportuni segnali di sincronizzazione, in modo che la MCU ricevente sappia dove inizia ogni sequenza), la ricevente AM e' anch'essa molto semplice, demoduli gli stream ricevuti e ci piloti un secondo shift in uscita ... se ti basta inviare fino ad un massimo di 8 comandi indipendenti contemporaneamente, un singolo shift e' sufficente, altrimenti se ne mettono due in cascata ...
Ringrazio particolarmente per le ultime due risposte che mi sono state di grande aiuto.
Ieri sera e questa mattina mi sono documentato un po' riguardo la trasmissione OOK e ho visto che non è molto difficile creare una ricevente/trasmittente, almeno sul piano teorico.
Trasmettere non dovrebbe essere complicato (secondo voi va bene un oscillatore Colpitts per generare la portante?), per ricevere un segnale OOK, a quanto ho capito bisogna utilizzare lo stesso metodo che si utilizzerebbe per qualsiasi altro segnale in AM (envelope detector mi pare si chiami il circuito di ricezione).
Adesso mi sto documentando su come funziona la comunicazione seriale fra arduini e spero di concludere qualcosa.
Secondo voi quindi il problema più grosso sarebbe ottenere un segnale pulito in ricezione e creare una ricevente che comunichi esattamente alla stessa frequenza della trasmittente(in Italia mi sembra che l'unica frequenza ammessa per legge sia 433 MHz)?
Per generare la portante stabile, o usi un classico colptiss, oppure uno di quegli "scatolini" che racchiudono quarzo, oscillatore e stadio di uscita, tipo ad esempio questi:
Questo per avere migliore stabilita' (per le potenze che servono a te, le limitazioni di frequenza credo non si applichino, essendo in fondo un giocattolo con portata di poche decine di metri) ... poi ci piloti un transistor chiuso su un LC accordato come finale e moduli la portante ON/Off con la sequenza generata da arduino tramite un'altro transistor, qui bisogna vedere che tipo di comunicazione vuoi utilizzare, ma credo la piu semplice, se ti limiti agli 8 comandi, sia ad esempio generare una sequenza di impulsi con due temporizzazioni, larga per lo zero e stretta per l'uno (o l'opposto, come vuoi), con le pause della stessa durata degli impulsi stretti, e far precedere il dato da un "tot" di impulsi stretti, una pausa larga, il dato trasmesso (4 impulsi), una pausa larga ... in questo modo oltre a definire i tempi (dato della stessa durata degli impulsi di sincro = 1, dato di durata doppia = 0), danno anche il sincro ... potrebbero essere ad esempio, 5 impulsi stretti, pausa larga, il dato, pausa larga, e via daccapo ... dato che il carattere che veicola il dato sono 4 impulsi, 5 consecutivi stretti sarebbero sempre riconosciuti come sincro, e le pause larghe come inizio e fine dati ... sto improvvisando al volo, ci sono molti modi per farlo ...
Io pensavo di mettere un codice di start fisso come dici tu e poi far partire una sequenza di 4 bit che dovrebbero corrispondere a 16 diverse combinazioni (e quindi comandi).
Tra il bit di start e i dati lascerei una pausa per dare il tempo ad arduino di prepararsi a ricevere i dati, inoltre lascerei una pausa anche fra un bit e l'altro magari meno lunga rispetto alla pausa che equivale allo 0 (per pausa intendo 0V nell'onda).
Adesso mi sto guardando un po' di video su modulazione AM e ogni tanto provo a fare qualche prova su un simulatore che ho sul cellulare (non è un granchè ma un piccolo modulatore con op-amp sono riuscito a farlo).
non ho ben capito il fatto della sincronizzazione, teoricamente i bit li invio sempre con la stessa durata già in uscita dall'arduino (non credo sia una cosa molto elegante ma non andrebbe bene creare la sequenza di bit accendendo e spegnendo un pin digitale col comando delay?).
il segnale alla ricevente deve essere amplificato dopo la trasmissione?
Ultima cosa, ho visto che in alcuni casi il segnale che contiene i dati viene amplificato anche prima di essere modulato e trasmesso, serve solo per incrementale la potenza di trasmissione oppure ha uno scopo preciso?
La sequenza di impulsi prima dei dati veri e propri fa sia da riconoscimento (dice all'arduino di prepararsi a ricevere i dati), che da sincro per la durata degli impulsi (e' virtualmente impossibile costruire due oscillatori indipendenti che abbiano SEMPRE la stessa frequenza e fase, quindi se non si usasse un sistema di sincronizzazione, anche primitivo come questo, alla lunga si sfaserebbero) ... con questo sistema invece quando terminano gli impulsi di "riconoscimento" e la pausa, ed iniziano quelli dei dati, arduino sapra' sempre che la larghezza degli impulsi la deve misurare "da quell'istante" ... e' semplicemente questo, che intendo per sincronizzazione ... ci sono anche altri sistemi, ma fondamentalmente si basano piu o meno tutti sullo stesso principio di base ...
L'amplificazione in trasmissione serve per avere maggiore potenza, ma se lo usi solo per trasmetterci una modulazione ON/OFF in quel modo, a te non dovrebbe servire (quei modulini a cristallo emettono pochi mW, ma ad esempio modulandoli On/OFF con una frequenza e collegandoci un'antenna discreta, c'e' gente che e' riuscita a ricevere il segnale con una radiolina a qualche centinaio di metri, senza amplificazione) ... al massimo uno stadio di uscita lo si puo usare per non sovraccaricare il modulino, considerando che alla fine non sara' collegato ad un'antenna accordata, e per avere una modulazione piu pulita che limitandosi ad agire sull'alimentazione del modulo, cosa per cui non sono previsti ...
L'amplificazione in ricezione serve sia ad avere migliore sensibilita', che ad ottenere all'uscita un segnale piu netto e "squadrato" da dare in pasto all'arduino ricevente ... basta un transistor o due, o un'operazionale, ed uno squadratore in uscita ... importanti invece saranno i filtri, per la reiezione di tutto quello che non e' la frequenza che interessa ... o anche un buon accordo di antenna ... per semplificare un po il tutto, si puo anche usare un MK484, che contiene l'equivalente del classico circuito di amplificazione, detector ed AGC fatto con i soliti 3 NPN e circuiteria varia in un case singolo TO92, con in ingresso un'antenna accordata LC sintonizzata sulla frequenza del trasmettitore ed in uscita un transistor o una porta trigger come squadratore ...