Bonjour, je voudrais afficher la valeur de la température sur un écran oled. Le programme fonctionne parfaitement avec l'écran branché avec un câble branché d'environ 30 cm. J'ai déplacé l'écran à environ 1,3 m et l'affichage ne fonctionne plus et le programme s'arrête.
Les mesures ne sont plus rafraîchies dans le moniteur série j'ai vérifié le câble et c'est bon.
Le câble utilisé est un vieux usb, le montage a bien fonctionné pendant une heure puis d'un coup j'ai ce problème?
Merci de vos réponses. Le câble est bien blindé. Je voudrais déplacer l'afficheur d'environ 1,3m pas plus.
Si je déconnecte l'afficheur le rafraîchissement se remet à fonctionner normalement. Dans le cas ou il est branché j'essaye de retélécharger le programme et çà bloque aussi. C'est une carte uno. Ce montage a parfaitement fonctionné hier pendant une heure et d'un coup le problème est survenu? J'ai remis l'afficheur à coté avec une connexion de 30 cm et c'est repartit?
Le pullup devrait améliorer certainement à tester mais pourquoi tout allait bien et sans raison le programme gèle?
L'arduino se plante même si j'appuie sur la touche reset de la carte. Testé avec une autre carte et même problème? Mon câblage est bon, vérifié les tensions aux différents capteurs et les tensions 5 volt.
La durée serrait aléatoire mais je dois revérifier? J'ai aussi changé le câble de liaison et pareil. Dès que je rebranche sda et scl le rafraîchissement ne se fait plus dans le moniteur série et impossible de télécharger le programme comme si le port est occupé.
Les fils croisés peuvent améliorer mais je ne dois pas avoir de signaux parasites mais c'est effectivement un bus donc à voir? Merci
Je ne suis pas un spécialiste de l'implantation du protocole I2C, mais je pense que le micro est en attente d'un retour de l'esclave -> un acquiescement (acknoledge) qu'il ne comprend pas, les signaux étant trop déformés.
On reprend les bases.
Le transistor "collecteur ouvert" de l'I2C est un transistor qui fonctionne en émetteur commun.
Son impédance de sortie est égale à sa charge de collecteur, ce que vous appelez tous des "pull-up".
Quand il y a de la longueur de câble, il y a de la capacité induite entre fils et plus les fils sont long, plus il y a de capacité.
Cette capacité se charge au travers de la "résistance de pull-up" selon la règle classique d'un circuit RC.
La conséquence est que le temps de montée des signaux augmente et que le signal n'arrive plus à atteindre une amplitude suffisante.
Pourquoi cela fonctionne au début et pas après ?
Une explication peut être qu'à la mise sous tension cela passe rik et rak mais ça passe. Après quelque temps le montage chauffe, les seuils se décallent légèrement et cela ne passe plus.
Et si on raccourcit le câble, la capa étant plus faible, le produit RC est plus faible et le signal a le temps de monter.
Solutions.
Quand il y a trop de capacité, l'habitude est de diminuer la valeur de la résistance de charge (pull-up) pour travailler à constante de temps plus faible.
C'est une possibilité mais ce n'est pas la seule.
L'autre possibilité est de laisser le temps à cette capacité de se charger en diminuant la fréquence I2C.
J'ai déjà abordé cette possibilité dans ce post de décembre 2015.
Diminuer la valeur des résistances de charge (pull-up) a pour conséquence d'augmenter le courant dans les transistors, il faut faire attention à ne pas dépasser la limite indiquée par le constructeur, quand il l'indique ce qui n'est pas gagné.
Un mix des deux méthodes peut être testé.
Ne pas descendre en dessous de 1k -> attention s'il y a plusieurs modules I2C toutes les ""pull-up"" se retrouve en parallèle !
PS : il faut garder en tête que l'I2C a été conçue pour des liaisons sur une même carte de circuit imprimé avec des distances inférieures à 10 cm.
PS2 : J'ai supposé que tu utilisais une carte avr (Uno, nano).
Bonjour, merci très bien expliqué et entièrement d'accord avec ce raisonnement. J'ai bien pensé à ces effets de capacités lié à la longueur mais ce que je ne m'explique pas c'est pourquoi le programme tourne bien un moment? En effet on a l'impression qu'il attend le retour de l'info qui ne vient pas? Le fait de couper l'alimentation quelques secondes devrait vider la capacité induite dans le câble qui fait 1,5 m à tout casser? La montée en T° est vraiment insignifiante et je ne pense pas qu'elle influe sur les composants? Je m'applique ce matin à refaire quelques essais. Bonne journée
Dans un microcontroleur il y a des références de tension.
C’est a partir de ces références que l’électronique décide si le signal reçu est un niveau bas, soit un 0 logique, soit un niveau haut, soit un 1 logique.
Une remarque : si tu as un micro d’architecture avr le seuil pour un digitalRead est autour de Vcc/2. Sauf pour l’I2C où ce sont des niveaux normalisés CMOS, soit niveau bas < 0,3 Vcc et niveau haut > 0,7 Vcc.
Pour moi il est tout a fait possible que ce seuil de 0,7 Vcc change légèrement avec la température.
J’imagine parfaitement que pour respecter les 0,7 Vcc ”à chaud”, le seuil soit de 0,6 Vcc ”à froid”.
A froid tu as l’impression que cela fonctionne alors tu es déjà hors specification.
Mais comme cela fonctionne tu ne te poses pas de questions.
Ce qui passait rik et rak à la mise sous tension fini par ne plus passer.