domenica 7 agosto 2016

GMail Notifier con Yun ed Edison

Per verificare se vi sono messaggi non letti in una casella postale di GMail non e' necessario utilizzare l'accesso POP3 od IMAP. Esiste infatti un servizio Atom che riporta tale informazione



Per fare cio' si usa la url
https://mail.google.com/mail/feed/atom/label

ma prima di fare cio' si deve andare nella configurazione della propria mailbox e configurare almeno una label e poi associare un filtro ad una determinata label

per esempio si puo' creare una label Lavoro e poi creare un filtro che in base ad un indirizzo mail associa l'etichetta Lavoro.

per recuperare il numero delle mail arrivate con la label Lavoro E NON APERTE si puo' usare il comando dove username e' la mail privata di @gmail.com e la password  e' quella dell'account

curl -u username:password "https://mail.google.com/mail/feed/atom/Lavoro" -k --silent |grep -o "<fullcount>[0-9]*</fullcount>" |grep -o "[0-9]*"

se si lancia il comanda si ha un errore di violazione. Questo perche' gli account di GMail sono particolarmente protetti. Per fare si' che il comando abbia buon fine si deve andare nel proprio account e cercare Consenti app meno sicure e settare On

Fatto cio' si puo' creare uno script che se il numero delle mail non lette con una determinata label e' maggiore di zero effettua una azione, diciamo azionare un rele' collegato al pin D12 a sua volta collegato per esempio ad una sirena o ad una luce a 12 V





YUN
In YUN si procede caricando lo script bash e poi, dall'interfaccia web, si abilita l'accesso REST senza password (OPEN)


Si carica quindi lo sketch Bridge dagli esempi e si lancia lo script sottostante

------------------------------
gmail=$(curl -u username:password "https://mail.google.com/mail/feed/atom/Lavoro" -k --silent |grep -o "<fullcount>[0-9]*</fullcount>" |grep -o "[0-9]*")
#echo $gmail
if [ "$gmail" -gt "0" ]; then
        then curl http://localhost/arduino/digital/12/1;
else
        then curl http://localhost/arduino/digital/12/0;
fi
------------------------------

Edison 
------------------------------
advertence=$(curl -u username:password "https://mail.google.com/mail/feed/atom/Lavoro" -k --silent |grep -o "<fullcount>[0-9]*</fullcount>" |grep -o "[0-9]*")
echo $advertence

if [ "$advertence" -gt "0" ]; then
        ./accendi.py
else
    ./spegni.py
fi
------------------------------

accendi.py
------------------------------
#!/usr/bin/env python

import mraa

x = mraa.Gpio(12)
x.dir(mraa.DIR_OUT)
x.write(1)
------------------------------

spegni.py
------------------------------
#!/usr/bin/env python

import mraa

x = mraa.Gpio(12)
x.dir(mraa.DIR_OUT)
x.write(0)
------------------------------

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);
  }

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

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...