본문 바로가기
엔비디아 플랫폼/jetson nano

[jetson nano] 젯슨나노 GPIO 이용 서보 모터 구동

by junhykim 2022. 2. 15.

젯슨나노 보드(B01)의 GPIO를 이용해 서보 모터 구동을 해보겠습니다. 젯슨 나노 보드에 PWM generator가 가능해서 PIN 설정한 뒤, PWM 신호로 서보모터를 구동해보겠습니다.

 

필요한 것

  • 서보모터 (SG-90사용)
  • M-F 점퍼선 (Male-Female Jumper Wires)

 

PWM이란 Pulse Width Modulation의 약자로 일정한 주기 내에서 Duty비를 변화(펄스폭 조절)시켜서 평균 전압을 제어하는 방법입니다. 일반적으로 MCU 내부의 내장 타이머 카운트를 이용해 제어합니다.

PWM을 이용하면 디지털신호로 아날로그 신호와 유사한 효과를 나타낼 수 있고, PWM 출력을 통해 조명의 밝기 제어, 모터의 속도 제어 등에 이용됩니다.

 

Duty 비(Duty ratio)는 주기 당 펄스 폭(high레벨 신호시간)을 나타내며 입력 전압에 Duty 비를 곱하여 평균전압을 구할 수 있습니다.

 

duty 비에 따른 평균 전압

 


PWM 환경설정

젯슨 나노에 PWM 신호를 인가하기 위해 설정을 합니다.

 

1. 터미널 창에서 아래 명령어로 jetson-io 옵션을 설정합니다

 

sudo /opt/nvidia/jetson-io/jetson-io.py

 

2. 젯슨나노 PIN의 PWM 사용 선택

 

환경 설정을 통해 GPIO 핀중 PWM 핀인 32,33의 상태를 사용으로 바꿔줍니다.

Configura Jetson 40pin Header - Configure hearder pins manually 엔터를 쳐서 이동합니다.

 

 

 

PWM 신호에서 스페이스바를 누르면 *표시와 함께 사용설정이 된 것을 확인할 수 있습니다.

 

 

3. 저장 후 환경 설정을 끝냅니다

Save and reboot 실행하면 아래 화면이 나타나고 아무런 키를 입력하면 재부팅이 됩니다.

 

여기까지 젯슨 나노의 GPIO핀에 PWM 신호 사용 설정을 하는 과정이었습니다.

이어서 서보모터와 젯슨 나노보드를 연결해 모터 구동을 해보겠습니다.

 

 

 


서보모터 구동

 

Jetson nano GPIO Datasheet

 

젯슨 나노 GPIO PIN과 서보모터 핀을 연결합니다. (40핀 기능 참고)

  • 모터의 점퍼선 빨강 - PIN 2(5V전압) 연결
  • 모터의 점퍼선 주황 - PIN 33(PWM 신호) 연결
  • 모터의 점퍼선 갈색 - PIN 6(GND) 연결

서보모터 점퍼선 젯슨 나노 PIN과 연결(PIN 2,6,33)

 

터미널 창에서 아래 명령어를 입력하고

 

gedit servo_motor.py

 

gedit 에디터를 이용해 서보모터 구동을 수행할 파이썬 파일을 만듭니다.

 

파이썬 파일에 서보모터 구동 코드를 작성합니다.

 

import Jetson.GPIO as GPIO
import time

#모터가 사용할 PWM PIN 설정
SERVO_PIN = 33

#GPIO 채널 설정
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(SERVO_PIN, GPIO.OUT)

#주파수 50hz, pwm high 주기 설정
pwm = GPIO.PWM(SERVO_PIN, 50)
pwm.start(3.0)                

for t_high in range(30, 125):            
    pwm.ChangeDutyCycle(t_high/10.0)     
    time.sleep(0.02)
    
pwm.ChangeDutyCycle(3.0)
time.sleep(1.0)
pwm.ChangeDutyCycle(0.0)

pwm.stop()
GPIO.cleanup()

 

GPIO 채널 설정 (PIN33)을 한 뒤 PWM duty 비를 설정해줍니다.

 

 

 

파이썬 파일을 실행하면 서보모터가 구동되는 것을 확인할 수 있습니다.

 

python servo_motory.py

 

 

구동영상