credo di non chiedere nulla di molto nuovo in quanto vedo già un post:
Che ne tratta, tempo fa. Forse è stata trovata una soluzione diversa a questo. Ho una Mega 2560 ed alcuni sensori tutti alimentati a 3.3 Volts collegati al bus I2C. A dir il vero tutto sembra funzionare come si deve ma noto delle piccole anomalie. Ho scoperto girando su Internet che la Mega 2560 ha dei pull up su I2C attivabili da software che vanno su +5V, e visto che i miei sensori I2C sono alimentati su 3.3 Volts (ho dovuto aggiungere dei pull up che vanno su +3.3 Volts per funzionare), credo di avere quindi dei +5v che mi finsicono sulla linea di alimentazione a 3.3, passanti per i pull up aggiunti da me (quelli on board non andavano bene).
Per i +5V e per i +3.3V uso due piccoli step down in quanto la Arduino da sola non ce la avrebbe fatta a sopportare tutti i carichi. Mi risulta quindi che per sanare questa condizione di stress alla mia scheda, debbo dissaldare la resisteza accanto al led di On (allego immagine, è quello, corretto ?).
La mia comprensione del problema è confortata anche da questo post:
stefano_falconetti:
Vi risulta che si debba rimuovere quindi tale resistenza per evitare "reflussi" di +5V sulla linea a 3.3 ?
Le pull up interne del micro hanno come valore minimo 20k, oltre a non essere adatte come pull up per la I2C perché sono troppo alte il loro effetto è ininfluente su hai messo le corrette pull up per il 3.3V (non più di 1.5K).
Il vero problema è che con il micro alimentato a 5V l'I2C a 3.3V lavora fuori specifiche per il valore minimo del uno logico, anche se riesce a funzionare lo stesso per via delle ampie tolleranze basta poco per incorrere in errori di trasmissione, la soluzione è usare un level shifter per portare la I2C 3.3V a 5V.
1 Elettricamente non mi creano proplemi per il flusso di corrente da +5 a +3.3, perchè quelle presenti di pull up sono molto alte (per quanto non mi sembra un design pulito).
2 Il problema ce lo ho invece nella comunicazione I2C per i livelli di I e 0 logico che differiscono per I2C a 5 e 3.3. Quindi: o tolgo le pull up dissaldandole dalla Mega oppure uso un level shifter che mi adegui i livelli logici. A senso mi sembrerebbe più pulito mettere un adeguatore di livelli logici perchè questo mi consente di integrare sensori a 5 e 3.3 senza altri problemi. Se son sicuro però che userò solo quelli a 3.3, allora potrei dissaldare quelle on board e via, usando le pull up su 3.3. Domanda: non ho mai usato un level shifter su I2C: come lo collego sul bus ? Inoltre.. servirebbe bidirezionale, giusto ?
Hmmm, una cosa del genere (pin to pin pass through) ?
stefano_falconetti:
Quindi: o tolgo le pull up dissaldandole dalla Mega oppure uso un level shifter che mi adegui i livelli logici.
Non c'è nulla da dissaldare, le pull up sono interne al micro e si attivano/disattivano da software, una volta attivata la I2C basta che fai una digitalwrite(pin,LOW) su i due pin della I2C, non mi ricordo i loro numeri sulla MEGA2560, per disattivarle, comunque anche se le lasci attive non succede nulla.
Controlla il datasheet dei dispositivi I2C ci sono alcuni che nonstante l' aliemntazione a 3,3V reggono il bus a 5V.
Se non é cosí devi mettere dei Level Shifter. Per esempio un PCA9306 (purtroppo solo SMD) o schedina https://www.sparkfun.com/products/8745
Ok, grazie mille, si in effetti stavo vedendo il BMP180 e l' ADXL345, che sono quelli che per ora integro. Come level shifter comunque, uno me lo tengo nella cassetta degli attrezzi, è carino quello di Adafruit:
Quindi, se ho capito bene, del level shifter GND V High a GND Arduino, Vcc High ad Alim. Arduino 5V, Vcc Low 3.3 allo step down 3.3, SDA ed SCL Arduino agli SDA ed SCL lato V High del level shifter e TUTTI gli SDA ed SCL di tutti i sensori a 3.3 volts connessi agli SDA ed SCL lato V Low dello step down... per i due sensori userò la stessa uscita SDA/SCL lato V low dello step down. Eventualmente lato 3.3 volta dei pull up resistors come li ho oggi.
con un level shifter bidirezionale (quello di adafruit mi sembra ben fatto e piccolo), con due sensori sull' I2C noto a vista il rallentamento della comunicazione. A questo punto torno a vedere l' articolo di Varesano (http://www.varesano.net/blog/fabio/how-disable-internal-arduino-atmega-pullups-sda-and-scl-i2c-bus) e da software disabiliterei le pull up interne, così da stroncare le correnti che vanno da 5 a 3.3. Mi resterebbero però comunque altre due pull up che sulla 2560 sono anche esterne, NON SOLO nel chip, diabolico... che non posso disabilitare da software a meno di dissaldarle. A questo punto di nuovo il level shifter rimane la soluzione migliore, con la sua implicita lentezza... che barba. Idee ?
stefano_falconetti:
con un level shifter bidirezionale (quello di adafruit mi sembra ben fatto e piccolo), con due sensori sull' I2C noto a vista il rallentamento della comunicazione.
Quello che affermi è impossibile, la velocità di comunicazione è stabilita da SCL che a sua volta dipende da come lo imposti nel setup hardware della I2C, poi ovviamente c'è anche la frequenza con cui interroghi la I2C.
Il level shifter è solo un accorgimento hardware per cambiare le tensioni, non ha alcun effetto sulla velocità di comunicazione.
così da stroncare le correnti che vanno da 5 a 3.3. Mi resterebbero però comunque altre due pull up che sulla 2560 sono anche esterne, NON SOLO nel chip, diabolico... che non posso disabilitare da software a meno di dissaldarle. A questo punto di nuovo il level shifter rimane la soluzione migliore, con la sua implicita lentezza... che barba. Idee ?
Le pull up su SCL e SDA, presenti nella MEGA2560 (ho controllato lo schema) sono da 10k e sono ininfluenti sia che usi il level shifter sia che se hai aggiunto le corrette pull up per il 3.3V con connessione diretta ai sensori.
Quello che affermi è impossibile, la velocità di comunicazione è stabilita da SCL che a sua volta dipende da come lo imposti nel setup hardware della I2C, poi ovviamente c'è anche la frequenza con cui interroghi la I2C.
Il level shifter è solo un accorgimento hardware per cambiare le tensioni, non ha alcun effetto sulla velocità di comunicazione.
Grazie astrobeed, ne parlo perchè sul display i miei indicatori grafici a barra colorata mi sembrano davvero più lenti... poi mi chiedo, e premetto che so di non sapere, il level shifter avrà dei componenti che si attivano per soglia con un tempo di latenza nella risposta (ho un pezzo in più in mezzo) ? del resto recepisco la tua osservazione e la sua correttezza perchè sono solo due sensori... non molti. Dico di più: il BMP180 prima mi misurava una quota altimetrica corretta, ora sbarella un pochetto nelle stesse condizioni di misura.
Ok stasera ritorno al banco di lavoro e rifaccio le mie osservazioni, devo capire il rallentamento che osservo da dove viene. Quindi il level shifter a prescindere dal traffico sul bus I2C non può comportare rallentamenti nella comunicazione ?
stefano_falconetti:
Quindi il level shifter a prescindere dal traffico sul bus I2C non può comportare rallentamenti nella comunicazione ?
No, è solo una black box dove da una parte arriva una tensione di 5V e dall'altra ne esce una di 3.3V, e viceversa, ovviamente introduce una piccola latenza, poche decine di ns, tra i due lati, però è un valore costante, non cumulativo, che non ha alcuna influenza sul bus I2C.