Välj en sida

En robot behöver kunna röra sig och för det behöver man motorer. Men motorer kräver mycket ström och det går inte att koppla in dem direkt till ett Arduino-kort. Därför behöver man en motor-drivare av något slag. Den enklaste att använda är Arduino Motor Shield R3. Efterom detta är en s.k. sköld (shield) så passar den att monteras direkt på (eller under) ett standard Arduino-kort. Man behöver därför inte koppla massa sladdar på en kopplingsplatta. Kretsen på det här kortet heter L298P och kan driva två likströmsmotorer på 2A stycket vilket är gott och väl tillräckligt för mindre robotar. För att styra varje motor med det här kortet använder man sig av tre signaler kallad PWM, DIR och BREAK. PWM använder man för att sätta hastigheten på motorn, DIR för att välja riktining och BREAK kortsluter motorn (på säkert sätt) vilket fungerar som en broms. Som namnet antyder så styr man hastigheten på PWM-anslutningen med pulsbreddsmodulering (PWM), dvs du använder funktionen analogWrite().

Kopplingen

Montera motor-skölden ovanpå Arduino-kortet och koppla in motorer och batterier (eller annan strömförsörjning) för motorerna enligt bild nedan. Batterierna behöver ha samma totala spänning som motorerna är gjorda för (men max 12V). Arduinon kan ta ström direkt från batterierna, men för säkrare drift är det bäst att ge ström till Arduinon separat. Annars finns det risk att när motorerna drar mycket ström så sjunker spänningen så pass mycket att Arduino-kortet startar om. Den här uppkopplingen och koden nedan förväntar sig att roboten använder s.k. tank-styrning där hjulen på var sida drivs av var sin motor och roboten svänger genom att ändra hastighet/riktning på motorn (motorerna) på ena sidan. Detta är det absolut vanligaste sättet att driva och styra mindre robotar och det här projektet lämpar sig mycket väl för de flesta av våra robotchassin. För robotar som har fyra motorer (två på var sida) kopplar man in båda motorerna på var sidan till samma utgångar på motor-skölden.

Arduino-projekt 008 – Styr motorer

Beskrivning av koden

Koden är enkel och gör inte något direkt användbart, men fungerar bra för att testa kopplingen och bildar en bra grund för dina egna robotar. Först definierar vi vilka anslutningar på Arduino-kortet som används till vad. Dessa bestäms så klart av själva motor-skölden och du ska inte ändra dem, men vi lägger in dem som konstanter så att vi i resten av koden inte behöver ange siffrorna utan istället kan skriva namnen. Det är mycket lättare att komma ihåg dir_a än att den funktionen ligger på pinne 12. Motor-skölden har ytterligare några anslutningar, men dessa är inte nödvändiga att använda. Därefter skapar vi ett antal funktioner för att sätta hastighet på motorerna och för att köra fram, bak, svänga och att stanna. Stanna-funktionen är egentligen inte nödvändig eftersom det enda den gör är att sätta hastigheten till 0, men den gör resten av koden lite mer lättläst.

I setup() ställer vi bara in vilka anslutningar på Arduino som ska vara utgångar, dvs de fyra kontrollsignaler som motor-skölden använder. I loop() ligger själva huvud-algoritmen. Denna är mycket enkel och använder de funktioner vi skapade för att köra framåt och bakåt och svänga runt i en enkel sekvens. Detta är bara till som exempel och för att se att allt fungerar som det sak. Denna kod ersätter du sedan lämpligen med din egna mer spännande kod. T.ex. kan du låta roboten ta emot kommandon från en bluetooth-modul, eller så kan du koppla in en ultraljudssensor så att roboten kan köra runt själv och undvika hinder.

Om roboten går fel

Om roboten skulle visa sig inte röra sig som du tänkt dig så finns det många möjliga orsaker. Vilket håll som en likströmsmotor snurrar på beror på vilket håll som strömmen genom den går. Så om en motor snurrar åt fel håll räcker det med att byta plats på de två sladdarna till den. Så om roboten svänger åt vänster när den ska gå framåt så byt pats på sladdarna till den vänstra motorn; och omvänt om den svänger åt höger. Om roboten går bakåt när den ska gå framåt byter du plats på sladdarna på båda motorerna, men håll reda på så att du inte växlar runt sladdarna mellan motorerna. Den ena motorn ska fortfarande använda anslutningarna A+ och A- och den andra ska använda B+ och B-. Om roboten går framåt och bakåt korrekt, men svänger höger när den egentligen ska svänga vänster och vice versa så betyder det att motorena sitter på fel sida. Man skulle kunna tro att det då räcker att byta plats på motorerna, men om du gör det kommer roboten att gå bakåt när den ska gå framåt. Istället behöver du byta plats på sladdarna så att motorn som är kopplad till utgångarna A+ och A- kopplas till utgångarna B+ och B- (utan att byta plats på + och -) och att motorn kopplad till B+ och B- kopplas in på A+ och A- (återigen så att + och – bibehålls). Om din robot har fyra motorer, dvs två på var sida, och ena motorn på en sida snurrar åt fel håll byter du runt sladdarna på bara den motorn. Se också till att båda motorerna på en sida är kopplade till samma utgångar, t.ex. motorerna på vänster sida till A+ och A- och motorerna på höger till B+ och B-.

Koden

// Inställningar för motorsignaler. Förutbestämda av motor-skölden så ändra ej!
const int dir_a = 12;
const int dir_b = 13;
const int pwm_a = 3;
const int pwm_b = 11;

// Funktion för att sätta hastigheten på båda motorerna
void hastighet(int v) {
  analogWrite(pwm_a, v);
  analogWrite(pwm_b, v);
}

// Funktion för att köra framåt
void kor() {
  digitalWrite(dir_a, HIGH);
  digitalWrite(dir_b, HIGH);
}

// Funktion för att backa
void backa() {
  digitalWrite(dir_a, LOW);
  digitalWrite(dir_b, LOW);
}

// Funktion för att svänga åt vänster
void svang_vanster() {
  digitalWrite(dir_a, LOW);
  digitalWrite(dir_b, HIGH);
}

// Funktion för att svänga åt höger 
void svang_hoger() {
  digitalWrite(dir_a, HIGH);
  digitalWrite(dir_b, LOW);
}

// Funktion för att stanna
void stanna() {
  hastighet(0);
}

// I setup ställer vi in vilka anslutningar som är utgångar
void setup() {
  // Sätt alla kontrollpinnar till utgångar
  pinMode(dir_a, OUTPUT);
  pinMode(dir_b, OUTPUT);
  pinMode(pwm_a, OUTPUT);
  pinMode(pwm_b, OUTPUT);
}

// Loop kör en enkel sekvens där roboten kör fram, bak och svänger efter ett enkelt mönster.
// Här lägger du in din egen kod för att få roboten att göra mer intressanta saker.
void loop(){
  // Kör framåt i full fart i 5 sekunder
  hastighet(255);
  kor();
  delay(5000);
  // Backa i lägre hastighet i 2 sekunder
  hastighet(180);
  backa();
  delay(2000);
  // Snurra runt åt vänster i 5 sekunder
  hastighet(255);
  svang_vanster();
  delay(5000);
  // Stanna och stå still i 4 sekunder
  stanna();
  delay(4000);
}