레시피

레시피는 picozero를 사용하는 방법에 대한 예제를 제공합니다.

picozero 임포트하기

picozero를 사용하려면 스크립트 맨 위에 import 줄을 추가해야 합니다.

필요한 항목만 임포트할 수 있으며, 항목은 쉼표 ,로 구분합니다:

from picozero import pico_led, LED

이제 스크립트에서 pico_ledLED를 사용할 수 있습니다:

pico_led.on() # Raspberry Pi Pico의 내장 LED 켜기
led = LED(14) # GP14 핀에 연결된 LED 제어
led.on()

또는 picozero 라이브러리 전체를 임포트할 수도 있습니다:

import picozero

이 경우 모든 picozero 항목 참조 앞에 접두사를 붙여야 합니다:

picozero.pico_led.on()
led = picozero.LED(14)

Pico LED

내장 LED에 GP25 라벨이 붙은 Raspberry Pi Pico 다이어그램.

Raspberry Pi Pico의 LED를 켜려면:

from picozero import pico_led

pico_led.on()

스크립트를 실행하여 LED가 켜지는지 확인하십시오.

pico_led를 사용하는 것은 다음과 동일합니다:

pico_led = LED(25)

pico_ledLED를 사용하여 만든 외부 LED와 동일한 방식으로 사용할 수 있습니다.

핀 배열 (Pin out)

핀과 핀 번호를 표시하는 Raspberry Pi Pico의 다이어그램을 출력할 수 있습니다.

from picozero import pinout

pinout()
        ---usb---
GP0  1  |o     o| -1  VBUS
GP1  2  |o     o| -2  VSYS
GND  3  |o     o| -3  GND
GP2  4  |o     o| -4  3V3_EN
GP3  5  |o     o| -5  3V3(OUT)
GP4  6  |o     o| -6           ADC_VREF
GP5  7  |o     o| -7  GP28     ADC2
GND  8  |o     o| -8  GND      AGND
GP6  9  |o     o| -9  GP27     ADC1
GP7  10 |o     o| -10 GP26     ADC0
GP8  11 |o     o| -11 RUN
GP9  12 |o     o| -12 GP22
GND  13 |o     o| -13 GND
GP10 14 |o     o| -14 GP21
GP11 15 |o     o| -15 GP20
GP12 16 |o     o| -16 GP19
GP13 17 |o     o| -17 GP18
GND  18 |o     o| -18 GND
GP14 19 |o     o| -19 GP17
GP15 20 |o     o| -20 GP16
        ---------

LED

GP14와 GND에 노란색 LED가 연결된 Raspberry Pi Pico 다이어그램.

Raspberry Pi Pico로 외부 LED를 제어할 수 있습니다.

깜빡이기 (Flash)

LED를 켜고 끕니다:

from picozero import LED
from time import sleep

led = LED(14)

led.on()
sleep(1)
led.off()

LED를 토글하여 켜짐 상태에서 꺼짐 상태로 또는 그 반대로 바꿉니다:

from picozero import LED
from time import sleep

led = LED(14)

while True:
    led.toggle()
    sleep(1)

🚀 Wokwi 시뮬레이터에서 실행하기

또는 blink() 메서드를 사용할 수 있습니다.

from picozero import LED

led = LED(14)

led.blink()

밝기 (Brightness)

LED의 밝기를 설정합니다:

from picozero import LED
from time import sleep

led = LED(14)

while True:
    led.brightness = 0  # off
    sleep(1)
    led.brightness = 0.5  # half brightness
    sleep(1)
    led.brightness = 1  # full brightness
    sleep(1)

맥박 효과(pulse effect) 만들기:

from picozero import LED
from time import sleep
from math import sin, radians

led = LED(14) 

while True:
    for i in range(360):
        angle = radians(i)
        led.brightness = 0.5 + 0.5 * sin(angle)
        sleep(0.01)

또는 pulse() 메서드를 사용할 수 있습니다.

from picozero import LED

led = LED(14) 

led.pulse()

버튼 (Buttons)

버튼과 스위치를 Raspberry Pi Pico에 연결하고 눌렸을 때를 감지할 수 있습니다.

Button이 눌렸는지 확인하기:

from picozero import Button
from time import sleep

button = Button(18)

while True:
    if button.is_pressed:
        print("Button is pressed")
    else:
        print("Button is not pressed")
    sleep(0.1)

Button이 눌릴 때마다 함수 실행하기:

from picozero import Button, pico_led
from time import sleep

button = Button(18)

def led_on_off():
    pico_led.on()
    sleep(1)
    pico_led.off()
    
button.when_pressed = led_on_off

참고

button.when_pressed = led_on_off 줄은 led_on_off 함수를 즉시 실행하는 것이 아니라, 버튼이 눌렸을 때 호출될 함수에 대한 참조를 생성합니다. 실수로 button.when_pressed = led_on_off() 를 사용하면 when_pressed 동작이 None (이 함수의 반환 값)으로 설정되어 버튼을 눌러도 아무 일도 일어나지 않습니다.

Button을 눌렀을 때 pico_led를 켜고 뗐을 때 끄기:

from picozero import Button, pico_led

button = Button(18)

button.when_pressed = pico_led.on
button.when_released = pico_led.off

터치 센서 (Touch sensor)

정전식 터치 센서를 사용하여 터치를 감지합니다:

from picozero import TouchSensor, pico_led
from time import sleep

# Capacitive touch sensor output connected to pin 2
touch = TouchSensor(2)

while True:
    if touch.is_touched:
        pico_led.on()
    else:
        pico_led.off()
    sleep(0.1)

콜백(callbacks)을 사용하여 터치 이벤트에 응답합니다:

from picozero import TouchSensor, pico_led
from time import sleep

touch = TouchSensor(2)

touch.when_touch_starts = pico_led.on
touch.when_touch_ends = pico_led.off

모션 센서 (Motion sensor)

PIR(Passive Infrared) 센서를 사용하여 움직임을 감지합니다:

from picozero import MotionSensor
from time import sleep

pir = MotionSensor(2)

print("PIR Motion Sensor Example")
print("Waiting for motion...")

while True:
    if pir.motion_detected:
        print("Motion detected!")
        sleep(1)
    else:
        print("No motion")
        sleep(0.5)

콜백(callbacks)을 사용하여 모션 이벤트에 응답합니다:

from picozero import MotionSensor, pico_led
from time import sleep

pir = MotionSensor(2)

# Set up event callbacks
pir.when_motion = pico_led.on
pir.when_no_motion = pico_led.off

# Keep the program running
try:
    while True:
        sleep(1)
except KeyboardInterrupt:
    print("\nShutting down...")
    pico_led.off()  # Make sure LED is off when exiting

RGB LED

RGBLED로 색상 설정하기:

from picozero import RGBLED
from time import sleep

rgb = RGBLED(red=2, green=1, blue=0)

rgb.red = 255  # full red
sleep(1)
rgb.red = 128  # half red
sleep(1)

rgb.on() # white

rgb.color = (0, 255, 0)  # full green
sleep(1)
rgb.color = (255, 0, 255)  # magenta
sleep(1)
rgb.color = (255, 255, 0)  # yellow
sleep(1)
rgb.color = (0, 255, 255)  # cyan
sleep(1)
rgb.color = (255, 255, 255)  # white
sleep(1)

rgb.color = (0, 0, 0)  # off
sleep(1)

# slowly increase intensity of blue
for n in range(255):
    rgb.blue = n
    sleep(0.01)
    
rgb.off()

toggle()invert() 사용하기:

from picozero import RGBLED
from time import sleep

rgb = RGBLED(red=2, green=1, blue=0)

rgb.color = (255, 165, 0) # orange
sleep(1)

for _ in range(6):
    rgb.toggle()
    sleep(1)

for _ in range(6):
    rgb.invert()
    sleep(1)
    
rgb.off()

맥박 (Pulse)

LED 색상을 점진적으로 변경하려면 pulse()를 사용하십시오. 기본값은 빨간색과 꺼짐, 초록색과 꺼짐, 파란색과 꺼짐 사이를 맥박처럼 움직입니다.

from picozero import RGBLED
from time import sleep

rgb = RGBLED(1, 2, 3)

rgb.pulse() # does not wait
sleep(6)
rgb.off()
sleep(1)

# 2 second to fade from purple to off, 0.5 seconds to change from off to purple 
rgb.pulse(fade_times=(2, 0.5), colors=((1, 0, 1), (0, 0, 0)), wait=True, n=3)

rgb.off()
sleep(1)

# 4 seconds to change from red to green, 2 to change from green to blue, then 1 to change from blue back to red
rgb.pulse((4, 2, 1), colors=((1, 0, 0), (0, 1, 0), (0, 0, 1)), wait=True, n=2)

순환 (Cycle)

cycle()의 기본값은 빨간색에서 초록색으로, 초록색에서 파란색으로, 파란색에서 빨간색으로 순환하는 것입니다.

from picozero import RGBLED
from time import sleep

rgb = RGBLED(1, 2, 3)

# Gradually colour cycle through colours between red and green, green and blue then blue and red
rgb.cycle()
sleep(4)
rgb.off()
sleep(1)

# Colour cycle slower in the opposite direction
rgb.cycle(fade_times=3, colors=((0, 0, 1), (0, 1, 0), (1, 0, 0)), wait=True, n=2)
rgb.off()

가변 저항 (Potentiometer)

가변 저항이 보고하는 값, 전압 및 퍼센트를 출력합니다:

# Potentiometer connected to GP26 (ADC0), GND and 3V

from time import sleep
from picozero import Pot

pot = Pot(26)

while True:
    print(pot.value, pot.voltage)
    sleep(0.1)
    

참고

Thonny Python 에디터에서 보기(View) > **플로터(Plotter)**를 선택하면 print()의 출력을 그래프로 볼 수 있습니다.

가변 저항을 사용하여 LED의 밝기를 제어합니다:

from picozero import Pot, LED

# Potentiometer connected to GP26 (ADC0), GND and 3V
# LED connected to GP0

pot = Pot(26)
led =  LED(0)

while True:
    led.value = pot.value

조이스틱 (Joystick)

조이스틱은 가변 저항과 유사하므로 Pot 클래스를 사용하여 조이스틱을 제어할 수 있습니다.

조이스틱에 연결된 Raspberry Pi Pico 다이어그램

조이스틱을 최소, 중간 및 최대 위치로 움직여 보십시오.

from picozero import Pot, Button
from time import sleep

x = Pot(27)
y = Pot(26)
button = Button(17)

while True:
    if button.is_pressed:
        print("Button is pressed\n")

    print("x: " + str(x.raw_value) + ", y: " + str(y.raw_value))
    sleep(0.1)

부저 (Buzzer)

전원이 공급될 때 음을 재생하는 능동 부저를 제어합니다:

# Active Buzzer that plays a note when powered
from time import sleep
from picozero import Buzzer

buzzer = Buzzer(10)

buzzer.on()
sleep(1)
buzzer.off()
sleep(1)

buzzer.beep()
sleep(4)
buzzer.off()


스피커 (Speaker)

다양한 톤이나 주파수를 재생할 수 있는 수동 부저나 스피커를 제어합니다:

from picozero import Speaker
from time import sleep

speaker = Speaker(5)

def tada():
    c_note = 523
    speaker.play(c_note, 0.1)
    sleep(0.1)
    speaker.play(c_note, 0.9)

def chirp():
    global speaker
    for _ in range(5):
        for i in range(5000, 2999, -100):
          speaker.play(i, 0.01)
        sleep(0.2)


try: 
    tada()
    sleep(1)
    chirp()
    
finally: # Turn the speaker off if interrupted
    speaker.off()

멜로디 연주하기

음 이름과 박자 길이를 사용하여 멜로디를 연주합니다:

from picozero import Speaker

speaker = Speaker(5)

BEAT = 0.25 # 240 BPM

liten_mus = [ ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['d6', BEAT], ['a#5', BEAT], ['d5', BEAT],  
              ['f5', BEAT], ['d#5', BEAT], ['d#5', BEAT], ['c5', BEAT / 2],['d5', BEAT / 2], ['d#5', BEAT], 
              ['c6', BEAT], ['a5', BEAT], ['d5', BEAT], ['g5', BEAT], ['f5', BEAT], ['f5', BEAT], ['d5', BEAT / 2],
              ['d#5', BEAT / 2], ['f5', BEAT], ['g5', BEAT], ['a5', BEAT], ['a#5', BEAT], ['a5', BEAT], ['g5', BEAT],
              ['g5', BEAT], ['', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT / 2], ['d6', BEAT / 2], ['c6', BEAT / 2],
              ['a#5', BEAT / 2], ['a5', BEAT / 2], ['g5', BEAT / 2], ['a5', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT],
              ['f5', BEAT], ['f5', BEAT], ['f5', BEAT / 2], ['d#5', BEAT / 2], ['d5', BEAT], ['f5', BEAT], ['d6', BEAT],
              ['d6', BEAT / 2], ['c6', BEAT / 2], ['b5', BEAT], ['g5', BEAT], ['g5', BEAT], ['c6', BEAT / 2],
              ['a#5', BEAT / 2], ['a5', BEAT], ['f5', BEAT], ['d6', BEAT], ['a5', BEAT], ['a#5', BEAT * 1.5]]

try:
    speaker.play(liten_mus)
       
finally: # Turn speaker off if interrupted
    speaker.off()

개별 음 연주하기

개별 음을 연주하고 타이밍을 제어하거나 다른 동작을 수행합니다:

from picozero import Speaker
from time import sleep

speaker = Speaker(5)

BEAT = 0.4

liten_mus = [ ['d5', BEAT / 2], ['d#5', BEAT / 2], ['f5', BEAT], ['d6', BEAT], ['a#5', BEAT], ['d5', BEAT],  
              ['f5', BEAT], ['d#5', BEAT], ['d#5', BEAT], ['c5', BEAT / 2],['d5', BEAT / 2], ['d#5', BEAT], 
              ['c6', BEAT], ['a5', BEAT], ['d5', BEAT], ['g5', BEAT], ['f5', BEAT], ['f5', BEAT], ['d5', BEAT / 2],
              ['d#5', BEAT / 2], ['f5', BEAT], ['g5', BEAT], ['a5', BEAT], ['a#5', BEAT], ['a5', BEAT], ['g5', BEAT],
              ['g5', BEAT], ['', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT / 2], ['d6', BEAT / 2], ['c6', BEAT / 2],
              ['a#5', BEAT / 2], ['a5', BEAT / 2], ['g5', BEAT / 2], ['a5', BEAT / 2], ['a#5', BEAT / 2], ['c6', BEAT],
              ['f5', BEAT], ['f5', BEAT], ['f5', BEAT / 2], ['d#5', BEAT / 2], ['d5', BEAT], ['f5', BEAT], ['d6', BEAT],
              ['d6', BEAT / 2], ['c6', BEAT / 2], ['b5', BEAT], ['g5', BEAT], ['g5', BEAT], ['c6', BEAT / 2],
              ['a#5', BEAT / 2], ['a5', BEAT], ['f5', BEAT], ['d6', BEAT], ['a5', BEAT], ['a#5', BEAT * 1.5]]

try:
    for note in liten_mus:
        speaker.play(note)
        sleep(0.1) # leave a gap between notes
       
finally: # Turn speaker off if interrupted
    speaker.off()

서보 모터 (Servo)

단일 핀, 3.3v 및 그라운드에 연결된 서보 모터입니다.

서보 모터에 연결된 Raspberry Pi Pico 다이어그램

서보를 최소, 중간 및 최대 위치로 움직입니다.

from picozero import Servo
from time import sleep

# Check the specifications SG-90 model
# Pulse width: 500 ~ 2400 µs
servo = Servo(1, 0, 0.5 / 1000, 2.4 /1000)

servo.move_to_degree(0)
sleep(1)

servo.move_to_degree(90)
sleep(1)

servo.move_to_degree(180)
sleep(1)

servo.off()

서보를 최소 위치와 최대 위치 사이에서 맥박처럼 움직입니다.

from picozero import Servo

servo = Servo(1)

servo.pulse()

서보를 최소 위치에서 최대 위치까지 100단계로 점진적으로 움직입니다.

from picozero import Servo
from time import sleep

servo = Servo(1)

for i in range(0, 100):
    servo.value = i / 100
    sleep(0.1)

servo.off()

모터 (Motor)

두 개의 핀(전진 및 후진)과 모터 드라이버 보드를 통해 연결된 모터를 움직입니다:

from picozero import Motor
from time import sleep

motor = Motor(14, 15)

motor.start()
sleep(1)
motor.stop()

로봇 로버 (Robot rover)

간단한 이륜 로봇 로버를 만듭니다.

배터리 팩으로 전원이 공급되는 모터 드라이버 보드를 통해 두 개의 모터에 연결된 Raspberry Pi Pico 다이어그램.

로버를 1초 동안 앞으로 움직이고 멈춥니다:

from picozero import Robot
from time import sleep

robot_rover = Robot(left=(14,15), right=(12,13))

# move forward
robot_rover.forward()
sleep(1)
robot_rover.stop()

로버를 (대략) 사각형 모양으로 움직입니다:

from picozero import Robot

robot_rover = Robot(left=(14,15), right=(12,13))

for i in range(4):
    # move forward for 1 second
    robot_rover.forward(t=1, wait=True)
    # rotate to the left for 1 second
    robot_rover.left(t=1, wait=True)

스테퍼 모터 (Stepper motor)

드라이버 보드(예: ULN2003)를 통해 연결된 스테퍼 모터를 제어합니다.

아날로그 시계

계속해서 움직이는 아날로그 시계의 초침을 만듭니다:

from picozero import Stepper

# Second Hand Clock - Continuous 60s Rotation
# One full revolution every 60 seconds.

STEP_DELAY = 60.0 / 2048  # ≈ 0.029296875 seconds per step (full-step)

stepper = Stepper((1, 2, 3, 4), step_delay=STEP_DELAY)

stepper.run_continuous(direction="cw")

자동 블라인드

시간 기반 블라인드 컨트롤러:

from picozero import Stepper
from time import localtime, sleep

stepper = Stepper((1, 2, 3, 4), step_sequence="half")

OPEN_TIME = (7, 0)  # Open at 7:00 AM (hour, minute)
CLOSE_TIME = (20, 0)  # Close at 8:00 PM
ROTATIONS = 5  # Number of full rotations needed to fully open/close blinds

# Track state
is_open = False


def open_blinds():
    global is_open
    if not is_open:
        for _ in range(ROTATIONS):
            stepper.rotate(1, "cw")
        is_open = True


def close_blinds():
    global is_open
    if is_open:
        for _ in range(ROTATIONS):
            stepper.rotate(1, "ccw")
        is_open = False


def check_schedule():
    now = localtime()
    current_time = (now.tm_hour, now.tm_min)

    # Check if it's time to open
    if current_time == OPEN_TIME and not is_open:
        open_blinds()

    # Check if it's time to close
    elif current_time == CLOSE_TIME and is_open:
        close_blinds()


# Set starting position (closed)
stepper.reset_position()
is_open = False

# Check every 30 seconds
while True:
    check_schedule()
    sleep(30)

내부 온도 센서

Raspberry Pi Pico의 내부 온도를 섭씨 단위로 확인합니다:

# Choose View -> Plotter in Thonny to see a graph of the results

from picozero import pico_temp_sensor
from time import sleep

while True:
    print(pico_temp_sensor.temp)
    sleep(0.1)

초음파 거리 센서

초음파 거리 센(HC-SR04)로부터의 거리를 센티미터 단위로 가져옵니다:

HC-SR04 거리 센서에 연결된 Raspberry Pi Pico 다이어그램.
from picozero import DistanceSensor
from time import sleep

ds = DistanceSensor(echo=2, trigger=3)

while True:
    print(ds.distance)
    sleep(0.1)

LCD 디스플레이

I2C 버스와 PCF8574 I2C 어댑터를 사용하여 LiquidCrystal 디스플레이(LCD)에 문자를 출력합니다.

I2C 버스를 통해 16x2 캐릭터 LCD 디스플레이에 연결된 Raspberry Pi Pico 다이어그램.
from picozero import I2cLcd
from time import sleep

lcd =  I2cLcd(1, 3, 2)  # i2c_id=1, scl=3, sda=2

lcd.putstr('Hello World')
sleep(1)
lcd.move_to(0, 1)
lcd.putstr('Hello Pi Pico')

GPIO 핀만 사용하여 LiquidCrystal 디스플레이(LCD)에 문자를 출력합니다.

16x2 캐릭터 LCD 디스플레이에 연결된 Raspberry Pi Pico 다이어그램.
from picozero import GpioLcd
from time import sleep

# Create the LCD object
lcd = GpioLcd(rs_pin=16,
              enable_pin=17,
              d4_pin=18,
              d5_pin=19,
              d6_pin=20,
              d7_pin=21,
              num_lines=2, 
              num_columns=16)

lcd.putstr('Hello World')
sleep(1)
lcd.move_to(0, 1)
lcd.putstr('Hello Pi Pico')