Тензодатчики и весы на Arduino и НХ711

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

Принцип работы тензорного датчика

Тензодатчики и весы на Arduino и НХ711Тензодатчики и весы на Arduino и НХ711

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

Тензодатчики и весы на Arduino и НХ711  Тензодатчики и весы на Arduino и НХ711

Электронный датчик веса

Датчик представляет собой прямоугольный брусок из алюминиевого сплава, с отверстием в центре. На его боковые поверхности нанесены тонкоплёночные резисторы, соединённые по мостовой схеме, поэтому резистивный датчик имеет 4 гибких вывода. Все элементы датчика залиты эпоксидным компаундом. На бруске предусмотрены резьбовые отверстия для крепления его к основанию и для установки пластины под измеряемый груз. На торцевой стороне датчика нанесена маркировка, указывающая максимальный вес измеряемого груза. Для того чтобы резисторы изменяли своё сопротивление, тензометрический датчик должен одним концом фиксироваться на основании, а на другой его конец должен действовать груз так, чтобы возникла деформация бруска и, соответственно, плёночных резисторов. Для того чтобы преобразовать аналоговый сигнал с выхода тензорного датчика в двоичный код, применяется аналого-цифровой преобразователь (АЦП) НХ711.

Тензодатчик и НХ711

Тензодатчик микросхема НХ711
Интегральная микросхема НХ711 представляет собой аналого-цифровой преобразователь с частотой дискретизации 24 бит и встроенным малошумящим операционным усилителем. Мультиплексор позволяет выбирать один из двух имеющихся входных каналов. Канал А имеет программируемый выбор коэффициента усиления, который может быть 64 или 128. Канал В работает с предустановленным коэффициентом, равным 32.

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

Основные технические характеристики НХ711:

  • Разрядность АЦП – 24 бит
  • Усиление по входу А – 64 или 128
  • Усиление по входу В – 32
  • Частота измерений – 10 или 80 раз в секунду
  • Питающее напряжение – 2,6-5,5 В
  • Потребляемый ток – менее 10 мА
  • Входное напряжение – ± 40 мВ

На плате с АЦП имеются два разъёма – J1 и JP2, на которых имеются следующие обозначения:

  • J1
    • E –, E + питание тензорного моста
    • A –, A + дифференциальный вход канала А
    • В –, В + дифференциальный вход канала В
  • JP2
    • GND, VCC питание
    • DT, SCK — информационные шины

Подключение НХ711 к ардуино

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

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

Тензодатчики и весы на Arduino и НХ711 Тензодатчики и весы на Arduino и НХ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(), 10;
 if (units < 0)
 {
 U = 0.00;
 }
 O = U * 0.035274;
 Serial.print(ounces);
 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;
 }
}
//код для весов
#include "HX711.h"

HX711 scale(A1, A0); 
float Calibration_Factor_Of_Load_cell = -3.7; // Калибровка
float U;
float O;

void setup() {
 Serial.begin(9600); 
 scale.set_scale();
 scale.tare(); //Сбрасываем на 0
 scale.set_scale(Calibration_Factor_Of_Load_cell); //Калибруем
}

void loop() { 

 Serial.print("Reading: ");
 for(int i = 0;i  10; i ++) U =+ scale.get_units(), 10; // усредняем показания считав 10 раз 
 O = U * 0.035274; 
 Serial.print(O); // посылаем в монитор порта
Serial.print(" grams"); 
 Serial.println();

 
}

 

ПОДЕЛИТЬСЯ

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here