Go Down

Topic: BUS I2C (Read 983 times) previous topic - next topic

nono63

Bonjour tout le monde!

J'aimerai savoir s'il est possible avec un master reader/salve write d'envoyer depuis le salve un tableau de float à travers le bus I2C ? Si oui comment faire je n'arrive pas à adapter le programme, exemple disponible sur le site d'Arduino : https://www.arduino.cc/en/Tutorial/MasterReader

Merci d'avance !

 

bricoleau

#1
Feb 09, 2017, 01:28 pm Last Edit: Feb 09, 2017, 01:31 pm by bricoleau
Oui sauf qu'il me semble qu'en standard la bibliothèque Wire limite les trames à 32 octets maximum, ce qui correspond à la taille de son buffer interne alloué de manière statique.
Donc un tableau de float serait limité à 8 occurrences.

NB : côté esclave I2C, si le float provient lui-même d'un calcul effectué sur des données plus petites, il serait plus judicieux de les transmettre directement sans calcul.

Exemple type : une sonde de température DS18B20, qui donne la température en binaire sur deux octets (= exprimée en nombre entier de seizièmes de degrés), il est dommage de convertir cette température en float car cela prend deux fois plus de places. La conversion en float n'est utile qu'au moment où on veut afficher la valeur de manière compréhensible par un oeil humain.
Idem si le float provient d'un calcul basé sur un analogRead.
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

bricoleau

Je suis désolé, mais je vais à nouveau émettre un avis contradictoire.

D'après ce qu'il m'a semblé voir en soulevant le capôt de la bibliothèque Wire.h, l'émission côté maître s'appuie également sur un buffer interne limité à 32 octets.

Wire.beginTransmission() se borne à mémoriser en RAM l'adresse de l'esclave, et à réinitialiser le buffer. Aucune action sur le bus I2C à ce niveau

Wire.write() remplit le buffer. Toujours aucune action sur le bus I2C à ce niveau

Wire.endTransmission() déclenche toutes les actions sur le bus I2C, à partir de ce qui a été stocké en RAM préalablement, et retourne un code qui indique si la transmission s'est bien passée.

Me gourre-je ?
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

nono63

Bonjour,

Merci beaucoup pour vos réponses. Pour préciser un peu les donnés du problèmes, j'ai n'ai que 10 float maximum à envoyer :)
Je vais essayer tout cela se soir ou demain !

Merci encore !

bricoleau

10 float ça fait 40 octets donc tros gros pour un envoi en une seule fois.

Question en rapport avec mon NB du #2 : d'où proviennent ces float? que contiennent-ils ? de quel calcul sont-ils issus ?
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

nono63

Les float proviennent de différents capteurs pour mesurer la concentrations de certains composants atmosphériques, certains capteurs sont issus de laboratoire de recherche, donc parfois ce sont des tensions qui serons analysées après, et d'autres donnent directement les concentrations en ppm avec des degrés de précision différents ! voilà :)

bricoleau

Et bien si c'est une tension, ça veut dire qu'à l'origine tu fais une mesure avec un convertisseur analogique - numérique qui te donne un résultat brut en binaire.

Par exemple un analogRead() sur une IO arduino donne un résultat brut sur 10 bits, compris entre 0 et 1023.

C'est une grandeur discrète qui n'admet que 1024 valeurs distinctes.

A ce stade, il n'y a aucun intérêt à le convertir tout de suite en tension valorisée dans un float. Ca bouffe le triple de place pour rien.

Tu peux conserver ta mesure brute stockée et remontée sur le bus I2C sur 2 octets sans t'embêter, ou même juste 10 bits (soit 4 mesures dans 5 octets).

Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

nono63

Oui toute à fait mais les autres capteurs ne sont pas analogique malheureusement ^^
Je pense qu'il y a une erreur dans le programme de _pepe_ pour le maître pour un tableau de 50 float p n'est pas déclaré je suppose qu'il s'agit du pointeur prec mais cela ne marche quand même :s

Go Up