LM298 motorkontroll

Målet er å kontrollere en motor fra en ESP32 ved hjelp av en LM298 motrorkontroller.

Kommunikasjonsprotokoll: 4 GPIO hvor to er vanlige av og på og to er PWM styrt.

Kode: https://github.com/kjetilfjellheim/micropython-dfmd

Diagram

Oversikt

Pin ESP32Pin LM298Forklaring
13E1Her setter vi 1 for nå motoren skal være i gang og 0 når den ikke skal det.
12M1Dette er PWM styrt og forteller om hastigheten til motoren og om den skal gå fremover eller bakover.
27E2Her setter vi 1 for nå motoren skal være i gang og 0 når den ikke skal det.
33M2Dette er PWM styrt og forteller om hastigheten til motoren og om den skal gå fremover eller bakover.

Kode

main.py

import time

from machine import Pin
from motor_control import MotorControl

MOTOR_ENABLE_PIN1 = 13
MOTOR_ENABLE_PIN2 = 27
MOTOR_PWM_PIN1 = 12
MOTOR_PWM_PIN2 = 33

e1Pin = Pin(MOTOR_ENABLE_PIN1, Pin.OUT, Pin.PULL_DOWN)
m1Pin = Pin(MOTOR_PWM_PIN1, Pin.OUT, Pin.PULL_DOWN)
e2Pin = Pin(MOTOR_ENABLE_PIN2, Pin.OUT, Pin.PULL_DOWN)
m2Pin = Pin(MOTOR_PWM_PIN2, Pin.OUT, Pin.PULL_DOWN)

motorControl = MotorControl(e1Pin, m1Pin, e2Pin, m2Pin)

motorControl.stop()
time.sleep(6)
motorControl.rotateInPlace(100, MotorControl.DIRECTION_RIGHT)
time.sleep(6)
motorControl.forward(80, MotorControl.DIRECTION_FORWARD)
time.sleep(6)
motorControl.stop()

Eksempel koden for å kjøre motorene.

motor_control.py

    DIRECTION_LEFT = 1
    DIRECTION_RIGHT = -1

    DIRECTION_FORWARD = 1
    DIRECTION_BACK = -1

    NEGATE = -1

    MAX_DUTY_CYCLE: int = 65535
    STOP_DUTY_CYCLE: int = 32768
    SPEED_CYCLE: int = int(STOP_DUTY_CYCLE / 100)

Direction brukes for å sette korrekt PWM på motorene. MAX_DUTY_CYCLE er maks en usignert 16 bit integer. STOP_DUTY_CYCLE er verdien vi setter for å stopp motorene. Høyere eller lavere forteller om motorene går fremover eller bakover. SPEED_CYCLE er en verdi vi setter mellom 0 og 100 som forteller hvor raskt motorene skal gå.

    def __init__(self, e1Pin, m1Pin, e2Pin, m2Pin):
        self.e1Pin = e1Pin
        self.m1Pin = m1Pin
        self.e2Pin = e2Pin
        self.m2Pin = m2Pin
        self.pwm1 = PWM(m1Pin)
        self.pwm2 = PWM(m2Pin)

Lagrer pin verdiene og lager PWM objekter.

    def enableMotors(self):
        self.e2Pin.value(True)
        self.e1Pin.value(True)

Slå på motorene.

    def disableMotors(self):
        self.e2Pin.value(False)
        self.e1Pin.value(False)

Slå av motorene.

    def rotateInPlace(self, speed, direction):
        self.enableMotors()
        self.pwm2.duty_u16(int(self.STOP_DUTY_CYCLE + (direction * speed * self.SPEED_CYCLE)))
        self.pwm1.duty_u16(int(self.STOP_DUTY_CYCLE + (direction * speed * self.SPEED_CYCLE)))

Kode for å rotere på uten å bevege seg fremover eller bakeover. Får den ene motoren til å gå fremover, men s den andre går bakover i samme hastighet.

    def turnDifferential(self, speedLeft, speedRight):
        self.enableMotors()
        self.pwm2.duty_u16(int(self.STOP_DUTY_CYCLE + (self.DIRECTION_LEFT * speedRight * self.SPEED_CYCLE)))
        self.pwm1.duty_u16(int(self.STOP_DUTY_CYCLE + (self.DIRECTION_RIGHT * speedLeft * self.SPEED_CYCLE)))

Snur ved å sette forskjellig hastighet på motorene.

    def forward(self, speed, direction):
        self.enableMotors()
        self.pwm2.duty_u16(int(self.STOP_DUTY_CYCLE + (direction * speed * self.SPEED_CYCLE)))
        self.pwm1.duty_u16(int(self.STOP_DUTY_CYCLE + (direction * speed * self.SPEED_CYCLE * self.NEGATE)))

Bevge seg fremover eller bakover med å sette samme hastighet på motorene.