mercoledì 3 agosto 2016

Arduino Sleep Mode

La possibilita' di "addormentare" il microcontrollore di Arduino e' documentata da anni con la possibilita' di avere 5 livelli di risparmio energetico ed essere risvegliata mediante interrupt.



Esiste una soluzione piu' lineare che e' quella di usare le JeeLib con la funzione Sleepy::loseSomeTime che corrisponde ad una funzione delay con il sistema in sonno profondo che si risveglia senza la necessita' di un interrupt esplicitp

in modo molto semplice lo sketch base e'
----------------------------
#include <JeeLib.h>

ISR(WDT_vect) { Sleepy::watchdogEvent(); }
void setup() {
}
 
void loop() {
  // fai qualcosa
  Sleepy::loseSomeTime(5000);    
}
----------------------------
L'unica accortezza con questa funzione e' il parametro e' in millisecondi ed il suo formato e' una word per cui al massimo si puo' arrivare a 65535 (ovvero circa 65 secondi). Per effettuare ritardi piu' lunghi si deve inserire la funzione in un ciclo del tipo

---------------------------
unsigned int minuti = 60;  //ritardo in minuti


for (byte i = 0; i < minuti; ++i)
 Sleepy::loseSomeTime(60000); //60.000 microsecondi = 1 minuto 
----------------------------

Visto che in fase di sleep e' disabilitato il clock dall'oscillatore al quarzo, il calcolo del tempo risulta non accurato (un utente riporta che loseSomeTime(60000) termina dopo 59 secondi)

Non sono riuscito a fare misure dirette (il mio misuratore Volt/Amp si ferma alla decina di mA) ma sembra che in fase di sleep il consumo del microcontrollore sia inferiore di circa un fattore 10 per scendere a qualche microA

Fauna Caldinese




Datalogger obsoleto

Mi sono stati regalati alcuni componenti elettronici tirati fuori da un armadio senza una precisa indicazione del loro utlizzo

Ad un esame attento degli integrati probabilmente si tratta di un datalogger. Sono presenti delle schede removibili al cui interno degli integrati M27128AF1, una UV EPROM (notare la finestrella scoperta) da 128 Kb per un totale di 4 moduli con un totale  512 Kb.




L'altra scheda e' ad occhio una vecchia ISA Full Size. Si notano un componente DM74LS38 (4 porte indipendenti di NAND), un P8255A-5 un integrato programmabile della Intel per funzione di IO per interfacciare un computer e un SN54LS245 ed un P8259A per la gestione programmabile degli interrupt












martedì 2 agosto 2016

Trova le differenze


1984 - Commodore 64


1995?? - Olivetti M24



2016 - Sala macchine


Debian 8 su PowerBook G4 Titanium

Con questo post si rientra alle origini del blog ovvero installare Debian su macchina obsolete
In questo caso c'e un dubbio. Ha una mela sullo schermo ma e' un Apple PowerBook od un PC piuttosto bruttino e molto standard ????
Si tratta di un modello particolarmente esotico (su Ebay al momento non sono presenti in vendita esemplari funzionanti) ovvero di un A1025 PowerBook G4 Titanium, un pezzo di storia risalente al 2002 nel periodo di passaggio da OS 9 a OS X


La macchina era destinata alla distruzione ed era priva dell'Hd (il precedente possessore si e' sincerata di rimuovere tutti i suoi dati)..fortunatamente ha lasciato pero' il flat cable per il montaggio dell'HD . Ha montati 256 MB di Ram (standard dell'epoca)

Scheda madre con il nuovo HD da 40 Gb

Accesso alla Ram sotto la tastiera
Le porte sono tutte nascoste da uno scomodissimo sportellino sul retro del computer



L'installazione di Debian 8 per PowerPC (non ci sono repository PowerPC su Debian.it quindi bisogna puntare su Debian.org) non ha mostrato nessun problema...la mancanza di Ram mette un po' in crisi XFCE ma con un po' di tuning si tratta di macchina ancora usabile


venerdì 15 luglio 2016

Servo Shield per Arduino

Avevo gia' provato ad usare i servo sia in modo diretto che tramite una scheda apposita. Questa volta devo realizzare un movimento PTZ per una webcam

Questa e' la volta dell'Adafruit Servo Shield (o meglio di un suo clone cinese)
La scheda, che funziona sul I2C, riesce a pilotare 16 canali da 0 a 15 a ciascuno dei quali corrisponde un servo



Arduino non eroga abbastanza tensione per cui e' necessario connettere una alimentazione esterna allo shield. Nel mio caso ho usato un modulo MB102 da breadboard collegato ad alimentatore da 2 A/12 V per pilotare due servo. Puo' essere anche necessario inserire un condensatore

Questa e' la pedinatura con il cavo giallo (dati) verso l'interno della scheda ed il cavo marrone (GND) sull'esterno)



Fatte le connessioni si deve scaricare la librerie apposita da Adafruit
Quiesto e' lo sketch che ho usato..si devono definire i valori minimi e massimi di rotazione (da riccercare per tentativi)


----------------------------------------------------
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);

#define SERVOMIN  200
#define SERVOMAX  400

void setup() {
  pwm.begin();
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
  yield();
}


void loop() {
  for (uint16_t pulselen1 = SERVOMIN; pulselen1 < SERVOMAX; pulselen1++) {
         pwm.setPWM(1, 0, pulselen1);
         delay(20);



        for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
              pwm.setPWM(0, 0, pulselen);
              delay(20);
              }
        delay(500);
        for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
              pwm.setPWM(0, 0, pulselen);
              delay(20);
              }
         delay(500);
  }

  for (uint16_t pulselen1 = SERVOMAX; pulselen1 > SERVOMIN; pulselen1--) {
         pwm.setPWM(1, 0, pulselen1);
         delay(20);



        for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
              pwm.setPWM(0, 0, pulselen);
              delay(20);
              }
        delay(500);
        for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
              pwm.setPWM(0, 0, pulselen);
              delay(20);
              }
         delay(500);
  }

}
----------------------------------------------------

lunedì 11 luglio 2016

Raggi cosmici e Android

Avevo sentito della possibilita' di usare il CCD della fotocamera dei comuni telefoni per individuare i raggi cosmici (o meglio i muoni che sono l'effetto dell'interazione del raggio cosmico con l'atmosfera.. quando un muone colpisce un CCD libera degli elettroni che sono misurabili dall'elettronica della fotocamera..per una descrizione piu' dettagliata si veda questo documento)

Questo effetto e' particolarmente visibile nelle fotografie riprese sulla stazione spaziole (i pixel, nella foto sottostante,  bruciati dal passaggio di raggio cosmico sono indicati dal cerchietto rosso).




Per vedere se riuscivo a catturare qualche evento ho usato l'applicazione DECO dell'Universita' del Winsconsin. Si tratta di un sistema di rilevazione distribuito che invia i dati ad un server centrale per discriminare i veri eventi dai falsi positivi



Il problema principale e' che il CCD, ovvero la sua matrice di sensori (ovvero i pixel), non sono tra loro calibrati e si deve quindi estrapolare dal rumore di fondo un eventuale evento.

Nonostante le bassa probabilita' di registrare un evento ho ottenuto nel giro di poche ore 6 eventi su  7770 osservazioni. O sono fortunato o c'e' qualcosa da capire.
Scaricando i dati dal sito a questo indirizzo queste sono le immagini relative ai miei eventi

Dati originali




Rielaborazione 
Rimettendo in ordine i dati all'interno di una GIF animata si vede chiaramente che alcuni punti a luminanza maggiori compaiono su diversi fotogrammi

Se si cerchiano di verde i pixel ad alta luminanza e si sottraggono dalle immagini delle acquisizioni reali si nota che, quelli indicati come eventi in realta' non sarebbero nient'altro che pixel fuori calibrazione all'interno della matrice dato che si trovano nella stessa posizione ed hanno una posizione reciproca uguale (e' altamente improbabile che un evento si ripeta nella stessa posizione della matrice nell'arco di un cosi' poco tempo, circa 3 ore di osservazione)

Visto che ho la fortuna di lavorare con colleghi che manipolano sostanze blandamente radioattive ed ho esposto il sensore della macchina fotografica ad un campione test di Cs137 in modo da forzare l'eccitazione dei pixel del CCD.

In questo modo, dal rumore di fondo, ogni tanto compaiono dei pixel piu' luminosi


Ancora una volta mettendo in fila le immagini si vede che il pixel piu' luminoso e' sempre il solito.





Non si tratta quindi dell'eccitazione derivante dal passaggio di una particella o radiazione ma di un errore del sensore della camera

In conclusione esperimento non riuscito
Per la cronaca ho provato a contattare gli sviluppatori di DECO sia sulla mailing list di Google che alla mail di riferimento ma non ho ottenuto risposta da circa 7 giorni. Peraltro le mie sono state le uniche registrate per 5 giorni consecutivi... non so quanto il progetto sia ancora attivo

Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...