Sensor de força amb arduinos i Phyphox

No sé si alguna vegada us heu preguntat com és per dins una balança electrònica de cuina? Quina mena de “molla” te per mesurar el pes dels aliments?. Jo no hi havia pensat en això mai fins que vaig veure un argentí a Youtube arreglant una (i netejant-la!).

El que fallava a la balança era un polsador, però en el que me vaig fixar és en la peça metàl·lica que hi feia de molla, en el que s’anomena cèl·lula de càrrega (load cell). Una cèl·lula de càrrega (en el cas de la foto de sota de biga o flexió) és un sensor dissenyat per mesurar forces o pesos i convertir-los en un senyal elèctric.

Balança amb la tapa aixecada en la que es veu la cèl·lula de càrrega

En aquesta entrada us parlaré, doncs, d’aquestes cèl·lules i com les podem fer servir per construir un sensor de força que enviï les dades a l’aplicació Phyphox del nostre telèfon mòbil:

  1. Mesurar forces al laboratori
    1. El muntatge
    2. El projecte
    3. L’experimentació

En la majoria dels casos, una cèl·lula de càrrega utilitza galgues extensomètriques (strain gauges) enganxades a un cos metàl·lic (la barra d’alumini foradada). Quan s’aplica una força a la barra el metall es deforma lleugerament, les galgues que estan pegades al metall s’estiren o encongeixen canviant la seva resistència elèctrica i aquest canvi es converteix en un senyal elèctric proporcional al pes o força aplicada.

Dues galgues extensomètriques enganxades a la cèl·lula.

Per mesurar la variació de voltatge de les galgues extensomètriques normalment s’utilitzen quatre formant un pont de Wheatstone. En els dos diagrames de sota es mostra com es col·loquen les galgues extensomètriques en la cèl·lula de càrrega i com es fiquen formant un pont de Wheatstone.

Diagrama d’una cèl·lula de càrrega amb la localització de les quatre galgues extensomètriques
Pont de Wheatstone amb les quatre galgues extensomètriques

Per ampliar coneixement sobre les cèl·lules de càrrega podeu acudir a la web d’Sparkfun, que és una botiga d’electrònica nord-americana amb moltes coses per arduinos.

Mesurar forces al laboratori

Una vegada aquí, com podem fer servir les cèl·lules de càrrega per mesurar forces i pesos i enregistrar les seves variacions?. Penso en tres maneres diferents, de les que aprofundiré en la tercera:

  • La primera és la que hem fer servir tota la vida: utilitzar una balança de laboratori barata (en les analítiques la “molla” és un electroimant) o de cuina electrònica per pesar substàncies i objectes i anar apuntant el seus valors.
  • La segona és la d’aprofitar una balança de cuina connectant la seva cèl·lula (o cèl·lules) de càrrega a través d’un arduino o esp32 a l’ordinador o al mòbil i recollir els valors del pes que ens vagi subministrant la balança (comentaré alguna cosa més al final de l’entrada).
  • La tercera seria la de treure la cèl·lula de càrrega de la balança o, millor, la de comprar una i utilitzar-la per muntat un sensor de força.

El muntatge

Es poden comprar cèl·lules de càrrega que permetin mesurar diferents quantitats de pes, des de 100 g fins a 200 kg. Jo me decanto per les d’un quilogram per fer el nostre sensor de força. Com que el voltatge que subministren els cèl·lules és molt baix es necessita comprar simultàniament l’amplificador HX711 o similar per tal d’intercalar-lo entre la cèl·lula i la placa Arduino o esp32 que utilitzem. Es poden comprar simultàniament per internet en les botigues d’electrònica a preus prou assequibles (menys de 5 € les dues peces).

El rang de voltatge operatiu típic del HX711 és de 2.6V a 5.5V, cosa que el fa adequat per a voltatges de 3.3V i 5V, és a dir, tant per Arduino com per esp32. Com amplificador per al sensor de força té la interessant funció de TARE que permet restar el pes del contenidor o l’estructura de suport, ficant el sistema a zero.

Una vegada el material a les vostres mans convé soldar la cèl·lula de càrrega i/o les potetes (tira de capçal, pin header strip) a l’amplificador HX711 com s’indica en el diagrama de sota o com es veu en la foto del que jo he fet:

Esquema de connexions. La placa del dibuix és una concreta però va bé qualsevol esp32. L’interruptor de corrent és opcional.

A l’entrada del HX711 he soldat els cables de la cèl·lula de càrrega i a la sortida he soldat les potetes que després he punxat a placa de proves (protoboard) per poder connectar-la amb cables pont (dupont) a la targeta esp32.

Sobre com soldar us podeu mirar les pàgines web d’Adafruit en les que l’expliquen molt bé. Bàsicament el tranquil està en punxat les tires de capçals en una placa de proves i col·locar damunt la placa a la que es volen soldar

Per a processar els voltatges que proporciona l’amplificador HX711 es pot utilitzar un microcontrolador Arduino, però en aquest cas se li ha d’afegir un Bluetooth si es volen enviar les dades inalàmbricament, o bé resignar-se a veure els valors obtinguts només a l’ordinador amb l’arduino connectat per cable. En aquests moments és preferible comprar qualsevol esp32, que som molt més potents, tenen incorporada la connexió wifi i Bluetooth i tenen un preu fins i tot inferior.

El sensor es pot subjectar d’una manera simple com es mostren les fotos de sota, però també es pot construir un recipient amb una impressora 3D  i incloure tot dins de manera que quedi recollit com els sensors comercials, com es veu en les fotos que segueixen. HeiLaut, autor del projecte que us proposo modificat, també fica a disposició de tothom en github els arxius necessaris per imprimir la caixeta (que l’haureu de modificar si voleu que encaixi perfectament amb els vostres materials). Si convideu un cafè als companys de Tecnologia segur que us imprimiran les peces en 3D.

Una vegada connectat tot entre sí segons l’esquema de dalt, s’ha d’endollar a l’ordinador amb un cable usb. És possible que en connectar l’esp32 el reconegui directament el sistema operatiu, però també és possible que no perquè totes les plaques que tenen un esp32 no tenen el mateix controlador usb. En aquest últim cas heu de anar a l’administrador de dispositius i mirar en els ports COM als que el sistema no ha trobat els controladors (drivers) el nom que apareix i instal·lar el controlador corresponent (CP210x USB to UART bridge o USB SERIAL CH340)

El projecte

Ara s’ha de carregar el codi (l’sketch) al microprocessador mitjançant l’IDE d’arduino. L’IDE es pot utilitzar com programa descarregat a l’ordinador o en pàgina web (Arduino Cloud), però en aquest últim cas per anar bé s’ha de pagar.

Prèviament a carregar el codi s’ha de seleccionar la placa esp que utilitzem i el port COM al que s’ha connectat a l’ordinador. Si sabem el nom de la placa, la busquem. Si no sabem quina placa és es pot escollir la genèrica ESP32 DEV MODULE (o ESP32 S3, etc.). Si la placa és de l’empresa Arduino ja estarà contemplada en el gestor de plaques de l’IDE, però en cas contrari, que serà la major part de les vegades, s’han d’instal·lar les plaques esp32 d’Espresiff Systems.

Per a que l’IDE d’arduino pugui trobar a internet la informació de les plaques que porten l’esp32 d’Espresiff Systems se li ha d’indicar la direcció on es troba. Per això s’ha d’incloure la direcció https://dl.espressif.com/dl/package_esp32_index.json en Arxiu>Preferències>URLs addicionals de gestor de plaques, i acceptar.

El projecte (codi) a carregar en la placa podria ser més senzill que el que us proposo si només volguéssim veure els valors de força a través del monitor sèrie de l’IDE, però és molt més interessant recollir les dades en l’aplicació Phyphox del telèfon mòbil per tal de veure les seves variacions i poder analitzar-les en el propi telèfon o exportant-les a l’ordinador.

El projecte el podeu descarregar de sketch_sensor_fuerza_esp32_phyphox.ino i obrir-lo a l’ordinador o bé copiar el codi de sota i pegar-lo a l’IDE d’arduino. Després el carregareu a la placa connectada pitjant el botó de la fletxa, segon a l’esquerra de dalt.

Si us fixeu, el codi inclou les llibreries phyphoxBle.h (de RWTH per a la comunicació amb l’aplicació Phyphox via bluetooth) i HX711_ADC.h (d’Olav Kallhovd per a l’amplificador de senyal), així que prèviament s’han d’instal·lar al gestor de llibreries de l’IDE.

També inclou un factor de càlcul que en el meu cas és calFactor = 1119.22. Aquest factor és per calibrar el dispositiu que munteu, i que serà diferent en cada cas, així que haureu de calcular el vostre i substituir-lo en el codi. Per trobar el valor heu de carregar el codi amb qualsevol valor i mesurar el pes d’un objecte del qual coneixeu el seu valor, per exemple perquè l’heu mesurat en una altra balança.

Imagineu-vos que pengeu un cos de 100 g i la mesura en el vostre sensor de força dona 80 g. El quocient 80/100 l’haureu de multiplicar per 1119.22 i el resultat substituir-lo en el projecte.

/*Sensor de fuerza.
El código está adaptado de https://github.com/HeiLaut/ble-physics-sensors/tree/main/Force%20Sensor
bajo una licencia para el original del MIT https://github.com/HeiLaut/ble-physics-sensors/blob/main/LICENSE
Se necesita una celda de carga de 1 kg y el amplificador de señal Hx711.
También un microprocesador esp32 que incorpora bluetooth.
Se han de instalar las librerias HX711_ADC.h (de Olav Kallhovd, para el amplificador de señal)
y phyphoxBle.h (de RWTH para la comunicación con la aplicación Phyphox via bluetooth).
La celda de carga se ha de conectar al amplificador de señal con el cable rojo a E+,
el cable negro a E-, el cable blanco a A- y el cable verde a A+
El amplificador de señal se conecta: VCC a 3,3 V, GND a GND, DT al pin 4 y SCK al pin 5.
*/
#include <HX711_ADC.h>
#include <phyphoxBle.h>
#define BUTTON_PIN 2
#define SENSOR_NAME "Sensor de fuerza M"
// Pines del HX711: DT = 4, SCK = 5
HX711_ADC LoadCell(4, 5);
// Factor de calibración (gramos)
const float calFactor = 1119.22;
// Variables de control
unsigned long t_offset = 0;
void setup() {
Serial.begin(115200);
// --- Configuración Phyphox ---
PhyphoxBLE::start(SENSOR_NAME);
PhyphoxBLE::experimentEventHandler = &newExperimentEvent;
PhyphoxBLE::printXML(&Serial);
PhyphoxBleExperiment exp;
exp.setTitle("Sensor de fuerza");
exp.setCategory("Arduino Experiments");
exp.setDescription("Dibuja la gráfica de la fuerza y la masa medidas por la celda de carga.");
// Vistas
PhyphoxBleExperiment::View viewGraph;
viewGraph.setLabel("Gráfica fuerza");
PhyphoxBleExperiment::View viewForce;
viewForce.setLabel("Fuerza");
PhyphoxBleExperiment::View viewMass;
viewMass.setLabel("Masa");
//vista para la gráfica de masa
PhyphoxBleExperiment::View viewMassGraph;
viewMassGraph.setLabel("Gráfica masa");
// Gráfico de fuerza
PhyphoxBleExperiment::Graph graphF;
graphF.setLabel("Fuerza");
graphF.setUnitX("s");
graphF.setUnitY("N");
graphF.setLabelX("Tiempo t");
graphF.setLabelY("Fuerza F");
graphF.setChannel(1, 2); // tiempo, fuerza
// gráfico de masa
PhyphoxBleExperiment::Graph graphM;
graphM.setLabel("Masa");
graphM.setUnitX("s");
graphM.setUnitY("g");
graphM.setLabelX("Tiempo t");
graphM.setLabelY("Masa m");
graphM.setChannel(1, 3); // tiempo, masa
// Valor fuerza
PhyphoxBleExperiment::Value force;
force.setLabel("F");
force.setPrecision(3);
force.setUnit("N");
force.setColor("FFFFFF");
force.setChannel(2);
force.setXMLAttribute("size=\"2\"");
// Valor masa
PhyphoxBleExperiment::Value mass;
mass.setLabel("m");
mass.setPrecision(1);
mass.setUnit("g");
mass.setColor("FFFFFF");
mass.setChannel(3);
mass.setXMLAttribute("size=\"2\"");
// Añadir elementos a vistas
viewGraph.addElement(force);
viewGraph.addElement(graphF);
viewForce.addElement(force);
viewMass.addElement(mass);
//añadir gráfica de masa
viewMassGraph.addElement(mass);
viewMassGraph.addElement(graphM);
// Añadir vistas al experimento
exp.addView(viewGraph);
exp.addView(viewForce);
exp.addView(viewMass);
exp.addView(viewMassGraph);
PhyphoxBLE::addExperiment(exp);
// --- Configuración HX711 ---
LoadCell.begin();
LoadCell.start(2000);
LoadCell.setCalFactor(calFactor);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
// --- Tara con botón ---
if (digitalRead(BUTTON_PIN) == LOW) {
LoadCell.tareNoDelay();
while (!LoadCell.getTareStatus()) {
LoadCell.update();
}
}
// --- Lectura del HX711 ---
if (LoadCell.update()) {
float t = (millis() - t_offset) / 1000.0; // tiempo en segundos
float grams = LoadCell.getData(); // masa en gramos
float forceN = grams * 9.81 / 1000.0; // fuerza en Newtons
// Enviar a Phyphox: (t, fuerza, masa)
PhyphoxBLE::write(t, forceN, grams);
// Enviar por serie
Serial.print(t);
Serial.print(",");
Serial.print(forceN, 3);
Serial.print(",");
Serial.println(grams, 1);
}
}
void newExperimentEvent() {
// Reiniciar tiempo al iniciar o reiniciar experimento
if (PhyphoxBLE::eventType == 1 || PhyphoxBLE::eventType == 2) {
t_offset = millis();
}
}

Una vegada carregat el codi ja podeu mirar els valors de força i massa a través del monitor sèrie de l’IDE d’Arduino (surten correlativament temps en segons, força en newtons i massa en grans) o amb l’app Phyphox. Si obriu Phyphox i cliqueu en el botó més podeu afegir a través del Bluetooth l’experiment del sensor de força. Recordeu que heu de tenir obert en el telèfon el Bluetooth i la ubicació.

Una de les gràcies d’utilitzar l’app per recollir les dades és que no és necessari que el sensor estigui connectat a l’ordinador. Es por desendollar i connectar-li al port usb una bateria externa del tipus de les que s’usen per als telèfons. D’aquesta manera podríem, per exemple, enganxar el sensor a una corda o un sistema que girés i mesurar la força centrípeta que pateix.

L’experimentació

Si en el muntatge de les piles que pengen d’una molla (en les fotos de dalt) estirem les piles una mica cap a baix i soltem, la força que suporta el sensor va variant segons es produeixen les oscil·lacions tal i com es veu en les captures de pantalla de sota. Si s’amplia el gràfic i es mesura el temps entre 10 oscil·lacions el resultat és de 0,63 s, o bé d’1,59 Hz.

Com que la freqüència de vibració d’una molla que oscil·la és:

Si k de la molla = 7,1 N/m i m de les piles = 70,9 g, llavors f = 1,6 H, que coincideix amb la freqüència de vibració de la molla. La constant de la molla es pot trobar a partir de la llei de Hooke (F = k·∆l) substituint els valors que s’obtenen en estirar el ressort penjat del sensor de força i mesurant la longitud de la molla i la força que pateix el sensor en estirar.

L’estudi del moviment harmònic simple (Activitats alumnat i Guia professorat del Projecte Multilog) és només una possibilitat d’utilització del sensor de força per fer estudis experimentals. Es pot estudiar el xoc d’un vehicle, com en Impuls i quantitat de moviment (Activitats alumnat i Guia professorat), o com fer un salt de bungee-jumping segur (Activitats alumnat i Guia professorat).

Esquema del muntatge per estudiar el xoc d’un carretó

També es pot analitzar com evoluciona una reacció química en la que hi ha despreniment de gasos com per exemple la reacció del bicarbonat de sodi amb vinagre (àcid acètic), on el diòxid de carboni gasos alliberat provoca una disminució en la massa del vas de reacció, o del zenc i l’àcid clorhídric, etc. En aquest últim cas aniria més bé una balança sobre la que es ficaria un vas de precipitats o un erlenmeyer en el que s’anés produint la reacció.

Es pot transformar una balança de cuina per a que en vagi subministrant dades de pes al llarg del temps. Si en desarmar la balança hi conté una cèl·lula de càrrega de tipus biga com de la que hem estat parlant en aquesta entrada, no hi ha més que tallar els cables de la cèl·lula i empalmar-los a un l’amplificador HX711, però si en obrir la balança apareixen quatre petites cèl·lules de càrrega en les cantonades (el que passarà si la basculeta és molt plana), les noves connexions a fer són una mica més complicades. Afortunadament Luis del Valle de Programar Fácil l’explica molt bé i pas a pas a l’entrada Amplificador HX711 con Arduino para crear una báscula digital.

Luis del Valle proposa un codi per a obtenir els valors de pes utilitzant un Arduino UNO que funciona molt bé, però no es poden recollir les dades en el telèfon, només pel monitor sèrie. També ha elaborat un coli per obtenir el valor del factor de calibració, però des del meu punt de vista és una mica ortopèdic i no cal; és molt més fàcil i ràpid utilitzar el procediment que us he indicat quan he parlat abans de la modificació del factor de calibració en el codi a utilitzar. En tot cas, si voleu veure les dades en Phyphox podeu utilitzar el mateix codi del sketch_sensor_fuerza_esp32_phyphox.ino.


Deixa un comentari

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.