Продублирую это здесь, так как топик касается и скриптов:
viewtopic.php?f=16&t=14657&p=90768#p90768
Использование линий ввода/вывода RBM33G
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
Последний раз редактировалось Sertik 03 окт 2023, 09:41, всего редактировалось 4 раза.
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
Сегодня подключал к GPIO RBM33G модуль реле на 4 канала MP701 от Мастер КИТ https://masterkit.ru/shop/1327359
Всё работает без проблем.

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

Написал простенькую функцию переключение реле (используются 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
viewtopic.php?f=14&t=13947
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
В итоге получилась вот такая более менее универсальная функция работы с реле через GPIO RBM33G:
параметры работы ясны из комментариев внутри кода
поддерживает работу с нормально открытыми и нормально закрытыми типами реле и блоков реле (max 6 rele)
параметры работы ясны из комментариев внутри кода
поддерживает работу с нормально открытыми и нормально закрытыми типами реле и блоков реле (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
viewtopic.php?f=14&t=13947
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
А это универсальная функция работы с линиями GPIO. Именно с линиями, а не с реле, подключенными к линиям на выход, как предыдущая.
Функция может делать с линиями всё - устанавливать режимы I/O, активировать/дезактивировать, читать состояние и устанавливать состояние для линий, настроенных на выход.
Работа и параметры ясны из кода, также ниже есть примеры вызова:
# Примеры вызова (: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]
Функция может делать с линиями всё - устанавливать режимы 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
viewtopic.php?f=14&t=13947