Бывают такие времена в жизни ардуинщика, когда ему приходится из глубин любительских датчиков подыматься в божественные выси их промышленных собратьев. При этом мы сталкиваемся с совсем другими стандартами сопряжения их сигналов с контроллером.
Промышленные аналоговые датчики выпускают со следующими выходными сигналами: импульсный, 0…20 мА, 4…20 мА, 0…5В и 0…10В. А стандартное напряжение питания у них 24В или сетевое 220В.
По моему опыту, самый популярный среди инженеров – токовый сигнал 4…20мА. Он меньше всего зависим от длины кабеля, а так же позволяет легко диагностировать неисправность или обрыв цепи датчика. Так же этот тип сигнала позволяет питать маломощные датчики прямо по сигнальному проводу. При этом между контроллером и датчиком нужно проложить только двухпроводный кабель. Такое подключение называют двухпроводной схемой. Датчик с сигналом 4-20мА ведет себя как переменный резистор с сопротивлением, прямо пропорциональным измеряемой величине. Это достигается стабилизатором тока внутри датчика. Этот стабилизатор конечно управляемый и держит величину тока, прямо пропорциональную значению измеряемого физического параметра. В трехпроводной и четырехпроводной схемах сигнал все тот же, но питание подводится к датчику дополнительными проводами.
Arduino 4-20mA
Мы можем мерять ток 4-20 мА аналоговым входом контроллера Arduino или других, собрав предварительно следующую простенькую схемку. Напряжение на аналоговом входе здесь будет пропорционально току через контрольный резистор.
И я для себя её еще немного усложняю для большей стабильности показаний. Здесь добавлена RC-цепочка из резистора 10К и конденсатора 100nF.
Номинал резистора 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 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 м. Значит формула работает как надо.
Теперь рассмотрим сам датчик уровня поближе. У него два провода: красный – плюс, черный – минус. Трубочка соединяет внутреннюю часть рабочей измерительной мембраны с атмосферным воздухом. Она должна всегда быть выше уровня воды и ничем не замазана. Металлическая погружная часть датчика довольно тяжелая. На ней нанесены основные параметры: диапазон давлений 0…250 мBar, что соответствует 0…2,5 м; питание 12…30 В; выход 4…20 мА и серийный код. Снизу наклейка с надписью: не трогайте лицевую часть диафрагмы. Типо можете повредить. Она тут впринципе хорошо защищена и контактирует с жидкостью только через мелкие отверстия по бокам.
Теперь подключаем к контроллеру Arduino реальный датчик по следующей схеме и поганяем его.
Датчик подключен и без погружения в воду держит ток 4 мА. Теперь я просто возьму атмосферную трубку и потяну в ней воздух на себя. И понаблюдаем как будет изменяться уровень воды в мониторе порта. Значение доходит почти до 2,5м. Вот так этот датчик и работает.
Надеюсь эта статья была полезной. И теперь вы легко сможете юзать промышленные датчики в связке с любительскими контроллерами. Ведь некоторые задачи решаются только с ними. Пишите в коментах, какие темы вас еще интересуют. С уважением geekmatic.in.ua! Заходите на наш канал Youtube
Модуль повербанка 4,2В на 2 USB выхода
К данному модулю нужно только подключить литий-ионный аккумулятор 3,7-4,2В, закрыть в корпус и повер..
127.89грн.
Датчик уровня дискретный горизонтальный
Дискретный датчик, срабатывающий при достижении жидкостью определенного уровня и выше его. В сработа..
113.03грн.
MOC3023 оптосимистор
Оптопара с симисторным выходом для импульсного управления мощным симистором от логических сигналов к..
14.62грн.
Уроки Arduino типы данных для начинающих
Привет друзья от geekmatic.in.ua! Пора заняться полезным делом и разобрать типы данных, представле..
Набор датчиков веса 200кг
4 тензодатчика для измерения веса до 200 кг при мостовом соединенииКаждый отдельный датчик рассчитан..
186.88грн.