주말을 알차게 보내기 위해 초간단 프로젝트를 준비해보았다. 바로 라즈베리 파이의 GPIO 핀을 이용해서 코드상에서 LED를 켜고 끌 수 있게 만드는 것.

회로 구성

너무 간단해서 회로도가 필요할까 하는 생각도 들지만, 회로 구성은 이렇다.

회로도와 자세한 설명은 이 페이지에서 볼 수 있다.

저항을 붙여놓은 이유가 LED를 보호하기 위해서1라고 원문은 설명하고 있는데, 그 보호한다는 의미가 LED가 원래 GPIO 핀에서 나오는 전류보다 낮은 전류에서 작동한다는 뜻이 아닐까 한다.

그리고 회로에 있는 스위치의 역할을 프로그램 코드가 해 줄 것이다.

GPIO

말 그대로 범용(general purpose) 입출력 장치이다. 라즈베리 파이 B+ 타입을 보면 핀이 40개 있는데, 이 중 26개가 범용 입출력 핀이다. 출력도 되고 입력도 된다. 각 핀의 역할은 이 페이지를 참고하면 알 수 있다.

Python Code

import RPi.GPIO as GPIO
import time
 
PIN = 3
INTERVAL = 1.0
 
def main():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(PIN, GPIO.OUT)
 
    while True:
        GPIO.output(PIN, 1)
        time.sleep(INTERVAL)
 
        GPIO.output(PIN, 0)
        time.sleep(INTERVAL)
 
 
if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        GPIO.cleanup()

Go Code

github.com/davecheney/gpio 에 있는 예제를 약간 변형해봤다.

import (
        "fmt"
        "os"
        "os/signal"
        "time"
 
        "github.com/davecheney/gpio"
)
 
func main() {
    // set GPIO25 to output mode
    pin, err := gpio.OpenPin(2, gpio.ModeOutput)
    if err != nil {
        fmt.Printf("Error opening pin! %s\n", err)
        return
    }
 
    // turn the led off on exit
    c := make(chan os.Signal, 1)
    signal.Notify(c, os.Interrupt)
    go func() {
        for _ = range c {
            fmt.Printf("\nClearing and unexporting the pin.\n")
            pin.Clear()
            pin.Close()
            os.Exit(0)
        }
    }()
 
    for {
        pin.Set()
        time.Sleep(1000 * time.Millisecond)
        pin.Clear()
        time.Sleep(1000 * time.Millisecond)
    }
}
  1. the resistor is there to protect the LED