Longueur maximale du câble entre un arduino uno et un écran oled?

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 votre aide

Bonsoir pierre34700

C'est un affichage i2C?

C'est étonnant.
Si tu déconnectes complétement ton affichage OLED, est ce que les données se rafraîchissent à nouveau?

A quelle distance tu veux aller?

Tu peux essayer avec des PULLUP sur le bus i2C
image

Cordialement
jpbbricole

Bonjour,

Est ce que sa câble est équipé d'un blindage ?
(Tresse de fil autour des différentes paire de fils)
Si oui, le blindage est il bien brancher ?

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?

Bonsoir pierre34700

1,30m est dans le domaine du possible. A cette distance je ne pense pas que le blindage soit nécessaire, mais un câble avec des fils torsadés, oui.

D'après ce que dit, il semblerai que ton Arduino se plante :face_with_diagonal_mouth:

c'est régulièrement une heure ou le temps est aléatoire?
Est ce que le GND est bien câblé entre l'Arduino et l'OLED?

A+
Bonne soirée.
jpbbricole

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

Il reste à essayer les pullup.

Bonne nuit.
jpbbricole

Bonsoir,

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).

Visible et dans la racine du forum francophone

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

On parle un peu dans le vide pour l'instant.
On pourrait avoir un schéma et un code pour savoir de quoi il est question.

Bonjour pierre34700

Tu as quel affichage et quelle bibliothèque?

J'ai fait des essais avec le classique:
image

et les bibliothèques:

#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"

Je peux interrompre le bus i2C en coupant SDL ou SDA ou les deux, sans que mon programme ne se bloque.

Cordialement
jpbbricole

Non, pour moi c’est un problème de thermique.

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.

Merci fdufnews, hier soir je ne voyais plus rien.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.