mercoledì 24 agosto 2016

Distanziometro VL6180X

In un precedente post avevo cercato di usare un sensore ultrasonico per misurare una distanza con una approssimazione di 1 mm ma senza grandi risultati

Ho quindi provato il sensore VL6180X della ST montato da Pololu su un breakout, un sistema che e' sostanzialmente un piccolo lidar ad infrarossi molto piccolo ed economico (circa 10 euro) con connessione I2C che calcola il tempo di ritorno di un impulso luminoso. Il sensore ha un raggio di azione massimo di 20 cm ma funziona al meglio entro i 10 cm


Per interfacciarsi con Arduino si puo' usare la comoda libreria

Effettuando 1000 misure e mediando il dato e spostando il bersaglio di circa 1mm (non ho la possibilita' di verificare che gli spostamenti siano effettivamente di 1mm, sono piuttosto interessato a vedere il valore della standard deviation)

Nella seconda riga c'e' un errore sul valore della misura. il valore di St.Dev e' corretto

come si deve il valore della StDev e' circa la meta' di quella ottenuta con il sensore ultrasonico SR-04. Da varie esperienze si puo' dire che un valore di riferimento sulla standard deviation e' di 1.3 mm

Il vantaggio rispetto al SR-04 e' che si tratta di una misura sostanzialmente assoluta perche' e' indipendente dalla riflettanza del bersaglio e non risente dell'illuminazione ambientale perche' ha un altro sensore per la correzione

Di seguito lo sketch utilizzato
-------------------------------------------------------------------
#include <Wire.h>
#include <VL6180X.h>
#include "Statistic.h"


VL6180X sensor;
Statistic myStats;


void setup()
{
  Serial.begin(9600);
  Wire.begin();

  sensor.init();
  sensor.configureDefault();
  sensor.setTimeout(500);

  myStats.clear();
}

void loop()
{
  for (int t=0;t<1000;t++)
    {
    if (!sensor.timeoutOccurred())
          {
            myStats.add(sensor.readRangeSingleMillimeters());
            }
    }
   
    Serial.print("  Count: ");
    Serial.println(myStats.count());
    Serial.print("  Min: ");
    Serial.println(myStats.minimum(),4);
    Serial.print("  Max: ");
    Serial.println(myStats.maximum(),4);
    Serial.print("  Average: ");
    Serial.println(myStats.average(), 4);
    // uncomment in Statistic.h file to use stdev
    #ifdef STAT_USE_STDEV
    Serial.print("  pop stdev: ");
    Serial.println(myStats.pop_stdev(), 4);
    Serial.print("  unbias stdev: ");
    Serial.println(myStats.unbiased_stdev(), 4);
    #endif
    Serial.println("=====================================");
    myStats.clear();
    delay(10000);
}

Bluetooth non e' BluetoothLE

Ho dovuto imparare (letteralmente a mie spese) una lezione ovvero che, nonostante il mio nome simile, Bluetooth 2.0 e BluetoothLe (o Bluetooth 4.0) non sono la stessa cosa e non hanno compatibilita' diretta


Il problema deriva dal fatto che volevo convertire un progetto Arduino Bluetooth standard realizzato con un modulo HC-05 in qualcosa di piu' tascabile ed integrato e mi sono comprato una scheda Blend Micro ed una Genuino 101 (la prima come hardware definitivo, la seconda come piattaforma di prova)

Solo dopo ho scoperto che BT 2.0 non e' compatibile nemmeno a livello hardware con BT 4.0...di fatto i telefoni che hanno il doppio protocollo utilizzano di fatto due sistemi radio distinti ed il chip Nordic nRF8001 permette solo BTLe...in pratica dei soldi buttati ...almeno per questo progetto


martedì 23 agosto 2016

Game Boy Advance

Ho trovato ad un mercatino (per 10 euro) un Game Boy Advance, una consolle da gioco della Nintendo in produzione dal 2000 al 2008.



Nel prezzo era compreso una docking station con un pacco di batterie ricaricabili, un modulo per alimentare la consolle da corrente di rete, uno strano attrezzo per avere i cheat di alcuni giochi ed un gioco per Game Boy Bugs Bunny e Lola Bunny (il GB Advance riesce ad avere una compatibilita' hardware con il modello precedente Game Boy perche' monta un processore aggiuntivo Z80 solo per l'emulazione)


Non avevo mai preso in mano un GBA ed ho faticato un po' a capire che per accenderlo c'e' un pulsante fisico sul lato verso il giocatore. La cosa piu' strana dell'attrezzo e' che lo schermo non e' retroilluminato quindi e' praticamente impossibile vedere lo schermo se si trova il giusto angolo di riflessione della luce ambientale...molto scomodo












OBDSim

Per sviluppare una applicazione che si interfacci con il sistema OBD (On Board Diagnostic) non e' comodissimo lavorare per strada con il portatile ed a motore acceso. La soluzione piu' semplice e' usare il simulatore gratuito OBDSim



Ho provato a compilarlo ed eseguirlo su Linux...la compilazione e' terminata correttamente ma non sono riuscito a creare la seriale virtuale Bluetooth per collegare i dati con Torque (una applicazione Androird per visualizzare i dati provenienti da ODB) forse a causa di SELINUX (ero su Centos e devo ammettere che litigo ancora abbastanza con  SELINUX)

Su Windows 10 e Surface le cose sono andate decisamente meglio.
Per prima cosa si deve effettuare l'accoppiamento tra il telefono ed il computer e si crea una seriale virtuale (Impostazioni/Dispositivi/Bluetooth/Altre Opzioni Bluetooth/Porte COM/Aggiungi)

Si scarica il pacchetto gia' compilato e si lancia il comando

obdsim.exe -w COM4 -g gui_fltk

a questo punto spostando le lancette sull'interfaccia del computer si vede che anche Torque esegue la medesima modifica




lunedì 22 agosto 2016

Tempesta di fulmini su Emilia-Romagna

Ieri sera guardando in direzione Est, Nord Est era visibile una vera tempesta di fulmini con eventi a frequenza di circa 1 secondo


Mi stavo preparando ad una notte agitata perche' pensavo che il temporale fosse nell'area Barberino del Mugello-Scarperia ma con mia grande sorpresa il sito blitzortung mi ha mostrato che gli eventi erano tutti oltre la catena appenninica a circa 60 Km di distanza (in effetti non si udivano tuoni)



ed una animazione (ipnotica) che rende l'idea della frequenza degli eventi








Fake ADXL345

Mi sono interessato agli accelerometri ADXL345 (dopo un po' di esperienza con ADXL335) per la caratteristica di poter generare interrupt e quindi di poter usare il segnale come trigger per svegliare una Arduino in modalita' sleep.



Per risparmiare (un bel po') mi sono preso dei moduli su Aliexpress 
Usando la libreria ADXL345 di Adafruit i risultati sono i seguenti

------------------------------------
Sensor:       ADXL345
Driver Ver:   1
Unique ID:    12345
Max Value:    -156.91 m/s^2
Min Value:    156.91 m/s^2
Resolution:   0.04 m/s^2
------------------------------------

Data Rate:    100  Hz
Range:         +/- 16  g

X: -3.53  Y: 0.51  Z: 16.08  m/s^2
X: -3.53  Y: 0.51  Z: 16.16  m/s^2
X: -3.53  Y: 0.47  Z: 16.16  m/s^2
X: -3.53  Y: 0.51  Z: 16.12  m/s^2
---------------------------------------
Ovviamente c'e' qualcosa che non torna

Utilizzando lo script a questo link per visualizzare i dati raw si ha per

Z=g     X=-12;Y=-1;Z=51 (X=0g,Y=0g)
Z=-g   X=-11;Y=-5;Z=-17  (X=0g,Y=0g)

Y=g    X=-13; Y=-35; Z=23 (X=0g,Z=0g)
Y=-g  X=-12; Y=31;  Z=21 (X=0g,Z=0g)

X=g    X=-46;  Y= -2;  Z=16 (Z=0g,Y=0g)
X=-g  X=21;     Y=-3;  Z=17 (Z=0g,Y=0g)

Quindi
X varia da -46 a +21 con un valore centrale di 12
Y varia da -35 a +31 con un valore centrale circa -3
Z varia da -17 a +51 con un valore centrale di  circa 17

ci sono un paio di problemi
il primo e' chiaramente che ogni misura ha un offset sensibilmente fuori dallo zero sui tre assi e ciascuno con una propria retta di calibrazione (questo puo' essere corretto con il calcolo)
 Il secondo problema e' che i valori riportati hanno una dinamica troppo limitata (dovrebbero essere dell'ordine del centinaio di unita', non della decina) con un fondo scala a +/- 16g. Cio' comporta che il valore di conversione da digital number ad accelerazione e' completamente sbagliato (dovrebbe essere 1DN = 0.004g)

Come riportato anche da questo post, sono segnalati dei moduli ADXL345 su ecommerce cinesi che sono semplicemente dei falsi e lontani dalle prestazioni del componente originale BOSCH

giovedì 18 agosto 2016

BME280

Il BME280 e' un sensore barometrico/umidita'/pressione della BOSCH che ho comprato su Aliexpress (per risparmiare sulla versione di Adafruit ...che diciamo e' un po' piu' completa per il tipo di connessioni ..dubito che il mio sia la versione Bosch originale)

Il dispositivo ha una connessione a due cavi SDA/SCL I2C. Usando la libreria di Adafruit in qualunque modo la settassi non riuscivo ad avere la connessione. Pensando che il componente fosse rotto ho provato ad usare lo sketch I2C Scanner che ha immediatamente riconosciuto il BME280 all'indirizzo 0x76. (la versione Adafruit permette di scegliere l'indirizzo)




Frugando su Internet ho trovato una libreria alternativa ad Adafruit che ha funzionato al primo avvio.Dopo un paio di mesi che tenevo sul componente sul tavolo cercando una soluzione adesso e' finalmente usabile

--------------------------------------------
/***************************************************************************
  This is a library for the BME280 humidity, temperature & pressure sensor
  Designed specifically to work with the BME280 Breakout board
  ----> http://www.adafruit.com/products/2650
  This sketch only supports the I2C bus for connection.
 ***************************************************************************/

#include <Wire.h>
#include "cactus_io_BME280_I2C.h"

// Create the BME280 object
//BME280_I2C bme;              // I2C using default 0x77
BME280_I2C bme(0x76);  // I2C using address 0x76

void setup() {
  Serial.begin(9600);
  Serial.println("Bosch BME280 Barometric Pressure - Humidity - Temp Sensor | cactus.io");

  if (!bme.begin()) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }

  bme.setTempCal(-1);

  Serial.println("Pressure\tHumdity\t\tTemp\t\tTemp");

}

void loop() {

    bme.readSensor();

    Serial.print(bme.getPressure_MB()); Serial.print("\t\t");    // Pressure in millibars
    Serial.print(bme.getHumidity()); Serial.print("\t\t");
    Serial.print(bme.getTemperature_C()); Serial.print(" *C\t");
    Serial.print(bme.getTemperature_F()); Serial.println(" *F\t");

    // add a 2 second delay to slow down the output
    delay(2000);
}

FigSpec FS-60CL

A lavoro mi hanno rifilato questo sensore iperspettrale cinese (pushbroom 400-1000 nm con larghezza di banda di 0.5 nm compatibile con DJI M...