Jumping Jack Flash weblog

COVID-19 – Misurare temperatura corporea con accuratezza di +/-0.1°C – Puntata 3

Posted in hardware by jumpjack on 25 maggio 2020

Per il “progetto termometro“, oltre ai già visti sensori “normali”, ne ho trovati altri che funzionano senza dover stare attaccati al corpo (“sensori a infrarossi senza contatto”), probabilmente usati nei termometri “a pistola”.

Potrebbero essere un’alternativa o un complemento ai sensori a contatto, viato che dalle prove che ho ftatto tenendo il sensore al polso, risulta che non supera mai i 35.0, raggiungendo spesso solo i 34.5, cosa che probabilmente è dovuta a questo:

Evidentemente c’è un motivo se i termometri vanno messi in bocca o sotto l’ascella…

Però mettendo un sensore remoto al polso sarebbe comunque possibile misurarsi la temperatura al volo, e creare comunque un log di tutte le misurazioni effettuate. Oppure si potrebbe aggiungere genericamente 1.0°-1.5°C alla misurazione effettuata sul polso, anche se la cosa sarebbe molto empirica.

Sensori senza contatto

 

  • IrThermo 2 click (TMP007)

Varianti di MLX90614 (+/-0.5°C)

 

  • NCIR – specificamente progettato per M5StickC

 

  • Banggood, 11,00 euroBundle sensore NCIR MLX90614 + M5StickC
  • Amazon,  36,00 euro

Varianti di MLX90615 (+/-0.2°C)

 

 


Termocamere


Sensori a contatto

 

 

 


Definiti “remoti” ma solo perchè leggono sensori remoti A FILO; sono inoltre a bassa acuratezza (+/-1°C):

Microchip (datasheet):

  • EMC1812
  • EMC1813
  • EMC1814
  • EMC1815
  • EMC1833

Board per leggere i suddetti sensori: MIKROE-3685

 

Board MIKROE-3636

 

MIKROE-3600

COVID-19 – Misurare temperatura corporea con accuratezza di +/-0.1°C – puntata 2

Posted in hardware by jumpjack on 22 maggio 2020

— IN AGGIORNAMENTO — PROGETTO IN CORSO —

E’ arrivato l’ultimo componente hardware necessario per il progetto: il ClosedCube breakout SHT35-D. Datasheet.

 

Quello che serve adesso per realizzare il progetto completo è:

Hardware

  • nuovo supporto stampato in 3d per il cinturino
    • ne ho stampato uno provvisorio tanto per provare, e funziona, ma non avendo tra  le mani la schedina SHT35 non potevo progettare quello definitivo, che contiene sia l’m5stickC che il sensore
    • FATTO; da mettere online il file 3d –>è sbagliato perchè l’ho predisposto per avere i pin dell’SHT sul lato dell’m5stickC col connettore lungo, ma i pin SDA/SCL sono sul connettore GROVE!
    • testare fissaggio del cinturino con perni in fil di ferro
  • connessione hardware tra sensore e m5stickC

M5stickC pinout

24/5/2020: FATTO. Connessione effettuata, sketch di prova funziona: vedo valori di temperatura e umidità sulla seriale; però ho dovuto cambiare da 0x44 a 0x45 l’indirizzo I2C del sorgente di esempio.

In compenso non vengono mostrati correttamente i valori float sul display, nonostante la copiatura dall’esempio “TFT_Float_Test.ino”

    • Esiste comunuque una libreria che permette di usare come pin I2C qualunque coppia di pin
    • L’alimentazione dell’SHT35 può essere sia 3.3V che  5V (max 5.5V), e la Vout della porta GROVE è 5V.
  • Altri pin utili:
    ESP32 GPIO10 GPIO9 GPIO37 GPIO39
    RED LED LED pin
    IR transmitter Transmitter pin
    BUTTON A Button pin
    BUTTON B Button pin
  • isolamento elettrico dei contatti del sensore dal sudore della pelle
  • verificare presenza di cicalino a bordo per allarme acustico in caso di temperatura pericolosa –> no, serve esterno

Software

Il software dovrà avere una serie di componenti, alcuni accessori, altri indispensabili; ovviamente non reinventerò la ruota ma andrò scopiazzando di qua e di là cosa c’è di disponibile. Chiaramente la prima cosa da fare è visualizzare la temperatura, anche senza ora attuale; il resto verrà dopo.

  • scansione dispositivi I2C (anche le periferiche di bordo sono su I2C, su pin vari) LINK
  • lettura e visualizzazione dati sensore SHT35
    • c’è una libreria specifica ClosedCube e una Adafruit, verificare
    • pare che nella libresria ClosedCube esista un modo per leggere la temperatura “periodicamente”, verificare se consuma di meno –> è una caratteristica del sensore, ma consuma 30 volte più corrente della lettura singola (70 uA invece che 2 uA)
    • Nella libreria ClosedCube il risultato della lettura del sensore tramite le varie funzioni possibili è di questo tipo:
      struct SHT31D {
      float t;
      float rh;
      SHT31D_ErrorCode error;
      };
      Quindi bisogna:

      • Definire la variabile:
        • SHT31D   risultato;
      • Assegnare alla variabile il valore della lettura effettuato tramite una delle 3 funzioni:
        1. readTempAndHumidity(repeatability, mode, timeout);
          • E’ la più generica: permette di scegliere una delle altre due in base al parametro “mode”.
        2. readTempAndHumidityClockStretch(repeatability);
        3. readTempAndHumidityPolling(repeatability, timeout);
      • Non sono riuscito a trovare nessuna info in merito alla differenza dei due metodi, quindi userei quello più semplice, con singolo parametro, tenendo in considerazione l’unica cosa che ho capito: più è basso il valore di repeatability, minori son i consumi; e noi dobbiamo tenere i consumi al minimo per prolungare la durata della batteria. Useremo quindi la funzione 2, con parametro pari alla costante SHT3XD_REPEATABILITY_LOW.
      • Utilizzare di temperatura contenuto nella variabile-risultato:
        • risultato.t
  • impostazione ora attuale
    • ho scoperto che è possibile impostare l’ora del PC sull’ESP32 al momento del caricamento dello sketch; questa riga memorizza in una variabile data e ora attuale:
      const char compile_date[] = __DATE__ ” ” __TIME__;
      risultato: May 22 2020 16:55:46  –> verificare configurabilità formato
    • l’orario andrà in qualche modo memorizzato nell’RTC di bordo
    • l’istruzione setTime(8,29,0,1,1,11) è valida solo per Arduino/AVR o anche per ESP32/M5stickC?
    • ho trovato diversi sorgenti, sia per orologi digitali che analogici; molti si basano su millis(), ma sarebbe meglio basarsi sull’RTC incorporato; pare che abbia una pessima precisione (5%, quindi un minuto perso ogni 3 ore!) se basato su riferimento interno, ma ottima se basato su un cristallo “esterno”: da verificare quanto/come “esterno. Discussione, discussione
    • esempio ufficiale RTC su M5stickC
    • si può usare server NTP er impostare l’ora; ci sono vari sorgenti, ma bisogna prima riuscire a collegarsi al WiFi! E al momento il mio m5stickC non si collega… Impostare oratio NTP con una riga singola: configTime(0, 0, pool.ntp.org);
  • visualizzazione ora/data: FATTO
  • visualizzazione livello batteria
  • impostazione deepsleep: la batteria deve durare almeno 24 ore, chissà se è possibile.
    • verificare i consumi in deepsleep dell’m5stickC –> 10uA (solo RTC e RTC memory); è presente anche un ULP (Ultra Low Power) processor, che consuma appena 100 uA o 150 uA durante il deepsleep, secondo come viene impostato, ma va programmato separatamente dallo sketch principale.
    • verificare i consumi in deepsleep dell’SHT35 –> 2 uA in attesa, 1500uA in misurazione, durata da 4ms a 15ms a seconda della ripetibilità impostata
    • Considerando i dati sopra, con un consumo di 12uA e una batteria da 80.000 uAh si avrebbe un’autonomia teorica di 6666 ore. Ovviamente però ogni tanto il dispositivo si accende, vuoi per leggere i valori e salvarli, vuoi perchè consultato dall’utente, quindi i consumi reali sono da valutare. Poichè l’M5stickC è dotato di appositi comandi per leggere la quantità di corrente assorbita in un dato momento grazie al power manager di bordo AXP192, volendo è possibile salvare questi dati durante l’utilizzo e fare una stima dell’autonomia reale possibile.
  • logging dei dati in memoria FLASH tramite SPIFFS; esempio1
  • visualizzazione grafico temperatura delle ultime X ore direttamente sul display; bisogna tracciare gli ultimi “n” valori; il display è 80×160. la temperatura può oscillare tra 36.0 e 38.0, quindi basterebbe una striscia alta 20 pixel. drawPixel(int16_t x, int16_t y, [uint16_t color]);
  • visualizzazione alert visivo in caso di temperatura pericolosa: usare immagini in formato XBM (BMP monocromatiche in formato testuale/esadecimale)
Tagged with: , , ,

COVID-19 – Misurare temperatura corporea con accuratezza di +/-0.1°C

Posted in hardware by jumpjack on 15 maggio 2020

Ai tempi del COVID-19, per molte settimane – e speriamo non mesi – ci verrà misurata la temperatura in continuazione: andando a lavoro, entrando nei locali, andando dal barbiere; per ora infatti è l’unico modo istantaneo per verificare, anche se molto a grandi linee, se si è infetti o no.

Potrebbe allora essere comodo potersi misurare da sè la temperatura corporea, senza dover stare ogni volta 5 minuti col termometro sotto l’ascella, o senza spendere 50 euro per un termometro a infrarossi; senza contare che sarebbe molto utile poter avere un grafico dell’andamento della temperatura nella giornata.

Stanno iniziando a comparire sul mercato i primi braccialetti fitness o smartwatch con termometro incorporato, ma per ora solo in spedizione dalla Cina, e comunque nessuno fornisce il grado di accuratezza della misurazione (tranne questo, che dichiara 0.1°C); e considerando, ad esempio, che per esempio che il termometro di una tipica stazione meteo ha un’accuratezza dichiarata di +/-2°C, significa che se usassimo quel termometro per misurarci la febbre, e avessimo 37.5°, quel termometro potrebbe dire un qualunque valore fra 35.5° (in ipotermia) o 39.5° (con le pezze in fronte)…

Serve quindi una misurazione molto più precisa, con uno scarto di pochi decimi di grado.

Ecco allora un elenco di alcuni sensori di temperatura ad alta accuratezza: anche se, usandoli per il fai-da-te, non possono essere usati come presidio medico per decidere se e come curarsi, possono comunque dare un valido indizio per decidere se poi farsi una misurazione seria con uno strumento certificato.

Ecco dunque la lista:

  1. SHT35: +/-0.1°C (Sensirion) (temperatura/umidità)
  2. STS35: +/-0.1°C (Sensirion) (solo temperatura)
  3. SHT85: +/-0.1°C (Sensirion) (temperatura/umidità)
  4. Si7051: +/-0.1°C (Silicon Labs)
  5. MAX30205: +/-0.1°C (Maxim Integrated)
  6. MAX30208: +/-0.1°C (Maxim Integrated)
  7. MCP9808: +/-0.1°C  (Microchip) (solo temperatura)

 

Altri  meno accurati:

 

Sono tutti sensori davvero minuscoli, grandi quanto l’unghia del mignolo, quindi impossibili da gestire con un saldatore classico: servirebbe un fornetto per saldature SMD. Per fortuna però per molti esistono delle versioni già saldate su breadboard; alcune sono molto rare e disponibili solo in ordine dalla cina, ma altre sono piuttosto diffuse e si trovano su ebay Italia o addirittura su Amazon, alcuni persino con spedizione gratuita con Prime da un giorno all’altro.

E’ importante quindi saper distinguere quale è il migliore. I dati di accuratezza  sono espressi come un singolo numero, ma un modo più preciso per definire l’accuratezza è un grafico; nei datasheet di questi oggetti sono presenti grafici come questo, che indicano quant’è il massimo possibile errore di misurazione (asse Y, a sinistra) alle varie temperature (asse X, in basso):

Questo grafico dice ad esempio che per questo specifico componenbte “tipicamente”, per misurazioni tra +20°C e +60°C, lo scarto tra temperatura misurata e reale è di 0.1°C, mentre quello “massimo” è di 0.3°C.

Prendendo i grafici di tutti i vari sensori e raggruppandoli tutti in un’unica figura, ho ottenuto quanto segue:

Si nota chiaramente come tutti i sensori siano più accurati nella zona di interesse, che è quella della temperatura del corpo umano, la quale può variare fra 35 e 43 gradi, dove ovviamente i valori estremi si hanno solo in caso di gravissima malattia: la temperatura tipica di un essere umano in salute è infatti di circa 37°C. “Circa” perchè la temperatura può variare per vari motivi:

In base al punto di misurazione:

In base al momento della misurazione:

Persino in base all’umore:

 

Questa tabella indica alcune temperature di riferimento, da cui si evince perchè bisogna allertarsi, in tempi di pandemia mondiale da coronavirus, se la temperatura sale sopra i 37.5°C:

Scelta del sensore

Qual è il sensore migliore tra quelli elencati prima?

Ovviamente quello che ha deviazione/errore più basso in prossimità dei 37 gradi, quindi quelli della prima lista, con accuratezza di 0.1°C; poi però bisogna trovare:

  1. quello più facilmente reperibile in Italia
  2. il meno costoso
  3. quello più pratico

Per il punto 1: scartiamo quindi quelli su Aliexpress e simili, che probabilmente, ordinati a maggio 2020, arriverebbero dopo che sarà stato inventato il vaccino… Orientiamoci quindi su siti italiani, su Ebay con spedizione dall’Europa, e su Amazon.

Per il punto 2: se c’è su Amazon, vediamo se è disponibile con spedizione gratuita.

Per il punto 3: verifichiamo se ci sono già librerie disponibili per Arduino, o addirittura kit di test già pronti.

 

Per quanto riguarda Amazon Prime, la scelta è molto limitata: ci sono solo SHT35 e Si7051. Su Ebay la scelta è un po’ più ampia: SHT35, SHT85, Si7051,  MAX30205.

Per quanto riguarda le librerie Arduino, ce ne sono per i Sensirion SHT3x e per i Silicon Labs Si7051 dalla Adafruit (o anche per i Silicon Labs Si7013, Si7020 e Si7021, che però hanno accuratezza troppo bassa (+/-0.5°C)).

Schede preassemblate

SHT31 Smart Gadget

Il Sensirion SHT35 ha un punto a suo favore in più: esiste un modulo già assemblato dotato di batteria tampone, circuito di lettura del sensore e schermo LCD, cose che altrimenti dovremmo aggiungere noi a mano, assemblare e testare: si chiama SHT31 Smart Gadget:

Clicca qui per una foto a risoluzione esagerata: link

Lo Smart Gadget è disponibile su:

Come è facile intuire dal nome, non è basato sull’SHT35 da +/-0.1°C ma sull’SHT31 da +/-0.2°C: ci si può accontentare di 0.2, oppure si può pensare di sostituire il sensore SHT31 con un altro: la scheda infatti espone i 4 pin a cui è collegato il sensore tramite protocollo I2C (Vcc, GND, SDA, SCL), che quindi può essere staccato e facilmente sostituito, a livello di hardware; per quanto riguarda la compatibilità SW, dal momento che le librerie arduino sono dichiarate come compatibili per tutti i modelli SHT3x, è ipotizzabile che anche questa scheda già pronta sia compatibile con tutti gli SHT3x. Naturalmente per esserne sicuri al 100%, anche qui bisognerebbe leggere in dettaglio nel datasheet i registri e i protocolli.

Importante anche l’indirizzo I2C assegnato: per certe board che montano SHT31 può essere impostato su 0x44 (default) o 0x45 a seconda di come è connesso il pin ADR (ADDRESS). Altre board hanno indirizzo fisso non modificabile, quindi non sono adatte:

Sullo smart gadget l’SHT31 ha il pin ADDR collegato all’alimentazione, quindi, da datasheet, l‘indirizzo è impostato su 0x45.

Lo Smart gadget è dotato di memoria onboard e capacità di logging, e sono disponibili due app della Sensirion stessa per scaricare i dati e mostrarli sul cellulare Android o iOS (qui l’app Android precedente e ormai abbandonata).

Il sensore esterno SHT35 si trova già montato su basetta con connettore GROVE, preimpostata su indirizzo 0x45, quindi direttamente collegabile al gadget.

L’immagine che segue mostra il retro di una schedaGrove SHT35, evidenziando le piazzole utilizzabili per modificare l’indirizzo dal default 0x45 a 0x44:

Affinchè una scheda SHT35 funzioni su uno Smart Gadget SHT31, deve essere impostata sullo stesso indirizzo che l’SHT31 ha sulla scheda (0x45); in caso di errore non si rompe niente, ma il sensore non verrà visto dalla scheda.

E’ disponibile, tra parentesi, anche una libreria Arduino per il sensore STS35, sempre della Sensirion, sempre da +/-0.1°C, ma solo sensore di temperatura (mentre l’SHT35 contiene anche un sensore di umidità ambientale, in realtà inutile per la nostra applicazione).

Sempre su RS è disponibile anche una board in formato “Grove” contenente il sensore SHT35 (disponibile da giugno) a 15,00 euro o su robot-domestici a 26,00 euro.

Questo è il manuale dello Smart Gadget, questa la pagina ufficiale

Esaminando i file gerber dello SmartGadget, è spossibile individuare come e a cosa sono connessi i vari pin, e scoprire che dal lato opposto della batteria c’è proprio una predisposizione per collegare un sensore esterno:

 

Basta quindi tagliare le piste di rame vicino al sensore, saldare il nuovo sensore alle piazzole libere, e ottenere quindi (in teoria) uno Smart gadget con accuratezza di +/-0.1°C anzichè 0.3°C; la rimozione dell’SHT31 è in ogni caso necessaria perchè è montato dalla parte del display, mentre è necessario che sia attaccato al polso per leggere correttamente la temperatura, ma una volta rimosso potrebbe risultare difficile, se non impossibile, risaldare i fili ai vicinissimi terminali del sensore, o ai forellini sul PCB per cui passano le piste di rame.

Scheda M5stickC

Una possibile alternativa quasi-già-pronta, essendo disponibili le librerie arduino, è l’utilizzo di una board M5StickC (da non confondere con M5Stack):

Anche se non dispone di un sensore di temperatura integrato, questo dispositivo è dotato di:

  • Microcontrollore ESP32 dualcore a 240 MHz con 4 Mbyte di RAM
  • Bluetooth
  • Wifi
  • Schermo OLED
  • Connettore GROVE (adatto per sensore esterno Grove SHT35)
  • Pulsanti
  • Accelerometro
  • Giroscopio
  • Trasmettitore IR
  • Segnalatore acustico
  • Predisposizione per attacco a cinturino
  • Batteria da 95 mAh
  • Connettore USB

La quantità di progetti realizzabili con un simile dispositivo è enorme, per cui, una volta terminata la necessità di misurarsi la temperatura tutto il giorno, può essere riciclato per altri usi.

E’ disponibile su Amazon Prime (B07QRQ4MP8) a 25 euro inclusivo di cinturino:

Naturalmente in questo caso il SW sarà tutto da scrivere, ma essendo l’ESP32 programmabile tramite Arduino, si tratta solo di usare le già citate librerie Arduino adatte per il proprio sensore e trovare un sorgente di esempio da cui partire.

Per quanto riguarda il cinturino, se si possiede già un M5tickC senza cinturino, o si vuole comprarlo senza per risparmare, usando un vecchio cinturino, qui c’è il modello 3d dell’involucro dell’M5stickC, su cui lavorare per crearsi manualmente l’aggancio in plastica per il cinturino:

 

Fai da te: Arduino/ESP8266/ESP32

Librerie

Sorgenti di esempio:

Questo sorgente di esempio si limita a stampare la temperatura sul monitor seriale; chiaramente l’applicativo finale dovrà invece stamparlo su un display:

#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"

Adafruit_SHT31 sht31 = Adafruit_SHT31();

void setup() {
  Serial.begin(9600);
  if (! sht31.begin(0x44)) { // Qui c'è l'indirizzo I2C del sensore; per alcuni è fisso a 0x40, per altri si può modificare tra 0x44 e 0x45
    Serial.println("*ERR01* Sensore non presente a indirizzo 0x44");
    while (1) delay(1);
  }
}

void loop() {
  float t = sht31.readTemperature();

  if (! isnan(t)) {
    Serial.print("Temp *C = "); Serial.println(t);
  } else {
     Serial.println("*ERR02* Lettura errata");
  }

  Serial.println();
  delay(1000);
}

 

 

Sensori su breadboard

Per SmartGadget (serve indirizzo 0x45):

 

Appunti su programmazione ATTINY85 su piattaforma Digistump Digispark

Posted in arduino, hardware by jumpjack on 25 ottobre 2019

L’attiny85 è un minuscolo microcontrollore con soli 6 pin con una minuscola memoria di 8 KB e una frequenza di lavoro di 16MHz, ma per alcuni progetti può benissimo sostituire una ben più costosa e ingombrante Arduino o Raspberry; per esempio per leggere semplicemente i valori di un dispositivo con interfaccia I2C.

L’unico problema è superare alcuni “scogli” per riuscire a programmarla tramite il normale IDE di Arduino; in giro c’è una moltpelicità di guide che spiegano trucchi e schemi elettrici vari per riuscire a programmare il modulo Digispark con l’arduino IDE usando una Arduino Uno come “ponte”…. ma sono obsoleti, non ce n’è più bisogno, ora si può semplicemente collegare il dispositivo al PC e caricarci direttamente lo sketch. Però bisogna seguire alcuni accorgimenti:

  1. Il problema dei driver
  2. Il problema del LED
  3. Il problema del mancato riconoscimento USB (suono continuo di connessione/disconnessione)
  4. Il problema della porta seriale

I driver

Servono dei driver specifici, che potrebbero non venire installati automaticamente quando si installa Arduino IDE, quindi ecco il link per scaricarli

Il LED

Esistono diverse varianti della board (rev2, rev3, rev4,…); sono identiche tranne per il pin a cui è collegato il LED: a volte 0, a volte 1; se è collegato al pin 0, non è possibile comunicare con dispositivi I2C, quindi va scollegato.

Mancato riconoscimento USB (suono continuo di connessione/disconnessione)

Connettendo il dispositivo a una porta USB, si sente inizialmente il classico suono di disconnessione, ma dopo 5 secondi si sente quello di disconnessione, poi di nuovo quello di connessione, e così via all’infinito.

Il problema è che… va bene così, è così che deve funzionare, non è rotto. E’ solo che va programmato in modo diverso da Arduino: prima di connettere il Digispark, bisogna avviare l’upload dello sketch, e solo dopo, quando è l’IDE stesso a chiederlo, bisogna collegare il dispositivo, e lo sketch verrà caricato. E una volta caricato il primo sketch, non ci sarà più il problema di connessione/disconnessione continua.

Dal manuale ufficiale:

You do not need to plug in your Digispark before invoking upload. Hit the upload button. The bottom status box will now ask you to plug in your Digispark – at this point you need to plug it in – or unplug and replug it. You’ll see the upload progress and then it will immediately run your code on the Digispark. If you unplug the Digispark and plug it back in or attach it to another power source there will be a delay of 5 seconds before the code you programmed will run. This 5 second delay is the Digispark Pro checking to see if you are trying to program it.

La porta seriale

Il problema della porta seriale… è che non c’è porta seriale, quindi il comando Serial.print() non è implementato e il Serial Monitor dell’IDE non si può usare.

Si può ovviare al problema installando una libreria a parte:

Altri metodi di debugging: link


Sensori I2C

Il digispark può leggere dati da sensori digitali tramite protocollo I2C (pin SDA e SLK):

  • SDA: pin 0
  • SCL: pin 2

Installando la scheda nell’IDE Arduino si rende disponibile uno sketch per la scansione di tutti i dispositivi I2C collegati (i2cscanner.ino)

Emulazione tastiera

Fortunatamente il Digispark non ha solo problemi, ma anche vantaggi; per esempio, nonostante le minuscole dimensioni, poichè gira a 16MHz e va a 5V, a differenza di altre board è in grado di emulare dispositivi HID (joystick, tastiere, mouse,…)

Connessione Android USB

Essendo in grado di emulare una tastiera, il Digispark può essere anche connesso via USB a uno smartphone che supporti l’OTG; il che significa che in sostanza si può usare per collegare a un dispositivo Android un qualunque sensore dotato di interfaccia I2C. Sorgenti di esempio.

 

Manuale d’uso per timer KKMoon 12V con display e 3 tasti

Posted in hardware by jumpjack on 10 ottobre 2019

timer KKMoon - pulsanti

K1: tenere premuto per 2 secondi per entrare in modalità programmazione (programmi da P-1 a P-4).

K2: seleziona cifre partendo da sinistra

K3:
A cifra lampeggiante: incrementa di 1.
A cifre già prograsmmate: spostamento punto decimale.

P-1:
Accensione: relè 0, attesa segnale
Segnale: relè 1, timer T1, relè 0, fine.

P-2:
Accensione: niente
Segnale = Timer T1, relè 1, timer T2, relè 0, fine.

P-3 – Lampeggiatore
Accensione: Relè A, timer T1, relè B, timer T2, ripete all’infinito
Se A e B sono 0 o 1 lo si decide a timer avviato col tasto K1.
Nota: un giorno dura 1440 minuti e il timer può contare solo fino a 999 minuti, quindi può ripetere il ciclo ogni 12 ore, o al massimo ogni 16,65 ore.

P-4:
Accensione: Relè 0, attesa segnale
Segnale: Relè 1, timer T1, Relè 0, fine.

Specifiche:
Tensione di funzionamento: DC 12V / DC 24V (opzionale)
Intervallo di tempo (impostabile): 0,1 ~ 99,9 secondi; 1 ~ 999 secondi; 1 ~ 999 minuti
Segnale di tensione: DC 4 ~ 20V
Capacità di uscita: può controllare il carico entro DC 30V 10A o 10A 220V AC

Tagged with: , , , , , ,

Dimensionamento di fusibili

Posted in hardware by jumpjack on 10 settembre 2019

Qualche anno fa, quando ho rifatto da zero l’impianto elettrico dello scooter elettrico Ecojumbo 5000, ho avuto delle belle difficoltà a trovare normative e specifiche su come dimensionare correttamente fusibili per alte correnti continue.

Ecco ora un documento che fa un po’ di luce sulla questione:

https://www.littelfuse.com/~/media/electronics/product_catalogs/littelfuse_fuseology_selection_guide.pdf.pdf

 

  • Parametri del circuito
    • Corrente nominale (normal operating current)
    • Corrente massima di guasto (maximum fault current)
  • Parametri del fusibile
    • Tensione massima di lavoro (voltage rating)
    • Corrente nominale (“current rating”)
    • Corrente di corto circuito o Corrente di rottura o Corrente di sovraccarico (“short circuit rating” o “breaking capacity” o “interrupting rating”)

La corrente di corto circuito del fusibile deve essere maggiore o uguale della corrente massima di guasto del circuito, in modo che sia impossibile far scorrere nel circuito una corrente superiore alla sua corrente massima di guasto.

CCC >= CMG


Data la corrente nominale indicata nel datasheet, un fusibile non deve essere attraversato da più del 75% di questa corrente; o, detto al contrario, se devo permettere il passaggio di una corrente I in un circuito, il fusibile deve avere una corrente nominale di almeno I/0.75. Il valore 0.75 va poi moltiplicato per il fattore di derating dovuto alla differenza di temperatura rispetto alla temperatura ambiente, graficato nel datasheet.

Questo però è valido a 25°C in spazio aperto, condizioni standard utili solo per confrontare componenti diversi; bisogna però tenere conto del derating, ossia del cambio dei valori di specifica, al variare delle condizioni ambientali, essendo per definizione i fusibili componenti estremamente sensibili alle temperature.

Tensioni tipiche di specifica dei  fusibili sono: 32V, 63V, 125V, 250V e 600V. Il comportamento di un fusibile resta lo stesso al variare della tensione nel  range ammesso, mentre cambia molto al cambiare della corrente. Il documento non specifica come rapportare la tensione di lavoro in corrente continua con quella in corrente alternata, ma è presente un elenco di vari fusibili per i quali sono indicate le tensioni massime di lavoro sia in continua che in alternata, dai quali si evince che la tensione continua tollerata da un fusibile è 5 volte più grande di quella tollerata in regime di corrente alternata.

Il parametro principale per dimensionare un fusibile è quello che lo fa rompere: “overload current” o “corrente di sovraccarico“, che però non va mai da sola, ma è accompagnata dal tempo di apertura o tempo di rottura, cioè per quanto tempo può scorrere quella corrente nel fusibile prima che questo si fonda e apra il circuito. Questi due parametri del fusibile dipendono dalla “maximum fault current” (corrente massima di guasto) del circuito, cioè la corrente massima che si prevede possa scorrere nel circuito in caso di guasto.

 

 

 

Tagged with: ,

Sensori di piccole correnti per ESP32/ESP8266 e Arduino

Posted in hardware by jumpjack on 3 settembre 2019

INA219 (digitale)

 

L’INA219 non misura solo la corrente ma anche la tensione, da cui è possibile calcolare la potenza in Watt e il consumo energetico in Wh.

Comunica digitalmente coi microcontrollori tramite protocollo I2C a 2 pin (SDA e SCL), il che rende possibile l’utilizzo in contemporanea con un display I2C anche in caso di scarsità di pin sul microcontrollore.


MAX471 (analogico)

Dimensionamento della resistenza esterna su cui leggere la tensione con una Arduino o simili:

  • Rout [kOhm] = Vcc / (ILOADmax [A] * 0.5mA/A) = 2 * Vcc / ILOADmax
  • Vout [V] = 0.5 mA/A * Rout [kOhm] * ILOAD [A]
  • ILOADmax è la portata del MAX471, che è 3A, quindi:
  • Rout = 2*Vcc/3
  • Vout = I*Vcc/3
    • ESP32/ESP8266:
      • Rout = 2*3/3 = 2 kOhm per avere una variazione di 1mV per ogni mA; (2 resistenze di valore standard 1 kOhm in serie)
      • Vout [V]= I [A]
      • L’ESP32 legge i valori da 0 a 3.3V in 4096 step, quindi ogni step corrisponde a 0.80 mV letti e a 0.80 mA misurati.
    • Arduino
      • Rout = 2*5/3 = 3.3 kOhm
      • Vout [V]= 1.7 * I
      • Arduino legge i valori da 0 a 5V in 1024 step, quindi 4.9 mV per ogni step, che corrisponde a 8.3 mA misurati per ogni step.

Misure di alta tensione

Per misurare invece i consumi di rete a 230V, come sensore di tensione conviene usare un dispositivo isolato galvanicamente, in modo da evitare che per errore sulla Arduino finiscano 230V, come il dispositivo ZMPT10B che regge fino a 250V alternati; come sensore di correntesi può usare un ACS712 (variante ACS712ELCTR-20A-T da +/- 20A o ACS712ELCTR-30A-T da +/- 30A), che però richiede il “taglio dei fili” perchè funziona tramite resistenza di shunt.

Sensore di corrente senza contatto: SCT-013-000

 

Hacking Icaro – Centralina GSM: Man in the Middle Attack – puntata 3

Posted in Diario elettrico GreenGo Icaro, hacking, hardware by jumpjack on 2 settembre 2019

Pinout

Terminata l’individuazione dei pin TX/RX da intercettare tramite apposito cavo:

Pinout centralina GSM Zhidou/Greengo Icaro

Pinout centralina GSM Zhidou/Greengo Icaro

 

Sul connettore nero sono i pin 33 e 34, ergo l’11mo e il 12mo partendo dal pin 23 (in basso nella figura qui sopra).

Il pin marchiato RX sul modulo va, da datasheet, collegato a RX sulla centralina, cioè qui viaggiano i dati provenienti dal modulo GSM, ergo le risposte del server. Il pin da “manomettere” e intercettare è quindi il TX, che corrisponde dal pin 33 sul connettore nero, l’undicesimo partendo dall’estremità del connettore contrassegnata dal n.23.

Il cavo

Un possibile cavo utilizzabile per questo hacking è il SAMTEC FFSD-25-D-03.00-01-N-R (datasheet):

  • FFSD = famiglia
    • FF passo 1.27 mm
    • S = socket (femmina); può andar bene anche la famiglia FFMD, con due spine maschio invece che due femmine, ma servirà un adattatore femmina-femmina; col connettore femmina-femmina (lettera S) serve invece un adattatore maschio-maschio, o semplicemente di inserire a mano 50 pin in uno dei due connettori femmina, in modo che diventi maschio.
    • D = doppia fila di pin
    • DA EVITARE le famiglie TCSD e TCMD, che hanno il passo sbagliato (2mm invece che 1.27mm)
  • 25 = 25 pin per fila
  • D = Doppio connettore
  • 03.00 = 3 pollici di lunghezza (7.5 cm)
  • 01 = valore fisso
  • N = presente tacca di polarizzazione
  • R = verso invertito del secondo connettore:

    L’ultima lettera va bene anche -O oppure -M (si tratta di cavi con 3 connettori invece che 2, uno dei quali invertito).

Il progetto

Questo è ciò che va realizzato per modificare il server a cui vengono inviate le telemetrie:

hacking icaro GSM – connessioni

Questa è l’unica connessione realmente necessaria, sia per modificare il server di invio dati, sia per loggare i dati stessi, ma chiaramente può essere utile collegarsi anche al pin 34(RX) per leggere e loggare la risposta del server.

 

Tagged with: , , , , ,

Diario elettrico Greengo/Zhidou Icaro: 2 agoto 2019 – problemi al motore

Ieri mattina, nuovo tipo di problema, questa volta riguardante il motore: all’improvviso, durante la marcia a bassa velocità, l’auto ha iniziato ad accelerare a singhiozzo, nonostante il pedale dell’acceleratore fosse fermo, e l’ago del tachimetro ha iniziato ad andare su e giù a vanvera; mi sono fermato, ho spento e riacceso, e tutto ok, ma la cosa è un po’ preoccupante, perchè sembra decisamente un problema di lettura dei sensori di hall, quei 3 sensori che permettono al motorcontroller di sapere in ogni istante a che velocità e in che direzione si sta muovendo il motore; il che vuol dire che se le letture sono a vanvera, la centralina potrebbe “ingranare la retromarcia” in qualunque momento…

Stamattina ho dato una controllata a fili, cavi e cavetti, ma non mi sembra ci sia nessun falso contatto; però il problema si è ripresentato un paio di volte, e una volta anche quando ero in velocità. Mettendo un momento in folle su “N” e poi di nuovo in drive su “D” il problema sembra risolversi, ma il differenziale non è molto contento di queste accelerazioni/decelerazioni improvvise, quindi questo sembrerebbe proprio essere un motivo in più per disattivare la famigerata rigenerazione in frenata, che secondo la Kelly, che fabbrica il motorcontroller, potrebbe essere la causa degli improvvisi, salturari depotenziamenti.

L’alernativa sarebbe forse cambiare il cavo che contiene i fili del sensore di hall, che magari si è deteriorato; ma il cavo costa 30 euro e la spedizione dalla Cina 35 euro….

Vedremo.

——————

A proposito del problema del depotenziamento, sono arrivato per ora a  questa conclusione:

il depotenziamento ha due possibili cause: il BMS, e il motorcontroller;

  1.  pare che il BMS sia tarato per tagliare la potenza se legge una differenza di tensione superiore a un tot tra cella più alta e cella più bassa; in origine sono 300 V, ma pare che nelle versioni successive di auto e/o BMS abbiano modificato o tolto questo limite, come è stato fatto sulla mia Icaro. Sulla quale però ogni tanto, anche se più raramente, il problema si ripresenta. E quindi entra in gioco una seconda possibile causa.
  2. anche il motorcontroller è tarato per tagliare la potenza in base alla tensione, ma di tutta la batteria: succede sia in accelerazione, se la tensione scende troppo, che in frenata rigenerativa, se la tensione sale troppo.

Abbassamenti eccessivi non ne ho mai rilevati in accelerazione, nonostante i 250A tirati fuori al posto dei 150A di origine (a seguito di una mia rimappatura della centralina), ma in compenso a volte mi è capitato di trovare la batteria a 81V la mattina, appena caricata, e a volte addirittura a 85V se si era appena spento il caricabatterie; trattandosi di 24 celle, significa 3.375V  e 3,54V per cella; se in questa situazione esco dal parcheggio, che ha una rampa in discesa, la tensione probabilmente sale ulteriormente (non ho un logger, devo vedere tutto a occhio), e la centralina va in protezione. Nella schermata 2 del SW di configurazione si possono impostare le soglie di intervento del regen (voce 5, nota 4)

La spiegazione dice:

  • Under voltage [3]: Controller will cut back current at battery voltage lower than 1.1x he value, cut out at the vale, and resume operation at 1.05x value
  • Over voltage [4]: Controller will cut back regen current at 0.95x the value, cut out regen if voltage reachd the setting, and resume regen at 0.95x value.

Traduzioni:

  • Sottotensione [3]: il controller ridurrà la corrente quando la tensione di batteria scenderà sotto 1.1 volte il valore impostato, la taglierà completamente quando raggiungerà esattamente il valore impostato, e la ripristinerà solo quando la tensione risalirà ad almeno 1.05 volte il valore impostato.
  • Sovratensione [4]: Il controller ridurrà la rigenerazione quando la tensione raggiungerà il 95% del valore impostato, lo azzererà al raggiungimento del valore esatto, e ripristinerà al ragiungimento  del 95%.

In questo caso ci interessa il punto 2 (sovratensione), l’altro riguarda la corrente esratta dalla batteria in accelerazione.

La Icaro monta 24 celle LiFePO4; in genere le LiFePO4 (ma ce ne sono tante varianti) hanno tensione massima di 3.33V e tensione di ricarica finale di 3.65V; a livello di batteria quste tensioni equivalgono a 80V e 87,6V. La tensione di ricarica finale permane però solo finchè resta collegato il caricabatteria; quando si stacca, la tensione decade spontaneamente a 3.33V/80V.

Il 95% di questi due valori massimi è:

  • 80.0 * 0.95 = 76 V
  • 87.6 * 0.95 = 83.2 V

Non ho invece modo di sapere quali sono i valori di intervento del BMS, quindi devo supporre che il BMS non effettui nessun intervento, ed agire quindi solo sul motorcontroller, assicurandomi che riduca la tensione di regen quando la tensione supera i 76V, e lo tagli completamente se supera gli 80V.

Purtroppo non ricordo a quanto impostai questa soglia l’anno scorso, però so che sia in ufficio che a casa l’uscita dal parcheggio (occasione in cui spesso si verifica il depoteniamento automatico) c’è una rampa in discesa; se a casa sicuramente parto con la batteria a 80V (a volte anche 81V), in ufficio, dopo 10 km di viaggio, mi pare difficile partire con questa tensione, ma la verità è che non ho mai controllato, mi sono sempre limitato a controllare che la tensione di cella non SCENDESSE sotto livelli critici, non ho mai pensato a verificare che non salisse troppo.

Dovrò quindi risistemare un po’ i parametri della centralina: o disattivo completamente il regen – cosa che renderebbe solo fastidioso, anzichè pericoloso, il problema dei sensori di hall –  oppure cambio la soglia di intervento in modo che la tensione di batteria non superi mai gli 80V a causa del regen.

 

 

Hacking Icaro – Centralina GSM: Man in the Middle Attack – puntata 2

Posted in auto elettriche, hacking, hardware by jumpjack on 11 luglio 2019

Una settimana di studi e teorie non sono valsi l’avere i pezzi tra le mani…

A quanto pare il passo dei due connettori non è di 2mm, ma di 1.27mm! Vale a dire 0.050″.

Quindi sia la striscia di cavi che le pin strip… sono completamente inutili, tocca ricominciare la ricerca da capo.

Per fortuna però ormai ho acquisito un po’ di esperienza nel decodificare i datasheet di questi cavi, e ci è voluto poco: quello che mi serve non è un cavo TCMD o TCSD (passo 2.0mm) , ma un cavo di una famiglia diversa: o FFMD o FFSD  (passo 1.27mm). Si tratta sempre di cavi IDC di tipo TigerEye, ma i pin hanno appunto passo 0.050″/1.27mm. “M” sta per “maschio” e “S” per socket, cioè femmina, poi per il resto la nomenclatura Samtec rimane la stessa, quindi un FFxD-25-D avrà due connettori uguali mentre un FFxD-25-T li avrà di sesso opposto; purtroppo da 2×22 pin non esistono, quindi devo prendere il numero subito superiore, 2×25. Altre famiglie sono FFTP e FMTP, che però hanno i cavi “twistati” a 2 a 2; non significa che i contatti siano “incrociati”, ma solo che i fili sono arrotolati l’uno sull’altro (credo per attenuare le interferenze elettomagnetiche), ma poi terminano da entrambi i lati nella stessa posizione.

Le sigle papabili sono quindi:

  • FFMD-25-T-xx.xx-01: maschio/femmina
  • FFMD-25-D-xx.xx-01: doppio maschio
  • FFSD-25-T-xx.xx-01: maschio/femmina
  • FFSD-25-D-xx.xx-01: doppia femmina

Twisted:

  • FFTP-25-T-xx.xx-01: twisted, maschio/femmina
  • FFTP-25-D-xx.xx-01: twisted,  doppia femmina
  • FMTP-25-T-xx.xx-01: twisted, maschio/femmina
  • FMTP-25-D-xx.xx-01: twisted, doppio maschio

Può darsi che alcune delle combinazioni maschio/femmina non esistano perchè coincidenti con altre sigle.

Purtroppo su https://www.toby.co.uk  un FFMD-25-T-08.00-01-N costa circa 32,00 sterline fra tasse e spedizione.

Su RS-components non ci sono cavi maschio/femmina in magazzino, ma ho visto che la strip-pin con passo 2.0mm che ho ordinato per sbaglio entrano senza sforzo nè gioco nel connettore-femmina della scheda GSM, quindi basterà sfilarne 22 uno per uno e infilarli in uno dei due connettori-femmina per ottenere un connettore maschio; il femmina/femmina più economico è un FFSD-25-D-04.00-01-N, cioè 2×25 pin lungo 4 pollici (10 cm) del costo di 13,54 euro, che con IVA e spedizione diventano 22,62€; prenderò questo e speriamo che stavolta i conti tornino.

 

connettore GSM nero con righello e pin

Tagged with: , ,