さて、前回までの記事でようやくラズベリーパイでLEDを1秒だけ光らせることが出来ました。

引き続き今回は1秒光らせて、1秒消すという動作を10回繰り返すLEDチカチカ(点灯)をやってみたいと思います。

このような感じです。

LED点灯プログラムの修正

このプログラムは次の様になります。

def switch(value)
  io = open("/sys/class/gpio/gpio24/value", "w")
  io.write(value)
  io.close
end

io = open("/sys/class/gpio/export", "w")
io.write(24)
io.close

io = open("/sys/class/gpio/gpio24/direction", "w")
io.write("out")
io.close

10.times.each do |i|
  switch(1)
  sleep 1
  switch(0)
  sleep 1
end

io = open("/sys/class/gpio/unexport", "w")
io.write(24)
io.close

それではプログラムを見ていきましょう。

同じ処理10回繰り返す

1秒点灯、1秒消灯を繰り返す処理を行うと説明しましたが便利なことにrubyでは処理を繰り返す為の命令があります。

それがtimesです。

プログラム上では次の部分になります。

10.times.each do |i|
  switch(1)
  sleep 1
  switch(0)
  sleep 1
end

timesの前の10という数字が繰り返す回数、10.times~とendの間に挟まれている4行繰り返す内容です。

この様にtimesは以下のようにして使います。

繰り返す回数.times do |i|
  繰り返したい処理
end

なのでこの処理を日本語で考えてみると「switch(1)を実行して1秒待つ、switch(0)を実行して1秒待つを10回繰り返す」という処理を表している事がわかります。

LEDをon/offするためのメソッドswitch

さて、10回繰り返す処理の中に突然switchを実行するという部分が出てきて何これ?と思われたと思いますが、これはメソッドと言って同じような処理を何度も繰り返す場合に処理を分かりやすくするためにまとめておく機能です。

と言っても何の事だかわからないのと思うので順を追ってみていきましょう。

まず、今回のプログラムは一旦忘れて「10回 on / off を繰り返す」という処理を前回のプログラムを元にtimesを使って書くことを考えてみましょう。

そうするとこうなります。

10.times do |i|
  io = open("/sys/class/gpio/gpio24/value", "w")
  io.write(1)
  io.close
  sleep 1
 
  io = open("/sys/class/gpio/gpio24/value", "w")
  io.write(0)
  io.close
  sleep 1
end

どうでしょう。もちろんこれでも正しく動きます。

「なんだ!じゃあこれで良いじゃん?修正する場所も少ないし…」と思うかもしれませんね。

でも良く見て下さい。

LEDを点灯する処理と消す処理はwriteに1を入れるか0を入れるかの部分だけが違って他の部分は一緒ですよね?

似てるんだから、なんかもっと短く書けないかな?と思いませんか?

まさしくこの短く書けないか?という問いに対する答えがメソッドを使うという方法なのです。

便利だと思いませんか?

それでもまだ「う〜ん、でもこう書く方がやっぱり直す部分が少なくて楽なんじゃ…」と思うかもしれませんね。

よく考えて下さい。

今回はLEDを付けて消してを1回ずつ繰り返すだけの簡単な処理ですが、1秒、2秒、3秒毎…10秒毎に消すのを100回繰り返して下さいと言われたらどうでしょう?

メチャクチャ長くなりますよね?

少なくとも私はそんな長いプログラムは見たくないです。

またメソッドにはプログラムを短く書くためだけではなく、後々修正が発生した場合に1箇所を直すだけで済むので楽といったメリットもあります。

従ってプログラムを書く時はメソッドを使わない事はまずないです。

なので、この点灯したり消したりっていう処理も今回は勉強も兼ねてわざわざswitchという名前を付けてメソッドとして用意したというわけです。

これは今回のプログラムの次の部分にあたります。

def switch(value)
  io = open("/sys/class/gpio/gpio24/value", "w")
  io.write(value)
  io.close
end

このように書いておくことでプログラム上で

switch(1)

とかけば、実際には

io = open("/sys/class/gpio/gpio24/value", "w")
io.write(value)
io.close

に処理が置き換えられて実行されわけです。

どうでしょう?メソッドのイメージは掴めましたか?

メソッドのより詳しい説明は下記のサイトが参考になるでしょう。

まとめ

どうでしょうか、単に10回繰り返すというだけならさほど難しくないですよね?

ということで今回はメソッドについても少し触れてみました。

折角なので前のプログラムを参考にLEDを光らせるためにGPIOを準備している部分と、処理終了後にGPIOの利用を停止する処理もみなさん自身の手でメソッドにしてみてください。

近くにあるロボット教室を探す

北海道・東北
関東
北陸・甲信越
東海
近畿
中国
四国
九州・沖縄