martedì 1 luglio 2014

Trigger per fotografare i fulmini

È da un po' che avevo voglia di costruire un qualcosa per fotografare i fulmini, li ho sempre fotografati utilizzando la posa B della macchina fotografica, ma è una cosa che può andare bene ad esempio di notte, in pieno giorno è impensabile. Quindi mi sono documentato in rete e ho visto che esistono dei sistemi (anche commerciali) per poter fotografare i fulmini, l'idea è quella di misurare l'intensità luminosa con un fototransistor e scattare una foto quando questa varia. E qui sorge un dubbio: ce la fa la macchina a scattare? Un fulmine dura un istante!? In realtà, da quello che ho letto almeno, un fulmine ha una durata media di 200 millisecondi, la macchina fotografica (la mia almeno) ha un ritardo, da quando si da l'input di scattare, di 85 millisecondi, ora non so il ritardo esatto del circuito ma anche lì sono pochi millisecondi, quindi ci si riesce senza problemi.


Una foto scattata con il trigger durante il test

Un'altra cosa importante è il fototransistor, bisognerà sceglierne uno che lavora in uno spettro di luce in cui emette il fulmine, ora non so dirvi esattamente su che spettro emettono i fulmini, però la luce visibile al nostro occhio è tra i 380 e i 760 nanometri. Cercando su ebay sono riuscito a trovare un SFH309 (qui il datasheet) che ha uno spettro da 380 a 1180 nanometri, quindi considerando che i fulmini si vedono ad occhio nudo, anche il sensore li rileva.
Il fototransistor in questione è un NPN e, teoricamente, andrebbe montato così:

Non so spiegarvi il perché, ma facendo delle prove ho visto che è più sensibile se montato al contrario, ossia così:
In teoria non dovrebbe andare, ma va...
Veniamo al circuito, il circuito è questo
Praticamente il funzionamento è il seguente: il PIC legge il valore del transistor tramite l'A/D, se |V(t)-V(t-1)| > SOGLIA allora scatta una foto, dove V(t) è il valore del fotodiodo all'istante attuale, V(t-1) è il valore letto all'istante precedente e la SOGLIA è un valore pre-impostato.
Il led L1 segnala che è stato rilevato un fulmine, i pulsanti UP e DOWN servono ad incrementare/decrementare il valore di SOGLIA e L2 segnala la pressione di uno dei pulsanti.
Avendo l'A/D di questo PIC una risoluzione a 10 bit, abbiamo 1024 valori possibili, quindi una variazione di un punto nella soglia corrisponde circa ad una variazione di 4,9 millivolt nel photransistor. In realtà ponendo la soglia ad 1 il PIC fa scattare la macchina fotografica "a caso", diciamo che una buona soglia è su 8-10, poi potete fare delle prove per vedere qual è meglio.
Un'altra cosa che ho notato è che, a volte, non rileva fulmini un po' deboli (magari quelli belli tutti ramificati ma molto sottili), mi è stato consigliato di mettere più fotodiodi in parallelo per aumentare la sensibilità, però non ho ancora provato.
Di seguito è riportato il codice che serve a programmare il PIC
#include <htc.h>
#define abs(x) ((x) > 0 ? (x) : -(x))
#define SOGLIA 10

/* ---------------------- HEADER ---------------------- */
void initialize(void);
void delay_ms(unsigned int D);

/* --------------------- VARIABILI -------------------- */
int value, new_value, soglia;

/* ----------------------- MAIN ----------------------- */
void main(void){
   initialize();
   while(1){
      if(GPIO4 == 1){                        //Incrementa la soglia di sensibilità
         if(soglia < 100){
            soglia = soglia + 1;
         }
         GPIO5 = 0;
         GPIO1 = 1;
         delay_ms(2000);
      }
      else if(GPIO2 == 1){                  //Decrementa la soglia di sensibilità
         if(soglia > 1){
            soglia = soglia - 1;
         }
         GPIO5 = 0;
         GPIO1 = 1;
         delay_ms(2000);
      }
      else{                              //Ciclo normale
         GPIO1 = 0;
         if(GO_DONE == 0){                  //Aspetto che finisca la conversione
             new_value = (ADRESH<<8)|ADRESL;      //Leggo il valore iniziale
            if(abs(new_value-value)>soglia){
               GPIO5 = 1;
               delay_ms(1);
               GPIO5 = 0;
            }
            value = new_value;
            GPIO5 = 0;
            ADIF = 0;                     //Resetto il flag
            GO_DONE = 1;                  //Riavvio la conversione
         }
      }
   }
}

/* --------------------- FUNZIONI --------------------- */

/* Inizializzazione */
void initialize(void){
   TRISIO = 0b010101;               //Selezione ingressi
   GPIO = 0b000000;               //Uscite a 0

   CMCON = 0x00;                  //Disabilito comparatore
   ANSEL = 0x00;                  //Disabilito ADC

   GIE = 0;                     //Disabilito interrupt globali
   PEIE = 0;                     //Disabilito interrupt da periferiche
   ADIE = 0;                     //Disabilito interrupt AD
   OSCCAL = 0b111111;               //Dovrebbe impostare il clock interno alla frequenza massima

   ADCS2 = 0;                     //Seleziono velocità di conversione 8*Tosc
   ADCS1 = 0;
   ADCS0 = 1;
   
   ADFM = 1;                     //Seleziono che in ADESL metta il LSB e ADRESH il MSB
   VCFG = 0;                     //Seleziono voltaggio di reference Vcc, quindi il valore letto varia da 0 (V=0) a 1023 (V=Vcc)
   TRISIO0 = 1;                  //Imposto il canale 0 come ingresso
   ANS0 = 1;                     //Imposto il canale 0 come ingresso analogico
   CHS1 = 0;                     //Seleziono il canale 0 come ingresso per l'AD
   CHS0 = 0;
   
   soglia = SOGLIA;

   delay_ms(1);                  //Aspetto un attimo per inizializzazione
   ADON = 1;                     //Accendo AD
   delay_ms(1);                  //Aspetto un attimo per inizializzazione
   
   GO_DONE = 1;                  //Avvio lettura valore
   while(GO_DONE);                  //Aspetto che finisca la conversione
   value = (ADRESH<<8)|ADRESL;         //Leggo il valore iniziale
   ADIF = 0;                     //Resetto il flag
   GO_DONE = 1;                  //Riavvio la conversione
}

/* Delay */
void delay_ms(unsigned int D){
   unsigned int i, j;
   for(i=0; i<D; i++);
   for(j=0; j<1000; j++);
}

Qui potete trovare il PCB per realizzare il trigger.
Qui la maschera per posizionare i componenti, E$10 è un 7805, E$12 e E$13 sono due condensatori ceramici da 0.1uF e E$2 (quel cerchietto sopra alle piazzole dove va l'alimentazione) è un diodo tipo 1N4007 per evitare l'inversione di polarità nel caso ci si sbagli a collegare l'alimentazione. I pulsanti per la regolazione vanno messi tra P+ e P-. L'integrato in alto è l'LM358, mentre quello in basso è il PIC.

Io ho realizzato un involucro con l'attacco per la slitta del flash in modo da poterlo montare comodamente sulla fotocamera

Questo è un video in cui si vede il funzionamento del circuito, il test è stato fatto con un flash

Queste sono altre immagini catturate con il trigger

domenica 7 aprile 2013

Incubatrice Notival Covatutto 120

Ciao, in questo post vorrei trattare la riparazione di un'incubatrice Covatutto 120 (in realtà il sistema dovrebbe essere uguale anche per incubatrici covatutto anche di altri modelli).
Possiedo una vecchia Covatutto 120 che avrà, come minimo, una 30ina d'anni. L'anno scorso ha smesso di funzionare, praticamente il termostato andava solo ogni tanto e non manteneva la temperatura, la cosa mi parve strana e pensai ad un contatto elettrico. Allora l'ho aperta e ho trovato che il problema era dato da una saldatura del potenziometro che serve a regolare la temperatura che era crepata, l'ho rifatta e il problema si è risolto.
Giusto oggi il problema mi si è ripresentato, forse il problema è dato dalle vibrazioni che produce la ventola visto che la uso molto, altrimenti non saprei perché si dissalda, le saldature sono fatte bene...
Comunque ho sentito anche altre persone lamentare problemi simili su vecchie Covatutto, magari prima di andare a cambiare tutto il sistema di regolazione della temperatura conviene aprire e controllare le saldature sulla scheda, ad occhio possono anche sembrare a posto, però toccando i componenti si può vedere se la saldatura è crepata perché il piedino del componente si muove. Altrimenti, metodo più professionale, potete provare con un tester per vedere se passa corrente.

Veniamo quindi allo smontaggio.
Rimuovete le due brugole che si trovano nella parte superiore dell'incubatrice, poi tirate verso l'alto e la scatola contenente il termostato verrà via.


Dopo di ché svitate le due viti indicate nella foto e togliete la scheda dal suo contenitore.

Nel mio caso il componente incriminato è quello segnato dalla freccia rossa, ossia il potenziometro che regola l'isteresi del termostato.

Per risolvere il problema è sufficiente scaldare lo stagno sul piedino con il saldatore a stagno, in modo che ritorni ad unirsi, eventualmente potete aggiungere un po' di stagno nuovo per consolidare meglio il tutto. Nel mio caso si era dissaldato il piedino centrale del potenziometro.

Ora non resta che rimontare tutto eseguendo le operazioni all'indietro e il problema dovrebbe essere risolto.

Già che ci sono colgo l'occasione per spiegare come si tara la temperatura nel caso vi si stari il termostato.
Innanzi tutto la temperatura idonea è quando il termostato stacca (si spegne la lucina e si sente il tack del relé) a 100°F (che corrispondono a 37.7°C), ho letto che c'è chi dice che la temperatura idonea sia 102°F perché la temperatura reale delle uova è leggermente più bassa di quella segnata dal termostato, questo non lo so, però io non ho mai avuto nessun problema con la temperatura impostata a 100°F e ci ho schiuso di tutto (anatre, oche, pavoni, polli, quaglie).


Tornando alla taratura vera e propria, le prime volte andavo a tentoni smuovendo il potenziometro e non ci saltavo mai fuori... alla fine ho appreso che il metodo più semplice è il seguente:
con un cacciavite girate verso il + la vite che avete sulla scatola presente sopra all'incubatrice (che poi è il potenziometro di prima) in modo da far si che il termostato si starato verso l'alto, cioè che superi la temperatura corretta.

Poi aprite lo sportello dell'incubatrice in modo che la temperatura segnata dal termometro scenda sotto i 100°F, dopodiché richiudete il pannello e attendete che la temperatura salga, appena la temperatura raggiunge i 100°F girate immediatamente il potenziometro verso il - finché non staccherà la corrente (di nuovo si sente il tack del relé e si spegne il led rosso), dovete fermarvi proprio sul punto in cui il termostato stacca. Ora il termostato è correttamente tarato a 100°F.

giovedì 16 agosto 2012

Astrometry

In questo post vorrei trattare l'uso di astrometry per il solving plate delle immagini astronomiche.
Per chi non lo sapesse astrometry è un software che consente di sapere che oggetti vi sono all'interno di un'immagine astronomica e che fornisce anche le coordinate AR e DEC del centro del campo.
Essendo piuttosto veloce io lo utilizzo anche sul campo per centrare gli oggetti non visibili con pose relativamente brevi: scatto una foto di una decina di secondi ad alti ISO in modo da poter immortalare un po' di stelle e poi la passo ad astrometry che mi dice dov'è esattamente l'oggetto e mi da anche le coordinate, basandomi su quelle correggo tramite eqmod le coordinate dove sta puntando la montatura, in questo modo in pochissimo tempo riesco a centrare perfettamente il soggetto.

È possibile scaricare astrometry da qui, vengono forniti i sorgenti che devono essere compilati, sotto a windows sinceramente non ho provato a compilarli, ho preferito installare una virtual machine con sopra linux per semplicità, ora vi illustrerò i passaggi per installare astrometry.

Innanzi tutto per potere utilizzare astrometry oltre ai sorgenti servono anche gli indici che utilizza per risolvere l’immagine, per ottenere questi indici è necessario inviare una mail a code2 CHIOCCIOLA astrometry.net dicendo che si accettano le condizioni d'uso e che si vogliono appunto scaricare gli indici, dopo qualche giorno a seconda di quando qualcuno leggerà la mail vi verranno inviati i dati per lo scaricamento.

mail
Ecco un esempio di mail da inviare

Scaricate virtual box che serve per creare la virtual machine da questo sito e poi installatelo.











Dopo di ché vi servirà una distro di linux, io ho utilizzato ubuntu che mi pare molto user friendly, potete scaricarlo da qui, scaricate la versione 10.04 perché l'altra da problemi in compilazione, che sono risolvibili ma c'è da smanettare parecchio...

Ora bisognerà installare ubuntu, aprite virtual box, cliccate su nuova in alto a sinistra e vi si aprirà la procedura guidata per la creazione della macchina virtuale, cliccate su avanti, date un nome alla virtual machine, se ad esempio la chiamate ubuntu in automatico vi selezionerà il sistema operativo e la versione corrette. Fate click su avanti e selezionate quanta ram dare alla virtual machine (ho messo 1 Gb), create poi un nuovo disco fisso per la macchina virtuale, praticamente lasciate le impostazioni di default, al massimo potete aumentare la dimensione massima che potrà raggiungere l'hard disk.
















Adesso bisogna dire alla virtual machine di far bootare la distro di linux che avete scaricato, cliccate con il tasto destro sulla virtual machine, selezionate Impostazioni -> Archiviazione -> Controller IDE, poi cliccate sull'icona del disco in alto a destra e selezionate 'Scegli un file di disco virtuale', selezionate l'immagine ISO che avete scaricato, fate click su ok e, infine, avviate la macchina virtuale.
Appariranno vari messaggi, dite sempre 'Ok' (magari selezionate anche 'non mostrare più questo messaggio).








Fatta partire la macchina virtuale, dovrebbe avviarsi ubuntu che vi chiederà se volete provarlo o installarlo, selezionate la lingua che preferite nella colonna di sinistra e poi fate click su installa. Vi verranno richieste varie informazioni (fuso orario, lingua della tastiera, etc), poi informazioni su come formattare il disco (lasciatele così come sono) e i dati che volete come nome utente e password, alla fine cliccate su installa. Completata l'installazione vi dirà che dovrete riavviare ubuntu, poi vi dirà di rimuovere il disco, è sufficiente premere invio.







Ora bisognerà creare una cartella condivisa in modo da passare i file dal vostro pc alla macchina virtuale, spegnete ubuntu, poi cliccate col tasto destro sulla macchina virtuale, poi cliccate su impostazioni e su cartelle condivise. Tasto destro su 'cartelle della macchina' poi aggiungi nuova, selezionate la cartella che volete condividere, premete ok e fare partire ubuntu.







Adesso la cartella condivisa va configurata dalla parte di ubuntu. Bisogna installare le guest addition, cliccate su dispositivi 'installa guest additions', su ubuntu apparirà come se fosse stato inserito un disco, vi verrà richiesta la password inserita durante l'installazione, mettetela e date ok, verrano installate le guest additions.

Cliccate su Applicazioni -> Accessori -> Terminale.
Scrivete
id -u
e salvatevi il numero, questo è il vostro uid.
poi scrivete
id -g
questo è il vostro gid.
Lanciate il comando sudo gedit /etc/fstab verrà aperto un documento di testo, in fondo inserite questa riga sostituendo al posto di UID e GID i valori che avete trovato prima
foto /media/foto vboxsf rw,auto,gid=GID,uid=UID,exec 0 0
(al posto di 'foto' va il nome della vostra cartella condivisa), salvate e riavviate ubuntu. Adesso all'interno di /media dovreste avere la cartella condivisa foto.


Veniamo ora all'installazione di astrometry vera e propria. Andate sul sito astrometry.net -> download e scaricate il file astrometry.net-0.38.tar.bz2, mettetelo all'interno della vostra cartella condivisa, da ubuntu copiatelo sul desktop e poi scompattatelo.
Aprite il terminale ed eseguite questi comandi, servono per installare i file aggiuntivi necessari per il funzionamento di astrometry (comunque è tutto scritto nel README).
sudo apt-get install libcairo2-dev libnetpbm10-dev netpbm
sudo apt-get install libpng12-dev libjpeg-dev python-numpy
sudo apt-get install zlib1g-dev
Finiti di installare i pacchetti portatevi, sempre da shell, nella cartella dove avete scompattato astrometry, se è sul desktop sarà cd Scrivania/astrometry.net-0.38, poi eseguite:
sudo make
sudo make extra
sudo make install
E l'installazione di astrometry è completata, potete eliminare la cartella dal desktop.

Ora se provate a scrivere il comando solve-field all'interno del terminale noterete che vi dice che il comando non esiste, bisognerà includere il path di dove è stato installato astrometry all'interno del search path del sistema, per fare questo spostatevi con la shell nella vostra home
cd /home/nomeutente eseguite il comando gedit .bashrc e aggiungete in fondo al file PATH=$PATH:/usr/local/astrometry/bin/ riavviate il sistema, adesso se eseguite solve-field vedrete che funzionerà.

Adesso non resta che copiare i file di indice (estratti dagli archivi) all'interno della cartella /usr/local/astrometry/data/, potrebbe richiedere i privilegi di root accedere a quella cartella, quindi se non riuscite a copiare i file direttamente in modo grafico, potete farlo via shell con:
sudo mv /media/foto/nomefile /usr/local/astrometry/data/

Per usare astrometry portatevi via terminale nella cartella dove avete le foto
cd /media/foto/ e poi eseguite il comando
solve-field nomefoto
questo eseguirà una ricerca in tutti gli indici finché non ne trova uno che matcha, nel caso vogliate velocizzare la ricerca (e ve lo consiglio fortemente) potete specificare le dimensioni minime e massime del campo in cui ricercare tramite i parametri --scale-low e --scale-high, ad esempio se si ha un campo di circa 1.86 gradi si può fare
solve-field nomefoto --scale-low 1.85 --scale-high 1.87 --scale-units dw
è bene stare un po' più larghi.
Ecco un esempio di plate solving di un'immagine