In dit lab bouw je een Arduino Nano motorbesturing met de L298N motordriver.

Als voorbereiding heb je ons lab gedaan: ‘Blink Extreme maar dan op het breadboard’, en anders moet je die toch nog even doen: https://junioriot.nl/blink-extreme-breadboard/

De uitgangen van de Arduino kunnen we makkelijk gebruiken om leds aan- en uit te zetten. Zwaardere belastingen gaan echter niet lukken. De motordriver zorgt ervoor dat de signalen van de uitgang worden versterkt naar een krachtigere aansturing voor een DC-motor.

L298N motordriver solderen voor het breadboard

Eerst willen we de motorcontroller klaar maken voor het breadboard. Als je de pennen nog niet op de L298 motordriver hebt gesoldeerd, doe je dat nu volgens dit lab: https://junioriot.nl/l298n-solderen-breadboard/.

Blink Extreme opbouwen, leds op 2-3, 5-6 en 8-9

Plaats je Arduino Nano in het breadboard. Zorg dat er wat extra ruimte zit aan de kant van de D2-D3-D4… aansluitingen. Als je de headers nog niet op de Arduino hebt gesoldeerd, doe dat dan alsnog volgens deze instructie: https://junioriot.nl/headers-op-arduino-nano-solderen/

Nu heb je het circuit en het programma nodig die je bouwt met het lab ‘Blink dubbel Extreme’: https://junioriot.nl/blink-dubbel-extreme/. Voer nu dat lab uit, en daarna lees je hieronder verder om de motor controller op te bouwen.

Power naar de motor control

De motor controller schakelt een externe power naar jouw motor. Dit kan een andere spanning zijn met voldoende kracht om je motors goed aan te sturen. Voor nu mag je het simpel houden, en je gebruikt de power van de USB kabel die in de Arduino zit. Maak daarom deze aansluitingen:

  • Met een rode jumper sluit je de +5V van de Arduino Nano aan op de + van de power controller.
  • De GND van de Arduino Nano sluit je aan op de – van de controller.

Besturing naar de motor control

De heen-en-weer twee kleuren knipper op D2 en D3 gebruiken we om de eerste motor linksom en rechts om te sturen. Sluit daarom aan:

  • D2 op IN1
  • D3 op IN2
  • Steek een led in de aansluitingen voor motor-A – maar heel kort, anders brandt deze door.

In je programma hoef je niets te veranderen. Als het gelukt is, dan zie je de ‘motor led’ nu knipperen. Oh jee, we zetten 5 volt op deze motor-led, en dat zal de led niet lang volhouden. We hadden een weerstand moeten toevoegen.

  • Test of het ledje echt stuk is en gooi het weg.

Motor aansluiten

Soldeer aan de motor twee aansluitdraden. Daarvoor kan je jumpers gebruiken of twee header pins. Met een plakbandje op de as is het makkelijker om te zien of de motor echt draait.

Sluit de motor aan op de motor-A aansluiting van de motor controller. Controleer of de motor in het ritme van je blink programma heen en weer draait.

De motor kan nu twee kanten op draaien. Het valt je vast op dat het met ons blink voorbeeld telkens met dezelfde snelheid gebeurt.

Rustiger draaien met PWM

Met het Blink voorbeeld laat je de motor op volle kracht draaien. Soms is dat prima, maar meestal mag het wat rustiger.

We kunnen de motor langzamer laten draaien door een PWM-signaal naar de motordriver te sturen. Met een PWM-signaal schakelt de poort snel tussen hoog en laag. Zo’n PWM-signaal krijg je met de Arduino met een analogWrite() opdracht. De eerste parameter van deze opdracht geeft aan welke poort je gebruikt.

Met de tweede parameter van de analogWrite() opdracht kies je de verhouding of het signaal meer of minder lang ‘hoog’ is. Met 0 is het altijd laag, en met 255 is het altijd hoog. En met bijvoorbeeld 255/3 is het signaal 1/3 van de tijd hoog, en draait de motor met 1/3 van de kracht. Bij motoren met een tandwielkast kan 255/3 te weinig zijn om echt te gaan draaien.

Op de Arduino Nano kan je deze pinnen gebruiken voor PWM: 3, 5, 6, 9, 10, 11. De details van de analogWrite() worden door Arduino uitgelegd: https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/

Ombouwen naar D5-D6

Hey, dat is vervelend. We gebruiken pin 3 en 4 voor de motor, en op 4 kunnen we geen PWM gebruiken. Dat kan wel op uitgang 5 en 6. Het is nu handig om je schema om te bouwen.

  • Verplaats de controller aansturingsdraden van D2-D3 naar D5-D6. Op deze twee pinnen kan je PWM gebruiken.

Gebruik analogWrite() op D5 en D6

Verander het programma. Zoek in jouw code de regels die nu nog met digitalWrite() een opdracht geven aan pin 5 en pin 6:


digitalWrite(5, HIGH); // turn the LED on (HIGH is the voltage level)
delay(200); // wait for a second
digitalWrite(5, LOW); // turn the LED off by making the voltage LOW
delay(200); // wait for a second

digitalWrite(6, HIGH); // turn the LED on (HIGH is the voltage level)
delay(200); // wait for a second
digitalWrite(6, LOW); // turn the LED off by making the voltage LOW
delay(200); // wait for a second


En vervang deze door analogWrite opdrachten:

  analogWrite(5, 255/2);   // pin, value --  0=off 255=fully on
  delay(200);                       // wait for a second
  analogWrite(5, 0);    // pin, value --  0=off 255=fully on
  delay(200);                       // wait for a second
  
  analogWrite(6, 255/2);   // pin, value --  0=off 255=fully on
  delay(200);                       // wait for a second
  analogWrite(6, 0);    // pin, value --  0=off 255=fully on
  delay(200);                       // wait for a second

Even kijken naar de code

Bij mij ziet het programma er nu zo uit:


// the setup function runs once when you press reset or power the board
void setup() {
   // initialize digital pin LED_BUILTIN as an output.
   pinMode(LED_BUILTIN, OUTPUT);

   pinMode(2, OUTPUT);
   pinMode(3, OUTPUT);

   pinMode(5, OUTPUT);
   pinMode(6, OUTPUT);

   pinMode(8, OUTPUT);
   pinMode(9, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
   digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
   delay(200); // wait for a second
   digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
   delay(200); // wait for a second

   digitalWrite(2, HIGH); // turn the LED on (HIGH is the voltage level)
   delay(200); // wait for a second
   digitalWrite(2, LOW); // turn the LED off by making the voltage LOW
   delay(200); // wait for a second

   digitalWrite(3, HIGH); // turn the LED on (HIGH is the voltage level)
   delay(200); // wait for a second
   digitalWrite(3, LOW); // turn the LED off by making the voltage LOW
   delay(200); // wait for a second

   analogWrite(5, 255/2); // pin, value -- 0=off 255=fully on 
   delay(200); // wait for a second 
   analogWrite(5, 0); // pin, value -- 0=off 255=fully on 
   delay(200); // wait for a second 

   analogWrite(6, 255/2); // pin, value -- 0=off 255=fully on
   delay(200); // wait for a second 
   analogWrite(6, 0); // pin, value -- 0=off 255=fully on 
   delay(200); // wait for a second
   digitalWrite(8, HIGH); // turn the LED on (HIGH is the voltage level)
   delay(200); // wait for a second
   digitalWrite(8, LOW); // turn the LED off by making the voltage LOW
   delay(200); // wait for a second
}

Volgens mij zal jouw code er iets anders uitzien.

Doet hij het nu?

Stuur het programma naar de Arduino. Draait de motor nu rustiger heen en weer?

Probeer voor jouw motor het laagste getal te vinden waarbij je motor nog draait.