John Val/ Informatica/ Physical computing/sketch 5

Een vijfde project: aansturing van een DC motor

DC motor aansturen Sketch Motor Licht Uitdagingen

DC motor

De DC motor


Een plaatje van de DC motor (klik op het plaatje
voor een plaatje van de werking)

Een DC motor (DC staat voor Direct Current) wordt ook wel gelijkstroommotor genoemd. Een DC motor zet elektrische energie in de vorm van een gelijkstroom om in mechanische energie. Door elektriciteit op de motor te zetten onstaat er een magnetisch veld in de spoel (die zich in de motor bevindt) waardoor de as, die daar doorheen loopt, begint te draaien.
Een DC motor kan ook gebruikt worden om elektriciteit op te wekken. Zo kan je een LED direct aansluiten op de motor en laten branden door eraan te draaien! Dit werkt net als de dynamo op een fiets (ervan uitgaande dat jullie allemaal een dynamo en werkend licht hebben op je fiets!! :) ).
Meer informatie en uitleg over een DC motor staat bij project 9 in het Arduino Projects Book en hier. De Nederlandse wikipedia pagina over de gelijkstroommotor kun je hier vinden.
Na deze les hoor je te weten:

  1. Wat een DC motor is.
  2. Hoe je DC motor aanstuurt.
  3. Wat een Mosfet transistor (datasheet) en waarvoor die gebruikt wordt.
  4. Wat een H-bridge is en waarvoor het gebruikt wordt.
  5. Wat een diode is en waarvoor het gebruikt wordt.

In dit project gebruiken we een Mosfet transistor, H-bridge en een DC motor.

Omdat een motor (zie ook sketch3) meer energie vraagt dan de Arduino kan leveren moet een (externe) batterij worden aangesloten om de motor te kunnen laten draaien. Door een transistor tussen de batterij en de motor te zetten kunnen we ervoor zorgen dat de Arduino de stroomkring over de batterij kan sluiten waardoor de motor stroom krijgt van de batterij en dus gaat draaien. Een Mosfet transistor heeft drie 'pinnen': de gate, de source en de drain. De gate pin zorgt ervoor dat de stroomkring tussen de source en de drain pin gesloten wordt. Door de Arduino op deze gate pin aan te sluiten en er een stroompje op te laten zetten (bv. na het indrukken van een knop) kunnen we er dus voor zorgen dat de Arduino de motor 'aanstuurt'.

Een H-bridge is een 'integrated circuit' (IC). Een IC is een component die een groter circuit in een klein 'pakketje' stopt. Dit zorgt ervoor dat grotere en complexere circuits makkelijker gemaakt kunnen worden (een deel van dat 'grote' circuit hoef je niet te maken omdat dat in de IC zit). De H-bridge heeft een aantal transistors ingebouwd waardoor de polariteit van de motor omgedraait kan worden en daarmee ook de richting (dus je kan dan de motor voor- en achteruit zetten).

Doordat de DC motor ook zelf elektriciteit kan opwekken is er een extra component nodig om de schakeling te beveiligen. Nadat er stroom op de motor is gezet gaat de motor draaien maar als de stroom eraf wordt gehaald stopt de motor niet direct. Doordat de motor nog heel even doordraait wekt het elektriciteit op. Deze elektriciteit stroomt in de tegengestelde richting als de stroom afkomstig van de batterij. De schakeling moet tegen deze stroom beschermd worden. Dat doen we door een diode in de schakeling te plaatsen. Een diode zorgt ervoor dat de stroom maar in 1 richting kan stromen. Door deze diode in de schakeling te plaatsen 'beschermd' het de schakeling tegen deze ongewenste stroom gegenereerd door het 'doordraaien' van de motor.

Omdat er in de les te veel problemen zijn geweest met de MOSFET sla je opgave 28 en 29 over. Opgave 30 kan worden gemaakt met behulp van de schakeling met de H-bridge.
  1. Bestudeer deze bladzijde goed voor je de MOSFET aansluit. Pas OP! Bij verkeerd aansluiten wordt een MOSFET heel erg heet..Wat doet de MOSFET?
  2. Op welke manier moet de diode in de schakeling geplaatst worden en waarom?

Sketch a

Sketch motor met knop (project 9)

De onderstaande sketch kun je in de IDE laden. In deze sketch wordt getracht de motor te laten draaien.

/*
 De motor aan of uit zetten
 Aanpassing van het commentaar bij de code horend bij 'Project 9  - Motorized Pinwheel' van de Arduino Starter Kit
 
 Modified 10 March 2014
 by Aitor Azcarate Onaindia
 
 This example code is part of the public domain 
 */

// variabele voor de pin
const int switchPin = 2; // druk knop aangesloten op pin 2
const int motorPin =  9; // motor aangesloten op pin 9

int switchState = 0;  // variabele om de staat van de druk knop te onthouden

void setup() {
  // initializeer de pinnen als in/uitvoer
  pinMode(motorPin, OUTPUT);      
  pinMode(switchPin, INPUT);     
}

void loop(){
  // controleer en sla de staat van de druk knop op
  switchState = digitalRead(switchPin);

  // als de knop is ingedrukt
  if (switchState == HIGH) {     
    // zet de motor aan    
    digitalWrite(motorPin, HIGH);  
  } 
  else { // anders is de knop niet ingedrukt
    // zet de motor af
    digitalWrite(motorPin, LOW); 
  }
}


Een schema van de schakeling (klik op het schema voor het breadboard lay-out)
  1. Op school zijn er drie soorten DC motoren aanwezig (zie de plaatjes hieronder) StarterKit Iprototype. Elk van deze motoren draait met zijn eigen snelheid. Bedenk een manier om te testen (en voer de test uit) welke het snelst draait en maak een ranglijst van snelst naar langzaamst. Geef ook in percentages in die ranglijst aan hoeveel sneller of langzamer ze zijn t.o.v. elkaar.
    De kleinsteDe midddelsteDe grootste
Sketch b

Sketch motor 'voor- en achteruit' (project 10)

De onderstaande sketch kun je in de IDE laden. In deze sketch wordt getracht de motor voor- en achteruit te laten draaien (met behulp van de H-bridge).

/*
 DC motor twee kanten op
 Aanpassing van het commentaar bij de code horend bij 'Project 10  - Zoetrope' van de Arduino Starter Kit
 
 Modified 10 March 2014
 by Aitor Azcarate Onaindia
 
 This example code is part of the public domain 
 */

const int controlPin1 = 2; // aangesloten aan pin 7 van de H-bridge
const int controlPin2 = 3; // aangesloten aan pin 2 van de H-bridge
const int enablePin = 9;   // aangesloten aan pin 1 van de H-bridge
const int directionSwitchPin = 4;  // aangesloten aan de knop om de richting (voor/achteruit) aan te geven
const int onOffSwitchStateSwitchPin = 5; // aangesloten aan de knop die de motor aan of uit zet
const int potPin = A0;  // aangesloten aan de output van de potentiometer ('draaiknop')

// variabele om waardes van de input te onthouden
int onOffSwitchState = 0;  // huidige staat van de aan/uit knop
int previousOnOffSwitchState = 0; // vorige staat van de aan/uit knop
int directionSwitchState = 0;  // huidige staat van de directie knop
int previousDirectionSwitchState = 0;  // vorige staat van de directie knop

int motorEnabled = 0; // zet de motor aan of uit
int motorSpeed = 0; // de snelheid van de motor
int motorDirection = 1; // huidige richting van de motor

void setup(){
  // zeg welke 'pin' invoer en uitvoer is
  pinMode(directionSwitchPin, INPUT);
  pinMode(onOffSwitchStateSwitchPin, INPUT);
  pinMode(controlPin1, OUTPUT);
  pinMode(controlPin2, OUTPUT);
  pinMode(enablePin, OUTPUT);

  // om te starten zet de enablePin laag/uit
  digitalWrite(enablePin, LOW);
}

void loop(){
  // controleer en sla de staat van de aan/uit knop op
  onOffSwitchState = digitalRead(onOffSwitchStateSwitchPin);
  delay(1);
  
  // controleer en sla de staat van de richting knop op
  directionSwitchState = digitalRead(directionSwitchPin);
  
  // controleer en sla de waarde van de potentiometer op
  // de waarde hiervan moet je delen door 4 omdat de PWM een waarde tussen 0 en 255 gebruikt
  // en de analogRead een waarde tussen 0 en 1024 geeft
  motorSpeed = analogRead(potPin)/4; 

  // als de aan/uit knop is ingedrukt sinds de laatste keer dat loop() werd doorlopen
  if(onOffSwitchState != previousOnOffSwitchState){
    // verander de waarde van de variabele als de knop is ingedrukt
    if(onOffSwitchState == HIGH){
      motorEnabled = !motorEnabled;
    }
  }

  // als de directie knop is ingedrukt sinds de laatste keer dat loop() werd doorlopen
  if (directionSwitchState != previousDirectionSwitchState) {
    // verander de waarde van de variabele als de knop is ingedrukt
    if (directionSwitchState == HIGH) {
      motorDirection = !motorDirection;
    }
  }  

  // verander de richting van de motor door te communiceren met de control pinnen van de H-bridge
  if (motorDirection == 1) {
    digitalWrite(controlPin1, HIGH);
    digitalWrite(controlPin2, LOW);
  } 
  else {
    digitalWrite(controlPin1, LOW);
    digitalWrite(controlPin2, HIGH);
  }  

  // als de motor aan is
  if (motorEnabled == 1) {
    // schrijf de huidige snelheid naar de pin
    analogWrite(enablePin, motorSpeed);
  }
  else { // anders is de motor uit
    // schrijf de snelheid van 0 naar de pin (dus hij draait niet meer)
    analogWrite(enablePin, 0);
  }
  // sla de huidige staat van de directie knop op als de vorige staat 
  // (want de volgende keer dat de loop() doorlopen wordt is de huidige staat de vorige
  // staat
  previousDirectionSwitchState = directionSwitchState;
  // sla de huidige staat van de aan/uit knop op als de vorige staat
  previousOnOffSwitchState = onOffSwitchState;
}


Een schema van de schakeling (klik op het schema voor het breadboard lay-out)
Opdracht:
  1. In de schakeling hierboven heb je een H-bridge gebruikt (L293DNE). Hieronder zie je een schematisch plaatje van de H-bridge. Zoek en benoem wat elk van de 16 pins doen.
  2. Zorg ervoor dat er een tweede motor aangesloten wordt en ook draait als er op de knop wordt gedrukt.
  3. Bij de vorige opdracht heb je een tweede motor aangesloten, waarschijnlijk draaiden beide motoren dezelfde kant op. Zorg ervoor dat de beide motoren in tegengestelde richting draaien.
Uitdaging

Uitdaging

  1. Motor met een sensor:
    Pas de sketch en de schakeling zo aan dat de motor draait aan de hand van een sensor. Dus als je er een licht sensor tussen zet zal de motor sneller draaien zodra er meer licht op valt. Doe je er een temperatuur sensor tussen dan zal de motor sneller draaien als de sensor warmer wordt. Bouw nu een karretje en laat je karretje naar het lichtste of warmste plek zoeken. Hint: Laat je karretje eerst in een rechte lijn heen en weer rijden en zorg voor een hoog/laag meting in de setup functie.