Jumping Jack Flash weblog

Nuovi appunti su ESP8266

Posted in esp8266, hardware by jumpjack on 24 novembre 2017

E’ uscito il successore, ESP8285:

  • 1 Mbyte di memoria flash incorporata nel chip stesso
  • velocità di upload di 4 Mbps invece dei soliti 115200
  • Processore Tensilica L106 32-bit  (100% compatibile con SW di ESP8266, quindi probabilmente con Arduino IDE, previa reflash)
  • 80MHz (160 MHz)
  • RTC (Real Time Clock) incorporato
  • Predisposto per supporto per SD-Card
  • Predisposto per ricevitore IR (infrarossi)
  • 17 GPIO
    • Assegnazioni riservate:
    • Pin Name Pin Num IO Function Name
      MTCK 12 IO13 Button (Reset)
      GPIO0 15 IO0 Wi-Fi Light
      MTDI 10 IO12 Link Light
  • Assorbimento massimo: 160 mA in trasmissione, ma la documentazione parla di un piccco di 500 mA all’avvio del predecessore ESP8266. Per questo motivo è sconsigliato alimentare l’ESP dalla porta USB di un PC, che sopporta AL MASSIMO 500 mA, quindi è troppo al limite; il costruttore consiglia inoltre di alimentare l’ESP tramite un DC/DC converter (che trasforma tensioni sotto- o sopra-soglia nei 3.3V richiesti) o un Low DropOut regulator (che può gestire solo tensioni sopra-soglia, quindi per esempio passare da 5V a 3.3V), mentre sconsiglia di usare direttamente una batteria al litio (LiPo o NCM)perchè ha un range di tensione troppo ampio durante la scarica: 3.0-4.2V contro i 3.0-3.6 accettati dall’ESP. Andrevve invece bene una LiFePO4, che ha una tensione massima di 3.3, però scende fino a 2.8, che non è abbastanza, quindi non si sfrutterebbe appieno la carica.
    Esempio di LDO:AMS1117,

 

Board di programmazione (con USB e pulsanti):

https://wiki.wemos.cc/products:d1:d1_mini_lite 3.00 dollari su Aliexpress

 

Modulo da solo:

2.79 euro su Electrodragon, 8 dollari su Amazon.com .

 

Datasheet:

https://dziadalnfpolx.cloudfront.net/blog/wp-content/uploads/2016/06/ESP8285-datasheet-EN_V1.0_20160302.pdf

 

Rivenditore di “follie” Espressif/AiTinker (tra cui un modulo GSM+GPRS+GPS + SDCard a 6 euro tutto incluso!!):

https://anxinke.world.taobao.com/

 


Documentazione tecnica ufficiale su motivi di reset dell’ESP8266:

http://wiki.ai-thinker.com/_media/esp8266/faq/esp8266_reset_causes_and_common_fatal_exception_causes_cn.pdf

FAQ espressif (in cinese…): http://wiki.ai-thinker.com/_media/esp8266/faq/espressif_faq_cn.pdf

Stesse FAQ ma in inglese: http://espressif.com/sites/default/files/documentation/espressif_faq_en.pdf


Note tecniche:

L’ESP8266 incorpora due Watchdog Timer (WDT o WT), uno HW e uno SW, per default entrambi abilitati.

Il WT HW ha un timeout di 1.6 secondi, seguito  da un “interrupt handling interval” di 6.6 secondi (“tempo di riserva” disponibile per azzerare il WT prima che si resetti l’ESP), per un totale di 8.2 secondi: se il programma non resetta il  timer entro 1.6 secondi, l’ESP POTREBBE resettaresi; se non lo resetta entra 8.2 secondi, l’ESP si resetta di sicuro.

Per resettare il WT in uno sketch IDE si può usare un’istruzione delay() “a vanvera”, oppure l’apposita funzione ESP.wdtFeed(); in realtà è già “segretamente” implementata in modo trasparente in varie librerie, ma se non dovesse bastare (cioè se lo sketch si dovesse riavviare senza motivo) si può provare a resettare il  WT a mano.

Per esempio se nella routine loop() non c’è nemmeno un delay(), si potrebbe resettare l’ESP per timeout del WT.

 

il WT SW ha un timeout di 1.6 secondi e un “interrupt handling interval” uguale, di 1.6 secondi,  per un totale di 3.2 secondi.

 

il WT HW non può essere spento, il WT SW sì, ma solo tramite programmi scritti con l’SDK.

 

Per creare ritardi che non resettino l’ESp il costruttore raccomanda di non usare loop, ma callback o timer.


All’accensione l’ESP invia sulla seriale a 74880 bps questo messaggio standard di avvio:

ets Jan 8 2013,rst cause:X, boot mode:(Y,Z)

il valore di X può essere:

  1. .
  2. .
  3. .
  4. .

Quello di Y è dato dalla combinazione dei 3 “GPIO di avvio” (“strapping pin”, pin di bootstrap), 15, 0 e 2, che essendo 3 bit possono comporre numeri da 0 a 7:

0:Remapping

  1. UART Boot
  2. Jump Boot
  3. Flash Boot
  4. SDIO LowSpeed V2 IO
  5. SDIO HighSpeed V1 IO
  6. SDIO HighSpeed V2 IO
  7. SDIO HighSpeed V2 IO

Si tratta quindi di pin riservati al sistema e non possono essere usati nei propri progetti.

Questi 3 pin vengono letti 60 ms dopo che il pin CHIP_EN (Chip enable) è stato portato a 3.3V, che a sua volta deve avvenire dopo l’accensione; la sequenza di boot quindi è:

  • Azione esterna: alimentazione a 3.3V
  • Il pin di reset, inizialmente a 0V, passa automaticamente a 3.3V
  • Azione esterna: CH_EN alto
  • Azione interna: lettura strap-pin
  • Azione interna: attivazione porta seriale

Il pin CH_EN non ha un pull-up interno.

Il pin di reset ha un pull-up interno, cioè normalmente è a 3.3V se è scollegato; se viene posto a zero tramite azione esterna, il chip si resetta.


L’ADC interno è cablato con gli stessi circuiti del wifi, quindi ha frequenza di campionamento diversa a seconda se il WiFi è attivo(1000 campioni/sec) o no (100.000 campioni/s), ed ha una risoluzione interna di 12bit ma disponibile di 10 bit. Il costruttore sconsiglia di effettuare contemporaneamente letture ADC e uso del WiFi.


L’ESP8266 non supporta nativamente le SD-Card sui pin SDIO perchè questi sono configurati come slave, quindi l’ESP può fungere solo da dispositivo.


Tutti i pin tranne GPIO4, GPIO5 (collegati al flashing) e GPIO16  hanno un pullup integrato, cioè se scollegati sono a 3.3V.

Per GPIO4 e GPIO5 non si può usare una resistenza di pullup da 1 Mohm, ma al massimo da 100k.

 

 

Tagged with: , ,

Appunti ESP8266 – Come risolvere problemi di stabilità

Posted in esp8266, hardware by jumpjack on 10 giugno 2017

Sembra che l’ESP8266 sia famoso per la sua instabilità, cioè la facilità con cui perde la connessione WiFi si resetta; queste ottime pagine spiegano come ovviare al problema: link1, link2.

Riassumendo:

  • Il comando “delay()” resetta il WatchDog Timer (WD o WT); si tratta di un contatore che, se raggiunge un valore troppo alto (maggiore di 5 secondi e non modificabile), fa riavviare il dispositivo; è un sistema di sicurezza per evitare che il sistema, se si blocca, resti bloccato indefinitamente: in “sottofondo” è infatti sempre attivo un controllo hardware sul watchdog, anche quando uno sketch si blocca; se rimane bloccato per troppo tempo, il processore va in autoreset e quindi lo sketch si riavvia; quindi lo sketch deve essere predisposto per potersi riavviare da solo senza l’intervento dell’utente.
  • Forse anche il comando wdt_feed()  resetta il watchdog, ma probabilmente è un comando dell’SDK di ESP, quindi per utenti evoluti.
  • Utilizzando l’ESP8266 come access point (ossia come router o come sever), bisogna evitare di gestire l’attesa dei comandi web durante alla funzione standard loop(), perchè sembra che la loop() interferisca con i meccanismi del wifi; bisogna invece implementare una funzione di callback che viene chiamata quando il client connesso all’ESP gli invia un comando (sketch di esempio: link).
  • La connessione WiFi può spesso cadere senza motivo, quindi uno sketch deve sempre prevedere nella funzione loop() un monitoraggio della connessione, per ristabilirla se cade.
    Queste righe servono a verificare se è attiva la connessione tra l’ESP e un router, non tra un dispositivo e l’ESP:
    while (WiFi.status() != WL_CONNECTED) {
      Serial.print(“.”);
      delay(500);
    }
    Quindi vanno dopo la riga:
    WiFi.begin(ssid, password);
    Dove “ssid” è il nome del router.
    Invece, per rilevare la connessione di un dispositivo bisogna usare questo codice:
    #include <ESP8266WiFi.h>
    WiFi.disconnect(true); // Più che disconnettere, cancella dalla PROM i parametri di connessione usati finora;
    WiFi.persistent(false); // Evita che tali parametri vengano poi memorizzati
    WiFi.mode(WIFI_AP); // Imposta la modalità di connessione su Access Point
    WiFi.softAP(ssid); // Imposta il nome della rete e accende l’access point (senza password)
    delay(1000); // Ritardo per azzerare il watchdog
    WiFi.onEvent(WiFiEvent); // Rileva tutti gli eventi WiFi nella funzione “WiFiEvent(WiFiEvent_t event);
  • Quando usa il WiFi, l’ESP8266 ha bisogno di molta più corrente dei 500 mA che può fornire la porta USB di un PC, quindi va alimentato con un trasformatore.
  • Anche utilizzare un adattatore USB/seriale può causare interferenze nel WiFi e perdita di connessione, quindi una volta terminate le prove, usare sempre un alimentatore per alimentare l’ESP.
  • Ad ogni richiesta http GET proveniente da un client, l’ESP “perde un po’ di memoria (heap)”, per liberarla solo “dopo un po’ “, quindi non si può inondare l’ESP di richieste http GET, bisogna aspettare almeno due minuti tra l’una e l’altra (fonte).
  • Un “bug noto” impedisce a SoftAP() di funzionare (cioè di impostare l’ESP come accesspoint)  se l’ESP non è anche connesso a un router.

Esiste anche una libreria WiFi specifica che effettua la riconnessione automatica in caso di disconnessione:

https://github.com/ekstrand/ESP8266wifi

 

Programmare l’ESP8266 con Arduino IDE

Posted in arduino, hardware, Uncategorized by jumpjack on 15 gennaio 2017

Brevissimo tutorial su come rendere il NodeMCU Amica con ESP8266 ESP12 a bordo programmabile tramite IDE Arduino.

  1. Scaricare esp8266_flasher.exe.
  2. Scaricare i file del firmware ESP_Easy (*).
  3. Collegare il NodeMCU (ad esempio Amica o Lolin) al PC tramite USB
  4. Avviare l’IDE arduino per verificare quale porta sia stata associata al dispositivo (menu Strumenti –> Porta)
  5. Aprire il monitor seriale di Arduino
  6. Premere e rilasciare il tasto reset sul NodeMCU per verificare se effettivamente il dispositivo comunica con l’IDE attraverso quella porta
  7. Chiudere l’IDE
  8. Avviare esp8266_flasher.exe
  9. Impostare il numero di porta
  10. Caricare il file .bin corretto, che dipende dalle dimensioni della flash a bordo del dispositivo (4MB o 4096 kbyte sull’ESP12, montato su Huzzah Adafruit, NodeMCU Lolin, NodeMCU Amica)
  11. Tenere premuto il tasto FLASH sul dispositivo, premere il tasto reset, rilasciare reset e rilasciare il tasto FLASH: in questo modo il dispositivo si predispone per la riprogrammazione (re-flashing)
  12. Cliccare DOWNLOAD: in realtà non verrà scaricato un file DA internet, ma inviato il firmware al dispositivo
  13. Attendere il completamento dell’operazione.
  14. Riaprire l’IDE di Arduino
  15. Ripetere il punto 11
  16. Caricare sul dispositivo uno sketch di esempio che stampi qualcosa sul monitor seriale

 

Metodo alternativo:

Per flashare il firmware è possibile usare direttamente anche il file eseguibile presente nel pacchetto ESP_Easy (*), che però è un po’ meno intuitivo. Una volta nota la porta a cui è collegato il dispositivo (v. punto 4 sopra) e la memoria disponibile (v. punto 10 sopra), mettere il dispositivo in modalità FLASH (punto 11 sopra), avviare esptool e indicare in sequenza il numero di porta, la dimensione della flash e la versione del fimware, cioè il numero dopo la “R” nel nome del file; ad esempio, ESPEasy_R108_4096.bin è la versione 108 per l’ESP da 4096 kbyte.

Nota: per scoprire quant’è grande la Flash RAM sul dispositivo si potrebbe usare questo comando:

esptool.py flash_id

Ma la cosa richiede di preinstallare e configurare un interprete python, che è una noia e una rogna, sto cercando un modo più semplice e alla portata di tutti.

 

(*) Il file .zip contiene vari file .bin, che sono firmware adatti a moduli ESP con Flash RAM di dimensioni diverse: 512 kbyte, 1924 kbyte, 4096 kbyte; ad esempio, il file ESPEasy_R108_1024.bin è per un ESP da 1024 kbyte (1Mbit); R108 è il numero di “build”, cioè di versione.

 

 

Collegamento di un CellLog8S/8m ad Arduino o a ESP8266

Posted in auto elettriche, batterie, hardware, scooter elettrici by jumpjack on 2 gennaio 2017

L’utente pa.hioficr sul forum https://endless-sphere.com/forums/viewtopic.php?f=14&t=20142 ha scoperto che è possibile leggere in tempo reale i dati di log di un CellLog (sia 8S con memoria che 8S senza memoria) semplicemente “agganciandosi” al pin TX dell’Atmel montato sul CellLog.

Questo significa che invece di spendere 40-50 euro per comprare un CellLog8S con memoria e infilarlo nel sottosella per poi aspettare di arrivare a casa per scaricare i dati letti, è in linea di principio possibile collegare al CellLog8M da 15 euro un ESP8266 da 8 euro che tramite Wifi invia dati a uno smartphone che li mostra in tempo reale sullo schermo durante la marcia; probabilmente è anche possibile scrivere un SW che legge i dati da più di un celllog contemporaneamente, sfruttando l’emulatore di porte seriali.

Questo è lo schema elettrico originale dell’autore:

celllog-000

 

Questa è una sua successiva modifica per implementare anche avvio del logging e reset del CellLog:

celllog-001

Di seguito la spiegazione del funzionamento che ho dedotto io dallo schema, inserita anche nella seconda edizione del mio libro “Guida alla costruzione di una batteria al litio per mezzi elettrici”, di imminente pubblicazione:

 

8.1.2. Materiale occorrente
Q1 = 2n3906 o altro PNP
R1 = R4 = R6 = R7 = 220 ohm
R2 = R5 = 330 ohm
R3 = 4700 ohm
U1 = U2 = optocoupler/fotoaccoppiatore a 2 canali, 5V, 8 pin, uscita a fototransistor di tipo NPN (es. Vishay ILD615, Fairchild MCT61, Isocom ISP827,… )
8.1.3. Spiegazione del funzionamento
Il circuito può essere suddiviso in 4 parti: le prime due ricevono dati dal CellLog tramite il primo fotoaccoppiatore e li inviano al microcontrollore esterno; le altre due ricevono invece dati dal microcontrollore e li inviano al CellLog tramite il secondo fotoaccoppiatore.
8.1.3.1. Rilevamento accensione
In Figura 127 è riportata la parte dedicata al rilevamento dell’accensione; notare che nella figura il transistor è stato capovolto rispetto allo schema originale reperito su internet, per renderlo coerente con la notazione standard di avere la corrente che scorre dall’alto verso il basso; inoltre lo schema è stato semplificato e ripulito, per facilitarne la comprensione, lasciando però inalterati i collegamenti e i componenti.
Il microcontrollore (MCU) è programmato per leggere sul pin MCU_CL8.1_DETECT lo stato del CellLog: quando il pin è “basso” (0V), vuol dire che il CellLog è acceso; normalmente questo pin è invece a 5V perché connesso all’alimentazione dell’MCU tramite R5 (che serve a limitare a 15mA la corrente Collettore-Emettitore quando il transistor è in conduzione); quando però il CellLog viene acceso, i suoi 5V arrivano, tramite la resistenza R4 (che limita la corrente a 23 mA) sul pin 4, e mettono in conduzione il fotodiodo 3-4, che mette a sua volta in conduzione il fototransistor 5-6, che mette a massa il pin MCU_CL8.1_DETECT.
celllog-002
Figura 127 – Rilevamento accensione
8.1.3.2. Lettura dati
Dobbiamo far “riflettere” sul piedino RX del microcontrollore esterno lo stato del pin TX del CellLog, tramite il fotoaccoppiatore; per farlo, usiamo il pin TX del CellLog per controllare la base di un transistor collegato all’ingresso del fotoaccoppiatore; il transistor serve a far sì che basti prelevare dal CellLog una piccolissima corrente (1 mA grazie a R3 da 4300 ohm) per attivare il fotodiodo, che richiede invece alcune decine di mA; in pratica è un transistor di disaccoppiamento, che cioè rende indipendenti gli assorbimenti di corrente di CellLog e fotoaccoppiatore.
celllog-003
Figura 128 – Circuito TX-RX con transistor PNP o NPN
Il progettista ha scelto di usare un transistor di tipo PNP, che viene acceso da una tensione di base negativa rispetto all’emettitore; l’emettitore va quindi collegato stabilmente alla tensione di alimentazione 5V, in modo che il transistor entri in conduzione quando TX va a 0V. Quando questo accade, succederà quanto segue, in sequenza:
1. Q1 si accenderà
2. Passerà una corrente nel fotodiodo 1-2
3. Si accenderà il fototransistor 7-8
Dobbiamo ora fare in modo che tutto ciò risulti in una tensione di 0V sul piedino RX del microcontrollore esterno, corrispondente al piedino 8 del primo fotoaccoppiatore, che è il collettore del fototransistor di uscita; per farlo, dobbiamo fare in modo che il piedino 8 si trovi normalmente a 5V, e venga portato a 0V solo quando si accende il fototransistor 7-8; bisogna quindi tenere il pin 8 costantemente collegato ai 5V del microcontrollore esterno, e il pin 7 alla sua massa; in questo modo, l’accensione del fototransistor 7-8, che avviene quando TX del CellLog va a 0, collegherà il pin 8 a massa tramite il 7, cioè metterà RX del microcontrollore esrerno a 0, riflettendo così esattamente lo stato del pin TX del CellLog.
Se non dovessimo avere disponibile un transistor PNP ma solo un NPN, occorrerà invertire la logica del circuito.
8.1.3.3. Reset
Il “cervello” del CellLog, un microcontrollore ATMEL, è dotato di un piedino di reset, che possiamo controllare tramite il nostro microcontrollore esterno; per farlo, al pin di reset colleghiamo il collettore del fototransistor 5-6 del secondo fotoaccoppiatore (pin 5); controlliamo questo fototransistor tramite il rispettivo fotodiodo 3-4, collegato al pin MCU_CL8.1_RESET del nostro microcontrollore esterno; basterà quindi mettere alto questo pin per mettere in conduzione il fotodiodo e il fototransistor e quindi resettare il CellLog.
celllog-005
8.1.3.4. Avvio log
Per far partire il logging è necessario premere per 3 secondi il pulsante 2 del CellLog (SW2); possiamo farlo fare al nostro microcontrollore esterno collegando l’interruttore in parallelo a un’uscita del secondo fotoaccoppiatore: quando sull’ingresso ci sarà una tensione di 5V (impostata via software), il fototransistor di uscita entrerà in conduzione chiudendo l’interruttore e avviando così il logging.

celllog-004