본문 바로가기

라즈베리파이 5

라즈베리파이 python 6 - RGB LED

반응형

 

이 튜토리얼에서는 Raspberry Pi를 사용하여 RGB LED를 제어하는 방법을 설명합니다.

자세히 알아보겠습니다:

 

  • RGB LED가 작동하는 방식.
  • 라즈베리파이에 RGB LED를 연결하는 방법입니다.
  • RGB LED의 색상을 제어하도록 Raspberry Pi를 프로그래밍하는 방법입니다. 

 

강의 순서

 

라즈베리파이 Python 9 - 버튼 채터링 방지

라즈베리파이 Python 8 - 버튼

라즈베리파이 python 7 - 교통 신호등

라즈베리파이 python 6 - RGB LED

라즈베리파이 Python 5 - LED Fade 구현

라즈베리파이 Python 4 - Delay 없는 LED Blink

라즈베리파이 Python 3 - LED Blink

라즈베리파이 Python 2 - 파이선 코드 템플릿

라즈베리파이 Python 1 - python 실행

 

 

RGB LED 개요

 

RGB LED는 빨간색, 녹색, 파란색의 세 가지 기본 색상을 조합하여 모든 색상을 생성할 수 있습니다. 이는 3개의 개별 LED(빨간색, 녹색, 파란색)로 구성되지만 모두 단일 구조물에 포함되어 있습니다.

 

RGB LED 핀아웃: RGB LED에는 4개의 핀이 있습니다.

  • GND(OV)에 연결해야 하는 공통(음극) 핀
  • 빨간색을 제어하는 ​​R(빨간색) 핀
  • 녹색을 제어하는 ​​G(녹색) 핀
  • 파란색을 제어하는 ​​B(파란색) 핀

 

 

RGB LED를 Raspberry Pi에 연결하려면 전류 제한 저항을 사용해야 합니다. 연결하는 것이 다소 어려울 수 있지만 걱정하지 마십시오. 이미 저항이 내장되어 있는 이 RGB LED 모듈을 사용할 수 있습니다.

 

RGB LED 모듈에는 다음과 같은 4개의 핀도 포함됩니다.

  • 공통(음극-) 핀: GND(OV)에 연결해야 함
  • R(빨간색): 빨간색을 제어하는 ​​데 사용되는 핀입니다. 
  • G(녹색): 녹색을 제어하는 ​​데 사용되는 핀입니다. 
  • B(파란색): 파란색을 제어하는 ​​데 사용되는 핀입니다. 

 

https://newbiely.com/tutorials/raspberry-pi/raspberry-pi-led-rgb

 

* 참고 사항: RGB LED의 일반적인 핀 유형은 다양할 수 있습니다. 음극(-, GND) 또는 양극(+, VCC)이 될 수 있습니다. 이 튜토리얼에서는 일반적인 음극 핀을 사용합니다.

 

작동 원리

 

물리학의 영역에서는 빨간색(R), 녹색(G), 파란색(B)의 세 가지 색상 값이 결합되어 색상을 형성합니다. 각 값의 범위는 0부터 255까지입니다. 세 가지 값을 조합하면 총 256 x 256 x 256 색상이 생성됩니다.

 

R, G, B 핀에 대한 PWM 신호(0~255 범위의 듀티 사이클)를 생성하도록 Raspberry Pi를 프로그래밍하여 RGB LED 디스플레이를 원하는 색상으로 만들 수 있습니다. R, G, B 핀으로 전송되는 PWM 신호의 듀티 사이클은 각각 빨간색(R), 녹색(G), 파란색(B) 색상 값에 비례합니다. 

 

연결도는 직접 RGB LED를 연결하는 방법과 RGB LED 모듈을 연결하는 회로도입니다.

 

 

 

 

 

RGB LED 제어 방법 GRB LED를 원하는 색상으로 제어하는 ​​방법(예: #00979D)을 단계별로 알아봅시다.

 

먼저 표시하려는 색상을 결정하고 해당 색상 코드를 가져옵니다.

팁:

색상 선택기를 사용하여 원하는 색상 코드를 선택할 수 있습니다.

미지의 색상을 사용하려면 온라인 이미지의 색상 도구를 사용할 수 있습니다.

 

그런 다음 w3school의 도구를 사용하여 색상 코드를 R, G, B 값으로 변환합니다. 이러한 값을 기록해 두십시오. 이 경우: R 0, G 151, B = 157

 

 

RGB 핀에 할당하는 라즈베리파이 핀 번호를 확인하세요.

 

LED_R_PIN = 13
LED_G_PIN = 12
LED_B_PIN = 18

 

RGB 핀을 출력으로 설정합니다.

 

GPIO.setmode(GPIO.BCM)
GPIO.setup([LED_R_PIN, LED_G_PIN, LED_B_PIN],GPIO.OUT)

 

컬러값을 아래와 같이 지정합니다.

 

RED = GPIO.PWM(LED_R_PIN, 1000)
GREEN = GPIO.PWM(LED_G_PIN, 1000)
BLUE = GPIO.PWM(LED_B_PIN, 1000)

 

 

아래의 Raspberry Pi 코드는 LED 색상을 다음과 같은 순서로 변경합니다. 

#00C9CC(빨간색 = 0, 녹색 = 201, 파란색 = 204)

#F7788A (빨간색 = 247, 녹색 = 120, 파란색 = 138)

#34A853(빨간색 = 52, 녹색 = 168, 파란색 = 83) 

 

 

"""
This Raspberry Pi code was developed by newbiely.com
This Raspberry Pi code is made available for public use without any restriction
For comprehensive instructions and wiring diagrams, please visit:
https://newbiely.com/tutorials/raspberry-pi/raspberry-pi-led-rgb
"""


import RPi.GPIO as GPIO
from time import sleep

LED_R_PIN = 13
LED_G_PIN = 12
LED_B_PIN = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup([LED_R_PIN, LED_G_PIN, LED_B_PIN],GPIO.OUT)
RED = GPIO.PWM(LED_R_PIN, 1000)
GREEN = GPIO.PWM(LED_G_PIN, 1000)
BLUE = GPIO.PWM(LED_B_PIN, 1000)


def _map(x, in_min, in_max, out_min, out_max):
    return int((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)

RED.start(0)
GREEN.start(0)
BLUE.start(0)

try:
    while True:
        # color code #00C9CC (R = 0,   G = 201, B = 204)
        RED.ChangeDutyCycle(_map(0, 0, 255, 0, 100))
        GREEN.ChangeDutyCycle(_map(201, 0, 255, 0, 100))
        BLUE.ChangeDutyCycle(_map(204, 0, 255, 0, 100))
        sleep(1)

        # color code #F7788A (R = 247, G = 120, B = 138)
        RED.ChangeDutyCycle(_map(247, 0, 255, 0, 100))
        GREEN.ChangeDutyCycle(_map(120, 0, 255, 0, 100))
        BLUE.ChangeDutyCycle(_map(138, 0, 255, 0, 100))
        sleep(1)

        # color code #34A853 (R = 52,  G = 168, B = 83)
        RED.ChangeDutyCycle(_map(52, 0, 255, 0, 100))
        GREEN.ChangeDutyCycle(_map(168, 0, 255, 0, 100))
        BLUE.ChangeDutyCycle(_map(83, 0, 255, 0, 100))
        sleep(1)
finally:
    RED.stop()
    GREEN.stop()
    BLUE.stop()
    GPIO.cleanup()

 

 

다양한 색상을 사용할 때 함수를 생성하여 Raspberry Pi 코드를 단축할 수 있습니다. 

 

"""
This Raspberry Pi code was developed by newbiely.com
This Raspberry Pi code is made available for public use without any restriction
For comprehensive instructions and wiring diagrams, please visit:
https://newbiely.com/tutorials/raspberry-pi/raspberry-pi-led-rgb
"""


import RPi.GPIO as GPIO
from time import sleep

LED_R_PIN = 13
LED_G_PIN = 12
LED_B_PIN = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup([LED_R_PIN, LED_G_PIN, LED_B_PIN],GPIO.OUT)
RED = GPIO.PWM(LED_R_PIN, 1000)
GREEN = GPIO.PWM(LED_G_PIN, 1000)
BLUE = GPIO.PWM(LED_B_PIN, 1000)


def _map(x, in_min, in_max, out_min, out_max):
    return int((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)

def setColor(r,g,b):
    RED.ChangeDutyCycle(_map(r, 0, 255, 0, 100))
    GREEN.ChangeDutyCycle(_map(g, 0, 255, 0, 100))
    BLUE.ChangeDutyCycle(_map(b, 0, 255, 0, 100))

RED.start(0)
GREEN.start(0)
BLUE.start(0)

try:
    while True:
        # color code #00C9CC (R = 0,   G = 201, B = 204)
        setColor(0, 201, 204);
        sleep(1)

        # color code #F7788A (R = 247, G = 120, B = 138)
        setColor(247, 120, 138);
        sleep(1)

        # color code #34A853 (R = 52,  G = 168, B = 83)
        setColor(52, 168, 83);
        sleep(1)
finally:
    RED.stop()
    GREEN.stop()
    BLUE.stop()
    GPIO.cleanup()

 

 

추가 지식

 

공통핀이 양극(+, VCC)인 경우는 다음을 수행해야 합니다.

 

  • 공통 핀을 Raspberry Pi의 3.3V에 연결합니다.
  • AnalogWrite() 함수를 활용하고 R, G 및 B 값을 각각 255 R, 255 G 및 255 B로 설정합니다.

 

RGB LED 스트립은 함께 연결된 일련의 RCB LED로 구성됩니다. LED 스트립은 주소 지정이 가능한 유형과 주소 지정이 불가능한 유형으로 나눌 수 있습니다. 우리는 각 유형의 LED 스트립에 대한 튜토리얼을 만들 것입니다.

 

* 참고 사항:

 

다른 핀에 세 개의 저항을 사용하고, RGB LED의 공통 핀에 단일 저항을 사용하지 마십시오.

 

단일 RGB 패키지에 있는 3개의 LED가 병렬인 것은 사실입니다. 이론적으로는 공통 핀에 단일 저항을 사용해도 괜찮습니다. 그러나 실제로는 이는 권장되지 않습니다. 이는 실제 LED가 동일한 특성을 갖지 않기 때문입니다. RGB 패키지의 3개 LED는 동일하지 않습니다

→ LED의 저항이 다릅니다 ⇒ 각 LED에 전류가 균등하게 분배되지 않습니다

→ 밝기가 균일하지 않아 LED 하나가 파손되고 결국 다른 LED가 파손될 수 있습니다 . 

 

 

마지막으로 모든 컬러값을 표현하는 코드입니다. 

 

import random, time
import RPi.GPIO as GPIO
import colorsys
 
RUNNING = True
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
red = 13
green = 12
blue = 28
 
GPIO.setup(red, GPIO.OUT)
GPIO.setup(green, GPIO.OUT)
GPIO.setup(blue, GPIO.OUT)


Freq = 100
 
RED = GPIO.PWM(red, Freq)
RED.start(100)
GREEN = GPIO.PWM(green, Freq)
GREEN.start(100)
BLUE = GPIO.PWM(blue, Freq)
BLUE.start(100)

outval = 128

def wheel_color(position):
    """Get color from wheel value (0 - 384)."""
    
    if position < 0:
        position = 0
    if position > 384:
        position = 384

    if position < 128:
        r = 127 - position % 128
        g = position % 128
        b = 0
    elif position < 256:
        g = 127 - position % 128
        b = position % 128
        r = 0
    else:
        b = 127 - position % 128
        r = position % 128
        g = 0

    return r, g, b

try:
	while(True):
		for pos in range(0,385):
			r, g, b = wheel_color(pos)
			print (r, g, b)
			percenttestr = (r/128.0)*100.0
			percenttestg = (g/128.0)*100.0
			percenttestb = (b/128.0)*100.0
			print (percenttestr)
			print (percenttestg)
			print (percenttestb)
			RED.ChangeDutyCycle(percenttestr)
			GREEN.ChangeDutyCycle(percenttestg)
			BLUE.ChangeDutyCycle(percenttestb)
			time.sleep(0.1)

			
except KeyboardInterrupt:
	GPIO.cleanup()

 

 

 

아래 코드를 참고하세요. 코드 출처는 여기를 따라가세요.

이 코드 테스트 중

 

 

 

 

#!/usr/bin/env python
import RPi.GPIO as GPIO
import time

colors = [0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0x00FFFF, 0xFF00FF, 0xFFFFFF, 0x9400D3]
pins = {'pin_R':13, 'pin_G':12, 'pin_B':28}  # pins is a dict

GPIO.setmode(GPIO.BOARD)       # Numbers GPIOs by physical location
for i in pins:
        GPIO.setup(pins[i], GPIO.OUT)   # Set pins' mode is output
        GPIO.output(pins[i], GPIO.HIGH) # Set pins to high(+3.3V) to off led

p_R = GPIO.PWM(pins['pin_R'], 2000)  # set Frequece to 2KHz
p_G = GPIO.PWM(pins['pin_G'], 2000)
p_B = GPIO.PWM(pins['pin_B'], 2000)

p_R.start(0)      # Initial duty Cycle = 0(leds off)
p_G.start(0)
p_B.start(0)

def map(x, in_min, in_max, out_min, out_max):
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

def setColor(col):   # For example : col = 0x112233
        R_val = (col & 0x110000) >> 16
        G_val = (col & 0x001100) >> 8
        B_val = (col & 0x000011) >> 0

        R_val = map(R_val, 0, 255, 0, 100)
        G_val = map(G_val, 0, 255, 0, 100)
        B_val = map(B_val, 0, 255, 0, 100)

        p_R.ChangeDutyCycle(100-R_val)     # Change duty cycle
        p_G.ChangeDutyCycle(100-G_val)
        p_B.ChangeDutyCycle(100-B_val)

try:
        while True:
                for col in colors:
                        setColor(col)
                        time.sleep(1.0)
except KeyboardInterrupt:
        p_R.stop()
        p_G.stop()
        p_B.stop()
        for i in pins:
                GPIO.output(pins[i], GPIO.HIGH)    # Turn off all leds
        GPIO.cleanup()

 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^