Amplificateur de pont de Wheatstone HX711
Matériel testé : HX711 de chez Sparkfun, ou modèles bon marché.
Bibliothèque pour Python (au choix) :
Ce composant permet d’amplifier la tension de sortie d’un pont de Wheatstone (typiquement un pont complet de jauge d’extensométrie).
Principales fonctionnalités :
- Convertisseur A-N 24 bits
- Sortie numérique,
- Fonctions de tarage,
- Gain variable (64 ou 128),
- Échelle ajustable,
- Extinction/allumage (pour optimiser la consommation électrique)
- …
Câblage

Programme
D’après https://github.com/tatobari/hx711py
class HX711:
def __init__(self, dout, pd_sck, gain=128):
self.PD_SCK = pd_sck
self.DOUT = dout
GPIO.setmode(GPIO.BCM)
GPIO.setup(self.PD_SCK, GPIO.OUT)
GPIO.setup(self.DOUT, GPIO.IN)
self.GAIN = 0
self.REFERENCE_UNIT = 1 # The value returned by the hx711 that corresponds to your reference unit AFTER dividing by the SCALE.
self.OFFSET = 1
self.lastVal = 0
self.LSByte = [2, -1, -1]
self.MSByte = [0, 3, 1]
self.MSBit = [0, 8, 1]
self.LSBit = [7, -1, -1]
self.byte_range_values = self.LSByte
self.bit_range_values = self.MSBit
self.set_gain(gain)
time.sleep(1)
def is_ready(self):
return GPIO.input(self.DOUT) == 0
def set_gain(self, gain):
if gain is 128:
self.GAIN = 1
elif gain is 64:
self.GAIN = 3
elif gain is 32:
self.GAIN = 2
GPIO.output(self.PD_SCK, False)
self.read()
def createBoolList(self, size=8):
ret = []
for i in range(size):
ret.append(False)
return ret
def read(self):
while not self.is_ready():
#print("WAITING")
pass
dataBits = [self.createBoolList(), self.createBoolList(), self.createBoolList()]
dataBytes = [0x0] * 4
for j in range(self.byte_range_values[0], self.byte_range_values[1], self.byte_range_values[2]):
for i in range(self.bit_range_values[0], self.bit_range_values[1], self.bit_range_values[2]):
GPIO.output(self.PD_SCK, True)
dataBits[j][i] = GPIO.input(self.DOUT)
GPIO.output(self.PD_SCK, False)
dataBytes[j] = numpy.packbits(numpy.uint8(dataBits[j]))
#set channel and gain factor for next reading
for i in range(self.GAIN):
GPIO.output(self.PD_SCK, True)
GPIO.output(self.PD_SCK, False)
#check for all 1
#if all(item is True for item in dataBits[0]):
# return long(self.lastVal)
dataBytes[2] ^= 0x80
return dataBytes
def get_binary_string(self):
binary_format = "{0:b}"
np_arr8 = self.read_np_arr8()
binary_string = ""
for i in range(4):
# binary_segment = binary_format.format(np_arr8[i])
binary_segment = format(np_arr8[i], '#010b')
binary_string += binary_segment + " "
return binary_string
def get_np_arr8_string(self):
np_arr8 = self.read_np_arr8()
np_arr8_string = "[";
comma = ", "
for i in range(4):
if i is 3:
comma = ""
np_arr8_string += str(np_arr8[i]) + comma
np_arr8_string += "]";
return np_arr8_string
def read_np_arr8(self):
dataBytes = self.read()
np_arr8 = numpy.uint8(dataBytes)
return np_arr8
def read_long(self):
np_arr8 = self.read_np_arr8()
np_arr32 = np_arr8.view('uint32')
self.lastVal = np_arr32
return int(self.lastVal)
def read_average(self, times=3):
values = 0
for i in range(times):
values += self.read_long()
return values / times
def get_value(self, times=3):
return self.read_average(times) - self.OFFSET
def get_weight(self, times=3):
value = self.get_value(times)
value = value / self.REFERENCE_UNIT
return value
def tare(self, times=15):
# Backup REFERENCE_UNIT value
reference_unit = self.REFERENCE_UNIT
self.set_reference_unit(1)
value = self.read_average(times)
self.set_offset(value)
self.set_reference_unit(reference_unit)
def set_reading_format(self, byte_format="LSB", bit_format="MSB"):
if byte_format == "LSB":
self.byte_range_values = self.LSByte
elif byte_format == "MSB":
self.byte_range_values = self.MSByte
if bit_format == "LSB":
self.bit_range_values = self.LSBit
elif bit_format == "MSB":
self.bit_range_values = self.MSBit
def set_offset(self, offset):
self.OFFSET = offset
def set_reference_unit(self, reference_unit):
self.REFERENCE_UNIT = reference_unit
# HX711 datasheet states that setting the PDA_CLOCK pin on high for >60 microseconds would power off the chip.
# I used 100 microseconds, just in case.
# I've found it is good practice to reset the hx711 if it wasn't used for more than a few seconds.
def power_down(self):
GPIO.output(self.PD_SCK, False)
GPIO.output(self.PD_SCK, True)
time.sleep(0.0001)
def power_up(self):
GPIO.output(self.PD_SCK, False)
time.sleep(0.0001)
def reset(self):
self.power_down()
self.power_up()
