Arduino modelspoor controller

Arduino modelspoor controller

Gepubliceerd op: 12-04-2016 12:44

Sommige delen van de modelbaan mogen best geautomatiseerd worden. Lees in dit artikel hoe je dat kan doen met behulp van een Arduino.

Voor mij zit de lol van het modelspoor bouwen vooral in het bouwen zelf, en voor een deel in het rangeerbedrijf. Lange treinen die volautomatisch rondjes rijden doen mij niet zoveel. Toch zijn sommige zaken wel handig om te automatiseren. Ik kies er daarom voor om mijn hoofdemplacement met de hand te bedienen, hier worden goederensporen bediend en treinen samengesteld. Vanaf het moment dat de treinen het station verlaten worden ze echter overgenomen door de Arduino modelbaan besturing die automatisch een vrij spoor selecteert in het schaduwstation en de trein hier netjes tot stilstand laat komen.

Motor besturen met L298N

Het hoofdcomponent van de modelbaanbesturing is de motordriver, ondanks alle leuke aankleding blijft het natuurlijk gewoon een elektromotor die je wilt aansturen, zowel in snelheid als richting. Met behulp van transistoren en een H-brug schakeling kan je hier een mooie powerdriver voor bouwen, maar waarom moeilijk doen als het ook makkelijk kan? Voor een habbekrats bestel je deze L298N motorcontroller uit China met de H-brug als integrated circuit voorzien van koelframe en randcomponenten.

De Arduino modelspoor controller met een L298N motordriver

De motordriver is voorzien van schroefterminals voor twee motoren/railsecties, een 12 Volt ingang en een 5 Volt uitgang die je Arduino kan voeden. De 6 pinheaders handelen de (zwakke) stuurstromen af. Enable A en Enable B sluit je aan op een PWM-pin van de Arduino, hiermee regel je de snelheid. In1 t/m In4 koppel je aan vier digitale poorten van je Arduino. In1 en In2 regelen de richting van motor A, en In3 en In4 regelen de richting van motor B, dit doe je door de ene ingang hoog te maken en de andere laag. Maak je beide uitgangen laag dan schakel je de motor helemaal uit en kan deze uitlopen.

void runTrains() {
  if (speedA > 0) {
    if (dirA == 0){
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
    }
    else {
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
    }
    analogWrite(enA, speedA);
  }
  else {
    // stop
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    analogWrite(enA, 0);
  }
  if (speedB > 0) {
    if (dirB == 0){
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
    }
    else {
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
    }
    analogWrite(enB, speedB);
  }
  else {
    // stop
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
    analogWrite(enB, 0);
  }
}

PWM-frequentie instellen

De standaard PWM (Pulsbreedtemodulatie) frequentie van de Arduino Uno op pin 3, 9, 10 en 11 is 490,2 Hertz. Een prima frequentie om LED's en dergelijke te faden maar de kleine elektromotortjes in modelspoorlocomotieven doen het graag wat rustiger aan. Door de massatraagheid van de motor en vliegwiel komen de loc's amper vooruit bij dergelijke hoge pulsbreedte-frequenties. Enig onderzoek leert dat commerciƫle treincontrollers die gebruik maken van pulsbreedtemodulatie gebruik maken van 100 Hz tot 200 Hz als PWM-frequentie. Er zijn zelfs bronnen die beweren dat de rij-eigenschappen verder verbeteren bij nog lagere frequenties tot 30 Hz.

De PWM-frequentie van je Arduino is (in stappen) instelbaar. Hier zijn geen handzame functies voor, we moeten direct de registers aanpassen met behulp van C++. De frequentie van Pin 9 en 10 wordt bepaald door Timer 1. Om de frequentie van 490,2 Hz terug te brengen naar 122,55 Hz plaats ik de volgende regel in de setup van mijn code:

TCCR1B = (TCCR1B & 0b11111000) | 0x04;

Pin 11 en 3 worden aangestuurd door Timer 2, hiervoor gebruik je:

TCCR2B = (TCCR2B & 0b11111000) | 0x06;

Alle opties voor de timerregisters kun je snel terugvinden in de TimerPWMCheatsheet op Arduino.cc. 122,55 Hz bleek voor mijn loc's de beste frequentie. Een stap lager is 30,64 Hz, de loc's rijden dan nog wel maar maken zoveel lawaai dat er voor je gevoel van alles kapot gaat :-). Overigens is het normaal dat PWM-aangestuurde motoren zingen of brommen, dat zijn de windingen van de spoelen in de motoren die trillen op de PWM-frequentie. Hoe hoger de frequentie hoe minder hoorbaar maar hoe slechter de rij-eigenschappen...

Automatisch rijden en stoppen

Je kunt treinen alleen op de juiste plaats laten stoppen als je weet waar ze zich bevinden. Omdat ik op de bovenbaan handmatig rij gaat een compleet bloksysteem mij een beetje te ver, de hoeveelheid draden die daar bij komt kijken is niet grappig. Eigenlijk wil ik de treinen slechts op twee plaatsen detecteren, namelijk of zij zich op een opstelspoor in het schaduwstation bevinden. Deze treinen detecteer ik optisch met behulp van een LDR tussen de rail. Als een trein gedetecteerd wordt zal hij automatisch afremmen, vervolgens wordt het wissel omgelegd waardoor het betreffende spoor stroomloos wordt, en er een nieuwe trein kan binnenlopen.

Wisselbediening met servo's

Alle fabrikanten hebben wisselmotoren in hun assortiment speciaal voor hun rails. Helaas zijn deze wisselmotoren best aan de prijs, en heb je ook nog wat elektronica nodig om ze aan te sturen aangezien het vaak magneetspoelen zijn die je niet rechtstreeks met je Arduino kunt aansturen. Servomotoren uit de RC-modelbouw zijn een stuk goedkoper en wel direct met een Arduino aan te sturen. Bovendien kunnen servo's een langzame vloeiende beweging uitvoeren wat belangrijk kan zijn voor in het zicht liggende wissels. Een echt wissel gaat namelijk ook nooit met een klik om zoals met de magneetspoelen wel gebeurd.

Fleischmann profiwissel bedienen met servo en Arduino

Servo's stuur je eenvoudig aan met behulp van de servo-library die standaard in de Arduino IDE aanwezig is. Van een dun ijzerdraadje buig ik een haakje om de arm van de servo met wisselsteller van de wissel te verbinden. De servo heeft een drie-aderige aansluiting: 5 volt, ground en input. De input wordt aangestuurd door een gepulst signaal van de Arduino. De library handelt dit af maar heeft daar wel Timer 1 voor nodig, dit houdt in dat je dus niet de PWM-frequency van Timer 1 kunt veranderen als je ook servo's wilt gebruiken op dezelfde Arduino!

6 reacties op dit artikel »

Aanbevolen artikelen