Pour réaliser un branchement, on m’a conseillé d’utiliser l’ADC TM7709, j’ai cherché sur le net la bibliothèque ou le codes relatifs à ce composant, j’ai trouvé un code dans lequel la référence TM7710 est utilisée au lieu de TM7709.
Voici le code que j’ai trouvé :
//TM7709 24bit ADC module arduino sketch
//coldtears electronics
//default connection arduino UNO
//DRDY = 11
//ADIO = 12
//SCLK = 13
#define TM7710_DRDY 3
#define TM7710_ADIO 4
#define TM7710_ADIO_OUT() DDRB|=1<<4
#define TM7710_ADIO_IN() DDRB&=~(1<<4)
#define Set_TM7710_SCLK() PORTB|=1<<5
#define Set_TM7710_ADIO() PORTB|=1<<4
#define Clr_TM7710_SCLK() PORTB&=~(1<<5)
#define Clr_TM7710_ADIO() PORTB&=~(1<<4)
unsigned char x[3];
long Result;
float vref=4.89;
void TM7710_start(void)
{
Clr_TM7710_ADIO();
delayMicroseconds(1);
Clr_TM7710_SCLK();
delayMicroseconds(1);
}
void TM7710_stop(void)
{
Clr_TM7710_ADIO();
delayMicroseconds(1);
Set_TM7710_SCLK();
delayMicroseconds(1);
Set_TM7710_ADIO();
delayMicroseconds(1);
}
void TM7710_write(unsigned char dd)
{
unsigned char i;
for(i=8;i>0;i--)
{
if(dd&0x80)
Set_TM7710_ADIO();
else
Clr_TM7710_ADIO();
delayMicroseconds(1);
Set_TM7710_SCLK();
delayMicroseconds(1);
Clr_TM7710_SCLK();
dd<<=1;
}
}
unsigned char TM7710_read(void)
{
unsigned char data=0,i;
for(i=0;i<8;i++)
{
Set_TM7710_SCLK();
data=data<<1;
if((PINB&(1<<TM7710_ADIO))==(1<<TM7710_ADIO))
{
data=data+1;
}
delayMicroseconds(1);
Clr_TM7710_SCLK();
delayMicroseconds(1);
}
return data;
}
void TM7710_Init()
{
TM7710_ADIO_OUT();
delay(100);
TM7710_stop();
TM7710_start();
TM7710_write(0xBF);
TM7710_write(0x20); //Gain=128
//TM7710_write(0x00); //Gain=16
TM7710_stop();
}
void setup()
{
DDRB|=1<<5 ;
delay(1000);
Serial.begin(57600);
Serial.println("TM7709 24bit ADC Module");
TM7710_Init();
}
void loop()
{
while((PINB&(1<<TM7710_DRDY))==(1<<TM7710_DRDY));
TM7710_start();
TM7710_write(0x7F);
TM7710_ADIO_IN();
for(unsigned char j=0;j<3;j++)
{
x[j]=TM7710_read();
}
TM7710_ADIO_OUT();
TM7710_stop();
Result=x[0];
Result = Result * 256;
Result = Result + x[1];
Result = Result * 256;
Result = Result + x[2];
Result = Result - 6912000;
double volt = Result * vref /16 / 6912000;
printFloat(volt,6);
Serial.println(" V ");
}
void printFloat(float value, int places) {
// this is used to cast digits
int digit;
float tens = 0.1;
int tenscount = 0;
int i;
float tempfloat = value;
// if value is negative, set tempfloat to the abs value
// make sure we round properly. this could use pow from
//<math.h>, but doesn't seem worth the import
// if this rounding step isn't here, the value 54.321 prints as
// calculate rounding term d: 0.5/pow(10,places)
float d = 0.5;
if (value < 0)
d *= -1.0;
// divide by ten for each decimal place
for (i = 0; i < places; i++)
d/= 10.0;
// this small addition, combined with truncation will round our
tempfloat += d;
if (value < 0)
tempfloat *= -1.0;
while ((tens * 10.0) <= tempfloat) {
tens *= 10.0;
tenscount += 1;
}
// write out the negative if needed
if (value < 0)
Serial.print('-');
if (tenscount == 0)
Serial.print(0, DEC);
for (i=0; i< tenscount; i++) {
digit = (int) (tempfloat/tens);
Serial.print(digit, DEC);
tempfloat = tempfloat - ((float)digit * tens);
tens /= 10.0;
}
// if no places after decimal, stop now and return
if (places <= 0)
return;
// otherwise, write the point and continue on
Serial.print('.');
for (i = 0; i < places; i++) {
tempfloat *= 10.0;
digit = (int) tempfloat;
Serial.print(digit,DEC);
// once written, subtract off that digit
tempfloat = tempfloat - (float) digit;
}
}
Et lorsque je voulais acheter le module je n’ai trouvé aucune trace de TM7709 ou de TM7710 sur le marché, par contre j’ai trouvé la référence TM7711.
Est-ce-que je peux utiliser le TM7711 au lieu de TM7710 ou TM7709 ? Sont-ils des modules identiques ou de même famille si on peut dire ça ?
Si la réponse est oui, est- ce-que je peux utiliser le code que j’ai mentionné (relatif à TM7710) avec le TM7711 ?
Basé sur la technologie brevetée d’Avia Semiconductor, le TM7711 est un convertisseur analogique-numérique (ADC) 24 bits de précision doté d’un capteur de température intégré conçu pour les balances de pesage et les applications de contrôle industriel permettant une interface directe avec un capteur en pont. Ce module utilise la puce TM7711 et convertit le changement de résistance en mesures de poids. Le TM7711 a un rapport de précision supérieur à celui du HX711. Tout ce dont vous avez besoin est un capteur de charge et un microcontrôleur pour créer votre propre balance numérique.
Il ressemble à un HX711 simplifié (une seule entrée différentielle, pas de circuit de'excitation, gain fixe)
Merci d'avoir répondu
justement auparavant on m'a proposer sur ce forum d'utiliser le HX711 pour pouvoir lire les mesures d'un pyranomètre, mais le problème que j'ai rencontré avec le HX711 est que les valeurs qui m'affichent sur le moniteur série sont sous forme d'un code hexadécimal que je dois convertir en tension, mais je n'ai pas compris comment le faire.
Du coup j'ai chercher encore sur le net et j'ai trouvé quelqu'un qui a réaliser le même branchement, mais il a utilisé l'ADC TM7710.
justement j'ai déja branché le HX711 avec le pyranomètre pour lire les mesures en utilisant le code suivant:
#include "HX711.h"
// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;
HX711 scale;
void setup() {
Serial.begin(57600);
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
}
void loop() {
if (scale.is_ready()) {
long reading = scale.read();
Serial.print("HX711 reading: ");
Serial.println(reading);
} else {
Serial.println("HX711 not found.");
}
delay(1000);
}
les valeurs qui m’affichent sur le moniteur série sont sous forme d’un code hexadécimal que je dois convertir en tension, pour ensuite diviser celle-ci sur la sensibilité du pyranomètre pour avoir la valeur du rayonnement solaire, mais je n’ai pas trouver de formule qui me permet de faire la conversion du code que j'ai obtenu en volte.
le pyranométre se comporte , pour le HX711 , a peu près comme un thermocouple ( et pour un pyranometre on n'a pas à faire de compensation de soudure froide, cest plus simple)
Mes essais d'exploitation d'un thermocouple avec un HX711 donnaient un résultat acceptable.
L'essentiel est de faire en sorte que les tensions sur les deux entrées analogiques aient une valeur en mode commun proche de VSS/2
C'est quand même dommage qu' @athcerr butte sur l'exploitation de la valeur fournie par le HX711 !
Oui , le HX711 (ou TM7711 dont je ne connaissais pas l'existence et que je vais commander qq ex)
est très versatile , je l'ai pas mal "torturé" dans différents domaines .
J'utilise (si c'est vraiment nécessaire) une méthode pas dés plus académique mis trés efficace pour drastiquement améliorer ses perfs au niveau bruit, je l'alimente avec une ref de tension MCP1541.. 4.096V)
le pyranomètre c'est un capteur de rayonnement solaire, le type que j'utilise a une sensibilité de 7 microVOLT / watt
la trace de cet échange c'était toujours moi, je me suis procurer le HX711 que vous m'aviez proposé je l'ai brancher comme le montre les figures en fichiers attachées (le + et le - du pyranomètre sont branchés aux broches A+ et A- du HX711 respectivement) et j'ai utilisé le code arduino fournie sur la librairie HX711
#include "HX711.h"
// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;
HX711 scale;
void setup() {
Serial.begin(57600);
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
}
void loop() {
if (scale.is_ready()) {
long reading = scale.read();
Serial.print("HX711 reading: ");
Serial.println(reading);
} else {
Serial.println("HX711 not found.");
}
delay(30000);
}
les valeurs entre 8949 et 8402 sont apparus lorsque j'ai couvert le pyranomètre (pas de rayonnement)
Mais je vais être franc avec vous, c'est mon premier projet en arduino et en électronique je n'ai pas trouver comment convertir ces valeurs en tension (je divise cette dernière par la sensibilité du pyranomètre pour avoir mon rayonnement équivalent)
d'ailleurs je n'ai pas compris ce que c'est VSS/2 !!
j'ai utilisé aussi le TM7711 que j'ai acheté dernièrement et j'ai aboutit au même résultat.
j'ai utilisé toutes mes connaissances et tout ce que vous m'avez proposer.
Mais je vais être franc avec vous, c’est mon premier projet en arduino et en électronique
conversion analogique/numérique, amplification différentielle..... c'est un projet qui nécessite un peu d'autoformation !!
Ce qui te fait défaut c'est quelques bases de conversion analogique/numérique
Un moteur de recherche te donnera des bons cours et tu y découvrira le principe de calcul d'une tension à partir du nombre issu de la conversion , du nombre de bits de celle ci et de la tension de référence
Apercu très rapide dans le cas du HX711 (lire sa notice technique) composant qui associe une amplification (128 de base) et une conversion analogique numérique
Vss/2 ? Vss étant la dénomination générique de la tension d'alimentation , VSS/2 est en quelque sorte le 'point milieu' Bourde !! Vss est la Masse , la tension d'alimentation est notée VDD !!
Le HX711 concu pour des ponts de Wheatstone, sait traiter les faibles écarts de tension entre les entrées, toutes les deux au voisinage de ce 'point milieu'
Si Vss vaut 5V et si les entrées INA+ et INA- dont toutes les deux à 2,5V, la sortie de la conversion donnera le nombre zéro ( écart nul en entrée -> nombre nul en sortie)
Si INA+ est à (2,5V + 20mV) et INA- à 2,5v -> écart de +20mV) l'amplification amènera en entrée du convertisseur la valeur (2,5V + 20mV *128) = 5V Valeur plafond.
Le nombre issu de la conversion sera si mes calculs sont bons égal à +2^23 (24 bits dont 1 bit de signe)
Si INA+ est à (2,5V - 20mV) et INA- à 2,5V -> écart de -20mV) l'amplification 128 amènera en entrée du convertisseur la valeur 2,5V -(20mV * 128) = 0 Valeur plancher.
Le nombre issu de la conversion sera -2^23.
Ensuite faire jouer la proportionalité entre tension et nombre issu de la conversion analogique numérique
Pour ce qui est du câblage j'ai un doute sur le tien qui ne fixe pas le potentiel des entrées INA+ et INA-
Je n'ai aucune idée du comportement du HX711 dans ce cas. Quand un pont de jauges est raccordé à un HX711 ses entrées INA+ et INA- sont toutes les deux proches de VSS/2 .
Merci beaucoup pour ces infirmations qui sont nouvelles pour moi, je vais chercher encore plus sur le net, en attendant d’éventuelles autres informations de la part de @Artouste qui dit qu'il maîtrise bien le HX711
Le capteur en question est-une thermopile donc la tension ne sera jamais négative.
La tension maximum ne devrait pas excéder 10mV
Under the assumption that the global broad-band solar irradiance does not exceed 1,400W/m2 (in both horizontal and tilted measurement positions) the signal level of the pyranometer output Voltage will remain below 10mV.
Comme la tension max est assez faible on peut utiliser le gain maximum du HX711. A noter que l'on sera limité à la moitié de la dynamique environ.
La datasheet du HX711 n'impose pas un mode commun de AVDD/2 (en reprenant la dénomination de la datasheet du HX7111). Il faut que celui-ci reste entre 1,2V et AVVD - 1,3V.
Le plus simple serait donc de fixer le potentiel de l'entrée INA- à AVDD/2 ou inférieur. On fait une calibration en masquant le capteur pour faire le zéro. La conversion se fait ensuite en prenant précisément en compte la tension de référence, le gain du HX711 et le coefficient de conversion du pyranomètre.
Si la dynamique de mesure devait dépasser les 1400w/m² il suffirait de réduire la tension de polarisation sur INA-.
Bonjour
Je ne suis pas le seul à jouer avec le HX711
voir par exemple la reponse de @fdufnews qui synthetise parfaitement le probleme
Reprend tes essais avec simplement un programme HX711 qui sors l'AD en RAW et permet l'affichage avec le traceur serie de l'IDE , çà permet déjà de faire une bonne approche.
// programme basique pour hx711 formatage serie pour faire du log timestamp et/ou sortie traceur IDE ARDUINO
#include "HX711.h"
uint8_t dataPin = 6;
uint8_t clockPin = 7;
HX711 scale; //gain par defaut 128
void setup() {
Serial.begin(115200);
Serial.println("LOG HX711 RAW");
// scale.power_up(); // pas d'excitation de pont
}
void loop() {
Serial.print(millis());
Serial.print(",");
Serial.println(scale.read()); // valeur brute AD
}
J'ai fais qq essais pour dériver çà avec un pont diviseur (potard 470K) de la ref de tension (4.096V MCP1541) qui me sert d'alim et je me suis rendu compte avec le DS que je cherchais à réinventer la poudre Le plus simple est simplement de connecter INA- à VBG (sortie bandgap 1.25V )
As tu essayé , Artouste , cette solution dans un cas où il faut injecter un petit courant dans le capteur (genre PT100) courant qui doit alors pouvoir entrer dans VBG ?
Pour cette manip avantage au HX711 sur le TM7711 qui est dépourvu de VBG et des autres bornes servant à câbler une petite alimentation régulée pour produire AVDD !!