Passion/Hardware

Jetson Nano에서 Go로 서보모터 제어하기 (sysfs 방식)

sunshout1 2025. 6. 7. 21:18

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
 

실행 방법

  1. Jetson Nano에 Go 설치 (Go 1.20 이상 권장)
  2. 위 코드를 main.go로 저장
  3. PWM0 핀에 서보모터 연결
  4. GPIO13(Pin 32)과 GND, 5V 연결
  5. 터미널에서 실행:
 
sudo go run main.go

 

sudo는 /sys/class/pwm/...에 쓰기 위해 필요합니다.

728x90