본문 바로가기
Real Cart 프로젝트

[EP.3] 라즈베리파이에서 DC 모터 제어

by code_killer 2023. 2. 15.
728x90
반응형

1. DC 모터

  • 고정자로 영구자석을 사용하고, 회전자(전기자)로 코일을 사용하여 구성한 것
  • 전기자에 흐르는 전류의 방향을 전환함으로써 자력의 반발, 흡인력으로 회전력을 생성시키는 모터
  • 모형 자동차, 무선조정용 장난감 등을 비롯하여 여러 방면에서 가장 널리 사용되고 있는 모터

1-1. 장점

  • 시동 토크가 크다
  • 동일한 출력의 교류 모터보다 출력이 크고 효율이 좋다
  • 교류 모터와 비교해 저 전압 사양 및 절연의 간소화가 가능하다
  • 가격이 저렴하다

1-2. 단점

  • Brush가 있어 수명에 한계가 있음
  • 노이즈가 발생함
  • 저속에서 원활한 회전을 하기가 힘

 

2. 모터 드라이버(L298N 모터 드라이버)

  • 외형

  • 회로도

  • 단자 설명

  • DC Motor A/B output : 모터에 전압을 가해주는 부분으로 DC 모터를 각 연결하거나 4선 스텝 모터를 연결
  • ENA/ENB : 모터 A/B 쪽 동작시키거나 멈추게 하는 단자
  • IN1 / IN2 / IN3 / IN4 : 모터 방향과 속도를 결정해주는 단자

 

3. 라즈베리파이 연결 및 테스트 코드

  • 라즈베리파이 연결도

 

  • 라즈베리파이 파이썬 코드
import RPi.GPIO as GPIO
from time import sleep

# 모터 상태
STOP  = 0
FORWARD  = 1
BACKWORD = 2

# 모터 채널
CH1 = 0
CH2 = 1

# PIN 입출력 설정
OUTPUT = 1
INPUT = 0

# PIN 설정
HIGH = 1
LOW = 0

# 실제 핀 정의
#PWM PIN
ENA = 26  #37 pin
ENB = 0   #27 pin

#GPIO PIN
IN1 = 19  #37 pin
IN2 = 13  #35 pin
IN3 = 6   #31 pin
IN4 = 5   #29 pin

# 핀 설정 함수
def setPinConfig(EN, INA, INB):        
    GPIO.setup(EN, GPIO.OUT)
    GPIO.setup(INA, GPIO.OUT)
    GPIO.setup(INB, GPIO.OUT)
    
    # 100khz 로 PWM 동작 시킴 
    pwm = GPIO.PWM(EN, 100) 
    
    # 우선 PWM 멈춤.   
    pwm.start(0) 
    return pwm

# 모터 제어 함수
def setMotorContorl(pwm, INA, INB, speed, stat):

    #모터 속도 제어 PWM
    pwm.ChangeDutyCycle(speed)  
    
    if stat == FORWARD:
        GPIO.output(INA, HIGH)
        GPIO.output(INB, LOW)
        
    #뒤로
    elif stat == BACKWORD:
        GPIO.output(INA, LOW)
        GPIO.output(INB, HIGH)
        
    #정지
    elif stat == STOP:
        GPIO.output(INA, LOW)
        GPIO.output(INB, LOW)

        
# 모터 제어함수 간단하게 사용하기 위해 한번더 래핑(감쌈)
def setMotor(ch, speed, stat):
    if ch == CH1:
        #pwmA는 핀 설정 후 pwm 핸들을 리턴 받은 값이다.
        setMotorContorl(pwmA, IN1, IN2, speed, stat)
    else:
        #pwmB는 핀 설정 후 pwm 핸들을 리턴 받은 값이다.
        setMotorContorl(pwmB, IN3, IN4, speed, stat)
  

# GPIO 모드 설정 
GPIO.setmode(GPIO.BCM)
      
#모터 핀 설정
#핀 설정후 PWM 핸들 얻어옴 
pwmA = setPinConfig(ENA, IN1, IN2)
pwmB = setPinConfig(ENB, IN3, IN4)

    
#제어 시작

# 앞으로 80프로 속도로
setMotor(CH1, 80, FORWARD)
setMotor(CH2, 80, FORWARD)
#5초 대기
sleep(5)

# 뒤로 40프로 속도로
setMotor(CH1, 40, BACKWORD)
setMotor(CH2, 40, BACKWORD)
sleep(5)

# 뒤로 100프로 속도로
setMotor(CH1, 100, BACKWORD)
setMotor(CH2, 100, BACKWORD)
sleep(5)

#정지 
setMotor(CH1, 80, STOP)
setMotor(CH2, 80, STOP)

# 종료
GPIO.cleanup()

[출처] 라즈베리파이(RaspberryPi) 기본 API로 L298n(모터 드라이버) 제어하기 (파이썬)|작성자 천동이

 

728x90