Go Down

Topic: Modulo WiFi+Bt ESP32 (Read 45214 times) previous topic - next topic

steve-cr

#315
Nov 07, 2019, 08:22 pm Last Edit: Nov 07, 2019, 08:25 pm by steve-cr
Aggiorno sulle porte ESP32 (e così rinfresco un po' anche la sezione ESP32.

Per chi non seguiva, avevo notato che le analogiche di ESP32 leggono diversamente da scheda a scheda (!!!!!).
Proseguendo le ricerche sul sito Espressif, la cosa era stata notata (con un po' di ritardo) e si era corso ai ripari eseguendo la taratura delle porte direttamente sul chip in fase di produzione, uno a uno.

Di questi chip, però, sembra che ancora non se ne vedano, almeno sul mercato cinese.

Infatti esiste ancora il solito problema alla programmazione con IDE che obbliga a premere il tastino BOOT per far partire il trasferimento del programma, e le porte analogica continuano a leggere valori diversi da chip a chip.

Vi allego un foglio che ho redatto proprio ora con 12 schedine esp32-devkit dove leggo le prime due porte analogiche e le confronto con un DHT22 (che, chiaramente, essendo digitale, non può che dare valori identici su tutte le schede).
Le differenze, come potete vedere, si aggirano anche oltre i 3 gradi.
Gli asterischi li ho messi a schede con una stampigliatura diversa e molto più completa dello schermo metallico.

Se qualcuno ha avuto a che fare con ESP32 nuove ci può rendere edotti...
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

zoomx

Dovresti leggere delle piccole tensioni note, tipo una pila alcalina carica o un generatore, se lo hai.

steve-cr

#317
Nov 08, 2019, 04:31 pm Last Edit: Nov 08, 2019, 04:32 pm by steve-cr
Mi hai dato una bella idea, per vedere se il problema è del regolatore interno da 3,3 volt oppure...peggio (perchè significa che il problema è all'interno della CPU).
Quindi a un terzo ingresso analogico ho attaccato una tensione di 3,3 volt da un alimentatorino stabilizzato (ho messo anche un bell'elettrolitico).
Sul terzo canale ho lasciato la formula di lettura della ntc degli altri due canali (non mi interessa leggere la tensione ma la differenza di valori letti)
Nel foglio allegato si evidenziano le stesse differenze. Quindi non è la tensione del regolatore interno montato sulla schedina DEVKIT, perchè se sulle ntc leggo la tensione erogata da questo, nel terzo ingresso leggo una tensione esterna. Ma l'errore esiste ugualmente ed è proporzionale all'errore delle NTC.
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

zoomx

Non so se leggere una tensione di 3.3V, che è giusto il fondoscala, sia un bene, per questo ti avevo suggerito una banale pila e confrontare i valori del convertitore, non convertiti in tensione.

steve-cr

Ops, mi sono dimenticato di dirti che ho fatto un partitore 10k-10k quindi ho esattamente la metà.
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

steve-cr

Qualcuno mi può dare una mano?
Ho visto che ci sono stati sviluppi e bisogna includere una libreria di correzione.
Si chiama  esp_adc_cal.h
Non ho capito come inserirla in un programma, mi sono fermato a #include.....

Mi mandano QUI, poi mi mandano QUI (me è in pyton!!!), poi ho visto QUI....
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

zoomx

#321
Nov 08, 2019, 09:20 pm Last Edit: Nov 08, 2019, 09:21 pm by zoomx
Il programma in python serve per caricare il bin compilato nell'ESP32 e ha anche un monitor seriale.


La calibrazione proposta del documento espressif è lineare quindi usa la semplice equazione y=ax+b che, nel documento, vengono chiamati coeff_a e coeff_b.

Si tratta di prendere una serie di valori raw del convertitore e delle corrispondenti tensioni misurate in altro modo. Quest'ultimo punto nel documento espressif non è molto chiaro, mi è sembrato di capire.

Metti i dati in un foglio di calcolo, plotti i punti e, nel foglio di calcolo stesso, fai un fit lineare, e usi i settaggi per far scrivere sul plot la funzione lineare trovata che avrà la forma y=ax+b e al posto di a e b ci saranno i valori che cerchi.
Oppure usi un programma per calcolare il fit lineare a partire dai tuoi dati.
Il diagramma nel documento espressif mi sembra sbagliato, nell'asse X ci dovrebbero essere i valori raw e nelle Y le tensioni ma può essere che il sonno mi tradisce.
Nel plot ci sono diversi punti ma la procedura può essere fatta anche solo con 2. Però più punti hai più puoi correggere eventuali piccoli errori.

Tale calibrazione è diversa a seconda delle attenuazioni che, mi par di capire, non sono altro che una variazione della tensione VREF.

Quindi, se hai un chip nuovo, la libreria ti permette di scrivere i valori a e b in efuse e successivamente di leggerli da li.

Ma nessuno ti vieta invece di utilizzare direttamente nel codice tali valori. E magari di leggerli dalla SPIFFS.

Questo tipo di procedura vale per qualsiasi ADC di qualsiasi MCU. La procedura potrebbe anche essere usata per passare direttamente dai valori raw a quelli di temperatura usando temperature note se il sensore ha comportamento lineare.

steve-cr

Praticamente.... GRANDE Arduino Uno oppure NANO. Lo attacchi e leggi lo STESSO VALORE su 20 schede di diversi fornitori.
Ancora mi domando come può uscire sul mercato una scheda così...
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

zoomx

Su Arduino il riferimento è la tensione di alimentazione che, essendo la stessa per tutti, ti da valori identici.

Credo che se tu usi il riferimento interno ad 1.1V mi sa che succede la stessa cosa dell'ESP32.



steve-cr

#324
Nov 11, 2019, 12:07 pm Last Edit: Nov 11, 2019, 12:28 pm by steve-cr
Comunque dai link allegati avevo capito che si legge il valore dei fuses e il programma ne tiene conto automaticamente in fase di lettura delle analogiche...
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

zoomx

Si, il vantaggio è che una volta calibrato la calibrazione rimane anche cambiando sketch.
Ma se fai pochi progetti puoi usare un file SPIFFS o forse la EEPROM simulata.

steve-cr

Appunto: mi puoi fare un esempio PRATICO di come inserirlo in un programma?
Grazie infinite
 
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

zoomx

Faccio un primo esempio banale.
Collego l'ingresso analogico a massa.
La tensione V è zero e il convertitore mi da zero.
Collego l'ingresso all'alimentazione.
La tensione V è 3.3V e il convertitore mi da 4095

Faccio quindi la regressione lineare. Per questo esempio uso 
https://www.graphpad.com/quickcalcs/linear1/

Nella tabella metto i miei valori, in X i valori del convertitore e in Y le tensioni misurate con il multimetro.

0    0
4095    3.3

Premo calculate now

Si tratta di una regressione lineare, cioè vogliamo trovare l'equazione della linea che segue meglio i nostri valori misurati.
L'equazione della linea è
Y=aX+b

Slope     sarà il nostro valore di a = 0.0008059
Y-intercept sarà il nostro b = 0.0
Poiché stiamo usando solo 2 valori R è 1. Questo perché abbiamo 2 punti e quindi una sola retta che passa per i nostri 2 punti. 

Quindi l'equazione diventa Y=0.0008059x+0
E quindi per passare dal valore del convertitore alla tensione basta moltiplicare per 0.0008059

Ma questo è un caso ideale e non ci da molte informazioni. Dobbiamo usare 2 o più tensioni che siano maggiori di zero e minori di 3.3V

Metti 1V e 2 V
A 1V il convertitore mi da 1235
A 2V il convertitore mi da 2483
In tabella quindi
1235    1
2483    2

Calcolando abbiamo 
a=0.0008013
b=0.01042
L'equazione diventa
Y = 0.0008013*X + 0.01042                    
Quindi il valore preso dal convertitore AD va moltiplicato per 0.0008013 e poi va aggiunto 0.01042, otterrai la tensione.

Questi 2 valori di a e b sono quelli da memorizzare in qualche modo, nel programma, nella eeprom, in un file SPIFFS o in questi efuses anche se non so se questi efuses memorizzano dei float.

Puoi anche usare più tensioni, basta inserire i rispettivi valori nella tabella. Sconsiglio gli estremi 0 e 3.3V in quanto sono proprio i valori di riferimento del convertitore.


Il discorso può anche essere fatto per le temperature, ti servono 2 temperature note, cacci i valori in tabella al posto della tensione e ottieni direttamente la temperatura. Questo se il legame tra la temperatura e tensione è lineare ma tu credo usi le NTC che invece non sono lineari.
Se non ricordo male lo sono le Pt100 e le termocoppie.


Spero di non aver scritto fesserie.

Moce993

Buongiorno,

so che tempo fa si era parlato del tasto di boot sul DevKit ESP32, ma non riesco a trovare dove  :smiley-sweat:

comunque volevo condividere con voi la mia esperienza, su sistema Win devo premere ogni volta il tasto di Boot per caricare uno sketch, mentre su sistema Mac non è necessario. Che dipenda dal chip usb to uart della silicon lab ?

Inoltre volevo chiedere se c'è qualcuno che utilizza un debugger per caricare lo sketch pre-compilato dall' Arduino IDE sull'esp32 e quale mi consigliate ?

steve-cr

#329
Nov 19, 2019, 05:25 pm Last Edit: Nov 19, 2019, 05:26 pm by steve-cr
...
 su sistema Win devo premere ogni volta il tasto di Boot per caricare uno sketch, mentre su sistema Mac non è necessario....
Queste cose mi fanno notevolmente inc...avolare!

Primo, perché non dovrebbero esserci differenze tre Linux, Mac e Windows se di un programma è stato fatto un porting decente.
Secondo, perché QUESTO dovrebbe essere il sito dell' IDE di Arduino e se c'è un problema andrebbe quantomeno risolto (e di ciò vorrei un parere dei moderatori...)

Mi succede la stessa cosa con IDE su Windows e IDE su Linux quando devo riscrivere il bootloader dei NANO: su Linux ZERO PROBLEMI, su Windows ogni tanto mi da errore e non c'è modo di scrivere.

A meno che mi dichiarate che su Windows alcune cose non si possono assolutamente fare.....
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Go Up