Модуль HX711: АЦП для тензодатчиков и весов на Arduino

Как устроен модуль HX711, как подключить к нему тензодатчик и плату Arduino и как откалибровать самодельные весы до 1 кг.
Для чего нужен HX711
Тензодатчик преобразует деформацию в электрический сигнал, но сигнал этот очень слабый, и штатного АЦП Arduino с разрешением 10 бит для него недостаточно. Модуль HX711 решает задачу целиком: на плате стоит специализированная микросхема HX711, объединяющая усилитель и 24-битный АЦП. За счёт такого разрешения достигается высокая точность измерений.
У модуля два входных канала, A и B, поэтому к нему можно подключить два тензодатчика. Для канала A доступен коэффициент усиления 64 или 128, для канала B он фиксированный — 32. Частота измерений составляет 80 Гц.

Характеристики
| Рабочее напряжение | 5 В |
| Каналы для тензодатчиков | 2 (A и B) |
| Коэффициент усиления | 32, 64, 128 |
| Дифференциальный вход | ±40 мВ |
| Разрядность АЦП | 24 бит |
| Частота измерений | 80 Гц |
| Рабочий ток | менее 10 мА |
| Рабочая температура | от -40 до 85 °C |
| Размеры | 38 x 21 x 10 мм |
Контакты и схема подключения
На плате два разъёма. К первому подключается измерительная часть:
- E+ и E- — питание тензодатчиков;
- A- и A+ — дифференциальный вход канала A;
- B- и B+ — дифференциальный вход канала B.
Второй разъём связывает модуль с контроллером:
- VCC — напряжение питания;
- GND — общий контакт;
- DT — линия данных;
- SCK — линия синхронизации.
В примере из источника линия DT подключена к выводу A1 платы Arduino Uno (цифровой номер 15), а SCK — к выводу A0 (номер 14).

Сборка весов до 1 кг
Для простых весов понадобятся плата Arduino Uno, модуль HX711, один тензодатчик на 1 кг и четыре провода. Тензодатчик в данном случае — это тензорезистор, то есть резистор, сопротивление которого меняется при деформации. Он скрыт под слоем белого защитного полимера. Измерительная схема на таком датчике полумостовая: один тензорезистор расположен сверху и работает на растяжение, второй снизу — на сжатие.

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

Калибровка
Программная часть строится на библиотеке HX711 (автор bogde, распространяется через GitHub). В скетче создаётся объект с указанием выводов DT и SCK, а коэффициент пересчёта хранится в отдельной переменной типа float.
Калибровочный скетч работает так: при запуске вызывается scale.set_scale() без параметра и scale.tare(), то есть показания обнуляются. Поэтому в момент старта на весах не должно быть груза. Далее в цикле применяется текущий коэффициент, считывается значение через get_units(), отрицательные результаты приравниваются к нулю, а вес и сам коэффициент выводятся в монитор последовательного порта на скорости 9600 бод.
После запуска на весы ставят груз известной массы, например гирю, и сравнивают показания с реальным весом. Если они расходятся, коэффициент в скетче меняют и повторяют проверку, пока результат не совпадёт. Для датчика на 1 кг из примера подошло значение 64.80; для другого экземпляра оно будет своим.
Измерение веса и возможные проблемы
Рабочий скетч отличается немногим: найденный коэффициент задаётся сразу в setup() после сброса на ноль, а в цикле берётся десять отсчётов подряд и вычисляется среднее — так показания получаются стабильнее. Результат выводится в последовательный порт в граммах.
Если весы показывают заведомо неверный вес, в первую очередь проверяют правильность соединений и заново проводят калибровку с эталонным грузом. Нулевые показания при калибровке также говорят либо об ошибке подключения, либо о том, что калибровочный коэффициент нужно подбирать тщательнее.