개발

라즈베리파이4와 스텝 모터 드라이버 연결 및 문제 해결 과정

Hugh Q Lee 2025. 1. 3. 12:08

라즈베리파이와 스텝 모터 드라이버 연결 및 문제 해결 과정


1. 도입: 프로젝트 개요

라즈베리파이를 이용해 스텝 모터를 제어하는 프로젝트를 진행하며, 다양한 문제를 경험했습니다. 특히, 모터 드라이버(A4988)를 사용해 모터를 제어하는 과정에서 핀 연결, 플로팅 상태, 전류 설정 등 여러 난관을 겪었고 이를 해결해 나가며 많은 것을 배울 수 있었습니다.

이번 포스팅에서는 프로젝트에서 겪은 문제와 그 해결 과정을 정리하여 공유합니다. 비슷한 프로젝트를 진행하시는 분들께 도움이 되었으면 합니다.


2. 문제 1: 모터가 진동만 하고 회전하지 않음

현상:

  • 드라이버와 모터를 연결한 후, 명령을 실행했더니 모터가 회전하지 않고 진동만 발생.

원인 분석:

  • 스텝 모터의 권선 연결 오류가 주요 원인이었습니다.
  • 드라이버와 모터 간의 핀 매칭을 잘못하여 권선에 적절한 전류가 흐르지 않았습니다.
  • 특히, 모터 제조사가 권선을 알파벳(A+, A-, B+, B-)으로 구분하는 반면, 드라이버는 숫자(1A, 1B, 2A, 2B)로 구분하여 혼란이 발생했습니다.

해결 과정:

  1. 권선-드라이버 핀 매칭 테이블 작성

    모터 권선 단자 드라이버 핀 단자
    A+ 1A
    A- 1B
    B+ 2A
    B- 2B
  2. 멀티미터로 권선 확인

    • 모터 단자 쌍의 저항값을 측정하여 권선(A, B)을 구분.
    • 저항값이 측정되는 단자 쌍이 하나의 권선(A 또는 B)에 해당.
  3. 정확한 연결

    • 권선 A의 단자(A+, A-)를 드라이버의 1A와 1B에 연결.
    • 권선 B의 단자(B+, B-)를 드라이버의 2A와 2B에 연결.

강조점:

  • 알파벳(A+, A-, B+, B-)를 기준으로만 연결하지 마세요. 항상 드라이버와 모터 간 핀 매칭 관계를 데이터시트나 권선 확인 과정을 통해 명확히 해야 합니다.

결과:

  • 정확히 연결한 후, 모터가 정상적으로 회전하기 시작했습니다.

3. 문제 2: 플로팅 상태와 GPIO 초기화 문제

현상:

  • 부팅 또는 cleanup() 메소드로 GPIO 핀이 초기화되면(즉, 모든 핀이 입력 모드에 값이 LOW가 되면), 모터 드라이버의 STEP 핀이 플로팅 상태가 되어 스텝 신호가 불안정해지고, 모터가 조금씩 회전하는 이상 작동.

원인 분석:

  1. 플로팅 상태:
    • GPIO 핀의 기본 상태가 정해지지 않아(플로팅 상태) 드라이버가 신호를 제대로 받지 못함.
  2. GPIO 핀맵 차이:
    • 라즈베리파이의 GPIO 핀 번호 체계(BCM vs. Physical) 혼동으로 설정 오류 발생.
  3. cleanup() 메소드 문제:
    • Python 코드 실행 후 GPIO.cleanup() 호출 시 GPIO 설정이 초기화되어 다시 불안정한 상태가 됨.

해결 과정:

  1. /boot/config.txt로 STEP 핀 초기화 설정

    • STEP 핀을 출력 모드(out)로 설정하고 기본값을 LOW로 초기화:
      gpio=20=op,dl
      """
      ip : 입력 모드
      op : 출력 모드
      dh : 기본값 HIGH (출력 모드 only)
      dl : 기본값 LOW (출력 모드 only)
      pu : 풀업 저항 활성화
      pd : 풀다운 저항 활성화
      """
    • 부팅 시 이 설정이 적용되어 플로팅 상태를 방지.
  2. 핀맵 체계 통일

    • Python 코드에서 BCM 핀 번호를 사용하기로 결정.
      GPIO.setmode(GPIO.BCM)  # BCM 핀 번호 사용
      GPIO.setup(20, GPIO.OUT, initial=GPIO.LOW)  # STEP 핀 설정
    • 만약 BCM핀 핀 번호가 혼동을 야기한다면, 코드에서는 피지컬 핀 번호 사용할 수 있어.
      GPIO.setmode(GPIO.BOARD)
  3. cleanup() 메소드 사용 시 주의

    • GPIO.cleanup() 호출 후 핀이 초기화되므로, 프로그램 종료 후에도 GPIO 핀 상태를 유지하려면 cleanup()을 호출하지 않거나 대체 코드를 작성:
      GPIO.output(20, GPIO.LOW)  # 종료 시 LOW로 설정

결과:

  • STEP 핀이 부팅 시 기본적으로 LOW 상태로 안정화되었고, GPIO 핀맵 혼동과 cleanup 문제로 인한 오류가 해결되었습니다.

4. 결론: 프로젝트를 통해 배운 점

이번 프로젝트를 통해 스텝 모터 제어와 관련된 여러 문제를 해결하며 다음과 같은 교훈을 얻었습니다:

  1. 권선 연결 확인은 필수
    • 모터와 드라이버 간의 핀 매칭을 명확히 하고, 멀티미터로 권선을 확인해야 올바른 동작을 보장할 수 있습니다.
  2. GPIO 초기화의 중요성
    • 부팅 시 GPIO 핀의 상태를 명확히 정의하여 플로팅 상태를 방지하고, cleanup 메소드 호출 시 발생하는 문제를 고려해야 합니다.
  3. 핀맵 체계 통일
    • Physical과 BCM 핀 번호 체계를 혼용하지 말고 하나로 통일하여 오류를 줄이세요.

이 글이 여러분의 프로젝트에 도움이 되었기를 바랍니다. 여러분의 경험이나 궁금한 점이 있다면 댓글로 공유해주세요! 😊

728x90