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 ESP32 | Pin LM298 | Forklaring |
13 | E1 | Her setter vi 1 for nå motoren skal være i gang og 0 når den ikke skal det. |
12 | M1 | Dette er PWM styrt og forteller om hastigheten til motoren og om den skal gå fremover eller bakover. |
27 | E2 | Her setter vi 1 for nå motoren skal være i gang og 0 når den ikke skal det. |
33 | M2 | Dette 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.
Du må være logget inn for å legge inn en kommentar.