Styr motorer med L298-modul och Arduino

Ett Arduino-kort kan inte ge ut tillräckligt med ström för att driva motorer. Man behöver därför någon form av motor-drivare. Det finns väldigt många varianter och typer, men en av de populäraste är en krets som heter L298. I den här guiden visar vi hur man använder en modul med denna krets tillsammans med ett Arduino-kort för att driva två små likströmsmotorer.

Den här modulen klarar av att driva motorer på upp till 2 Ampere och 30 Volt, men det är rekommenderat att hålla sig en bit under detta så att modulen inte blir för varm.

Modulen har många anslutningar. Här nedan ser du en ritningar som visar vad varje anslutning heter och en tabell som beskriver deras funktioner.

AnslutningFunktion
OUT1 (MOTOR A +)Anslutning 1 till motor A
OUT2 (MOTOR A -)Anslutning 2 till motor A
OUT3 (MOTOR B +)Anslutning 1 till motor B
OUT4 (MOTOR B -)Anslutning 2 till motor B
12 VStrömmatning för motorerna. Anslut plus på batteri eller nätaggregat hit. Måste inte vara 12 Volt utan ska vara samma spänning som motorerna behöver, men får inte vara högra än 30 Volt.
GNDJordanslutning. Kopplas till minus på batteri eller nätaggregat samt till GND på Arduino-kortet.
5 V5 Volt ut. Kopplas till 5V-anslutningen på Arduino-kortet för att ge ström till det.
ENA (Enable A)Aktivering av motor A. Sätts till hög (5 Volt) för att starta motor A, alternativt använder man PWM-signal för att styra hastigheten. Se beskrivning nedan för mer information.
ENB (Enable B)Aktivering av motor B. Sätts till hög (5 Volt) för att starta motor A, alternativt använder man PWM-signal för att styra hastigheten. Se beskrivning nedan för mer information.
IN1Riktnings-signal 1 för motor A. Se beskrivning nedan för detaljer.
IN2Riktnings-signal 2 för motor A. Se beskrivning nedan för detaljer.
IN3Riktnings-signal 1 för motor B. Se beskrivning nedan för detaljer.
IN4Riktnings-signal 2 för motor B. Se beskrivning nedan för detaljer.

Kopplingen

Koppla in komponenterna enligt schemat nedan. Kontrollsignalerna till motor-drivaren kopplas till data-anslutningar på Arduino-kortet. Motorerna kopplas till motoranslutningarna på motor-drivaren. Batteri eller annan strömkälla kopplas in till strömanslutningarna på motor-drivaren och sedan kopplas 5 Volt-anslutingarna från motordrivaren till Arduino-kortet så att det får ström. Kontrollsignalerna (IN1, IN2, IN3, IN4 , ENA och ENB) kan anslutas till nästan vilken som helst av de digitala anslutningarna på Arduino-kortet bara du ändrar om siffrorna i koden. Dock måste ENA och ENB kopplas till anslutningar som stöder PWM. Dessa är normalt markerade med en liten vågig linje (~) och på Arduino UNO är det D2, D3, D4, D5, D6, D9, D10 och D11.

Beskrivning av koden

Koden är väldigt enkel och gör inget speciellt användbart, men visar hur det fungerar och kan användas som utgångspunkt för dina egna projekt. Det första vi gör är att skapa ett antal konstanta värden som talar om för resten av koden vilka anslutningar som är kopplad till motor-drivaren.

const int ENA = 2;
const int ENB = 3;
const int IN1 = 7;
const int IN2 = 6;
const int IN3 = 5;
const int IN4 = 4;

I setup() ställer vi in att anslutningarna vi använder ska vara utgångar. Alla anslutningar är alltid satta som ingångar vi uppstart.

void setup() {
  // Sätt alla kontrollpinnar till utgångar
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
}

För att starta en motor behöver man göra två saker. Först måste man ställa in dess IN-anslutningar för att välja vilket håll den ska snurra på. Sedan aktiverar man den genom att antingen sätta dess Enable-anslutning hög, eller genom att skicka snabba pulser på den, s.k. pulsbreddsmodulering eller PWM. Exakt hur PWM fungerar går vi inte in på här. Det enda du behöver veta för att du antingen använder funktionen digitalWrite() för att starta och stoppa motorn i full fart, eller så använder du analogWrite() för att ställa in godtycklig hastighet. I tabellen nedan ser du hur signalrna ska sättas för motor A. Signalerna för motor B är samma. Det finns fyra möjliga kombinationer som gör det möjligt att inte bara byta håll på motorn utan även bromsa den. Notera att åt vilket håll motorn roterar på beror inte bara på signalerna utan även på hur dess sladdar är inkopplade. Om motorn roterar åt ”fel” håll och du inte vill ändra din kod så kan du bara byta plats på sladdarna.

ENAIN1IN2Motorfunktion
Lågspelar ingen rollspelar ingen rollStanna
HögLågLågBromsa
Hög eller PWMLågHögRotera medurs
Hög eller PWMHögLågRotera moturs
HögHögHögBromsa

Som du kan se så behöver IN1 och IN2 vara olika för att motorn ska rotera och vilken som är hög respektive låg bestämmer riktningen. Om båda är höga eller båda är låga så kommer motorn inte bara att stanna utan även bromsa om den redan roterar.

  // Snurra på motor A i ganska hög hastighet i 5 sekunder.
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  analogWrite(ENA, 200);
  delay(5000);
  // Stoppa motor A
  digitalWrite(ENA, LOW);

 // Snurra på motor A långsammare åt andra hållet.
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, 150);
  delay(5000);
  // Bromsa motor A
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(ENA, HIGH);

Koden

// Inställningar för motorsignaler. Måste matcha din koppling.
// Det är en bra idé att ge dem bättre namn som beskriver deras funktion närmare,
// men vi håller oss till ursprungsnamnen här i vårt exempel för att de ska vara
// samma som i alla bilder och beskrivningar.
const int ENA = 2;
const int ENB = 3;
const int IN1 = 7;
const int IN2 = 6;
const int IN3 = 5;
const int IN4 = 4;

// I setup ställer vi in vilka anslutningar som är utgångar.
void setup() {
  // Sätt alla kontrollpinnar till utgångar
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
}

// I Loop lägger vi in vår kod för att styra motorerna.
void loop(){
  // Snurra på motor A i ganska hög hastighet i 5 sekunder.
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  analogWrite(ENA, 200);
  delay(5000);
  // Stoppa motor A
  digitalWrite(ENA, LOW);
  // Snurra på motor B i 5 sekunder.
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  analogWrite(ENB, 200);
  delay(5000);
  // Stoppa motor B
  digitalWrite(ENB, 0);
  // Byt riktning på motor B och snurra lite långsammare i 5 sekunder.
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  analogWrite(ENB, 100);
  delay(5000);
  // Stoppa motor B
  digitalWrite(ENB, 0);
  // Byt riktning på motor A och snurra lite långsammare i 5 sekunder.
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, 100);
  delay(5000);
  // Stoppa motor A
  digitalWrite(ENA, 0);
}

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *