Perl
RaspberryPi

ラズベリーパイ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