Leon van der Horst - Projecten

MD03
Motor controller van Robot Electronics


De MD03 is gelijkstroom motor controller (met H-brug) van Parallax welke motoren kan aansturen tot 50V en maximaal 20A. Daarnaast kan deze motor regelaar diverse verschillende inputs aan, zoals het aansturen via:
  - analoge spanning (0 - 5V) met separate motorrichting besturing
  - analoge spanning (0 - 2,5V - 5V) waarbij 0V = vol achteruit, 2,5V = stop, 5V = vol vooruit
  -
I2C™
  - een normale RC-ontvanger.

  - PWM (Pulse Width Modulation), waarbij de Arduino PWM mogelijkheid gebruikt kan wordenop een frequentie     van 20KHz of hoger.

Ideaal voor in de modelbouw als je stap voor stap wilt overschakelen van RC-besturing naar besturing via een microcontroller bijvoorbeeld.

Sluit de schakeling aan volgens onderstaand schema (GND aan GND van de Arduino, +5V aan +5V van de Arduino (beter nog een extra 5V voeding), SCL (SCL = Serial Clock) aan de analoge poort 5 van de Arduino en SDA (SDA = Serial Data) aan de analoge poort 4 van de Arduino). Bij de Arduino Mega wordt voor SDA digital pin 20 gebruikt en voor SCL pin 21.

Sluit de Arduino via de USB-kabel aan op de computer en laad de sketch in de editor (Arduino IDE = Arduino Interface Development Environment).
In dit schema staat ook een LCD van Parallax getekend, welke ik echter niet gebruik, de programma code hiervoor is dan ook niet opgenomen in de sketch.

Let op: Zet de dipswitches op de MD03 controller in de juiste stand! In dit voorbeeld wordt de MD03 ingesteld voor gebruik van I2C™ met adres 0xB0, waarmee alle vier de dipswitches op ON dienen te staan. Totaal zijn er op de MD03 acht adressen instelbaar.


Hieronder de sketch in de Arduino IDE:

De sketch kun je hier downloaden.

Uitleg bij deze sketch:

De sketch begint met het definiëren van twee libraries die toegevoegd worden tot het totale programma. De eerste is "#include <Wire.h>", de tweede is "#include <SoftwareSerial.h>". Let op de hoofdletters, de IDE is daar zeer gevoelig voor! De Wire-library wordt gebruikt voor de communicatie met de MD03 motor controller via I2C™. De SoftwareSerial-library wordt gebruikt voor de communicatie met de computer via de USB aansluiting op de Arduino. Beide libraries zitten standaard in het totaal pakket van de Arduino IDE.
Verder valt op dat er twee eigen geschreven functies in de sketch zitten: "getData()" en "sendData()". Daarover later mee.
Na de instructies voor de compiler voor het toevoegen van de libraries worden een aantal vaste waarden gezet door middel van een andere compiler instructie "
#define". Hierbij ook het ingestelde adres van de MD03 motor controller. De I2C™ bus maakt gebruik van een 8-bit adres, echter de Arduino Wire-Library maakt gebruik van 7-bit adressering. Het 8-bit adres wordt ingesteld op de MD03, dit is hexadecimaal genoteerd B0 (B nul). Binair geschreven ziet dit er als volgt uit: 10110000. De Arduino schuift alle bits één positie naar rechts en voegt een 0 toe, je krijgt dan dit: 01011000 = 58 hexadecimaal. Meer info over het binaire en hexadecimale stelsel vind je op WikipediA. De overige waarden die via #define worden gedifinieerd zijn commando's die naar de MD03 controller worden gestuurd om bepaalde zaken gedaan te krijgen, waaronder: Uitlezen temperatuur, instellen snelheid, uitlezen stroom e.d.
De "
Serial.begin(9600);" initialiseert de seriële poort van de Arduino (RX en TX pinnen op pin 0 en 1 die verbonden zijn met de USB aansluiting) en zet deze op een snelheid van 9600 Baud (is ongeveer gelijk aan 9600 bits per seconde). Daarna wordt via "Serial.print" tekst naar de computer verstuurd, die dan zichtbaar gemaakt kan worden in de serial monitor van de Arduino IDE.
De "
Wire.begin()" aanroep zorgt voor de initialisatie van de I2C™ bus. Door geen waarde (lees: adres) mee te geven wordt de Arduino in master-mode gezet.
Dan een aanroep waarin een variabele ("software") wordt gevuld, maar die niet van te voren gedeclareerd is. Dat hoeft ook niet, het betekent echter wel dat deze (tijdelijke) variabele alleen bruikbaar is binnen de functie waarin deze gebruikt worde en dat is de "
void setup()" functie. Om de software versie te verkrijgen van de MD03 controller is een eigen functie geschreven die vaak gebruikt gaat worden (vandaar een eigen functie, dat maakt het programma overzichtelijker en kost minder type werk). In deze "getData()" functie wordt een hexadecimale code meegegeven (hier: softReg = 07), welke een commando voorstelt voor de MD03. Deze herkent dit commando en geeft een waarde terug van één byte welke het versie nummer voorstelt.

Daarna begint het hoofdprogramma in de "void loop()" functie. Deze eindeloze loop (=herhaling) laat ter demonstratie de snelheid van de motor oplopen in stapjes van 10, van de waarde 0 tot 250. Gedurende deze lus in de "for" instructie wordt telkens de snelheid van de motor aangepast en verder wordt van de MD03 de temperatuur en motor stroomverbruik opgevraagd en op de computer gepresenteerd in de serial monitor. Daarna wordt de draairichting omgedraaid en begint alles opnieuw.

Uitleg bij "getData()" functie:
De formulisering van de functie luidt: "int getData(int reg){}", waarbij alles tussen de accolades ({ en }) de daadwerkelijke functie is. De "
int" vooraan geeft aan dat de functie een waarde, een integer, terug geeft. De "int reg" tussen de ronde haakjes geeft aan dat er een waarde, een integer, wordt meegegeven bij de aanroep van deze functie en deze variabele "reg" is dan een lokale variabele, die alleen bestaansrecht heeft binnen de functie "getData".
Dan begint de communicatie met de MD03 via "
Wire.beginTransmission(address)". Hey, waar komt "address"vandaan? Deze is geheel bovenaan gedeclareerd via "#define", dit noemt men een globale variabel en in dit geval zelfs een globale constante. De "address" constante (het is géén variabele) kan niet gewijzigd worden doordat het keihard is vastgelegd op de waarde via "#define". De "Wire.beginTransmission()" functie zend zelf geen data, dit is puur een initialisatie functie, waarbij de I2C™ bus wordt klaargezet om data te versturen. Om de data daadwerkelijk te versturen worden twee functies aangeroepen, de eerste is "Wire.send(reg)" die in feite niets anders doet dan de data (één byte in dit geval) klaarzet in een wachtrij (queue). De tweede functie "Wire.endTransmission()" verstuurd daadwerkelijk de data. De waarde van "reg" is een commando voor de MD03, die daarop een actie uitvoert en data terug geeft, dit vangen we op door een drietal functies, welke begint met "Wire.requestFrom(address, 1)", gevolgd door "Wire.available()" en afgesloten met "Wire.receive()". Ook hier wordt eerst de I2C™ bus klaargemaakt voor het ontvangen van data, dan wordt gecontroleerd of er data ontvangen kan worden en tot slot wordt er één byte ontvangen. Één byte omdat we dit aangaven bij "Wire.request". De "getData" functie wordt afgesloten met het terug sturen van de ontvangen byte aan het hoofdprogramma.

Uitleg bij "sendData()" functie:
Bij de
"send"data()"functie vinden dezelfde commando's terug, echter in mindere mate. Het begin is het opzetten van de communicatie met "Wire.begintTransmission(address)" gevolgd door het sturen van de juiste commando's en data naar de MD03, zie voor dit protocol de bijgeleverde
documentatie van de MD03, of klik hier voor de laatste online versie. Dan afsluiten met de "Wire.endTransmission()" functie.

 

Uitleg hardware:

De MD03 controller heeft géén zekering op het bordje zitten, dus zorg voor een juiste zekering van 25/30 A in de "+V Batterij"-aansluiting!
Verder de SDA en SCL lijnen elk via een weerstand van 1K8 Ohm aan +5V verbinden.
De motor aansluiting kan omgedraaid worden indien de motor in de stand voorwaarts de verkeerde kant op draait. De benodigde motor spanning tot maximaal 50V wordt extern aangesloten, meestal de hoofdaccu of een extra motor accu als de ruimte in het model dat toelaat. Verbind wel de GND's met elkaar van de spanningsbronnen.
Intern werkt deze controller met een H-brug om de motorrichting te kunnen omdraaien en de motor wordt via een PWM signaal van 15kHz aangestuurd. De daarvoor benodigde MOSFET's hebben een spanning nodig van 15V, welke door een schakeling op de print wordt gegenereerd vanuit de 5V voeding.

 

Naar elektronica          Naar projecten          Naar hoofd pagina