Сегодня поговорим об одном интересном проекте на платформе ардуино. Прибор для измерения веса или по простому – весы.
Весы можно использовать таких проектах как определение веса продуктов, или веса человека, еще одним из интересных проектов может быть автоматическая кормушка для животных (отмерять корм определенного веса и что либо с ним делать).
Для подобных проектов нам понадобится собственно сама плата ардуино, тензодатчик для определения веса и модуль внешнего АЦП 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"); // Выводим текст в монитор последовательного порта }
Лучше использовать микросхему от Analog Device AD7799. Относительно высокая точность и отсутствие плавания у нее , по сравнению с HX711. При подключении 2-х тензодатчиков по 50 кг по мостовой схеме точность 10 грамм. Использую библиотеку AD779x.h и пример программы, который появляется в меню файл-примеры в ардуино, после установки библиотеки. При подключении hx-711 к этим-же датчикам у меня точность составила 30 грамм, измерял точность у обеих АЦП в течение 10 минут. Заказывал AD7799 на али за 250 руб. Брать нужно вместе с переходником для микросхемы ssop16 c расстоянием между выводами переходника 0,65 мм. Также нужно брать “паяльная паста с припоем”, т.к. выводы слишком мелкие и близкие. Конденсаторы брал SMD с испорченной матплаты, измеряя их емкость тестером. При прогреве тензодатчика феном , данные сильно изменяются. Возможно нужно ставить на тезодатчик на термоскотч термодатчик цифровой ds18b20. При даже кратковременном прикосновении к тензодатчику пальцем показания также сильно изменяются из-за прогрева датчика от тепла тела. Если прикасаться через несколько слоев сложенной бумаги, датчик не прогревается и показания не меняются. Те, кто будут тестировать тензодатчики, нажимая на них пальцем, должны помнить, что через несколько секунд, после прикосновения пальца к тензодатчику, тепло достигнет чувствительного элемента датчика по его металлическому корпусу и значения поплывут наверх или вниз на десятки грамм, в зависимости от схемы подключения, типа датчика, длительности прикосновения. Нажимайте на датчики какими либо предметами, а не рукой напрямую. L индуктивность возможно можно и не ставить. Возможно можно подключить и без источника опорного напряжения TL431, а напрямую от ардуино 5в с фильтром из 2-х конденсаторов (что на схеме). Источник питания использовал от Hi-link.
Спасибо большое, за столь развернутый комментарий. Думаю многим будет полезно использовать данную микросхему в своих проектах. Да еще с такой точностью.
По поводу влияния температуры: к сожалению это известная проблема всех тензодатчиков. Они подвержены влиянию окружающей среды и при повышении или понижении температуры, а так же влажности изменяюся показания от датчика.
Если вам нужна работа тензодатчика при высоких или низких температурах, то лучше поискать датчики для экстремальных условий, такие есть, но стоить они будут не мало. А для бытового прибора можно использовать защитное покрытие или банально чехол, что бы немного ограничить воздействие окружающей среды.
Опорное напряжение лучше использовать, так как напряжение питания не всегда будет ровно 5V, а это повлияет на точность измерения.