Использование линий ввода/вывода RBM33G

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Продублирую это здесь, так как топик касается и скриптов:

viewtopic.php?f=16&t=14657&p=90768#p90768
Последний раз редактировалось Sertik 03 окт 2023, 09:41, всего редактировалось 4 раза.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Сегодня подключал к GPIO RBM33G модуль реле на 4 канала MP701 от Мастер КИТ https://masterkit.ru/shop/1327359
Всё работает без проблем.


Изображение

Написал простенькую функцию переключение реле (используются GPIO pin12,13,15,16 настроенные на вывод):

Код: Выделить всё

# Функция работы с реле модуля MP701
# by Sertik 30/09/2023

# $1 - action (on/off)
# $2 - rele number (if not set all)

:local iotRele do={
:local arrayPin {12; 13; 15; 16}
:local act
     :if ($1="on") do={:set act 1}
     :if ($1="off") do={:set act 0}

:if ([:len $act]>0) do={

   :if ([:len $2]>0) do={
           :do {
                  :if (([:tonum $2]<=0) or ([:tonum $2]>4)) do={:return Error}
                  /iot gpio digital set "pin$($arrayPin->([:tonum $2]-1))" output=$act
                  } on-error={:return Error}
     } else={
                  :foreach Xpin in=$arrayPin do={
                  /iot gpio digital set "pin$Xpin" output=$act
                   }
                } 

 :return "Done"} else={:return "Error"}
}



# :log error ("Включаем реле 3 "."$[$iotRele off 3]")
# :delay 2s
# :log warning ("Выключаем реле 3 "."$[$iotRele off 3]")

# Включаем все реле
# [$iotRele on]

# Выключаем все реле
# [$iotRele off]


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Интересная статья на Хабре по теме:

https://habr.com/ru/articles/765404/


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

В итоге получилась вот такая более менее универсальная функция работы с реле через GPIO RBM33G:
параметры работы ясны из комментариев внутри кода
поддерживает работу с нормально открытыми и нормально закрытыми типами реле и блоков реле (max 6 rele)

Код: Выделить всё

# Функция работы с реле через GPIO RBM33G; by Sertik 13/10/2023 v.2.0
# максимально поддерживается 6 реле
# соответствие реле GPIO распиновке задаётся в массиве arrayPin:
# реле 1- pin3 
#             2- pin5
#             3- pin12
#             4- pin13
#             5- pin15
#             6- pin16

# количество подключенных реле задается в :local ReleAll

# $1 - действие (on/off/status/direction/info), при info всегда выдается информация по всем реле
# $2 - номер реле (если не указан действие выполняется над всеми)
# $3 - input/output, используется при $1 direction, если не задан, действие производится над всеми линиями

# в глобальной переменной ioReleNONC должно стоять "true" если реле нормально открытые и "false" если нормально замкнутые
# по умолчанию (если ioReleNONC не задавать) считается, что реле нормально открытые (output=1 включает реле, output=0 - выключает)
# ! если реле разнотипные нужно устанавливать ioReleNONC индивидуально для каждого реле перед его переключением
#  и не использовать работу со всеми реле сразу !
# корректная работа осуществляется только с однотипными реле или блоками однотипных реле !

:global iotRele do={
:global ioReleNONC
:local arrayPin {3, 5, 12; 13; 15; 16}
:local ReleAll 6
:local act;

:if ([:len $ioReleNONC]=0) do={:set $ioReleNONC true}

:if ($1="help") do={
         /terminal style varname
         :put ""
         :put "Function works with GPIO RBM33G"
         :put "version 2.0"
         :put "by Sertik 13/10/2023"
         :put ""
         :put "\$1 - action: on/off/status/direction/info/help"
         :put "\$2 - rele number, if not define - all"
         :put "\$3 - input/output for direction"
         :put "\$ioReleNONC - true (or not specified) - NO rele/ false - NC rele"
         :put ""
         /terminal style none}

 :if ([:len [/system routerboard settings get gpio-function]]!=0) do={
                              :local gpioanswer "Pin 12-16 is not set on GPIO.\n\rPlease reset routerboard gpio-function and reboot Router."
                              :put ("ERROR $0 function"."\r\n"."$gpioanswer")
                              :log error ("ERROR $0 function"."\r\n"."$gpioanswer")
                              :return $gpioanswer}       

:do {
    :foreach Xpin in=$arrayPin do={
            /iot gpio digital set "pin$Xpin" direction=output}
             } on-error={:local gpioanswer "GPIO pin 12-16 is set on serial-port"
                              :put ("ERROR $0 function"."\r\n"."$gpioanswer")
                              :log error ("ERROR $0 function"."\r\n"."$gpioanswer")
                              :return $gpioanswer       
                   }

     if ($1="info") do={
:local gio [/iot gpio digital print as-value]
:local count 0; local name; :local dir; :local state;
:foreach i in=$gio do={
                            :set name ($gio->$count->"name")
                            :set dir ($gio->$count->"direction")
                            :set state ($gio->$count->"output")
                            :set count ($count+1)
         :put ("$count "."$name "."$dir "."$state")
         :log warning ("$count "."$name "."$dir "."$state")
  }
:return $gio}

:if (($1="status") and ([:len $2]=1)) do={
do {
                  :return [/iot gpio digital get "pin$($arrayPin->([:tonum $2]-1))"]
} on-error={:return Error}
}

:if (($1="direction") and ([:len $3]=0)) do={
    :if (($2="input") or ($2="output")) do={
        do {
                  :foreach Xpin in=$arrayPin do={
                  /iot gpio digital set "pin$Xpin" direction=$2
                   }
        } on-error={:return Error}
  } else={:return Error}
:return Done}

:if (($1="direction") and ([:len $2]=1) and ([:len $3]>0)) do={
     :if (($3="input") or ($3="output")) do={
            :do {
                  /iot gpio digital set "pin$($arrayPin->[:tonum $2])" direction=$3
                } on-error={:return Error}
     } else={:return Error}
:return Done}

     :if (($1="on") && ($ioReleNONC=true)) do={:set act 1}
     :if (($1="on") && ($ioReleNONC=false)) do={:set act 0}
     :if (($1="off") && ($ioReleNONC=true)) do={:set act 0}
     :if (($1="off") && ($ioReleNONC=false)) do={:set act 1}

:if ([:len $act]>0) do={

   :if ([:len $2]>0) do={
           :do {
                  :if (([:tonum $2]<=0) or ([:tonum $2]>$ReleAll)) do={:return Error}
                  /iot gpio digital set "pin$($arrayPin->([:tonum $2]-1))" output=$act
                  } on-error={:return Error}
     } else={
                  :foreach Xpin in=$arrayPin do={
                  /iot gpio digital set "pin$Xpin" output=$act
                   }
                } 

 :return "Done"} else={:return "Error"}
}


# Примеры вызова (:global ioReleNONC true или не задано для реле NO типа, :global ioReleNONC false для реле NC-типа)

# help (выводится только в Терминал)
# [$iotRele help]

# вывести состояние всех реле в терминал и лог
# [$iotRele info]

# запросить состояние реле 3
# :local R3 [$iotRele status 3]

# установить направление ввода/вывода линии 4
# [$iotRele direction 3 output]

# установить направление ввода/вывода всех 4-х линий на ввод:
# [$iotRele direction input]

# :log error ("Включаем реле 3 "."$[$iotRele off 3]")
# :delay 2s
# :log warning ("Выключаем реле 3 "."$[$iotRele off 3]")

# Включаем все реле
# [$iotRele on]

# Выключаем все реле
# [$iotRele off]


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

А это универсальная функция работы с линиями GPIO. Именно с линиями, а не с реле, подключенными к линиям на выход, как предыдущая.
Функция может делать с линиями всё - устанавливать режимы I/O, активировать/дезактивировать, читать состояние и устанавливать состояние для линий, настроенных на выход.

Работа и параметры ясны из кода, также ниже есть примеры вызова:

Код: Выделить всё

# Функция работы линиями GPIO RBM33G; by Sertik 30/10/2023 v.1.2
# соответствие реле GPIO распиновке задаётся в массиве arrayPin (порядок менять нельзя):
# линия     1- pin3 
#                2- pin5
#                3- pin12
#                4- pin13
#                5- pin15
#                6- pin16

# $1 - действие (on/off/direction/info/enable/disable), при info всегда выдается информация по всем реле
# $2 - номер линии (если не указан действие выполняется над всеми)
# $3 - input/output, используется при $1 direction, если не задан, действие производится над всеми линиями

# в глобальной переменной ioLineNONC должно стоять "true" если линия нормально открытая и "false" если нормально закрытая
# по умолчанию (если ioLineNONC не задавать) считается, что линии, настроенные на output нормально открытые (output=1 включает реле, output=0 - выключает)
# ! если линии управляют разнотипными реле нужно устанавливать ioLineNONC индивидуально для каждого реле перед его переключением
#  и не использовать работу со всеми линиями сразу !
# корректная работа осуществляется только с линиями, управляющими однотипными реле или блоками однотипных реле !

:global iotLine do={
:global ioLineNONC
:local arrayPin {3; 5; 12; 13; 15; 16}
:local ioLine 6
:local act;

:if ([:len $ioLineNONC]=0) do={:set $ioLineNONC true}

:if ($1="help") do={
         /terminal style varname
         :put ""
         :put "Function works with GPIO RBM33G"
         :put "version 1.0"
         :put "by Sertik 23/10/2023"
         :put ""
         :put "\$1 - action: on/off/enable/disable/direction/info/help"
         :put "\$2 - line number, if not define - all"
         :put "\$3 - input/output for direction"
         :put "\$ioLineNONC - true (or not specified) - line for NO rele/ false - line for NC rele"
         :put ""
         /terminal style none}

 :if ([:len [/system routerboard settings get gpio-function]]!=0) do={
                              :local gpioanswer "Pin 12-16 is not set on GPIO.\n\rPlease reset routerboard gpio-function and reboot Router."
                              :put ("ERROR $0 function"."\r\n"."$gpioanswer")
                              :log error ("ERROR $0 function"."\r\n"."$gpioanswer")
                              :return $gpioanswer}       


     if (($1="info") and ([:len $2]=0)) do={
:local gio [/iot gpio digital print as-value]
:local count 0; local name; :local comment; :local script; :local dir; :local output; :local input;
:foreach i in=$gio do={
                            :set name ($gio->$count->"name")
                            :set comment ($gio->$count->"comment")
                            :set script ($gio->$count->"script")
                            :set dir ($gio->$count->"direction")
                            :set input ($gio->$count->"intput")
                            :set output ($gio->$count->"output")
                            :set count ($count+1)
         :put ("$count "."$name "."$dir "."$output "."$input "."$comment "."$script")
         :log warning ("$count "."$name "."$dir "."$output "."$input "."$comment "."$script")
  }
:return $gio}

:if (($1="info") && ([:len $2]=1)) do={
   :if (([:tonum $2]<=0) or ([:tonum $2]>$ioLine)) do={:return Error}
do {
                  :local state [/iot gpio digital get "pin$($arrayPin->([:tonum $2]-1))"]
                  :return $state
} on-error={:return Error}
}

:if (($1="enable") and ([:len $2]=1)) do={
  :if (([:tonum $2]<=0) or ([:tonum $2]>$ioLine)) do={:return Error}
do {
                               [/iot gpio digital set "pin$($arrayPin->([:tonum $2]-1))" disabled=no]
                               :local pinSet ([/iot gpio digital get "pin$($arrayPin->([:tonum $2]-1))"]->"disabled")
                               :if (!$pinSet) do={:return "Done"} else={:return "Not set"}
} on-error={:return Error}
}

:if (($1="disable") and ([:len $2]=1)) do={
  :if (([:tonum $2]<=0) or ([:tonum $2]>$ioLine)) do={:return Error}
do {
                               [/iot gpio digital set "pin$($arrayPin->([:tonum $2]-1))" disabled=yes]
                               :local pinSet ([/iot gpio digital get "pin$($arrayPin->([:tonum $2]-1))"]->"disabled")
                               :if ($pinSet) do={:return "Done"} else={:return "Not set"}
} on-error={:return Error}
}

:if (($1="disable") and ([:len $2]=0)) do={
   do {
                  :foreach Xpin in=$arrayPin do={
                  /iot gpio digital set "pin$Xpin" disabled=yes
                   }
        } on-error={:return Error}
:return Done}

:if (($1="enable") and ([:len $2]=0)) do={
   do {
                  :foreach Xpin in=$arrayPin do={
                  /iot gpio digital set "pin$Xpin" disabled=no
                   }
        } on-error={:return Error}
:return Done}


:if (($1="direction") and ([:len $3]=0)) do={
    :if (($2="input") or ($2="output")) do={
        do {
                  :foreach Xpin in=$arrayPin do={
                  /iot gpio digital set "pin$Xpin" direction=$2
                   }
        } on-error={:return Error}
  } else={:return Error}
:return Done}

:if (($1="direction") and ([:len $2]=1) and ([:len $3]>1)) do={
     :if (($3="input") or ($3="output")) do={
       :if ([:tonum $2]>$ioLine) do={:return "Error"}
            :do {
                  /iot gpio digital set "pin$($arrayPin->[:tonum $2])" direction=$3
                } on-error={:return Error}
     } else={:return Error}
:return Done}

     :if (($1="on") && ($ioLineNONC=true)) do={:set act 1}
     :if (($1="on") && ($ioLineNONC=false)) do={:set act 0}
     :if (($1="off") && ($ioLineNONC=true)) do={:set act 0}
     :if (($1="off") && ($ioLineNONC=false)) do={:set act 1}

:if ([:len $act]>0) do={

   :if ([:len $2]>0) do={
           :do {
                  :if (([:tonum $2]<=0) or ([:tonum $2]>$ioLine)) do={:return Error}
# check direction output - error
        :if ([/iot gpio digital get "pin$($arrayPin->([:tonum $2]-1))" direction]="input") do={:return "Error line $2 is set on INPUT"}
                  /iot gpio digital set "pin$($arrayPin->([:tonum $2]-1))" output=$act
                  } on-error={:return Error}
     } else={
                  :foreach Xpin in=$arrayPin do={
#check direction output for group line - sckip input line
         :if ([/iot gpio digital get "pin$Xpin" direction]="output") do={
                  /iot gpio digital set "pin$Xpin" output=$act}
                   }
                } 

 :return "Done"} else={:return "Error"}
}

# Примеры вызова (:global ioLineNONC true или не задано для линий NO типа, :global ioLineNONC false для линий NC-типа)

# help (выводится только в Терминал)
[$iotLine help]

# вывести состояние всех реле в терминал и лог
[$iotLine info]

# запросить состояние реле 3
:local R3 [$iotLine info 3]

# запросить флаг активности PIN "2"
:put ([$iotLine info 2]->"disabled")

# установить направление ввода/вывода линии 4
[$iotLine direction 3 output]

# установить направление ввода/вывода всех 4-х линий на ввод:
[$iotLine direction input]

:log error ("Логическая единица на линии 3 "."$[$iotLine on 3]")
:delay 2s
:log warning ("Логический ноль на линии 3 "."$[$iotLine off 3]")

# Логическая единица на всех линиях
[$iotLine on]

# Логический ноль на всех линиях
[$iotLine off]

# Активировать/дезактивировать линию 1
# [$iotLine enable/disable 1]

# Активировать/дезактивировать все линии
# [$iotLine enable/disable]


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить