Працюємо з 09:00 до 19:00 Пн-Пт
Київ біля ТЦ Квадрат бул.Перова

Бывают такие времена в жизни ардуинщика, когда ему приходится из глубин любительских датчиков подыматься в божественные выси их промышленных собратьев. При этом мы сталкиваемся с совсем другими стандартами сопряжения их сигналов с контроллером. 



Подключение промышленного датчика уровня к Arduino

Промышленные аналоговые датчики выпускают со следующими выходными сигналами: импульсный, 0…20 мА, 4…20 мА, 0…5В и 0…10В. А стандартное напряжение питания у них 24В или сетевое 220В.

По моему опыту, самый популярный среди инженеров – токовый сигнал 4…20мА. Он меньше всего зависим от длины кабеля, а так же позволяет легко диагностировать неисправность или обрыв цепи датчика. Так же этот тип сигнала позволяет питать маломощные датчики прямо по сигнальному проводу. При этом между контроллером и датчиком нужно проложить только двухпроводный кабель. Такое подключение называют двухпроводной схемой. Датчик с сигналом 4-20мА ведет себя как переменный резистор с сопротивлением, прямо пропорциональным измеряемой величине. Это достигается стабилизатором тока внутри датчика. Этот стабилизатор конечно управляемый и держит величину тока, прямо пропорциональную значению измеряемого физического параметра. В трехпроводной и четырехпроводной схемах сигнал все тот же, но питание подводится к датчику дополнительными проводами.

Arduino 4-20mA

Arduino 4-20mA

Мы можем мерять ток 4-20 мА аналоговым входом контроллера Arduino или других, собрав предварительно следующую простенькую схемку. Напряжение на аналоговом входе здесь будет пропорционально току через контрольный резистор.

Arduino 4-20 mA

И я для себя её еще немного усложняю для большей стабильности показаний. Здесь добавлена RC-цепочка из резистора 10К и конденсатора 100nF.

Arduino 4-20мА

Номинал резистора Rx можно посчитать по простой формуле Rx=Uplc/0,02A, где 0,02А – это ток 20мА, а Uplc – это максимальный уровень аналогового входа контроллера в вольтах. Для Arduino Nano например, это напряжение составляет 5В. Для ESP32 – это примерно 3В. И таким образом получаем для Arduino Nano сопротивление 5В/0,02А = 250 Ом, а для ESP32 3В/0,02А = 150 Ом. Для напряжения 3,3В – это будет 165 Ом (или что более доступно 160 Ом). Сам резистор Rx нужно выбрать самый точный из всех, вам доступных, чтобы показания как можно меньше зависели от температуры воздуха. 

Дальше можно собирать схему и мерять напряжение на резисторе через аналоговый вход контроллера. Для опыта я возьму Arduino Nano и промышленный гидростатический датчик уровня с двухпроводной схемой питания и токовым сигналом 4-20 мА.

Но для начала перестрахуемся и проэмулируем сигнал датчика при помощи лабораторного блока питания. По расчетам для Arduino у нас получилось сопротивление резистора 250 Ом, но из-за не точности резистора у нас может получаться небольшой выход за предел измерения аналогового входа. Поэтому я возьму резистор 220 Ом. Собираем все по схеме. 

Arduino 4-20mA тест

Набрасываем программу в Arduino IDE. Она будет просто читать аналоговый вход А0 и писать его машинное значение в монитор порта. Загружаем программу в контроллер.

//Arduino 4-20 mA
const byte sensorPin = A0;
int sensorValue = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(sensorPin);
  
  Serial.println(sensorValue);
  
  delay(500);
}

Теперь выкрутим резистор, задающий напряжение на выходе блока питания, на минимум и начнем плавно увеличивать это напряжение до достижения тока 4 мА на амперметре. При этом запишем машинное значение напряжения на аналоговом входе, которое отображено в мониторе порта - 185. Это число будет соответствовать минимуму шкалы датчика. Дальше подымаем ток через измерительный резистор до 20 мА и снова записываем теперь уже число, соответствующее максимуму шкалы датчика - 928. И напоследок докрутим ток до максимума шкалы аналогового входа – то есть до 1023 и определим ток, при этом через резистор – 22 мА. Не старайтесь приравнять максимум датчика максимуму машинного значения аналогового входа. Желательно оставить небольшой запас значений аналогового входа для диагностики выхода измеряемой величины за границу допустимых значений. В нашем случае для этого мы изначально взяли резистор на 220 Ом вместо 250 Ом, чтобы уменьшить масштаб входной шкалы. Так же само можно играться величиной резистора и в обратную сторону. К примеру у вас есть датчик уровня на 3м, а вам надо точно мерять в диапазоне 0…2 м, то вам наоборот лучше увеличить сопротивление и при уровне 2м получать максимум шкалы аналогового входа.

Теперь можно преобразовать машинные значения измеряемого параметра в понятные нам физические единицы измерения, то есть в метры водяного столба. Хотя для отображения уровня в сборнике воды еще пользуются такими единицами как процентами наполнения сборника или даже объемом жидкости в нем. Все эти три параметра можно получить от одного аналогового датчика уровня. Для преобразования воспользуемся формулой масштабирования, но стандартная функция map() нам не подойдет, ибо она работает только с целыми числами int, а нам нужна высота водяного столба в формате float с плавающей запятой. Следующая формула порешает нам все вопросы масштабирования. В переменную L1 типа float будет сохраняться окончательный уровень в метрах. sensorValue – это значение аналогового входа. 185 – это машинное значение при 4мА. 2,5 – это максимум шкалы датчика в метрах. 0,0 – это минимум шкалы датчика в метрах. Дальше 928 – это машинное значение при 20 мА. И последний 0,0 – это смещение шкалы в метрах. Например, если датчик установлен на высоте 20 см от дна сборника воды, то сюда нужно вписать число 0,2 в метрах. В монитор порта будем писать как машинные значения так и уровень в метрах. Загрузим программу в контроллер и проверим нашу формулу в деле.

//Arduino 4-20 mA
const byte sensorPin = A0;
int sensorValue = 0;
float L1=0.0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(sensorPin);
  L1 = (sensorValue - 185.0) * (2.5 - 0.0) / (928.0 - 185.0) + 0.0;
  Serial.print(sensorValue);
  Serial.print(" ");
  Serial.println(L1);
  delay(500);
}

В Arduino IDE клацаю Загрузить. Запускаю монитор порта и при 4мА получаем уровень 0,0 м. Теперь подымаю ток до максимальных 20 мА и получаем искомые 2,5 м. Значит формула работает как надо.

Arduino 4-20mA гидростатический датчик уровня

Теперь рассмотрим сам датчик уровня поближе. У него два провода: красный – плюс, черный – минус. Трубочка соединяет внутреннюю часть рабочей измерительной мембраны с атмосферным воздухом. Она должна всегда быть выше уровня воды и ничем не замазана. Металлическая погружная часть датчика довольно тяжелая. На ней нанесены основные параметры: диапазон давлений 0…250 мBar, что соответствует 0…2,5 м; питание 12…30 В; выход 4…20 мА и серийный код. Снизу наклейка с надписью: не трогайте лицевую часть диафрагмы. Типо можете повредить. Она тут впринципе хорошо защищена и контактирует с жидкостью только через мелкие отверстия по бокам.

Теперь подключаем к контроллеру Arduino реальный датчик по следующей схеме и поганяем его.

Датчик подключен и без погружения в воду держит ток 4 мА. Теперь я просто возьму атмосферную трубку и потяну в ней воздух на себя. И понаблюдаем как будет изменяться уровень воды в мониторе порта. Значение доходит почти до 2,5м. Вот так этот датчик и работает.

Надеюсь эта статья была полезной. И теперь вы легко сможете юзать промышленные датчики в связке с  любительскими контроллерами. Ведь некоторые задачи решаются только с ними. Пишите в коментах, какие темы вас еще интересуют. С уважением geekmatic.in.ua! Заходите на наш канал Youtube

<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Стойка роликовая для оси Y с крепежом

Стойка роликовая для оси Y с крепежом

Монтажная панель из МДФ для организации оси Y автоматического лазерного гравера.Отверстия под шаговы..

77.28грн.

Шестерня для зубчатого ремня на 40 зубьев под ось 8 мм

Шестерня для зубчатого ремня на 40 зубьев под ось 8 мм

Используется для передачи и редукции крутящего момента от двигателя до оси 8 ммКоличество зубьев 40 ..

57.81грн.

Arduino UNO R3 + USB кабель

Arduino UNO R3 + USB кабель

Плата контроллера, полюбившаяся всем почитателям этой марки Arduino на базе микропроцессора ATmega3..

198.93грн.

Радиатор 25х23х16мм

Радиатор 25х23х16мм

Радиатор алюминиевый для транзисторов, симисторов ... с установкой на печатную платуОкрашенный в чер..

11.41грн.

Шилд 2 реле для Arduino NANO

Шилд 2 реле для Arduino NANO

Шилд для проектов с двумя электромеханическими реле под контроллер Arduino NANO. Упрощает монтаж и о..

170.66грн.