
Сегодня поговорим об одном интересном проекте на платформе ардуино. Прибор для измерения веса или по простому — весы.
Весы можно использовать таких проектах как определение веса продуктов, или веса человека, еще одним из интересных проектов может быть автоматическая кормушка для животных (отмерять корм определенного веса и что либо с ним делать).
Для подобных проектов нам понадобится собственно сама плата ардуино, тензодатчик для определения веса и модуль внешнего АЦП HX711. Данный модуль как раз таки и был разработан для работы с тензодатчиками.
Принцип работы тензодатчика
В зависимости от того, какой элемент применяется в конструкции тензодатчика, измеряется соответствующий параметр. Этот параметр изменяется в пропорциональной зависимости от веса предмета, который оказывает воздействие на датчик.
Если нагрузка оказывает воздействие на пьезокерамическую пластину, то в таком случае изменяется напряжение, на основе его изменения и происходит замер веса.
В основе конструкции тензодатчика могут использоваться емкостные датчики, в таком случае изменяется емкость переменного конденсатора.
В статье мы рассмотрим тензодатчик на основе упругого резистора. В такой конструкции при воздействии на датчик происходит изменение сопротивления резистора, а также напряжения на мостовой схеме.
Конструкция датчика на основе упругого резистора имеет вид представленный на рисунке ниже.
Модуль АЦП HX711
Модуль внешнего АЦП HX711 представляет собой микросхему внешнего АЦП с разрядностью 24. 2 дифференциальных канала и программируемым коэффициентом усиления 32, 64, 128. Ниже представлена схема внутреннего строения модуля HX711.
Как устроен модуль АЦП HX711 подробнее можно прочитать в нашей статье.
Подключение HX711 к Arduino
Как подключать тензодатчик к модулю HX711, изображено на рисунке ниже:
Так как резисторы в тензодатчике подключены по мостовой схеме, датчик имеет четыре провода. По двум на датчик поступает опорное напряжение и по двум замеряется напряжение, которое в свою очередь поступает на вход ОУ (операционного усилителя) модуля НХ711. Полная схема подключения представлена на рисунке ниже.
Для чтения данных с модуля необходимо использовать контакты DT и SCK.
- Когда идет преобразование на контакте DT устанавливается 1, а на SCK в этот момент должен быть 0.
- После того как модуль закончит преобразование, на выводе DT установиться 0. После этого можно считывать дынные, подав на вход SCK тактовую частоту.
- После окончания чтения на контакте DT вновь установиться 1.
Установка коэффициента усиления и выбор канала для чтение происходит подачей определенного количества импульсов на контакт SCK.
ВНИМАНИЕ!
Выбор коэффициента усиления и канала устанавливается для следующего измерения. Это значит, что если читая текущее измерение мы на вход SCK подадим 25 импульсов, то следующее измерение будет, согласно таблице, с канала А с усилением 128.
Так же с коэффициентом усиление автоматически задается диапазон измерений напряжений:
- коэффициент усиления 128: диапазон напряжений ±20mV;
- коэффициент усиления 64: диапазон напряжений ±40mV;
- коэффициент усиления 32: диапазон напряжений ±80mV.
Это справедливо при аналоговом питании +5V. Если произойдет выход по питанию за верхнюю границу, АЦП выдаст на выходе код 7FFFFFh, если выход будет за нижнюю границу АЦП выдаст код 800000h.
Пример скетча для весов
Для написания данного скетча использовалась библиотека «HX711 by Rob Tillaart». На самом деле для работы с данным модулем разработано много библиотек какую выбрать, выбор за вами. Все они работают по одному и тому же принципу.
#include "HX711.h" // Подключаем библиотеку HX711 HX711 scale; // Создаём объект scale #define DT 2 // Указываем номер вывода, к которому подключен вывод DT датчика HX711 #define SCK 3 // Указываем номер вывода, к которому подключен вывод SCK датчика HX711 float calibration_factor = -0.89; // Вводим калибровочный коэффициент float units; // Задаём переменную для измерений в граммах float ounces; // Задаём переменную для измерений в унциях void setup() { Serial.begin(57600); // Инициируем работу последовательного порта на скорости 9600 бод scale.begin(DT, SCK); // Инициируем работу с датчиком scale.set_scale(); // Выполняем измерение значения без калибровочного коэффициента scale.tare(); // Сбрасываем значения веса на датчике в 0 scale.set_scale(calibration_factor); // Устанавливаем калибровочный коэффициент } void loop() { Serial.print("Reading: "); // Выводим текст в монитор последовательного порта for (int i = 0; i < 10; i ++) { // Усредняем показания, считав значения датчика 10 раз units = + scale.get_units(), 10; // Суммируем показания 10 замеров } units = units / 10; // Усредняем показания, разделив сумму значений на 10 ounces = (units * 0.035274)*10; // Переводим вес из унций в граммы Serial.print(ounces); // Выводим в монитор последовательного порта вес в граммах Serial.println(" grams"); // Выводим текст в монитор последовательного порта }