PWMでRaspberryPiに接続したLEDの明るさを変える

f:id:hogesuke_1:20160905013832j:plain

RaspberryPiでLEDの点灯は簡単にできたので、次にLEDの明るさ調整を試してみたいと思います。

PWM

明るさの調整は、PWM(Pulse Width Modulation)という方法用いることで実現可能です。

f:id:hogesuke_1:20160904041609p:plain

PWMというのはパルス信号のONである時間(パルス幅)を調整することにより流れる電流量を変えるような仕組みです。

OFFの時間と較べONの時間が長くなるほど電流量が大きくなり、短くなるほど電流量が小さくなります。 その特性を利用することでLEDの明るさを調整することが可能となります。

以下の動画は実際にPWMでLEDの明るさを動的に変えて点滅させた様子です。

youtu.be

Raspberry PiでPWMを利用する

それでは、Raspberry PiでPWMを利用するにはどうすればいいでしょうか。
WiringPiというライブラリを使用することで簡単にPWMを利用可能です。

wiringpiのインストール

以下はRubyでWiringPiを使用する場合の説明となります。

Raspbian Jessieの場合、WiringPiはすでにインストールされているため、RubyからWiringPiを操作するためのGemをインスールすればOKです。

ただし、 ruby-dev が入っていないとGemのインストールに失敗するので、先にインストールしておきます。

$ sudo apt-get install -y ruby-dev
$ sudo gem install wiringpi

RubyでPWMを使用するコード

require 'wiringpi'

LED = 4

begin
  io = WiringPi::GPIO.new

  io.soft_pwm_create(LED, 0, 100)
  while true
    (0..100).each do |x|
      io.soft_pwm_write(LED, x)
      sleep(0.01)
    end
    (0..100).each do |x|
      io.soft_pwm_write(LED, (100 - x))
      sleep(0.01)
    end
  end
rescue Interrupt
  io.soft_pwm_write(LED, 0)
end

上記のコードを sample.rb で保存してください。 ちなみに、上記のコードではLEDを GPIO23 に接続した場合の例となります。

※ RaspberryPiのピン番号とWiringPiのピン番号は異なるので注意が必要です。それぞれの対応は以下のページで確認できます(下の方の画像)。

Pins | Wiring Pi

実行

$ sudo ruby sample.rb

だんだんと明るくなり、その後、だんだんと暗くなることを確認できると思います。
処理を止める際は Ctrl + C を入力してください。

ちょっとだけ雑に解説

8行目の soft_pwm_create の3番目の引数 100pwm_range です。

io.soft_pwm_create(LED, 0, 100) # 8行目

pwm_range は何かというと、LEDの明るさを何段階に設定するか、というように考えると分かりやすいかと思います。

100を設定した場合、100でもっとも明るく、0でもっとも暗くなります。

今回のコードでは0からはじめ、 soft_pwm_write で1ずつ値を加えるように書き換えています。 100までいったところで、今度は1ずつ減らすように書き換えています。

このようなコードで、だんだんと明るく、その後だんだんと暗くなるような点滅を実現できます。

おわりに

ライブラリを使うことで簡単にPWMを使用し、LEDの明るさを変えることができました。
今度はフルカラーLEDを使って色をだんだんと変えていくような実装を試してみたいと思います。

参考

PWM制御
Rubyでwiringpiを使う | ぬわーーーーーーー!!!

Raspberry Pi 3 Model B (Element14)

Raspberry Pi 3 Model B (Element14)