?

Log in

No account? Create an account
Разбираю гуманитарные вопросы на винтики, функции, алгоритмы. Оживляю технологии
Совмещаю гуманитарный и технический пласты знаний в единое мировоззрение
Raspberry Pi: работа с реле 
10th-Nov-2016 09:00 pm
rele srd-05vds-sl-c

Электроника частенько применяется для управления электрикой. Вот и мне понадобилось включаться или отключать электрические приборы сети переменного тока 220В для одного из проектов. Использовал электромагнитное реле с питанием 5В на 2 линии на основе китайских модулей srd-05vds-sl-c. Впрочем, уже думаю о замене на твердотельные в перспективе, о причинах в конце заметки. Да и двух линий уже маловато.


Взаимодействие ведется с помощью двух скриптов. Один переключает состояние массива реле. Второй считывает состояние массива реле.
Интерфейс взаимодействия - /sys/class/gpio

Переключаем реле:
releSwitch.pl 0 1 -
где каждый аргумент:
'0' - включить
'1' - выключить
'-' (или другой символ) - не переключать

Код releSwitch.pl
#!/usr/bin/perl
use strict;
use v5.14;
use experimental 'smartmatch';

my @rele_pins = (20, 21);

my @rele_switch;

for ( my $i = 0; $i < @rele_pins; $i++ )
{
	if ( defined($ARGV[$i]) && $ARGV[$i] ~~ ['0','1'] )
	{
		$rele_switch[$i] = $ARGV[$i];
	}

	# RELE $i
	my $direction_socket = "/sys/class/gpio/gpio$rele_pins[$i]/direction";
	my $value_socket = "/sys/class/gpio/gpio$rele_pins[$i]/value";

	my $i_nice = $i + 1;
	if ( defined $rele_switch[$i] )
	{
		# turn on
		unless ( -f $direction_socket )
		{
			say "Set PIN$i_nice (GPIO$rele_pins[$i])";
			`echo $rele_pins[$i] > /sys/class/gpio/export`;
			select(undef, undef, undef, 0.1);
		}
		# set direction
		say "Set direction$i_nice";
		`echo out > $direction_socket`;
		select(undef, undef, undef, 0.1);
		# switch
		say "Set value$i_nice = $rele_switch[$i]";
		`echo $rele_switch[$i] > $value_socket`;
	}
}


Считать состояние массива реле:
releState.pl
На выходе значения через пробел
0 1

Код releState.pl
#!/usr/bin/perl
use strict;
use v5.14;
use experimental 'smartmatch';

my @rele_pins = (20, 21);

my @result;
foreach my $pin ( @rele_pins )
{
	my $value = `gpio -g read $pin`;
	$value =~ s/[^\d]+//g;
	push(@result, $value );
}
print join(' ', @result);


Реле имеют свойство иногда помирать (прикипает контакт). Результат помершего реле не обязательно совпадает со значением, считываемым с интерфейса. Т.е. является неопределенным. Поэтому необходимо узнавать результат работы реле на выходе, либо проверять работу подключенного устройства.
Если же это сделать затруднительно, да и вообще, мне видится лучшим вариантом твердотельные реле. Меньше шанса сломаться - это раз, сломанное реле гарантировано разомкнуто - это второе, - система более предсказуема.

This page was loaded Aug 19th 2018, 1:25 pm GMT.