ESP32 - MicroPython을 사용하여 스테퍼 모터 제어

소개



스테핑 모터를 사용하고 싶어서 구입했습니다.
Arduino 스케치로 제어하는 ​​기사는 많이 있지만,
MicroPython으로 제어하는 ​​것이 없었기 때문에,
소개하겠습니다.



작업환경


  • 호스트 PC
  • windows10 64bit Home
  • VSCode - 1.47.3
  • NodeJS - 12.14.1 LTS

  • 타겟 보드
  • ESP32-WROOM-32 개발 보드
  • MicroPython 1.12 (esp32-idf4-20191220-v1.12.bin)


  • ESP32의 MicroPython 환경 구축은 이전에 설명했습니다.
    - [비망록] ESP32-VSCode-microPython으로 개발 환경 구축
    참조하십시오.

    장비




    부품명
    설명
    비고


    ESP32-WROOM-32 개발 보드
    5V

    스테퍼 모터
    모형: 28BYJ-48, 12V 구동
    구매처 아마존

    ULN2003 스테퍼 모터 구동 테스트 모듈 보드
    모터 구동을 위한 보드
    모터와 세트 구매

    DC 어댑터 12V
    모터가 12V 구동을 위해
    구매처 아마존

    점퍼 케이블
    10개 정도



    연결




    부품명
    설명
    비고


    ESP32-PIN25
    테스트 모듈 보드 - IN1
    -

    ESP32-PIN26
    테스트 모듈 보드 - IN2
    -

    ESP32-PIN27
    테스트 모듈 보드 - IN3
    -

    ESP32-PIN13
    테스트 모듈 보드 - IN4
    -

    AC 어댑터 - GND
    테스트 모듈 보드 - GND
    ESP32-GND

    AC 어댑터 - 12V
    테스트 모듈 보드 - 12V

    테스트 모듈 보드 - 모터 커넥터
    스테퍼 모터
    -




    코드 작성



    Arduino - Stepper 라이브러리을 기반으로 MicroPython으로 이식합니다.

    이 라이브러리를 기반으로 한 것은
  • Arduino 사이트에서 자주 사용되기 때문에 최대 인터페이스를 동일하게 만들고 싶습니다
  • (거기까지) 시비어 타이밍이 없다

  • 됩니다.

    또, 본가와의 차이는 이하가 됩니다.
  • stop () 메소드를 추가하고있다
  • step()에서 동작시킨 후 stop() 메소드를 호출
  • 본가의 라이브러리에서 사용자가 능동적으로 정지하지 않으면 항상 전류가 계속 흐릅니다
  • 뜨거워지기 때문에, stop()를 호출하고 있다

  • 5pin 모터 기능 삭제
  • 이번은 4pin 구성이므로, 5pin 부분은 이식 없음


  • 스테퍼 모터를 제어하는 ​​코드



    다음은 스테핑 모터를 제어하는 ​​클래스입니다.

    stepper.py
    import time
    from machine import Pin
    
    
    class Stepper():
        def __init__(self,  number_of_steps,
                     motor_pin_1, motor_pin_2, motor_pin_3, motor_pin_4):
            self.step_number = 0                   # which step the motor is on
            self.direction = 0                     # motor direction
            self.last_step_time = 0                # time stamp in us of the last step taken
            self.number_of_steps = number_of_steps  # total number of steps for this motor
    
            # setup the pins on the microcontroller:
            self.motor_pin_1 = Pin(motor_pin_1, Pin.OUT)
            self.motor_pin_2 = Pin(motor_pin_2, Pin.OUT)
            self.motor_pin_3 = Pin(motor_pin_3, Pin.OUT)
            self.motor_pin_4 = Pin(motor_pin_4, Pin.OUT)
    
            # pin_count is used by the stepMotor() method:
            self.pin_count = 4
    
            self.set_speed()
            return
    
        def set_speed(self, what_speed=10):
            ''' Sets the speed in revs per minute
            '''
            self.step_delay = 60 * 1000 * 1000 // self.number_of_steps // what_speed
            return
    
        def step(self, steps_to_move, auto_stop=True):
            ''' Moves the motor steps_to_move steps.  If the number is negative,
                the motor moves in the reverse direction.
            '''
            steps_left = abs(steps_to_move)  # how many steps to take
    
            # determine direction based on whether steps_to_mode is + or -:
            self.direction = 1 if steps_to_move > 0 else 0
    
            # decrement the number of steps, moving one step each time:
            while steps_left > 0:
                now = time.ticks_us()
                # move only if the appropriate delay has passed:
                if time.ticks_diff(now, self.last_step_time) >= self.step_delay:
                    # get the timeStamp of when you stepped:
                    self.last_step_time = now
                    # increment or decrement the step number,
                    # depending on direction:
                    if self.direction == 1:
                        self.step_number += 1
                        if self.step_number == self.number_of_steps:
                            self.step_number = 0
                    else:
                        if self.step_number == 0:
                            self.step_number = self.number_of_steps
                        self.step_number -= 1
    
                    # decrement the steps left:
                    steps_left -= 1
                    # step the motor to step number 0, 1, 2, 3
                    self._step_motor(self.step_number % 4)
    
            if auto_stop:
                self.stop()
            return
    
        def _step_motor(self, this_step):
            ''' Moves the motor forward or backwards.
                  if (this->pin_count == 4) {
            '''
            # 1010
            if this_step == 0:
                self.motor_pin_1.value(True)
                self.motor_pin_2.value(False)
                self.motor_pin_3.value(True)
                self.motor_pin_4.value(False)
            # 0110
            elif this_step == 1:
                self.motor_pin_1.value(False)
                self.motor_pin_2.value(True)
                self.motor_pin_3.value(True)
                self.motor_pin_4.value(False)
            # 0101
            elif this_step == 2:
                self.motor_pin_1.value(False)
                self.motor_pin_2.value(True)
                self.motor_pin_3.value(False)
                self.motor_pin_4.value(True)
            # 1001
            elif this_step == 3:
                self.motor_pin_1.value(True)
                self.motor_pin_2.value(False)
                self.motor_pin_3.value(False)
                self.motor_pin_4.value(True)
            return
    
        def stop(self):
            self.motor_pin_1.value(False)
            self.motor_pin_2.value(False)
            self.motor_pin_3.value(False)
            self.motor_pin_4.value(False)
            return
    

    사용법



    사용을 위한 준비


    >> from stepper import Stepper
    
    >> MOTOR_STEPS = (2048)
    >> PIN_MOTOR_1 = (25)
    >> PIN_MOTOR_2 = (26)
    >> PIN_MOTOR_3 = (27)
    >> PIN_MOTOR_4 = (13)
    
    >> my_motor = Stepper(MOTOR_STEPS, PIN_MOTOR_1,
                       PIN_MOTOR_3, PIN_MOTOR_2, PIN_MOTOR_4)
    >> my_motor.set_speed(10)
    

    회전하다


    my_moter.step(512)
    # =>ステッピングモータが90度、時計回りに回転
    my_moter.step(2048)
    # =>ステッピングモータが360度、時計回りに回転
    my_moter.step(-512)
    # =>ステッピングモータが90度、反時計回りに回転
    
  • MOTOR_STEPS가 2048이므로 회전 당 2048입니다.
  • step ()에 마이너스 방향을 지정하면 반 시계 방향이됩니다.
  • set_speed ()는, 1-20 당까지가 유효

  • 사이고에게


  • 현재 회전을 실행하면 멈출 수 없습니다


  • 참고


  • Arduino - Stepper 라이브러리
  • MicroPython 문서 - utime - 시간 관련 함수
  • Arduino에서 스테퍼 모터를 돌립니다.
  • 좋은 웹페이지 즐겨찾기