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

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

Тензодатчик

В разрезе темы статьи речь пойдет о популярной платформе Arduino, аналого-цифровом преобразователе HX711 и подключаемых к нему тензодатчиках.

Зачем все это необходимо

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

такие весы тоже сделаны на основе Arduino

Пригодится аппарат и пасечникам — объединив весы с передатчиком Bluetooth или GSM-модемом можно контролировать «налет» веса пчел в различные периоды года. Достаточно знать чистую массу улья. Все что выше, как раз и будет воск, пчелы и мед.

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

Вообще, на рынке присутствуют три варианта тензодатчиков. Емкостные, на основе пьезоэлементов, и использующие упругие резисторы Уитстона. У последних фамилия указывает не марку модели, а имя изобретателя.

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

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

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

С виду — тензодатчик Ардуино выглядит как своеобразный алюминиевый брусок, с крепежными отверстиями. На его гранях видно размещенные там тонкопленочные резисторы, на которые собственно и помещается платформа с грузом. Количество выходов — 3 в случае полу мостовых и 4 у полных. Две линии используются для питания, остальные с целью передачи аналоговой информации на исполняющее устройство.

мостовой датчик

На одной из граней обычно указан максимально допустимый вес нагрузки.

Характеристики оборудования, его настройка, примечания

Здесь начать стоит непосредственно с преобразователя аналогового сигнала в цифровой, а конкретно с платы-посредника между Arduino и тензодатчиками — HX711:

  • Частота обработки входящих сигналов: от 10 до 80 раз в секунду.
  • Питание: 2.5–5.5 В при 10 мА.
  • Минимальное напряжение на входе: ~40мВ
  • Количество каналов: 2
  • Усиление по входящей линии A: 64, 128
  • Усиление по входящей линии B: 32
  • Разрядность исходящего канала: 24 бита.
  • Ширина на длину платы: 21×34 мм

Основное назначение устройства в конвертации объема поступающего тока в бинарный формат. Причем чувствительность аппарата непосредственно зависит от установленного режима усиления линии:

Коэффициент Пиковый ток
32 ± 80 мА
64 ± 40 мА
238 ± 20 мА

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

HX711

К сожалению, есть у преобразователя HX711 определенные проблемы. К примеру, точность его работы сильно зависит от температуры окружающей среды. Дополнительно, даже в нормальном режиме, происходит изменение определяемых аналоговых значений. То есть, результирующие коды все время «бегают» в определенных, достаточно сильных пределах:

таблица Excel демонстрирующая изменение определяемых сигналов на вводе HX711

Один из немногих дельных советов для таких случаев, выясненный при помощи интернет, — использовать для питания ровно 5 В в отношении датчиков и самого АЦП, а также снизить частоту определения до 10 Гц.  Кроме того, пользователи названой платы применяют линейные фильтры на вводе и рекомендуют делать больший упор в конструкциях на канал B — он менее шумный. Также хорошим стабилизатором показаний будет опрос 10 значений и вывода среднего. Вариантом можно применить сборки на основе АЦП HX710A. Названый конвертер дополнительно оснащен сенсором температуры, корректирующим выходные данные.

К Ардуино преобразователь соединяется четырьмя контактами, два из которых питание, а остальные применяются в деле передачи данных:

Arduino HX711
5V VCC
GND GND
DT Цифровой вывод
SCK Цифровой вывод

Закончив с конвертером аналога в цифру для Ардуино, перейдем к характеристикам, которыми обладают сами тензодатчики:

полу мостовые:

  • Критичная измеряемая масса: 50 кг.
  • Размеры: 9×34×34 мм.

На выходе полу мостового тензодатчика три провода, которыми он подключается к HX711. Классически они имеют следующее цветовое разделение:

Контакт Цвет
А+ Белый
E- Черный
E+ Красный

Мостовые:

  • Предельный вес: 1–20 кг.
  • Габариты: 14×14×80.5 мм.

У мостового детектора четыре исходящих контакта, имеющих следующую цветовую дифференциацию:

Контакт Цвет
А+ Белый
E- Черный
E+ Красный
A- Зеленый

На обоих видах резистивных детекторов присутствуют отверстия под крепежные болты M4/5.

схема

Схемы соединения и скетчи

Сами тензодатчики подключаются по схеме в зависимости от их типа — полу-, или мостового, а также общего количества чувствительных элементов. На плате HX711 размещены два аналоговых входа, соответственно к АЦП можно присоединить или четыре половинчатых детектора или два полных.

Соединение с единичным датчиком полумоста

схема 2

Соответственно скетч его калибрующий и опрашивающий:

// Указываем соответствующие контакты, к которым присоединен сенсор
#define pSCK 2
#define pDT 3
#include "HX711.h"
HX711 HX711ctl;         // создаем объект
float CF = -0.6;        // поправочный коэффициент подобранный к конкретным датчикам
float UNC,GR;                                                  // Унции и граммы
void setup() {
Serial.begin(57600);
HX711ctl.begin(pDT, pSCK);    // инит детектора
HX711ctl.set_scale();         // - //
HX711ctl.tare();              // Очистка показаний детектора
HX711ctl.set_scale(CF);       // Настройка поправочного значения
}
void loop() {
UNC = HX711ctl.get_units(10); // Делаем 10 проб и получаем усредненное значение
GR = UNC * 0.035274;          // Конвертация унция → грамм
Serial.print("Volume: ");
Serial.print(GR);
Serial.println(" Gr");
}

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

схема 3

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

Соединение с одним мостовым тензодатчиком

схема 4

Опять же, и для представленной схемы скетч изменений не требует. Есть только у некоторых специалистов замечание, по вычислению и установке CF — переменной поправки:

void setCF() {
HX711ctl.set_scale();         // - //
HX711ctl.tare();              // Очистка показаний датчика
const WOS = 200; // вес платформы
float CFM[10],CF=0,CR=0.035274;
for (int j=0;j < 10; j++){
CFM[j] = HX711ctl.get_units(1) / (WOS / CR);
CF += CFM[j];
}
CF=CF/10;
HX711ctl.set_scale(CF);
}

Соответственно изменится и остальной код:

// Указываем соответствующие линии, к которым присоединен детектор
#define pSCK 2
#define pDT 3
#include "HX711.h"
HX711 HX711ctl;
float UNC,GR;                   // Унции и граммы
void setup() {
Serial.begin(57600);
HX711ctl.begin(pDT, pSCK);    // инит детектора
HX711ctl.set_scale();         // - //
HX711ctl.tare();              // Очистка показаний датчика
setCF();       // Настройка поправочного значения ← измененная часть
}
void loop() {
UNC = HX711ctl.get_units(10); // Делаем 10 проб и получаем усредненное значение
GR = UNC * 0.035274;          // Конвертация унция →  грамм
Serial.print("Volume: ");
Serial.print(GR);
Serial.println(" Gr");
}

Библиотека 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() Ничего Ничего Вывод модуля АЦП из «сна»

Проект электронных весов с управлением и экраном

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

Наименование Количество
Arduino UNO 1
Экран 0.96 Oled Display с интерфейсом I2C 1
Резисторы 10кОм 4
Тактовые кнопки 4
Плата HX711 1

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

Подключение тензодатчиков

Скетч, который всем этим управляет:

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define pDT A0
#define pSCK A1
#define OLED_RESET 4
//коэффициент калибровки + (кнопка)
#define B1 22
//коэффициент калибровки - (кнопка)
#define B2 23
//коэффициент калибровки применить (кнопка)
#define B3 24
//установка 0 массы (кнопка)
#define B4 25
#include <Wire.h>
#include "HX711.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
HX711 HX711ctl;
float CF =3178.0;
float y1cal = 500.0;
long x1cal = 0L;
long x0cal = 0L;
float units;
float GR;
float GR_max=0;
float GR_min=1000;
void setup() {
// Подключаем монитор, если не получилось -- сообщение в порт отладки
if(!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C))  {
Serial.println(F("Display error"));
for(;;);
}
oled.clearDisplay();
oled.setTextColor(WHITE);
oled.setTextSize(1);
HX711ctl.begin(pDT, pSCK);
HX711ctl.set_scale();
pinMode(B1, INPUT);
pinMode(B2, INPUT);
pinMode(B3, INPUT);
pinMode(B4, INPUT);
delay(5000);
}
void loop() {
Serial.print("Volume: ");
units = HX711ctl.get_units(10);
GR = units;                                    // переводим унции в граммы
Serial.print(GR);                                          // отправляем в монитор порта
Serial.print(" Gr");
Serial.println();
oled.clearDisplay();
oled.setTextSize(1);
oled.setCursor(0,0);
if (GR_min>GR)GR_min=GR;
if (GR_max<GR)GR_max=GR;
if(digitalRead(B1) == LOW) {
oled.print("1: On");
GR_max=0;
GR_min=1000;
} else {
oled.print("1: Off");
}
oled.setCursor(0,8);
if(digitalRead(B2) == LOW) {
oled.print("2: On");
CF=GR/500.0f;
HX711ctl.set_scale(CF);
} else {
oled.print("2: Off");
}
oled.setCursor(64,0);
if(digitalRead(B3) == LOW) {
oled.print("3: On");
HX711ctl.set_scale(); // Сбрасываем калибровку
GR_max=0;
GR_min=1000; } else {
oled.print("3: Off");
}
oled.setCursor(64,8);
if(digitalRead(B4) == LOW) {
oled.print("4: On");
HX711ctl.tare();
GR_max=0;
GR_min=1000;
} else {
oled.print("4: Off");
}
oled.setTextSize(2);
oled.setCursor(0,16);
oled.print("VOL:");
oled.println(GR);
oled.setTextSize(2);
oled.setCursor(0,32);
oled.print("DIF:");
oled.println(GR_max-GR_min);
oled.setTextSize(2);
oled.setCursor(0,48);
oled.print("K:");
oled.println(CF);
oled.oled();
}

планируемый внешний вид конструкции

Видео по теме

Хорошая реклама
 

Ссылка на основную публикацию