E questo e' come Federico ha visto il concerto (fuori concorso)
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)
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
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
}
-----------------------------------------------------------------
#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
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);
}
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);
}
Complimentary filter con MPU6050 ed Arduino
Per terminare la serie, dopo Kalman e Madgwick un esempio di Complementary Filter
Dal punto di vistra computazionale e' il piu' semplice perche' si tratta di una sola formula
senza ricorsione e matrici
angle = 0.98 *(angle+gyro*dt) + 0.02*acc
(i parametri possono essere ottimizzati)
Una breve statistica (per raffronto con le prove precedenti)
Nr campioni : 20121
Media : -11.97
Range : 0.41
Std : 0.02
Varianza : 0.0005
Skewness :0.62
Il codice e' stato adattato da qui
-----------------------------------------------------------------------
// Complementary filter
#include <Wire.h>
int16_t axRaw, ayRaw, azRaw, gxRaw, gyRaw, gzRaw, temperature;
float pitch=0;
float pitchAcc;
float P_CompCoeff= 0.98;
unsigned long delta_t,old_time;
void ComplementaryFilter(int ax,int ay,int az,int gy,int gz) {
long squaresum=(long)ay*ay+(long)az*az;
delta_t = micros()- old_time;
old_time = micros();
pitch+=((-gy/32.8f)*(delta_t/1000000.0f));
pitchAcc =atan(ax/sqrt(squaresum))*RAD_TO_DEG;
pitch =P_CompCoeff*pitch + (1.0f-P_CompCoeff)*pitchAcc;
}
void setup() {
Serial.begin(115200);
//Inizio configurazione clock interno
Wire.beginTransmission(0x68);
Wire.write(0x6B);
Wire.write(0x00);
Wire.endTransmission();
// Inizializzazione Accelerometro intervallo di 8g Fattore di scala 4096
Wire.beginTransmission(0x68);
Wire.write(0x1C);
Wire.write(0x10);
Wire.endTransmission();
// Inizializzazione Gyro Intervallo di 500 deg/sec LSB (fattore di scala) 65.5 deg/s
Wire.beginTransmission(0x68);
Wire.write(0x1B);
Wire.write(0x08);
Wire.endTransmission();
old_time = micros();
}
void loop() {
Wire.beginTransmission(0x68);
Wire.write(0x3B);
Wire.endTransmission();
Wire.requestFrom(0x68, 14);
while (Wire.available() < 14);
axRaw = Wire.read() << 8 | Wire.read();
ayRaw = Wire.read() << 8 | Wire.read();
azRaw = Wire.read() << 8 | Wire.read();
temperature = Wire.read() << 8 | Wire.read();
gxRaw = Wire.read() << 8 | Wire.read();
gyRaw = Wire.read() << 8 | Wire.read();
gzRaw = Wire.read() << 8 | Wire.read();
/*Serial.print(axRaw/4096.0); Serial.print(",");
Serial.print(ayRaw/4096.0); Serial.print(",");
Serial.print(azRaw/4096.0); Serial.print(",");
Serial.print(gxRaw/131.0); Serial.print(",");
Serial.print(gyRaw/131.0); Serial.print(",");
Serial.println(gzRaw/131.0);*/
ComplementaryFilter(axRaw,ayRaw,azRaw,gyRaw,gzRaw);
Serial.println(pitch);
delay(2);
}
Dal punto di vistra computazionale e' il piu' semplice perche' si tratta di una sola formula
senza ricorsione e matrici
angle = 0.98 *(angle+gyro*dt) + 0.02*acc
(i parametri possono essere ottimizzati)
Una breve statistica (per raffronto con le prove precedenti)
Nr campioni : 20121
Media : -11.97
Range : 0.41
Std : 0.02
Varianza : 0.0005
Skewness :0.62
Il codice e' stato adattato da qui
-----------------------------------------------------------------------
// Complementary filter
#include <Wire.h>
int16_t axRaw, ayRaw, azRaw, gxRaw, gyRaw, gzRaw, temperature;
float pitch=0;
float pitchAcc;
float P_CompCoeff= 0.98;
unsigned long delta_t,old_time;
void ComplementaryFilter(int ax,int ay,int az,int gy,int gz) {
long squaresum=(long)ay*ay+(long)az*az;
delta_t = micros()- old_time;
old_time = micros();
pitch+=((-gy/32.8f)*(delta_t/1000000.0f));
pitchAcc =atan(ax/sqrt(squaresum))*RAD_TO_DEG;
pitch =P_CompCoeff*pitch + (1.0f-P_CompCoeff)*pitchAcc;
}
void setup() {
Serial.begin(115200);
//Inizio configurazione clock interno
Wire.beginTransmission(0x68);
Wire.write(0x6B);
Wire.write(0x00);
Wire.endTransmission();
// Inizializzazione Accelerometro intervallo di 8g Fattore di scala 4096
Wire.beginTransmission(0x68);
Wire.write(0x1C);
Wire.write(0x10);
Wire.endTransmission();
// Inizializzazione Gyro Intervallo di 500 deg/sec LSB (fattore di scala) 65.5 deg/s
Wire.beginTransmission(0x68);
Wire.write(0x1B);
Wire.write(0x08);
Wire.endTransmission();
old_time = micros();
}
void loop() {
Wire.beginTransmission(0x68);
Wire.write(0x3B);
Wire.endTransmission();
Wire.requestFrom(0x68, 14);
while (Wire.available() < 14);
axRaw = Wire.read() << 8 | Wire.read();
ayRaw = Wire.read() << 8 | Wire.read();
azRaw = Wire.read() << 8 | Wire.read();
temperature = Wire.read() << 8 | Wire.read();
gxRaw = Wire.read() << 8 | Wire.read();
gyRaw = Wire.read() << 8 | Wire.read();
gzRaw = Wire.read() << 8 | Wire.read();
/*Serial.print(axRaw/4096.0); Serial.print(",");
Serial.print(ayRaw/4096.0); Serial.print(",");
Serial.print(azRaw/4096.0); Serial.print(",");
Serial.print(gxRaw/131.0); Serial.print(",");
Serial.print(gyRaw/131.0); Serial.print(",");
Serial.println(gzRaw/131.0);*/
ComplementaryFilter(axRaw,ayRaw,azRaw,gyRaw,gzRaw);
Serial.println(pitch);
delay(2);
}
lunedì 18 marzo 2019
Filtro Madgwick con MPU6050 ed Arduino
Un test del filtro di Madgwick , un possibile sostituto per il filtro Kalman su processori meno potenti
La libreria per Arduino si trova a questo link
Da notare prima di tutte che :
1) la finestra di campionamento del filtro in Madgwick.begin aumenta o diminuisce la velocita' di convergenza dei dati
2) i dati devono essere inseriti nel filtro con le corrette unita' fisiche (m/sec2 e deg/sec) e non con i dati raw in uscita dal sensore
3) la libreria permette di inserire anche i dati di un sensore magnetico (che non e' pero' presente nella 6050)
Una prova veloce con il filtro Madgwick e MPU statica
Nr campioni : 73071
Media : 9.82
Range : 0.56
Std : 0.04
Varianza : 0.001
Skewness : -0.01
Nelle stesse condizioni ma con filtro Kalman
Nr campioni : 16568
Media : 9.84
Range : 0.44
Std : 0.04
Varianza : 0.001
Skewness : 0.05
Aggiornamento : per calcolare il valore della Temperatura in gradi Celsius si usa la formula
T = (lettura/340.0)+36.53
--------------------------------------------------------------------------------------------
#include <MadgwickAHRS.h>
#include <Wire.h>
int16_t axRaw, ayRaw, azRaw, gxRaw, gyRaw, gzRaw, temperature;
Madgwick MadgwickFilter;
void setup() {
Serial.begin(115200);
//Inizio configurazione clock interno
Wire.beginTransmission(0x68);
Wire.write(0x6B);
Wire.write(0x00);
Wire.endTransmission();
// Inizializzazione Accelerometro intervallo di 8g Fattore di scala 4096
Wire.beginTransmission(0x68);
Wire.write(0x1C);
Wire.write(0x10);
Wire.endTransmission();
// Inizializzazione Gyro Intervallo di 500 deg/sec LSB (fattore di scala) 65.5 deg/s
Wire.beginTransmission(0x68);
Wire.write(0x1B);
Wire.write(0x08);
Wire.endTransmission();
// Inizializzazione LPF (Filtro passa basso) 43 Hz
Wire.beginTransmission(0x68);
Wire.write(0x1A);
Wire.write(0x03);
Wire.endTransmission();
MadgwickFilter.begin(100); // 100 Hz
}
void loop() {
Wire.beginTransmission(0x68);
Wire.write(0x3B);
Wire.endTransmission();
Wire.requestFrom(0x68, 14);
while (Wire.available() < 14);
axRaw = Wire.read() << 8 | Wire.read();
ayRaw = Wire.read() << 8 | Wire.read();
azRaw = Wire.read() << 8 | Wire.read();
temperature = Wire.read() << 8 | Wire.read();
gxRaw = Wire.read() << 8 | Wire.read();
gyRaw = Wire.read() << 8 | Wire.read();
gzRaw = Wire.read() << 8 | Wire.read();
/*Serial.print(axRaw/4096.0); Serial.print(",");
Serial.print(ayRaw/4096.0); Serial.print(",");
Serial.print(azRaw/4096.0); Serial.print(",");
Serial.print(gxRaw/65.5); Serial.print(",");
Serial.print(gyRaw/65.5); Serial.print(",");
Serial.println(gzRaw/65.5);*/
MadgwickFilter.updateIMU(gxRaw/65.5,gyRaw/65.5,gzRaw/65.5,axRaw/4096.0,ayRaw/4096.0,azRaw/4096.0) ;
Serial.println(MadgwickFilter.getRoll());
//ROLL = MadgwickFilter.getRoll();
//PITCH = MadgwickFilter.getPitch();
//YAW = MadgwickFilter.getYaw();
delay(2);
}
La libreria per Arduino si trova a questo link
Da notare prima di tutte che :
1) la finestra di campionamento del filtro in Madgwick.begin aumenta o diminuisce la velocita' di convergenza dei dati
2) i dati devono essere inseriti nel filtro con le corrette unita' fisiche (m/sec2 e deg/sec) e non con i dati raw in uscita dal sensore
3) la libreria permette di inserire anche i dati di un sensore magnetico (che non e' pero' presente nella 6050)
Una prova veloce con il filtro Madgwick e MPU statica
Nr campioni : 73071
Media : 9.82
Range : 0.56
Std : 0.04
Varianza : 0.001
Skewness : -0.01
Nelle stesse condizioni ma con filtro Kalman
Nr campioni : 16568
Media : 9.84
Range : 0.44
Std : 0.04
Varianza : 0.001
Skewness : 0.05
Aggiornamento : per calcolare il valore della Temperatura in gradi Celsius si usa la formula
T = (lettura/340.0)+36.53
--------------------------------------------------------------------------------------------
#include <MadgwickAHRS.h>
#include <Wire.h>
int16_t axRaw, ayRaw, azRaw, gxRaw, gyRaw, gzRaw, temperature;
Madgwick MadgwickFilter;
void setup() {
Serial.begin(115200);
//Inizio configurazione clock interno
Wire.beginTransmission(0x68);
Wire.write(0x6B);
Wire.write(0x00);
Wire.endTransmission();
// Inizializzazione Accelerometro intervallo di 8g Fattore di scala 4096
Wire.beginTransmission(0x68);
Wire.write(0x1C);
Wire.write(0x10);
Wire.endTransmission();
// Inizializzazione Gyro Intervallo di 500 deg/sec LSB (fattore di scala) 65.5 deg/s
Wire.beginTransmission(0x68);
Wire.write(0x1B);
Wire.write(0x08);
Wire.endTransmission();
// Inizializzazione LPF (Filtro passa basso) 43 Hz
Wire.beginTransmission(0x68);
Wire.write(0x1A);
Wire.write(0x03);
Wire.endTransmission();
MadgwickFilter.begin(100); // 100 Hz
}
void loop() {
Wire.beginTransmission(0x68);
Wire.write(0x3B);
Wire.endTransmission();
Wire.requestFrom(0x68, 14);
while (Wire.available() < 14);
axRaw = Wire.read() << 8 | Wire.read();
ayRaw = Wire.read() << 8 | Wire.read();
azRaw = Wire.read() << 8 | Wire.read();
temperature = Wire.read() << 8 | Wire.read();
gxRaw = Wire.read() << 8 | Wire.read();
gyRaw = Wire.read() << 8 | Wire.read();
gzRaw = Wire.read() << 8 | Wire.read();
/*Serial.print(axRaw/4096.0); Serial.print(",");
Serial.print(ayRaw/4096.0); Serial.print(",");
Serial.print(azRaw/4096.0); Serial.print(",");
Serial.print(gxRaw/65.5); Serial.print(",");
Serial.print(gyRaw/65.5); Serial.print(",");
Serial.println(gzRaw/65.5);*/
MadgwickFilter.updateIMU(gxRaw/65.5,gyRaw/65.5,gzRaw/65.5,axRaw/4096.0,ayRaw/4096.0,azRaw/4096.0) ;
Serial.println(MadgwickFilter.getRoll());
//ROLL = MadgwickFilter.getRoll();
//PITCH = MadgwickFilter.getPitch();
//YAW = MadgwickFilter.getYaw();
delay(2);
}
Iscriviti a:
Post (Atom)
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...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...