RaspberryPiに接続したフルカラーLEDをPWMでグラデーションさせる

f:id:hogesuke_1:20160906013834j:plain

以下の記事でPWMでLEDの明るさの調整をすることができました。
hogesuke.hateblo.jp

つづいて、フルカラーLEDを使ったグラデーションに挑戦してみたいと思います。

フルカラーLEDのグラデーション

PWMを使って赤・緑・青の各色の明るさを変えることによりグラデーションさせることできます。
下の動画は実際にPWMを使ってグラデーションさせた様子です。

youtu.be

ちなみに使っているフルカラーLEDは以下のものです。

放熱基板付1WハイパワーフルカラーRGBLED OSTCWBTHC1S: LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販

PWMを使ってグラデーションさせるコード

以下はRubyでwiringpiを使ってグラデーションさせるコードです。

※ wiringpiのインストールについては下の記事を参照してください
PWMでRaspberryPiに接続したLEDの明るさを変える - 無理しない感じ

require 'wiringpi'

RED_LED = 4
GREEN_LED = 5
BLUE_LED = 6

SLEEP_TIME = 0.01

begin
  io = WiringPi::GPIO.new
  
  io.soft_pwm_create(RED_LED, 100, 100)
  io.soft_pwm_create(GREEN_LED, 0, 100)
  io.soft_pwm_create(BLUE_LED, 0, 100)
  
  while true
    (0..100).each do |x|
      io.soft_pwm_write(BLUE_LED, x)
      sleep(SLEEP_TIME)
    end
    (0..100).each do |x|
      io.soft_pwm_write(RED_LED, (100 - x))
      sleep(SLEEP_TIME)
    end
    (0..100).each do |x|
      io.soft_pwm_write(GREEN_LED, x)
      sleep(SLEEP_TIME)
    end
    (0..100).each do |x|
      io.soft_pwm_write(BLUE_LED, (100 - x))
      sleep(SLEEP_TIME)
    end
    (0..100).each do |x|
      io.soft_pwm_write(RED_LED, x)
      sleep(SLEEP_TIME)
    end
    (0..100).each do |x|
      io.soft_pwm_write(GREEN_LED, (100 - x))
      sleep(SLEEP_TIME)
    end
  end
rescue Interrupt
  io.soft_pwm_write(RED_LED, 0)
  io.soft_pwm_write(GREEN_LED, 0)
  io.soft_pwm_write(BLUE_LED, 0)
end

上記のコードを sample_color.rb として保存してください。
また、上記のコードは各色をそれぞれ以下のピンに接続した場合を前提としています。

  • 赤 -> GPIO23
  • 緑 -> GPIO24
  • 青 -> GPIO25

実行

$ sudo ruby sample_color.rb

グラデーションする様子を確認できるでしょうか。
処理を止める際は Ctrl + C を入力してください。

超カンタンに解説

初期状態では赤のみ点灯させ、その後、以下のように変化させています。

  1. 青をだんだんと明るく
  2. 赤をだんだんと暗く
  3. 緑をだんだんと明るく
  4. 青をだんだんと暗く
  5. 赤をだんだんと明るく
  6. 緑をだんだんと暗く

以上を繰り返すことで、赤 から 緑、青、そしてまた赤に戻るグラデーションをつくることができます。

おわりに

PWMを使ったLEDの明るさ調整を応用して、フルカラーLEDでグラデーションを実現できました。 これを利用して電子工作の表現の幅も広がりそうです。

Raspberry Pi 3 Model B (Element14)

Raspberry Pi 3 Model B (Element14)