Posted at

ラズベリーパイ2とperlを使って、LEDをランダムな時間間隔でチカチカさせる

More than 3 years have passed since last update.


概要

ラズベリーパイ2を利用したLEDチカチカ(通称Lチカ)を試してみます。

せっかくなので、それっぽくチカチカさせようと思います。

ここではすぐ使えるperlを利用します。

(やっていることはechoだけですので、もちろんshellなどでも同様のことはできます!)


Math::Roundをインストール

四捨五入の制御用にMath::Roundをcpanでインストールします。

$ cpan Math::Round

// rootでも使えるように
$ sudo cpan Math::Round


プログラムを作成

GPIOのvalueを 0<->1 と切り替えるだけの簡単なプログラムです。

切り替えはechoで、引数で指定したgpioのvlaueに書き込むことで対応。

あとはスリープの時間(切り替え時の待機時間)をランダムにしてやればOKです。


RandomFlash.pl

#!/user/local/bin/perl

use strict;
use warnings;
use utf8;
use Time::HiRes 'sleep';
use Math::Round;

#
# メイン処理
#
sub main
{
# Lチカに利用するPIN番号が引数に指定されていない
if (@ARGV == 0) {
print "invalid argument. please assign gpio num.(ex. 18)";
return 1;
}

my $gpio = $ARGV[0];

# PIN設定
exec_cmd("echo $gpio > /sys/class/gpio/export");
exec_cmd("echo out > /sys/class/gpio/gpio$gpio/direction");

# Lチカ
my $LIMIT = 10;
for (my $count = 0; $count < $LIMIT; $count++){
print ">>>> [count = $count]\n";
# 点灯
turn_on_LED($gpio);
sleep(getRandomeTime());
# 消灯
turn_off_LED($gpio);
sleep(getRandomeTime());
}

return 0;
}

#
# 点灯(消灯)時間をランダムに返す
#
sub getRandomeTime
{
return nearest(0.1, rand(1));
}

#
# LED制御
#
sub turn_on_LED { ctrl_LED(1, shift); }
sub turn_off_LED { ctrl_LED(0, shift); }
sub ctrl_LED
{
my ($val, $gpio) = @_;
exec_cmd("echo $val > /sys/class/gpio/gpio$gpio/value");
}

#
# コマンドを実行する
#
sub exec_cmd
{
my ($cmd) = shift;
print "$cmd\n";
my $output = `$cmd 2>&1`;
chomp($output);
my $status = $? / 256;
return ($status, $output);
}

&main();



実行

配線はこんな感じで。

ここではGPIO18(12番PIN)を利用します。

LEDはカソード(足が短い方)をマイナス極につなぎます。

raspberry01.png

引数にGPIOの番号を指定して実行します。

$ sudo perl RandomFlash.pl 18

成功すると下記のように出力され、LEDがランダムにチカチカします!

echo 18 > /sys/class/gpio/export

echo out > /sys/
class/gpio/gpio18/direction
>>>> [count = 0]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 1]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 2]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 3]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 4]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 5]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 6]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 7]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 8]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 9]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value