Ciao a tutti. Sto costruendo un sistema di comunicazione messaggistica laser. 2 sistemi in grado di trasmettere e ricevere dati (che rappresentano caratteri, codificati usando 8 bit per carattere) con un tastierino alfanumerico tipo quello dei cellulari e display. Uso il laser non perchè vi sia una necessità ma perchè l'effetto è molto teatrale: I due moduli sono posti ad una distanza di un centinaio di metri al massimo, da una finestra ad un'altra finestra di due palazzi (dove abita un amico ovviamente). e in questi giorni essendoci un bel pò di nebbia l'effetto "raggio laser" è notevole. Il laser è potente e collimato al punto giusto (ho già testato), l'allineamento al fotodiodo è manuale per il momento e automatizzata in un futuro. Essendo lo scopo più scenografico che pratico , ogni bit lo faccio durare 0.1 secondi. Il mio cruccio è trovare il modo più intelligente per leggere i bit: Vorrei che i bit venissero letti e immagazzinati in memoria indipendentemente dal programma principale (se per esempio sto scrivendo qualcosa non voglio che il programma si "blocchi" per visualizzare su lcd, lettera per lettera il messaggio in ingresso. Sarebbe più carino che i bit vengano registrati da qualche parte, un suono o una luce avverta che qualcosa è arrivato senza che l'utente se ne accorga durante la normale esecuzione e solo alla fine magari decida di leggere il messaggio o di cestinarlo). Avevo quindi pensato all'interrupt:
Fotodiodo in serie a una resistenza opportuna e prelevo l'interrupt nel nodo centrale.
La mia domanda è se qualcuno vede qualche inghippo in tutto questo, qualche suggerimento o anche qualche miglioramento. Tutto è ben accetto ovviamente.
Licius1991:
... Il laser è potente ...
... QUANTO potente ? ... occhio, che c'e' in giro un sacco di scassamarroni in toga, che non hanno nulla di meglio da fare che creare problemi a chi usa i laser, anche per applicazioni "relativamente innocue" come la tua (sempre supponendo che quando fate il puntamento utilizziate degli appropriati occhiali protettivi, e facciate attenzione a non riflettere mai il raggio in modo che possa finire negli occhi a qualcuno ... SPERO ... )
E che c'e' in giro ancora piu scassamarroni SENZA toghe, che come vedono un laser si mettono a starnazzare come tante oche giulive e corrono a telefonare a vigili, carabinieri, nettezza urbana, protezione civile, Batman, esercito, marina, aviazione, Superman, il nucleo NBC, il centro controllo epidemie e l'ispettore Gadget, pur di farsi notare e di creare fastidi a chiunque ...
tranquillo, la potenza è sotto 1 mW ma evidentemente il fotodiodo ha una buona responsività. dall'analogRead dell'Arduino leggo 0 quando non c'è illuminazione e 1023 quando è completamente illuminato (anche con nebbia). Per il puntamento usiamo degli occhiali ma in realtà ce n'è bisogno poco: il laser è molto ben collimato anche a 100 metri di distanza (spot non maggiore di 5 cm di Diametro ma giocando con l'ottica penso di poterlo migliorare) e basta mettersi di spalle e poi allineare il fotodiodo alla luce.
questo è un progettino carino! Mi piace! purtroppo non saprei come aiutarti... penso che un problemino sia far capire che il messaggio è finito, magari con una sequenza precisa?
Licius1991:
tranquillo, la potenza è sotto 1 mW ma evidentemente il fotodiodo ha una buona responsività. dall'analogRead dell'Arduino leggo 0 quando non c'è illuminazione e 1023 quando è completamente illuminato (anche con nebbia). Per il puntamento usiamo degli occhiali ma in realtà ce n'è bisogno poco: il laser è molto ben collimato anche a 100 metri di distanza (spot non maggiore di 5 cm di Diametro ma giocando con l'ottica penso di poterlo migliorare) e basta mettersi di spalle e poi allineare il fotodiodo alla luce.
Ti stai contradicendo.
il laser è molto ben collimato anche a 100 metri di distanza
Quello non é ben colimato e é poco peicoloso perché ll' energia del laser é suddiviso sulla superfice del cerchio di 5cm. Se lo colimi meglio vuol dire che la stessa potenza é su una superfice maggiore e percui riscalda di piú.
Un fotodiodo da solo non é l' elemento opportuno per rilevare luce. Ti serve un amplificatore.
Per il protocollo di trasmissione usa la seriale. Se non vuoi usare i pin 0 e 1 allora la softserial.
Un valore determinato di una lettura analogica non puó essere fonte per un interrupt.
Il puntamento del Laser non é una cosa semplice. A mano non riesci a centrare una superfice di 3mm come un fotodiodo / fototransistore. Se hai mai sparato al poligono lo sai. Li il fucile non lo tieni fermo, ma spari nel momento giusto.
Un angolo di 1° a 100m corrisponde a una deviazione di 1,7m, un angolo di 1 minuto corrisponde a 29mm; per centrare un bersaglio di 2x2mm con un laser colimato a 100m a 5cm Ti serve una regolazione del puntamento del laser di 1,7 minuti (o 0,029 Gradi) in entrambi le direzionei (x e y) Se il Laser non é fissato in modo massiccio se parli o starnutisci vicino oppure il vicino cammina hai tante di quelle vibrazioni da poter usare il laser come microfono e non da vettore per un segnale elettronico.
La stessa cosa vale per il vetro della finestra se pensi di far passare il lase attrraverso e non sei perettamente perpendicolare.
Ciao Uwe
questo è un progettino carino! Mi piace!
Grazie mille!!!
leouz:
penso che un problemino sia far capire che il messaggio è finito, magari con una sequenza precisa?
Un altro problema è anche come riconoscere sequenze "lunghe" di bit uguali. L'interrupt lo trigghererei sui fronti di salita e di discesa, ma se ho 2 o più bit uguali questi vengono rilevati come uno solo.
Ti stai contradicendo.
Scusa riformulo: il Laser non è molto potente ma in compenso ha una buona collimazione così non perdo molto in potenza ottica dispersa attraverso l'aria
Licius1991:
Ti stai contradicendo.
Scusa riformulo: il Laser non è molto potente ma in compenso ha una buona collimazione così non perdo molto in potenza ottica dispersa attraverso l'aria
neanche questo é giusto.
La colimazione é di quanto si apre il raggio con la distanza. parte con sotto 1mm dal laser e diventa 50mm a 100m.
L' assorbimento di luce durante il tragitto a causa del vetro delle finestre e relativo parziale riflesso e l' assorbimento in aria dato dalla polvere e dalla nebbia é un altra cosa (parti con 1mW di potenza ottica e ti arrivano 0,XW al 100m).
Ciao Uwe
Un fotodiodo da solo non é l' elemento opportuno per rilevare luce. Ti serve un amplificatore.
Per il protocollo di trasmissione usa la seriale. Se non vuoi usare i pin 0 e 1 allora la softserial.
Un valore determinato di una lettura analogica non puó essere fonte per un interrupt.
Non ho capito... l'interrupt è un segnale digitale e infatti quello che gli sto dando in pasto al fotodiodo è un 1(laser acceso ) o 0(laser spento). Il discorso sull'analogread lo facevo solo per dire che il laser anche a quella distanza faceva 0-5V e quindi assumeva valori logici corretti che potevano essere interpretati correttamente da un interrupt. Non capisco quindi a cosa serva l'amplificatore e la seriale ?Non basta così comè?
@uwe Per quanto riguarda il puntamento hai ragione a dire che è un bel po complicato. Al momento diciamo che è il fotodiodo che si sposta dove sta la chiazza laser: dove vedo la chiazza rossa li ci appiccico al muro il fotodiodo. In futuro avrà un sistema di puntamento automatizzato con due motorini ed una routine di allineamento e controllo che ciclicamente controlla l'allineamento e lo corregge. cio ho già pensato e steso due righe di codice e fatto un po di hardware ma stiamo già parlando dello step successivo. per il momento mi concentro nel terminare il back end.
Al momento diciamo che è il fotodiodo che si sposta dove sta la chiazza laser: dove vedo la chiazza rossa li ci appiccico al muro il fotodiodo.
Questa idea non mi é venuto. Soluzione pratica e funzionante.
In futuro avrà un sistema di puntamento automatizzato con due motorini ed una routine di allineamento e controllo che ciclicamente controlla l'allineamento e lo corregge.
Come leggi di quanto e in quale direzione é spostato? o almeno in quale direzione é spostato?
Ciao Uwe
uwefed:
Licius1991:
Ti stai contradicendo.
Scusa riformulo: il Laser non è molto potente ma in compenso ha una buona collimazione così non perdo molto in potenza ottica dispersa attraverso l'aria
neanche questo é giusto.
La colimazione é di quanto si apre il raggio con la distanza. parte con sotto 1mm dal laser e diventa 50mm a 100m.
L' assorbimento di luce durante il tragitto a causa del vetro delle finestre e relativo parziale riflesso e l' assorbimento in aria dato dalla polvere e dalla nebbia é un altra cosa (parti con 1mW di potenza ottica e ti arrivano 0,XW al 100m).Ciao Uwe
Chiarissimo. Grazie mille. In effetti ho fatto un po di confusione. ehehe XD
uwefed:
In futuro avrà un sistema di puntamento automatizzato con due motorini ed una routine di allineamento e controllo che ciclicamente controlla l'allineamento e lo corregge.
Come leggi di quanto e in quale direzione é spostato? o almeno in quale direzione é spostato?
Mi vengono in mente 2 soluzioni: 1 da primo approccio, una molto raffinata:
-
se il laser è fuori asse il secondo modulo chiede al primo di spostare il laser in modo che lo spot copra una area X volte più grande dello spot stesso. Ovviamente questa è una soluzione molto rapida e sbrigativa, suppone che il laser sia acceso durante la routine, che lo spot non sia spostato troppo dalla direzione del fotodiodo (anche se in teoria potrei fare uno scanning di tutta l'area o quasi fino a che il secondo modulo non mi blocca), e presuppone che il secondo laser sia locked al fotodiodo del primo. Ci sono un po di limitazioni ma ragioanndoci si può crearew qualcosa di fattibile alla fine.
-
Usare una antenna che presenti uno zero di trasmissione nel centro e dei picchi ai lati (un cono piccolo dentro un cono più grande con il vertice in comune sostanzialmente) Il laser ancorato in qualche modo all'antenna. Se le antenne sono allineate (e anche il laser, non ricevono segnale (o comunque molto poco). Se una di esse è fuori asse si genera un segnale in entrambe le antenne e per esempio potrebbe far scattare un secondo interrupt che avvia una routine di riallienamento. A seconda della parte del diagramma di radiazione che viene eccitato, il segnale ha caratteristiche diverse (fase, ampiezza, polarizzazione....dipende dall'antenna). Viene preprocessato via sw o hw (phase detector, envelope detector....) e quindi restituisce coordinate sferiche sul riposozionamento. In questo modo le due antenne lavorano indipendentemente l'una dall'altra, senza conoscenze a priori e hanno un grosso range di acquisizione. L'idea non è mia. è quello che in realtà avviene con i radar che trackano gli aerei o gli shuttle. Hanno qualche dozzina di movimenti in più ma il concetto è lo stesso.
Come dicevo prima però sono ancora idee molto campate in aria che ho tirato fuori in questi giorni perchè il bootloader del mio micro se n'è andato alle cozze e finch'è non mi arriva un secondo micro con cui ripristinarlo sono a terra...
Per settare la rs232 ad un bit/rate così basso 10baud, devi sostituire il quarzo di arduino con uno da 8mhz, altrimenti la velocità minima è 16baud.
essendo asincrona contiene l'informazione del clock (10baud) quindi anche se hai 2 valori logici "1" non c'è problema , infatti solo quando l'intero byte è trasferito viene generato un interrupt che metterai in un buffer ram, per rilevare il fine messaggio puoi usare un carattere speciale ascii o un carattere di controllo (0-31) oppure un carattere esteso (128-255)
Per la collimazione non è piu semplice fare un bel supporto metallico robusto fissato con dei fisher sul muro? A meno che non venga un terremoto le case non si spostano
icio:
Per settare la rs232 ad un bit/rate così basso 10baud, devi sostituire il quarzo di arduino con uno da 8mhz, altrimenti la velocità minima è 16baud.
In che senso? a me interessa solo che un bit venga messo a 1 o a 0 a seconda che si abbia avuto un rise o un fall nel segnale. L'interrupt si verifica solo quando l'evento predisposto alla sua attivazione si verifica. Quindi cosa gliene importa al micro se questo evento si verifica 1 volta al secondo o 1 volta all'anno? O sbaglio?
essendo asincrona contiene l'informazione del clock (10baud) quindi anche se hai 2 valori logici "1" non c'è problema , infatti solo quando l'intero byte è trasferito viene generato un interrupt che metterai in un buffer ram,
Non ho capito: l'interrupt è asincrono, quindi che informazione di clock porta?
La routine con cui acquisisco i dati la strutturerei in questo modo: ad ogni bit ricevuto (posto che riesco a discriminare ogni singolo bit indipendentemente dalle sequenze più o meno lunghe di 0 e 1) pongo a 1 o 0 il bit corrispondente ad un contatore, aggiorno il contatore in modo che punti al bit successivo, eventualmente realloco il vedttore di byte in modo che contenga un byte in più se il contatore ha raggiunto il valore 8 o suo multiplo. attendo il prossimo interrupt.
Mi sono diemnticato di dire che ogni carattere (ne ho usati solo 84 tra maiusoli minuscoli e segni grafici o di punteggiatura) li ricodifico da 0 a 83 con 7 bit (il most significant bit lo uso come bit di parità). Quindi ogni carattere è trasmesso con un byte.
per rilevare il fine messaggio puoi usare un carattere speciale ascii o un carattere di controllo (0-31) oppure un carattere esteso (128-255)
La conversione byte--> carattere la vorrei fare non durante questa routine ma successivamente, quando l'utente si accorge che è arrivato un messaggio (un led per esempio o un segnale acustico) e decide o di cestinare il messaggio direttamente o di leggerlo. Quindi preferirei un altro modo più hardware per porre fine alla comunicazione. Stavo pensando a qualcosa tipo rilevare quanto tempo intercorre tra un interrupt e l'altro. In questo modo si potrebbe determinare sia di quanti bit è composta una lunga sequenza di bit uguali (ogni bit è lungo 0.1s) sia interrompere l'acquisizione se il tempo trascorso tra un interrupt e il successivo è maggiore di 8*bit_duration cioè non è stato trasmesso alcun carattere dall'ultimo interrupt verificatosi. Come concetto è simile a quanto dicevi tu ma in questo caso non devi perdere tempo a riconvertire durante la routine dell'interrupt i byte e confrontarli con un carattere di STOP. Alleggerisco un po il lavoro al micro (anche se con questo baud il micro è più che alleggerito me ne rendo conto)
Ho un solo dubbio/terribile verità...mi sembra che in un interrupt la funzione millis non funzioni. c'è qualche alternativa?
Il mio commento ha senso solo se utilizzerai l'USART di atmega328, se non intendi utilizzarlo allora non prendere in considerazione il mio commento
Licius1991 perché vuoi riinventare la ruota.
Usa l' interfaccia seriale. Piloti il laser con un transistor collegato a TX e colleghi il ricevitore con RX sul altro Arduino.
la Seriale ha un buffer e percui non devi reagire subito.
Ciao Uwe
uwefed:
Licius1991 perché vuoi riinventare la ruota ....
... ... o, se proprio devi reinventarla ... allora usa una codifica Manchester.
Buon divertimento ... XD
Guglielmo
Bella la codifica Manchester