http://qs1969.pair.com?node_id=11125110


in reply to Re^11: Controlling USB on Raspberry Pi
in thread Controlling USB on Raspberry Pi

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". ;-)