Jetson Nano에서 GPIO나 PWM 제어를 시도할 때, Python이 아니라 Go를 사용하고 싶었던 적 있으신가요?
이번 글에서는 sysfs 인터페이스를 통해 Jetson Nano의 PWM 기능을 Golang으로 직접 제어하는 방법을 소개합니다.
목표
- Jetson Nano의 PWM0을 사용하여 SG90 등의 서보모터 제어
- 각도(0°, 90°, 180°)에 따라 서보모터 회전
- Go 언어로 sysfs 접근 방식 구현
준비물
- Jetson Nano
- SG90 서보모터 또는 유사 PWM 제어 가능한 장치
- Pin 32, PWM0
- 외부 5V 전원 또는 GPIO 헤더 전원
Golang 코드
아래는 완전한 코드입니다:
package main
import (
"fmt"
"os"
"strconv"
"time"
)
// sysfs에 문자열 쓰기
func writeToFile(path, value string) error {
return os.WriteFile(path, []byte(value), 0644)
}
// 각도를 PWM duty(ns)로 변환
func angleToDuty(angle int) int {
if angle < 0 {
angle = 0
}
if angle > 180 {
angle = 180
}
return 1000000 + (angle * 1000000 / 180) // 1ms~2ms
}
func main() {
pwmchip := "/sys/class/pwm/pwmchip0"
pwm := pwmchip + "/pwm0"
// pwm0 export
if err := writeToFile(pwmchip+"/export", "0"); err != nil {
fmt.Println("이미 export 되었을 수 있습니다:", err)
}
time.Sleep(200 * time.Millisecond)
// period 설정 (20ms)
writeToFile(pwm+"/period", "20000000")
// 초기 각도: 90도
duty := angleToDuty(90)
writeToFile(pwm+"/duty_cycle", strconv.Itoa(duty))
// enable
writeToFile(pwm+"/enable", "1")
fmt.Println("→ 90도 위치로 이동")
time.Sleep(2 * time.Second)
fmt.Println("→ 0도 위치로 이동")
writeToFile(pwm+"/duty_cycle", strconv.Itoa(angleToDuty(0)))
time.Sleep(2 * time.Second)
fmt.Println("→ 180도 위치로 이동")
writeToFile(pwm+"/duty_cycle", strconv.Itoa(angleToDuty(180)))
time.Sleep(2 * time.Second)
fmt.Println("→ PWM 비활성화")
writeToFile(pwm+"/enable", "0")
}
코드 설명
부분설명
writeToFile() | sysfs 경로에 값을 쓰기 위한 유틸 함수 |
angleToDuty() | 서보 각도를 나노초 단위 duty cycle로 변환 |
/sys/class/pwm/pwmchip0/ | Jetson Nano에서 PWM 제어에 사용되는 sysfs 경로 |
export, period, duty_cycle, enable | 각각 PWM 활성화, 주기 설정, 펄스폭, 출력 on/off |
실행 방법
- Jetson Nano에 Go 설치 (Go 1.20 이상 권장)
- 위 코드를 main.go로 저장
- PWM0 핀에 서보모터 연결
- GPIO13(Pin 32)과 GND, 5V 연결
- 터미널에서 실행:
sudo go run main.go
sudo는 /sys/class/pwm/...에 쓰기 위해 필요합니다.
728x90