I would expect the relay to switch on at the same time as "ON" is printed - in other words 1s later than it does. Doing a bit of experimenting shows that it actually switches on not at print $value "0"; but when the direction is set to out at close $direction;.
The files in /sys/ are actually kernel drivers, much like in /proc/. Those file-based drivers are rather simple-minded and desigend to use by shell scripts, where each echo foo > /proc/some/magic/file ends in calling open(2), write(2), and close(2). So you should simulate that behaviour.
At work, I had a client project where a Raspi was involved, running a daemon for a different purpose. Some more I/Os were needed, and so I added a tiny C module that implemented functions to configure and functions to set pins. Both just simulated a shell echo, i.e. called open, write, close. I/O switching was fast enough not to see a delay with the naked eye, so probably below 100 msec.
Rewriting your code like this should help:
#!/usr/bin/perl
# untested!
use strict;
use warnings;
use feature "say";
sub write_file
{
my ($fn,$content)=@_;
open my $f,'>',$fn or die "Could not open $fn: $!";
say $f $content;
close $f;
}
sub export
{
my $number=shift;
write_file("/sys/class/gpio/export",$number);
}
sub direction
{
my ($number,$dir)=@_;
write_file("/sys/class/gpio/gpio$number/direction",$dir);
}
sub write_value
{
my ($number,$level)=@_;
write_file("/sys/class/gpio/gpio$number/value",$level);
}
sub read_file # unused
{
open my $f,'<',$fn or die "Could not open $fn: $!";
my $line=<$f>;
close $f;
chomp $line;
return $line;
}
sub read_value # unused
{
my $number=shift;
return read_file("/sys/class/gpio/gpio$number/value");
}
# all of the functions above could move to a module
export(20);
direction(20,"out");
while (1) {
write_value(20,0);
say "on";
sleep 1;
write_value(20,1);
say "off";
sleep 1;
}
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.