Linux에서 Golang 으로 GPIO를 제어해보았다.
GPIO란? GPIO(General Purpose Input Output)는 일반적인 용도의 입출력 포트를 의미한다.
NewGPIO로 구조체를 만들고, Pin(string)으로 제어할 GPIO 핀번호를 정한다.
Out , In 으로 dir을 정하고 , High, Low로 값을 정하고, PinRead 로 해당 GPIO 값이 0인지 1인지 읽을 수 있다.
PinUnexport로 사용을 종료할 수도 있다.
핀을 초기화하고, 방향과 Low,High를 정해 사용할 수 있다.
예를 들면
g:=NewGPIO()
g.Pin("1")
g.Out().High()
g.In().Low() 등등
전체코드는 다음과 같다.
// gpio.go
package gpio
import (
"io/ioutil"
"log"
"os"
)
const (
gpioBasePath = "/sys/class/gpio"
gpioExportPath = "/sys/class/gpio/export"
gpioUnexportPath = "/sys/class/gpio/unexport"
)
type GPIO struct {
pin string
}
func NewGPIO() GPIO {
return GPIO{}
}
func (g GPIO) Pin(pin string) GPIO {
g.pin = pin
if _, err := os.Stat(gpioBasePath + "/gpio" + g.pin); os.IsNotExist(err) {
err := ioutil.WriteFile(gpioExportPath, []byte(g.pin), 0666)
if err != nil {
log.Println(err)
}
}
return g
}
func (g GPIO) Out() GPIO {
err := ioutil.WriteFile(gpioBasePath+"/gpio"+g.pin+"/direction", []byte("out"), 0666)
if err != nil {
log.Println(err)
}
return g
}
func (g GPIO) In() GPIO {
err := ioutil.WriteFile(gpioBasePath+"/gpio"+g.pin+"/direction", []byte("in"), 0666)
if err != nil {
log.Println(err)
}
return g
}
func (g GPIO) High() bool {
err := ioutil.WriteFile(gpioBasePath+"/gpio"+g.pin+"/value", []byte("1"), 0666)
if err != nil {
log.Println(err)
return false
}
return true
}
func (g GPIO) Low() bool {
err := ioutil.WriteFile(gpioBasePath+"/gpio"+g.pin+"/value", []byte("0"), 0666)
if err != nil {
log.Println(err)
return false
}
return true
}
func (g GPIO) PinRead(pin string) byte {
value, err := ioutil.ReadFile(gpioBasePath + "/gpio" + pin + "/value")
if err != nil {
log.Println(err)
}
return value[0] - 48
}
func (g GPIO) PinUnexport(pin string) bool {
err := ioutil.WriteFile(gpioUnexportPath, []byte(pin), 0666)
if err != nil {
log.Println(err)
return false
}
return true
}
끝 !
반응형