1/f로 칠색으로 흔들리는 필립스 허를 해보았다

전자 공작 모두 맨맨입니다.

오늘 아침.

1/f의 변동이란



...모두 모르겠어....
어쩐지 푸리에 변환하면, 강도가 주파수에 반비례하는 것만은 알았다.
원래 기사에서도 참조되지만, 1/f로 칠색으로 흔들리는 LED 조명을 전자공작한다(입문 레벨) 의 기사에서, 자세한 설명이 있습니다. (고맙습니다)

그래프 덕분에 완전히 이해했다.

만들기



(재료 목록)
신규 철도 모형 레이아웃 제작 상황 그 2:별의 변동 표현

필립스 Hue를 프로그래밍 방식으로 제어하는 ​​방법은 파이썬에서 사용할 수있는 또는 Node.js의 phue입니다.
이번에는 phue 쪽을 사용해, 신속하게 실장해 갑시다.

Philips Hue의 색 공간은 HSV입니다.
우리 인류에게 RGB 이외의 색 공간은 미지의 세계. 바로 우주. 그러나 파이썬에는 표준 라이브러리 cylon.js에 RGB에서 HSV로 변환하는 rgb_to_hsv가 있습니다.

지루한 일은 파이썬에게 해보자.

이렇게, 흔들림에 대해서나, 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)



colorsys

좋은 웹페이지 즐겨찾기