balance 3axes

Bonjour à tous,

Je voudrais réaliser une balance 3axes avec une arduino uno, une INA125 et des jauges d'extensiometrie en pont de wheastone.
Je m'inspire de ceci: http://cerulean.dk/words/?page_id=42
Pour limiter la conso, j'envisage d'exciter successivement les trois pont et mesurer la microdef sur une seule INA125, (voir mon schémas).
Avant de me lancer, j'aurais aimé avoir votre avis.

shemas.png

Bonjour

Supposons réglé le problême du collage des jauges....

Les ponts de Wheatstone vont se géner avec cette mise en parallèle !!!
Il est déjà difficile de récupérer la faible tension différentielle d'un pont, si en plus il y a des résistances en parallèle je crains qu'il n'y ait plus grand chose d'intéressant à mesurer.
Le fait de ne pas exciter 2 des ponts ne supprime pas la perturbation, les résistances sont toujours là en parallèle avec celles du pont actif qui aura du mal à s'exprimer !!

A mon avis il est impératif de séparer les ponts :
-en mettant un ampli d'instrumentation par pont,
-ou en prenant un bon convertisseur Analogique Numérique possédant les 3 entrées différentielles,
-ou en interposant un multiplexeur analogique entre ponts et Ampli unique

Exemple (parmi d'autres) de convertisseur utilisable : le MCP3424 de Microchip, 18bits, bus I2C, 4 entrées différentielles. http://jeelabs.net/projects/hardware/wiki/Analog_Plug

MCP3424.jpg

Je m'en doutais un peu.
Merci pour le lien, c'est une bonne solution.
Cependant,

  • il me semble que sur arduino, I2c est en 5v. :fearful:
  • Je suis donc obligé d'exciter les 3 ponts en permanence? ]:slight_smile:

-Les ponts peuvent etre excités sous 5V l'un après l'autre en les reliant chacun à une sortie numérique.
-Si le convertisseur est comme le MCP3424 (5V ou 3,3V) il n'y a pas de probleme. Tout peut être sous 5V

En voilà des nouvelles qu'elles sont bonnes!
Il n'y a plusqu'à!
Merci encore, et @+, quand le montage sera prêt!

-Si le convertisseur est comme le MCP3424 (5V ou 3,3V) il n'y a pas de probleme. Tout peut être sous 5V

et pourtant, je lis à http://jeelabs.net/projects/hardware/wiki/Analog_Plug:

An I2C bus running at 3.3V is used for I/O,

Faut-il prévoir un convertisseur tel http://www.hobbytronics.co.uk/logic-level-converter ?
Ça me laisse perplexe. :cold_sweat:

Un peu plus bas sur ma même page on voit :

This plug can be operated at 5V as well as 3.3V.
This board uses the conventions of a JeePlug and can be used with the ports on a JeeNode. It can also be used with other boards and MCU's, if you hook it up properly and adapt the interface code for it.

En fait le schéma montre effectivement une totale adaptabilité au 5V car
-la puce le supporte,
-les résistances de tirage (pull-up) du bus I2C ne sont pas implantées.

schema.jpg

Ça y est, j'ai monté le machin sur mon arduino uno.
j'ai pompé sans tout bien comprendre:

#define analogPlug 0x68         // analogPlug I2C address

#include <Wire.h>
byte buffer[3];   // Array to store values 

void setup()
{
    Serial.begin(9600); 
    
    Wire.begin();
    wire.beginTransmission(analogplug);
    // Set analoogPlug settings
    // chanel1, continuous,18-bit, gain x1
    wire.send(0x1c);
    wire.endTransmission();
}

void loop()
{
    // Read the analogPlug

    Wire.beginTransmission(analogPlug);
    Wire.requestFrom(analogPlug,3); // Read 3 bytes 18-bit
    i = 0;
    while(Wire.available())
    {
        buffer[i] = Wire.receive();
        i++;
    }
    Wire.endTransmission();

    //Combine bytes into integer
    long value = (long) buffer[0] << 16 | buffer[1] << 8 | buffer[2];
    long uvolt = round(value * 2048/131.072);
    // Print out what we have
    Serial.println(uvolt/10);
    delay(400);             // wait for a second   
}

résultat: avec une vieille pile de1.5v, j'obtiens 147871, ce qui colle assez bien avec mon multimetre.
en court circuit, j'ai un beau 0
mais en mettant la même pile à l'envers, tuedieux! j'ai -45312!
j'essaie de comprendre avec le MSB, mais surtout, je n'ai pas encore bien compris pourquoi cette ligne:

uvolt = round(value * 2048/131.072);

sans aide, peut-être que j'y arriverais, mais un petit coup de main n'est-ce-pas....

Ce convertisseur travaille içi sur 17 bits de valeur absolue (FAUX) et un bit MSB de signe ("18bits")

2 puissance 17 = 131 072 (nombre de valeurs absolues possibles)
La réference de tension interne (précision 0,05 %) est 2,048V ou 2048 mV (pleine échelle en volts)

Le rapport 2048/131,072 permet donc d'afficher une valeur en µV

Merci, c'est lumineux! 8)

En toute rigueur, avec 17 bits, la valeur max est 131071?
pour le signe et le msb, Pas de soucis.

par contre, nouvelle surprise, quand je branche correctement ma pile, j'obtiens:
0101101010000101010110 1483094
bien, et en inversant la polarité
1110000100000000100001 -1589281
:roll_eyes:

0.1V, ça me fait un peu de peine!

mode 'pinaillage' ON

En toute rigueur, avec 17 bits, la valeur max est 131071?

Oui? Et avec la valeur zéro in a 131072 "valeurs possibles " !!
mode 'pinaillage' OFF

100mV d'erreur pour un circuit ayant 1µV de résolution c'est effectivement dérangeant !!!
Je possède cette petite carte mais ne l'ai pas encore testée. Il faut trouver la cause et 'débugger" !!
je n'ai pas le temps en ce moment . Il faudrait vérifier dans la doc du convertisseur comment sont codés les nombres négatifs et voir si le programme de JCW respecte bien ce codage.
J'ai écrit hier un peu vite et sans vérifier '17bits de valeur absolue'..... :blush: A vérifier, c'est douteux !!

CORRECTION : nombres négatifs codés en 'complément à 2' !!

complément à 2.jpg

conversion.jpg

mode 'pinaillage' OFF

Bon, c'était juste pour ma compréhension. C'est à la notion de "valeurs possibles" qu'il faut que je réfléchisse, plutôt que valeur max?

C'est peut-être (sans doute) mon adaptation du code de JCW qui est en cause, mais il semble que celui-ci ne fait aucun effort pour connaître la polarité. Dans certains cas, ça peut être sans intérêt, mais pour mes ponts de jauges, j'ai besoin de la mesure signée.

Il faudrait vérifier dans la doc du convertisseur comment sont codés les nombres négatifs

c'est le MSB: 1-> négatif 0->positif
0101101010000101010110 1483094
1110000100000000100001 -1589281

Enfin, si j'ai bien compris. C'est peut-être un peu plus compliqué!?

1 11111111111111111 ce que donne le circuit pour -1
11111111111111111 on laisse le bit de signe
00000000000000000 on inverse chaque bit
00000000000000001 on ajoute 1

Il faut faire ce travail pour récupérer la valeur absolue d'un nombre négatif.
C'est un codage fréquent pour les convertisseurs analogique/numérique ou numérique/analogique
Avec ce codage le nombre zéro n'esiste pas en deux exemplaires +0 et -0
De plus de manière paradoxale ça simplifie les opération arithmétiques en binaire.

Oui, bon, je galère:

j'ai compris :. et corrigé mon code en fonction de tes conseils, al1fch:

    int i = 0;
    while(Wire.available())
    {
        buffer[i] = Wire.receive();
        i++;
    }
    Wire.endTransmission();
   //Combine bytes into integer
    int signe = 1;
    long value = (long) buffer[0] << 16 | buffer[1] << 8 | buffer[2];
    if (bitRead(value,17) == 1)  //c'est négatif
    {
      bitWrite(value,17,0);// on laisse le bit de signe
     //!! avec bitWrite(value,16,0), ca regle le probleme, du moins avec ma pile, mais bon!
      signe = -1;
      value = ~ value;//on inverse chaque bit
    }

bon, j'ai pas encore ajouté 1 (mode 'pinaillage' OFF)
Vous ne pensez pas que la méthode de récupération de la valeur est peut-être en cause?

Je crois tout simplement que ce qui est en cause c'est les specs du MCP : http://ww1.microchip.com/downloads/en/DeviceDoc/22088c.pdf

Tension minimale : Vss - 0.3 donc si tu lui envois -1.5V c'est un peu normal que ça bug ...

B@tto : Vss-03 c'est la limite de tension entre une entrée et la masse.
La tension négative que patsol applique est branchée au niveau des entrées différentielles du convertisseur, pas par rapport à la masse. Ce convertisseur, alimenté en 3,3V ou en 5V peut tout à fait mesurer des tensions entre -2,048V et +2,048V (tensions toujours positives par rapport à la masse)

Bonjour,

J'ai refait les tests en paramettrant sur 16 bits, je récupère un entier et là, miracle, ça va seul.
C'est pas satisfaisant sur le fond (j'ai vraiment pas tout compris) mais ça convient pour mon application.
Voilà, je vais pouvoir brancher mes ponts comme ça, avec un gain à 8x

Merci encore pour votre aide.