Как работать с универсальными линиями ввода-вывода GPIO?

Как работать с универсальными линиями ввода-вывода GPIO?

В роутерах RTU предусмотрены 4 универсальных порта ввода-вывода GPIO (маркировка I1, I2, I3 и I4).




Выводы являются независимыми, могут быть программно сконфигурированы в операционной системе и предполагают три режима использования:

        1. Подключение резистивных датчиков.


        2. Управление нагрузкой. В данном режиме выводы I1 - I4 можно объединять для увеличения нагрузочной способности выхода.


        3. Измерение напряжения (режим работы по умолчанию).


PULLUP - "Подтягивающий" резистор к питанию.

PULLDOWN - "Подтягивающий" резистор к заземлению.

ADC - АЦП.


1. Конфигурирование GPIO через WEB

Для настройки GPIO через Web-интерфейс, необходимо перейти во вкладку Службы ---> I/O Lines.




Далее можно выбрать необходимый режим:




АЦП - измерение напряжения.

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

Открытый коллектор - устанавливается активный уровень на выходе "открытый коллектор".

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


2. Конфигурирование GPIO через консоль

Каждый GPIO имеет определенный индекс и направление по умолчанию в операционной системе. Приводим таблицу соответствий:




# - инвертированный сигнал.

Все GPIO расположены по пути /sys/class/gpio/.

Внимание:

  • Если мы работаем с PULLDOWN, PULLUP# должен быть выключен!
  • Если мы работаем с PULLUP#, PULLDOWN должен быть выключен!

Для примера включим на входе I1 режим "Измерения напряжения":

echo 66 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio66/direction
echo 65 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio65/direction
echo 0 > /sys/class/gpio/gpio65/value

Пример измерения напряжения на входе I1:

cat /sys/bus/iio/devices/iio\:device0/in_voltage6_raw

in_voltage6_raw мы определили командой ls -la /dev/io*.

Получаем N (для примера - 1493).

Формула для расчета:

N * 8,219 = XмВ

1493 * 8,219 = 12 270мВ

Теперь включим на I1 режим "Подключения резистивных датчиков":

echo 66 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio66/direction
echo 0 > /sys/class/gpio/gpio66/value
echo 65 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio65/direction
echo 0 > /sys/class/gpio/gpio65/value

Формула определения зависимости сопротивления резистивного датчика от цифровых показаний adc_raw:

R = 0.543 * adc_raw

И третий режим "Управление нагрузкой":

echo 66 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio66/direction
echo 1 > /sys/class/gpio/gpio66/value
echo 65 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio65/direction
echo 1 > /sys/class/gpio/gpio65/value

Тогда для управления током будем подавать команду:

echo 1 > /sys/class/gpio/gpio65/value - рабочий ток идет через нагрузку
echo 0 > /sys/class/gpio/gpio65/value - рабочий ток НЕ идет через нагрузку

Для того чтобы постоянно не подавать команды инициализации GPIO, их можно внести в файл /etc/rc.local.

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