LoginSignup
0
0

More than 3 years have passed since last update.

1 / fで七色にゆらぐPhilips Hueをやってみた

Last updated at Posted at 2021-01-15

電子工作なんもできんマンです。

今朝1 / f で七色にゆらぐLED照明を電子工作する(入門レベル)をみて, 「Philips Hueを使えば, 電子工作なんもできんマンでもできるのでは?」と思ってやってみました。

1 / fのゆらぎとは

... なんもわからん...。
なんとなくフーリエ変換したら, 強度が周波数に反比例するっぽいことだけはわかった...。
元記事でも参照されていますが, 新規鉄道模型レイアウト制作状況その2:星のゆらぎ表現の記事で, 詳細な説明があります。(ありがてぇ)

グラフのおかげで完全に理解した。

作る

(材料一覧)
材料

Philips Hueをプログラムで制御する方法として, パッと思いつくものとしては, Pythonで使えるphueか, Node.jsのcylon.jsがあります。
今回はphueの方を使って, 手早く実装していきましょう。

Philips Hueの色空間はHSVです。
我々人類にとってRGB以外の色空間は未知の世界。まさに宇宙。しかし, pythonには標準ライブラリcolorsysにRGBからHSVに変換するrgb_to_hsvがあります。

退屈なことはPythonにやらせましょう。

こうして, ゆらぎについてや, HSV色空間など分からないものをすっ飛ばして, チャチャッと仕上げたものがこちら。

# ipythonで実行
!pip install phue
from colorsys import rgb_to_hsv
from random import uniform, randint
from time import sleep
from phue import Bridge


IP_OF_MY_BRIDGE = "192.168.0.1"  # Philips Hue BridgeのIPアドレス
GROUP = [1,2,3,4]  # 操作したい電球のidリスト
MAX_RGB = 255
FLUCTUATION_THRESHOLD = 0.01  # 元記事でいう大きすぎたり小さすぎたりすると変化しなくなる問題の回避のための閾値 (好みで小さくしてみた)


def init_rgb():
    return [randint(0, MAX_RGB) for _ in range(3)]

def fluctuate(x):
    if x < 0.5:
        x = x + 2 * x * x
    else:
        x = x - 2 * (1.0 - x) * (1.0 - x)
    if x < FLUCTUATION_THRESHOLD or x > 1 - FLUCTUATION_THRESHOLD:
        x = uniform(0.1, 0.9)     
    return x

def convert_rgb_to_next_state(rgb_list):
    for idx, rgb in enumerate(rgb_list):
        rgb_list[idx] = round(fluctuate(rgb/MAX_RGB) * MAX_RGB)
    return rgb_list

def set_right(light_idx,r:int, g:int, b:int):
    hsv = rgb_to_hsv(r/MAX_RGB, g/MAX_RGB, b/MAX_RGB)
    light = lights[light_idx]
    #print(hsv)
    light.hue = round(hsv[0] * 65535)  # max hue is 65535
    light.saturation = round(hsv[1] * 255)  # max saturation = 255
    light.brightness = round(hsv[2] * 255)  # max brightness = 255
    light.transitiontime = 10  # 1 second


def main():
    bridge = Bridge(IP_OF_MY_BRIDGE)
    bridge.connect()
    lights = bridge.get_light_objects('id')
    right_rgb_states = [init_rgb() for _ in GROUP]
    while True:
        sleep(1)
        for idx, right_rgb_state in enumerate(right_rgb_states):
            set_right(GROUP[idx], *right_rgb_state)
            right_rgb_states[idx] = convert_rgb_to_next_state(right_rgb_state)        
main()

朝にぴったりな遊びでした。
なんも分からなくても意外となんとかなるもんですね。
Philips Hueの活用方法をもっと考えていきたいです。
また, 実装中, 「人類的にはRGBは0-255がええか」と思っていましたが, 実装後に見ると, 普通に小数でいい気がしました。
電子工作にも入門してぇ…。

結果(GIF)

ezgif.com-video-to-gif-2.gif

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0