Подключение тензодатчика к плате ардуино

Подключение HX711 к Arduino

Поскольку резисторы тензорного датчика включены по мостовой схеме, от устройства отходят 4 проводника, имеющих разную цветовую маркировку. На два плеча моста подаётся опорное напряжение, а с двух других плеч снимается выходное напряжение, которое подаётся на вход операционного усилителя микросхемы НХ711. Подключение по цветам проводов осуществляется следующим образом:

  • Красный – Е +
  • Чёрный – Е –
  • Белый – А –
  • Зелёный – А +

Для дальнейшей обработки и передачи информации осуществляется подключение НХ711 к Ардуино UNO. Для этого контакты питания GND и VCC HX711 подключаются к точкам GND и 5V разъёма POWER модуля Arduino UNO, а контакты DT и SCK подключаются к точкам A1 и A0 разъёма ANALOG IN. Тензодатчик НХ711 через контроллер Arduino UNO можно подключить к жидкокристаллическому дисплею LCD 1602 или компьютеру, используя USB порт и стандартные библиотеки для Ардуино.

Поскольку на выходе измерительного моста изменяется напряжение, то именно оно преобразуется в бинарный код. Диапазон контролируемых напряжений зависит от выбранного коэффициента усиления. Если коэффициент равен 128, диапазон измеряемых напряжений варьируется от – 20 mV до + 20 mV, выбор коэффициента усиления 64 определяет пределы измерения от – 40 mV до + 40 mV и при коэффициенте равном 32 пределы измерения определяются величинами – 80 mV и + 80 mV. Эти данные будут корректными только при напряжении питания +5 V. Если входное напряжение выйдет за нижнюю границу диапазона, АЦП выдаст код 800000h, а если за верхнюю, то код будет 7FFFFFh. Для калибровки и измерений можно использовать следующие коды:

//код для калибровки
//код для калибровки
#include "HX711.h"

HX711 scale(A1, A0); // DT, CLK

float Calibration_Factor_Of_Load_cell = -3.7; // этот калибровочный коэффициент настраивается в соответствии с тензодатчиком
float U;
float O;

void setup() {
  Serial.begin(9600);
  Serial.println("HX711 calibration sketch");
  Serial.println("Remove all weight from scale");
  Serial.println("After readings begin, place known weight on scale");
  Serial.println("Press + or a to increase calibration factor");
  Serial.println("Press - or z to decrease calibration factor");

  scale.set_scale();
  scale.tare(); //Сбросьте масштаб до 0
  long zero_factor = scale.read_average(); //Получаем базовое чтение
  Serial.print("Zero factor: "); //Это можно использовать, чтобы устранить необходимость тарирования шкалы. Полезно в проектах постоянного масштаба.
  Serial.println(zero_factor);
}

void loop() {

  scale.set_scale(Calibration_Factor_Of_Load_cell); //Отрегулируйте этот калибровочный коэффициент
  Serial.print("Reading: ");
  U = scale.get_units();
  if (U < 0)
  {
    U = 0.00;
  }
  O = U * 0.035274;
  Serial.print(O);
  Serial.print(" grams");
  Serial.print(" Calibration_Factor_Of_Load_cell: ");
  Serial.print(Calibration_Factor_Of_Load_cell);
  Serial.println();

  if (Serial.available())
  {
    char temp = Serial.read();
    if (temp == '+' || temp == 'a')
      Calibration_Factor_Of_Load_cell += 1;
    else if (temp == '-' || temp == 'z')
      Calibration_Factor_Of_Load_cell -= 1;
  }
}

Как подключить тензодатчик к Ардуино

Для этого занятия нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • модуль тензодатчика hx711;
  • провода «папа-папа», «папа-мама»;
  • паяльник и немного фантазии.

Для датчика потребуется придумать и собрать некую конструкцию весов, а также иметь под рукой весы, чтобы сравнивать данные с модуля с эталоном. Для сборки весов на Ардуино в датчике имеются отверстия с резьбой. Основным элементом модуля (см. картинку ниже) является 24 битный аналого-цифровой преобразователь для весов — микросхема HX711, к которой подключается тензодатчик.


Схема подключения тензодатчика HX711 к Arduino Uno

HX711 Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
VCC 5V 5V 5V
DT 2 2 2
SCK 3 3 3

После сборки весов на Ардуино, необходимо откалибровать тензорезистивный датчик. Подключите датчик к модулю HX711, согласно схеме размещенной выше, а сам модуль необходимо подключить к плате Ардуино. Порты DT и SCK можно подключить к любым цифровым портам микроконтроллера (в примере кода мы использовали 2 и 3 порт). После сборки схемы загрузите скетч для калибровки датчика в плату Arduino.

Счетч для калибровки тензодатчика HX711

#include <HX711.h>
HX711 scale(2, 3);                  // порты DT, CLK                        

float calibration_factor = -3.7; // калибровка датчика
float units;
float ounces;

void setup() {
   Serial.begin(9600);
   Serial.println("HX711 calibration sketch");
   Serial.println("Remove all weight from scale");
   Serial.println("Press + or a to increase calibration factor");
   Serial.println("Press - or z to decrease calibration factor");

   scale.set_scale();
   scale.tare();         // сбрасываем датчик на 0

   long zero_factor = scale.read_average();
   Serial.print("Zero factor: ");
   Serial.println(zero_factor);
}

void loop() {
   scale.set_scale(calibration_factor); // применяем калибровку

   Serial.print("Reading: ");
   units = scale.get_units(), 10; // выполняем замеры 10 раз
   if (units < 0)
   {
       units = 0.00;
   }
   ounces = units * 0.035274; // переводим усредненные значения в граммы

   Serial.print(ounces);
   Serial.print(" grams"); 
   Serial.print(" calibration_factor: ");
   Serial.print(calibration_factor);
   Serial.println();

   if (Serial.available())
   {
       char temp = Serial.read();
       if (temp == '+' || temp == 'a')
          calibration_factor += 1;
       else if (temp == '-' || temp == 'z')
          calibration_factor -= 1;
   }
}

Пояснения к коду:

  1. на монитор порта будет выведен поправочный коэффициент, который следует использовать далее в работе с датчиком для весов;
  2. при необходимости корректировки коэффициента, через монитор порта следует отправлять «+» или «-» на плату Ардуино.

Счетч для тензодатчика (hx711) Ардуино

#include <HX711.h>
HX711 scale(2, 3);                  // порты DT, CLK                        

float calibration_factor = -3.7; // калибровка датчика
float units;
float ounces;

void setup() {
   Serial.begin(9600);

   scale.set_scale();
   scale.tare();                                     // сбрасываем датчик на 0
   scale.set_scale(calibration_factor); // применяем калибровку
}

void loop() { 
   Serial.print("Reading: ");
  
   for(int i=0; i<10; i++) units =+ scale.get_units(), 10; // выполняем замеры 10 раз
   units / 10;                                                                  // делим значения на 10
   ounces = units * 0.035274;                                       // переводим значения в граммы

   Serial.print(ounces);
   Serial.print(" grams");  
   Serial.println();
}

Пояснения к коду:

  1. используя поправочный коэффициент из первой программы, ваши весы должны показывать довольно точные показания в граммах;
  2. скачать библиотеку hx711.h Arduino с описанием команд можно на нашем сайте на странице Библиотеки Ардуино.

Исходный код программы

Прежде чем приступить к написанию программы для нашего устройства, вспомним немного основы работы с АЦП в Arduino Uno. Плата Arduino имеет шесть каналов АЦП. Мы можем использовать любой из них. Разрешение АЦП Arduino составляет 10 бит – то есть мы сможем работать с диапазоном целых чисел (0-(2^10) 1023)). Это означает что данный АЦП преобразует входное напряжение от 0 до 5 Вольт в целое число от 0 до 1023. То есть имеем точность АЦП 5/1024= 4.9 мВ. То есть один шаг приращения целого числа на выходе АЦП равен изменению в 4.9 мВ на его входе.

В нашей схеме для АЦП мы будем использовать канал A0. Для осуществления функций АЦП мы должны в программе сделать следующие вещи:

Все каналы АЦП платы Arduino Uno имеют опорное напряжение 5В – то есть это максимальное значение входного напряжения, которое способны обрабатывать данные каналы. Поскольку, к примеру, некоторые датчики обеспечивают на своем выходе диапазон напряжений 0-2.5В, то использование опорного напряжения 5В в данном случае приведет к уменьшению точности измерений. Поэтому в подобных случаях для изменения опорного напряжения целесообразно использовать функцию “analogReference();”. Мы в рассматриваемом случае оставим значение опорного напряжения без изменений.

По умолчанию разрешающая способность каналов АЦП платы Arduino Uno составляет 10 бит. Однако в некоторых случаях (например, для увеличения скорости преобразования) можно уменьшить эту разрешающую способность с помощью команды “analogReadResolution(bits);”. Мы в нашем примере не будем изменять разрешающую способность каналов АЦП.

Если все необходимые настройки канала АЦП сделаны (или оставлены по умолчанию), то для чтения значения с выхода АЦП можно воспользоваться функцией “analogRead(pin);”, где pin обозначает контакт платы Arduino, который мы будем использовать для аналого-цифрового преобразования, в нашем случае это будет контакт “A0”. Для того чтобы сразу сохранить значение с выхода АЦП в переменной целого типа можно использовать команду вида ”int SENSORVALUE = analogRead(A0);”, в результате этой команды значение с выхода АЦП будет сохранено в переменной “SENSORVALUE”.

Контакты платы Arduino Uno, на которых возможно формирование ШИМ сигнала, обозначены символом “~”. Всего таких каналов на плате Arduino Uno шесть. Мы в рассматриваемом примере для формирования ШИМ сигнала будем использовать контакт PIN3.

Как использовать ШИМ сигнал в Arduino? Это можно сделать, к примеру, с помощью функции analogWrite(3,VALUE) – эта функция на 3-м контакте сформирует ШИМ сигнала со значением (коэффициентом заполнения), определяемым параметром VALUE. Параметр VALUE может изменяться в диапазоне от 0 до 255. 0 соответствует самому низшему значению, а 255 – самому высшему. При VALUE=255 в результате приведенной команды мы получим 5В на контакте PIN3. Если VALUE=125, то на PIN3 мы получим среднее значение напряжения равное 2,5 В.

То есть на выходе АЦП значение может изменяться в диапазоне 0-1024, а коэффициент заполнения ШИМ может изменяться в диапазоне 0-255. То есть значение на выходе АЦП примерно в 4 раза превышает значение необходимого нам коэффициента заполнения сигнала ШИМ. Поэтому если мы разделим значение с выхода АЦП на 4, то мы получим примерное значение нужного нам коэффициента заполнения ШИМ.

В этом случае среднее значение напряжение на выходе ШИМ сигнала будет изменяться линейно с изменением напряжения на выходе делителя напряжения. Поэтому если мы подадим этот сигнал ШИМ на звонок, то мы получим громкость звонка линейно зависящую от значения напряжения на выходе делителя напряжения, которое, в свою очередь, линейно зависит от значения сопротивления датчика силы.

Далее представлен полный текст программы.

Мэтт Янг

Я бы использовал мост Уитстона в инструментальном усилителе, подобном этому. Я делал это все время, когда был в INDOT, и это довольно стандартная конфигурация для датчиков давления и тензодатчиков, намного проще, чем добавление внешнего АЦП.

R4 — твой тензодатчик. Обязательно установите усиление инструментального усилителя таким образом, чтобы он заполнял диапазон АЦП как можно ближе. В зависимости от тензодатчика, он может быть разомкнут, когда не загружен, или некоторое фиксированное сопротивление. Таблица данных скажет вам это. Эта информация понадобится для установки R3 и определения усиления. Я не знаю, если Arduino по умолчанию 2,56 или 5 В, это вопрос для кого-то, кто использовал один.

Определение маркировки проводов тензодатчика без документации

Если у вас отсутствует описание тензодатчика, для определения маркировки проводов можно использовать обыкновенный мультиметр, при условии, что датчик аналоговый, а не цифровой.

  • Измерьте сопротивление между всеми проводами. В 4-проводном тензодатчике имеется шесть комбинаций проводов, следовательно, вы получите 6 значений сопротивлений, одна пара проводов будет иметь сопротивление больше, чем все остальные.
  • Пара с самым большим сопротивлением – это линия питания, оставшаяся пара проводов – линия сигнала.
  • Подключите линию питания к весоизмерительному прибору, или подайте напряжение.
  • Измерьте напряжение на линии сигнала, определив тем самым полярность подключения.

https://youtube.com/watch?v=-LhoLj2v06Q

Подключение нескольких тензодатчиков при помощи соединительной (балансировочной) коробки

Как подключать несколько тензодатчиков при помощи балансировочной коробки можно посмотреть на видео

https://youtube.com/watch?v=Pc9kNSIX7DU

Заземление и экранирование при подключении тензодатчика.

Организация заземления и экранирования важный вопрос успешного создания весовой системы с использованием тензодатчиков. Надёжное решение данной задачи — ключ к правильной работе тензометрического датчика, генерирующего слаботочные сигналы. Кабели тензодатчиков должны иметь экранирующую оплетку, которая, при правильном подключении, обеспечивает защиту от электростатических и других помех.

Основное правило, которое нельзя нарушать: необходимо избегать «земляных» петель, т. е. заземлять устройства нужно в ОДНОЙ общей точке. Петли могут возникать если экран кабеля подключать к заземляющему контуру с двух концов. Поэтому, если корпус датчика надёжно заземлён и одновременно соединён с экраном — этого достаточно, в противном случае — соединить экран с заземлением только с любого ОДНОГО конца, например, в электрощите, где установлен прибор отдельным жёлто-зелёным проводом. Под «заземлением» мы понимаем защитное заземление, желто-зелёный провод. Использовать «нейтраль» в качестве «земли» очень нежелательно.

Примеры использования тензометрических датчиков

  • элемент конструкции весов.
  • измерение усилий деформации при обработке металлов давлением на штамповочных прессах и прокатных станах.
  • мониторинг напряженно-деформационных состояний строительных конструкций и сооружений при их возведении и эксплуатации.
  • высокотемпературные датчики из жаропрочной легированной стали для металлургических предприятий.
  • с упругим элементом из нержавеющей стали для измерений в химически агрессивной среде.
  • для измерения давления в нефте и газопроводах.

Простота, удобство и технологичность тензодатчиков – основные факторы для дальнейшего активного их внедрения, как в метрологические процессы, так и использования в повседневной жизни в качестве измерительных элементов бытовой техники.

Термометр сопротивления — датчик для измерения температуры: что это такое, описание и видыЧто такое электроконтактный манометр, назначение, принцип работы, схема подключения и обзор популярных моделейЧем отличаются и где используются постоянный и переменный токЧто такое активная и реактивная мощность переменного электрического тока?Как установить и настроить спутниковую антенну самостоятельно?Для чего нужен пирометр и как измерять температуру бесконтактным методомЧто такое нихромовая проволока, её свойства и область примененияЧто означает степень защиты IP — расшифровка, таблица, примеры использования

Во многих отраслях промышленности необходимо измерение размера деформации. Для таких целей применяется тензодатчик давления, который помогает преобразовать уровень деформации в определенную величину. Благодаря этому можно определить её значение.

Характеристики и распиновка 711 модуля

В самом чипе имеется несколько разъемов для подключения датчиков и МК, и для подачи питания, соответственно. J1 является разъемом для подключения датчиков, а вот E+ и Е необходимы для подключения их питания, в то же время, JP2 необходим для подсоединения чипа к микроконтроллеру Ардуино и последующей подачи питания через него.

По А каналу можно установить коэффициенты усиления сигнала от датчиков, их имеется две разновидности – в 64 и в 128 раз. Это позволит измерять десятые доли килограммов, которые попадают на тензодатчики. Сам чип способен потреблять энергию не только непосредственно из Ардуино, но и из внешних источников через дополнительно подключенное питание.

Не стоит и упоминать, что на месте Ардуино может быть любой, полюбившийся вам контроллер. Напряжение плата выдерживает от 2.6 до 5.5 Вольт соответственно, это стоит учитывать, если вы беспокоитесь, о необходимости припайки резисторов к конструкции.

Распиновка HX711

Тензодатчики веса

Прежде всего, это тензодатчики веса. Будь то напольные весы в спальне посадивших себя на диету женщин, неизменные электронные атрибуты современных магазинов, промышленные установки взвешивания автомобилей на стройплощадках или балочные платформенные весы, без тензорезисторов не обойтись. В настоящее время ассортимент тензодатчиков веса настолько велик, что любой заинтересованный потребитель сможет без особого труда выбрать требуемую именно для его случая комплектацию. Остановимся на нескольких конструктивных типах промышленных тензодатчиков веса.

Консольные устройства в алюминиевом или стальном исполнении. Диапазон весовых нагрузок этих приборов достаточно широк, а разнообразие вариантов корпусного решения позволяет использовать их во многих хозяйственных и бытовых сферах.

Стальные тензодатчики типа «бочка» или «шайба». Обладают хорошими показателями по герметичности и защите устройства от внешних воздействий. Это касается и материала оболочки и изоляции электропровода.

Балочные весовые регистраторы. Область применения – измерение весовых нагрузок на мостовые и платформенные конструкции. Регистрируют деформации изгиба и сдвига. Фиксировать натяжение крепежных элементов помогут тензодатчики на растяжке, а допустимость подвесного груза на стройке S-образные.

How to use ADC?

It has two differential input channels A and B which are selecttable by the input multiplexer and apply this channel input to the PGA.

Chip Activation

  • To activate the on-chip oscillator, connect pin14 to ground. The output data rate is 10SPS or 80SPS.  Use a crystal across XI and XO pins to obtain an accurate data rate at the output.
  • Pin11 and pin12 are used to retrieve data. The pin12 becomes HIGH, when data is not ready. At that time, the pin11 input should below. When pin12 is low, it means data is ready to be retrieved. Data comes out from the pin 12 on applying 25 to 27 positive clock signals.

Clock Pulses and Control Inputs

  • The number of the input clock pulses control inputs and select gain. Their number should not be less than 25 or greater than 27. Otherwise, it will cause serial communication error.
  • It has a power-on reset ability which will reset the IC on powering up a chip.
  • During normal operation, pin11 clock input is low.
  • When a positive edge transition is applied at pin 11 and stays in the same logic for longer than 60µs, the IC enters power-down mode.

Reset Operation

The chip will reset and reenters into the normal mode of operation when pin 11 returns to low. After this input channel will be set to Channel A by default.

Тензодатчики силы растяжения и сжатия

Тензодатчики силы растяжения и сжатия, как правило, имеют S-образную форму, изготавливаются из алюминия и легированной нержавеющей стали. Предназначены для бункерных весов и дозаторов с пределом измерения от 0,2 до 20 тонн. S-образные тензодатчики силы растяжения и сжатия могут использоваться в станках по производству кабелей, тканей и волокон для контроля силы натяжения этих материалов.

Тензорезисторы проволочные и фольговые

Проволочные тензорезисторы делают в виде спирали из проволоки малого диаметра и крепят на упругом элементе или исследуемой детали с помощью клея. Их отличает:

Circuit Description of Arduino weighing Machine

The arduino based layout of the project is shown in figure 1. As stated earlier, the Arduino UNO Board is the heart of the circuit. It is accompanied by other components like Load Cell, analog to digital converter cum amplifier module, 16×2 alphanumeric LCD and few other passive components like resistors.

Calibration Circuit: The weight calibration circuit is shown in figure 2. This circuit is basically a switch with pull back resistor connect to arduino uno board digital pin D10. When we push the switch the weight automatic calibrated to 0 KG and display the value 0.0 in LCD.

Load Cell | Arduino Weighing Machine

The load cell is basically a strain gauge which convert pressure into electrical signal. This utilize the basic method of measuring elongating or displacement. The method consists in using a strain gauge which provides a variation in resistance corresponding to the elongating or displacement to the measure. This load cell is resistance type strain gauge. The load cell available in market is made from aluminum alloy because it has various advantage like light weight, more accurate, anti-rusting structure etc. The load cell shown in figure 2 is strain gauge and operated as Wheatstone bridge.

HX711 Module | Arduino Weighing Machine

The output of load cell is low and is analog in nature. Thus, we have decided to use an amplifier module which take input from load cell, amplify it and convert into digital form. It has distinct two input channel i.e. Channel A and Channel B. Channel A is programmable gain amplifier having gain of 128 or 64 where as channel B is fixed gain amplifier of 32. Other features of this module are 24-bit high precision analog to digital converter. HX711 Module with connector is shown in figure 3.

Библиотека HX711.h

Все сказанное ранее описывает всего несколько команд управляющих HX711. Далее представлен их полный список с расшифровкой. Нужно только напомнить, что инициализация подключаемого модуля проводится так: #define DT A0 #define SCK A1 #include «HX711.h» HX711 scale; // структура через которую будет идти обращение

Остальные процедуры:

Название Параметры по порядку На выходе Описание
begin() A1 — Вывод Ардуино, где DT, A2 — вывод SCK,

A3 — разрядность датчика 32(B), 64 или 128(A). По умолчанию 128

Ничего Инициализация
is_ready() Ничего True — готов, False — не готов Тест состояния АЦП
set_gain() 32,64,128 Ничего Установка значения усиления
read() Ничего Сырое значение АЦП Возвращает «чистый» ответ HX711 без поправочных сведений
read_average() Сколько делать проб Возвращает среднюю цифру от выполненных проб (унция) Получить усредненные данные
get_value() Сколько делать проб На выходе средняя масса (унция) без упаковки Получение поправленного значения без веса упаковки
get_units() Сколько делать проб Усредненная поправленная масса (унция) Возвращает массу с учетом упаковки и поправочных значений.
Tare() Сколько делать проб Масса упаковки (унция) Получение массы упаковки
set_scale() Коэффициент Ничего Задание значения корректировки
get_scale() Ничего Значение Получение текущего значения заданного set_scale()
set_offset() Вес (унция) Ничего Ручная установка веса упаковки
Get_offset() Ничего Масса (унция) Запрос установленного вручную параметра упаковки
power_down() Ничего Ничего Перевести HX711 в состояние «сна»
power_up() Ничего Ничего Вывод модуля АЦП из «сна»

How to calibrate HX711 Load cell measurement with arduino ?

Once you upload the calibration code, open serial monitor and adjust your scale factor with known weight until you see the correct readings. Press a,s,d,f to increase calibration factor by 10,100,1000,10000 respectively. Press z,x,c,v to decrease calibration factor by 10,100,1000,10000 respectively. Don’t forget to hit enter key to send the data.

Once you see the placed weight is same as shown weight note down calibration factor and use it in Final code for weight measurement.

Note: Before you start running calibration code keep your Load Cell horizontal so that it will not have any weight (Weight of your fixture arrangement). Fixture arrangement causes problem to base line scale. Remove all fixture arrangement and just put known weight directly on load cell.

scale.set_scale();

Once you find the calibration factor update it in below code.

Final Code for Weight Measurement

/*
 * https://circuits4you.com
 * 2016 November 25
 * Load Cell HX711 Module Interface with Arduino to measure weight in Kgs
 Arduino 
 pin 
 2 -> HX711 CLK
 3 -> DOUT
 5V -> VCC
 GND -> GND

 Most any pin on the Arduino Uno will be compatible with DOUT/CLK.
 The HX711 board can be powered from 2.7V to 5V so the Arduino 5V power should be fine.
*/

#include "HX711.h"  //You must have this library in your arduino library folder

#define DOUT  3
#define CLK  2

HX711 scale(DOUT, CLK);

//Change this calibration factor as per your load cell once it is found you many need to vary it in thousands
float calibration_factor = -96650; //-106600 worked for my 40Kg max scale setup 

//=============================================================================================
//                         SETUP
//=============================================================================================
void setup() {
  Serial.begin(9600);  
  Serial.println("Press T to tare");
  scale.set_scale(-96650);  //Calibration Factor obtained from first sketch
  scale.tare();             //Reset the scale to 0  
}

//=============================================================================================
//                         LOOP
//=============================================================================================
void loop() {
  Serial.print("Weight: ");
  Serial.print(scale.get_units(), 3);  //Up to 3 decimal points
  Serial.println(" kg"); //Change this to kg and re-adjust the calibration factor if you follow lbs

  if(Serial.available())
  {
    char temp = Serial.read();
    if(temp == 't' || temp == 'T')
      scale.tare();  //Reset the scale to zero      
  }
}
//=============================================================================================

This code gave me accuracy of less than +/- 3 grams on Precision grade C2 40Kg Load Cell