lunedì 25 marzo 2019

Confronto consumi tra Arduino Uno ed Arduino Zero

Un confronto tra i consumi di una Arduino Uno ed una Arduino Zero, entrambe originali, entrambe alimentate via USB e con lo sketch Blink in esecuzione

Arduino Zero
In casi in cui il fattore consumo sia critico e' evidente come sia preferibile la scelta di una Arduino Zero
Arduino Uno

domenica 24 marzo 2019

Filtro EKF con GPS ed IMU su Android

Per continuare la sperimentazione sui filtri applicati ai sensori ho provato ad usare l' Extended Kalman Filter, un metodo matematico che permette la fusione di dati GPS e derivanti da IMU (per una descrizione abbastanza semplice del metodo si puo' andare qui,

Visto che la matematica non e' banale ho usato un progetto gia' fatto basato su Android. A questo link si trova la descrizione che usa la fusione di velocita' e dati geografici per ridurre le fluttuazioni del segnale GPS. Una libreria EKF per Arduino si trova a questo link basato su questo codice Matlab (l'esempio che usa EKF per GPS si trova nella sottodirectory /extras/c/ con dati di pseudorange, non direttamente lat/lon). Per una breve trattazione matematica invece qui

Un altro sito con una trattazione matematica semplice si trova qui

E' disponibile una app per Android a questo indirizzo GitHub


La prova e' stata effettuata mantenendo il sensore fermo e leggendo ad intervalli di tempo la distanza cumulata (ovvero la somma degli errori dei falsi movimenti registrati dal sensore).
Si evidenzia che il tempo di campionamento del GPS e del'accelerometro sono molto differenti e gli aggiornamento del filtro sono scalati sul sensore piu' lento

Distanza cumulata in metri
Come si vede il filtro impiega circa 100 secondi per stabilizzzarsi

Eliminando i primi due punti si ha una deriva media di 0.0015 m/sec, un dato incredibile considerando che con il solo GPS per ogni secondo la distanza e' di oltre 1 m

La scheda PixHawk contiene all'interno un algoritmo di fusione dei sensori per GPS ed IMU basato su EKF

venerdì 22 marzo 2019

Tre allegri ragazzi morti al Firenze Comics 21 Marzo 2019

Concerto dei Tre Allegri Ragazzi Morti all'interno di Firenze Comics, manifestazione creata dall'Accademia The Sign. Durante il concerto i ragazzi in sala erano invitati a disegnare ispirandosi alla musica (con selezione finale del migliore)


E questo e' come Federico ha visto il concerto (fuori concorso)


Snowden e frigorifero

Parlando con un amico e' saltato fuori il discorso del documentario su Edward Snowden Citizen Four e nel libro No Place to Hide ed il fatto che Snowden richiede ai giornalisti di mettere il cellulare nel forno a micro onde


A questo punto e' saltato fuori....ma funzionera' davvero?? Una fondo di verita' doveva esserci perche' comunque il forno a microonde deve avere una barriera per evitare l'emissione all'esterno di onde elettromagnetiche


E non sono stato il solo ad avere la stessa idea: su Youtube ci sono altre persone che hanno messo il cellulare nel microonde o nel frigorifero. .
I risultati......niente di niente...il cellulare continua a funzionare nel frigorifero e nel microonde

Andando a rileggere in originale il libro la frase originale e' :

Snowden immediately raised issues of security, asking whether I had a cell phone.
My phone only worked in Brazil, but Snowden nonetheless insisted that I remove the battery
or place it in the refrigerator of his minibar, which would at least muffle conversations,
making them more difficult to overhear. 

Quindi se ti ricordi male poi non prendere che le cose funzionino come ti ricordavi

mercoledì 20 marzo 2019

Mkr1010 Wake up da pin e risparmio energetico

Un sistema rapido per mettere in sleep mode una MKR1010 e risvegliarla tramite un interrupt sul pin 8 (che puo' essere simulato connettendo il pin 8 al GND)



-----------------------------------------------------------------
#include "ArduinoLowPower.h"

// Pin per wakeup
const int pin = 8;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(pin, INPUT_PULLUP);
  LowPower.attachInterruptWakeup(pin, funzione, CHANGE);
}

void loop() {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(500);
    digitalWrite(LED_BUILTIN, LOW);
    delay(500);
    LowPower.sleep();
}

void funzione {
// qui il codice da eseguire durante l'interrupt
}

Casio FP-200

Un nuovo piccolino si e' aggiunta alla collezione, Casio FP-200 direttamente dal 1982 con processore 80c85, in pratica un concorrente dell'M10

Prima di tutto una nota : attenzione all'alimentazione. Il jack laterale e' un input per un 6V 1A ma con il positivo sull'esterno e non sul pin centrale (c'e' anche una alimentazione con 4 batterie AA nascoste in cassetto sul lato superiore)


La macchina doveva essere funzionante ma all'accensione si presentava immancabilmente questo messaggio Memory illegal con 0 Bytes di memoria libera e premendo Invio gli errori SN Error, FC Error. La documentazione on line e' molto scarsa ma ho trovato il Service Manual ed un User Manual (in tedesco) da cui si legge che in questi casi si deve digitare RESET e premere Invio


 

I banchi di memoria sono sul retro coperti da un coperchio


Schermata di modalita' Basic e CETL (uno spreadsheet integrato)



Da notare la presenza di una porta Centronics


martedì 19 marzo 2019

Arduino MKR1010 ed allarme ricorsivo con RTCZero e risparmio energetico

Aggiornamento: questo post e' molto simile al precedente

Lo scopo di questo script e' generare ogni 10 secondi un allarme che risvegli dall standby la MKR1010 per effettuare una operazione e poi la riaddormenti in staandy


Una volta in Sleep Mode in consumo e' inferiore a 10 mA ovvero e' sotto la soglia di misura del mio strumento

Con questa configurazione il consumo e' di circa 14 mA

Attenzione : quando viene lanciato il programma il processore va in standby e viene disabilitata la porta USB. Per effettuare un nuovo upload si deve premere il tasto di reset per due volte in modo veloce
--------------------------------------------------------------------------
#include <RTCZero.h>

/* Create an rtc object */
RTCZero rtc;

/* Change these values to set the current initial time */
const byte seconds = 0;
const byte minutes = 00;
const byte hours = 17;

/* Change these values to set the current initial date */
const byte day = 17;
const byte month = 11;
const byte year = 15;

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  rtc.begin();

  rtc.setTime(hours, minutes, seconds);
  rtc.setDate(day, month, year);

  rtc.setAlarmTime(17, 00, 10);
  // Abilita l'allarme quando i secondi sono uguali alla soglia
  rtc.enableAlarm(rtc.MATCH_SS);
  rtc.attachInterrupt(alarmMatch);

  rtc.standbyMode();
}

void loop()
{
  rtc.standbyMode();    // Sleep until next alarm match
}

void alarmMatch()

  // INVERTE LO STATO DEL LED
  digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  // Setta il nuovo allarme 10 secondi nel futuro
  rtc.setAlarmSeconds((rtc.getSeconds() + 10) % 60);
}

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