Electrónica y programación para Microcontroladores.

Libros técnicos para electrónica programable.

Email
Contactanos en:

consultas@firtec.com.ar

Arduino

Si se estira una tira de metal conductor, se volverá más delgada y más larga, ambos cambios resultan en un aumento de la resistencia eléctrica de un extremo a otro. Por el contrario, si una tira de metal conductor se coloca bajo fuerza de compresión (sin pandeo), se ensanchará y acortará. Si estas tensiones se mantienen dentro del límite elástico de la tira de metal (de modo que la tira no se deforme permanentemente), la tira se puede utilizar como elemento de medición de la fuerza física, es decir que la cantidad de fuerza aplicada se puede conocer al medir el cambio resistencia eléctrica.
La mayoría de estos sensores son bastante pequeños apenas unos milímetros montados sobre un brazo metálico  que es el que recibe la fuerza física, su aspecto es como el mostrado en la imagen, observe que tiene una flecha indicadora de hacia donde se debe ejercer la fuerza a medir.

Las resistencias típicas de estas celdas de carga oscilan entre 30 Ω y 3 kΩ (sin tensión). Esta resistencia puede cambiar sólo una pequeña fracción de un porcentaje para todo el rango de fuerza, dadas las limitaciones impuestas por los límites elásticos del material de la propia celada. Fuerzas lo suficientemente grandes como para inducir cambios de resistencia mayores deformarían permanentemente el material de la celda y / o los propios conductores del sensor, arruinando así el dispositivo de medición. Por lo tanto, para utilizar la galga extensiométricas como un instrumento práctico, debemos medir cambios extremadamente pequeños en la resistencia con alta precisión.
Una precisión tan exigente requiere un circuito de medición puente. A diferencia del puente de Wheatstone para mantener un estado de equilibrio, un circuito puente para celdas de carga indica la deformación medida por el grado de desequilibrio en una de sus resistencias y utiliza un voltímetro de precisión en el centro del puente para proporcionar una medición precisa de ese desequilibrio. Es normal hablar de un conversor de 24 bits como mínimo para poder medir estas pequeñas variaciones eléctricas en el puente.
Uno de los problemas con los puentes para celdas de cargas son las variaciones de temperatura, es por esto que normalmente un puente para celdas de carga tienen mínimo dos a cuatro celdas para compensar estos corrimientos por temperatura.
La temperatura actúa sobre todos los elementos del puente por lo tanto su efecto es despreciable.


Interfaz de celda de carga HX711.

Este módulo es una interfaz entre las celdas de carga y el procesador, permitiendo poder leer el peso de manera sencilla. Internamente se encarga de la lectura del puente wheatstone formado por la celda de carga, convirtiendo la lectura analógica a digital con su conversor A/D interno de 24 bits.
Es muy utilizado en procesos industriales, sistemas de medición automatizada e industria médica.
Se comunica mediante 2 pines (Clock y Data) de forma serial.

Ejemplo de uso con Raspberry PI. 
En el siguiente ejemplo vamos a leer el peso colocado en una celda de carga con capacidad de medir hasta 10Kg sin embargo como se puede ver, podemos discriminar gramos sin ningún problema.

La precisión puede ser ajustada para lecturas mas exactas sin embargo como ejemplo de funcionamiento consideramos que es mas que suficiente.
El código está escrito para Python 3 y es el siguiente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/env python3
import RPi.GPIO as GPIO  # importa GPIO
from hx711 import HX711  # importa la clase HX711
GPIO.setwarnings(False)  # elimina los warnings
 
try:
    GPIO.setmode(GPIO.BCM)  # Pines GPIO en numeración BCM
    # Crea un objeto hx que represente el chip HX711 real
    # Los parámetros de entrada obligatorios son solo 'Pin_Dato' y 'PD_sck'
    hx = HX711(dout_pin=21, pd_sck_pin=20)
    # Medir la tara y guardar el valor como compensación para el canal actual
    # y ganancia seleccionada. Eso significa canal A y ganancia 128
    err = hx.zero()
    # Verifica si todo está correcto
    if err:
        raise ValueError('La tara no se puede definir.')
 
    reading = hx.get_raw_data_mean()
    if reading:     # Verificar si el valor correcto 
                    # ahora el valor está cerca de 0
        print('Datos restados por compensación pero todavía no convertidos a unidades:',
              reading)
    else:
        print('Dato invalido', reading)
 
    # Para calcular la tasa de conversión a algunas unidades, en en este caso gramos,
    # Se debe partir de un peso conocido para ajustar.
    input('Coloque un peso conocido en la balanza y luego presione Enter')
    reading = hx.get_data_mean()
    if reading:
        print('Valor medio de HX711 restado para compensar:', reading)
        known_weight_grams = input(
            'Escriba cuántos gramos eran y presiona Enter: ')
        try:
            value = float(known_weight_grams)
            print(value, 'gramos')
        except ValueError:
            print('Entero o flotante esperado y tengo:',
                  known_weight_grams)
 
       
        # establecer la relación de escala para un canal en particular y una ganancia
        # utilizada para calcular la conversión a unidades. El argumento requerido es solo
        # una relación de escala. Sin argumentos 'canal' y 'ganancia_A' establece
        # la relación entre el canal actual y la ganancia.
        ratio = reading / value   # calcular la relación para el canal A y la ganancia 128
        hx.set_scale_ratio(ratio) # Determina la proporción para el canal actual
        print('Relación de peso establecida.')
    else:
        raise ValueError('No se puede calcular el valor medio . ERROR', reading)
 
    # Leer datos varias veces y devolver el valor medio
    # restado por compensación y escalado a las 
    # unidades deseadas. En este caso en gramos.
    print("Ahora, leeré datos en un bucle infinito. Para salir presione 'CTRL + C'")
    input('Presione Enter para comenzar a leer')
    #print('El peso actual en la balanza en gramos es: ')
    while True:
        print("El peso actual en gramos es de %.2f" % (hx.get_weight_mean(20)))
 
except (KeyboardInterrupt, SystemExit):
    print('Chau :)')
 
finally:
    GPIO.cleanup()

Archivos disponibles para su descarga en el siguiente link.