Tmp 36 impazzito....

Salve a tutti, mi presento con questo post, rompendo subito le scatole!!
Sono appassionato di elettronica e da poco ho conosciuto il fantastico mondo Arduino (mi dilettavo con i PIC).
Da qualche tempo sto realizzando un sitema basato su arduino per effettuare delle misurazioni in un fuoristrada da gara di un amico (pressioni, tensioni, temperature....) ma i problemi non sembrano di facile soluzione.
Per la sezione temperature ho utilizzato una Arduino UNO REV 3 (ORIGINALE e soprattutto Made in Italy!!!!!), un LM35 e un TMP36, inviando la lettura ad un display GLCD 128x64 KS0107.
per il collegamento delle sonde ho utilizzato solo cavi schermati ed eseguito tutti i collegamenti previsti dai datasheet per cavi lunghi.
Fin'ora tutto ok, al banco, le temperature sono stabilissime e le letture precise (analogReference a 3V3).
Installando tutto "l'accrocchio" all'interno dell'auto tutto ok, nessun disturbo (frecce, blinker,fari, verricelli, trombe,stereo etc.....).
Accendendo la radio CB e modulando iniziano i guai, con temperature impazzite.
Armandomi di pazienza riesco ad effettuare tramite codice (da principiante ma funziona) il filtraggio dei disturbi per tutti gli ingressi, tranne per il TMP36 che è rimasto un calvario.
Ho provato di tutto, filtri, codice diverso,ritardi, posizione sensore, lunghezza cavo, tipo di cavo, schermo collegato in un milione di modi (a massa su arduino,a massa sulla sonda, a massa in entrambe le estremità, a massa con condensatori e chi più ne ha più ne metta) senza soluzione. Ho letto (mi sembra nel datasheet) che l'Atmega ha gli ingressi Muxati, può dipendere dal fatto che le misure avvengono in sequenza senza ritardi?
ringrazio anticipatamente
ciao a tutti.

Se a CB spento i problemi non li hai.....
Comunque più volte è stato consigliato sul Forum di ignorare la prima lettura di ogni ingresso ADC, i quanto potenzialmente influenzabile dai valori presenti sugli altri ingressi, inoltre è decisamente preferibile effettuare, per ogni ingresso, una serie di letture 20-30 e poi estrarre la media; infine non dimenticare di infilare un C da 100nF tra il pin ARef e GND. Infine conviene SPEGNERE completamente gli ingressi ADC non utilizzati.
Ci sarebbero altri importanti accorgimenti ma purtroppo non sono applicabili su Arduino, ma solo su un eventuale cicruito stand-alone.

Personalmente sconsiglio l'utilizzo di sensori che forniscono in uscita analogica, se sono posti a + di 10 cm dal processore. Basta che alzi il volume della TV, un gatto che miagola o passa uno in strada che urla un po' più forte, che la misura viene alterata.

Ti suggerisco di usare un diverso sensore tra i millemila che ci sono con bus one wire, I2C, SPI, ecc. molto meno soggetti a raccattare disturbi. Inoltre, se hai già trafficato con i PIC, non dovresti avere difficoltà particolari.

(provo una sottile soddisfazione a vedere informatici e elettronici digitali nei guai per cose che noi elettronici analogici ci sguazziamo con facilità eheheh :grin:)

E' evidente che il segnale RF altera la lettura del sensore: una gran brutta bestia!

Proverei, se non lo hai già fatto, ad inserire l'intero Arduino in una scatola d'alluminio posta a massa.

Ma anche il sensore lo inserirei in un tubicino di alluminio collegato alla calza del cavo schermato.

BaBBuino:
(provo una sottile soddisfazione a vedere informatici e elettronici digitali nei guai per cose che noi elettronici analogici ci sguazziamo con facilità eheheh :grin:)

salvo poi restituire tale soddisfazione a chi si intende di meccanica e motociclismo :stuck_out_tongue_closed_eyes:

Grazie a tutti per il tempestivo interessamento alla problematica che ormai mi tormenta.
Per quanto riguarda i bus non sono molto esperto, anzi diciamo che ancora non ho mai provato a cimentarmi con i2c etc....
Il condensatore da 100n è già presente sulla board, devo inserirne un'altro?
Ho visto che qualcuno ha disaccoppiato l'alimentazione dei sensori inserendo una resistenza da 100 ohm in serie ad un condensatore da 0,1uF tra vcc e gnd (con la resistenza collegata a vcc) e poi ha spillato l'alimentazione del sensore tra resistenza e condensatore...che ne dite?
I sensori sono inseriti in contenitori di ottone avvitati nel motore e quindi a massa.
Per scartare la prima misura posso semplicemente fare due letture consecutive a distanza di alcuni ms e prendere l'ultima?
Domanda forse stupida...come si spengono i canali analogici non utilizzati?
Grazie a tutti, buona serata....Mirko

NOn so se per il messaggio sopra riportato ho premuto report to moderator, se si era involontario e dovuto al fatto che sto scrivendo in mobile....
Ho provato a fare la media ma ottengo risultati influenzati comunque dai disturbi, dato che un messaggio radio dura anche 20-30 secondi durante i quali l'arduino fa la media generando misure errate.
Lo pseudofiltraggio software che ho realizzato, evita che le misure disturbate vengano elaborate (confronta la misura vecchia con quella nuova)....ma con il tmp36 nulla da fare.

Dovresti provare a misurare con un buon multimetro la tesione direttamente sul pin d'uscita del sensore e poi a valle del filo, sull'ingresso analogico.
Comunque a mio parere il problema è l'RF che si intrufola dappertutto, quindi dovresti muoverti nella direzione di filtrare questi disturbi iniziando dall'alimentazione del circuito.
Proprio in questi giorni sto lavorando ad un problema simile, anche se decisamente minore di quanto tu racconti, cioè l'ADC disturbato dall'RF, nel mio caso le cose vanno meglio perché ho realizzato uno stand-alone e sto lavorando con PCB con piani di massa e tutti gli accorgimenti necessari per l'ADC, tuttavia permangono ancora piccoli problemi, che spero di risolvere in questo fine settimana; nel caso ti dirò cosa provare. Intanto fai una ricerca sui filtri RF, alcuni schemi sono abbastanza facili da replicare.

Grazie Michele, proverò ad effettuare le misurazioni con l'oscilloscopio.
I canali ADC vanno spenti via software? È opportuno inserire resistenze di pull-down sugli ingressi non utilizzati?
L'RF è una gran brutta bestia...si intrufola veramente ovunque.
Ciao

Se hai l'oscilloscopio sei notevolmente agevolato, comincia a sondare l'alimentazione esterna, poi prova direttamente sul pin Avcc e sul pin ARef di Arduino, e sul pin di ingresso del TMP, una volta localizzati i bordelli puoi iniziare un lavoro specifico.
In setup aggiungi:
DIDR0 = 0b00111111;
in tal modo spegni tutta la parte digitale collegata ai pin analogici.

Rieccomi qui...allora ho provato con un contenitore metallico...nulla, schermando il guscio del sensore...nulla, inserendo il cond sull'AREF...nulla, spegnendo i pin digitali...nulla, scartando le prime 4 letture del sensore intervallate di 50ms....nulla....tutte le prove in varie combinazioni e anche tutte insieme....risultato....BUTTO TUTTO...mi arrendo!
Ciao

Più che buttare via tutto, butta via i sensori analogici e monta qualcosa a bus. Un DS18B20 o qualsiasi altro.

Oppure un ATmega in stand-alone, montato vicinissimo allo LM35 e poi spedisci il valore all'Arduino UNO su seriale RS232 o I2C.

Non è difficile.