Scale-N

Scale-N
Arduino
Componenten
Rollend Materieel
Naslag
Onderdelen
Wissels
Basis Electronica
Symbols Electronica
Programming Arduino
AKS
DCC++
DR5000













































Rijsnelheid en richting met behulp van een L293D en arduino

Met deze ‘How To’ gebruiken we de L293D motor driver chip. Met de L293D is het ook mogelijk om de rijrichting te bepalen. Voor de rijsnelheid gebruiken we een PWM uitgang van de arduino. De richting word bepaald door een hoog signaal op 1 van de ingangen van de L293D. In totaal zijn we dus 3 uitgangen van een arduino nodig. We gebruiken een externe voeding voor de rijspanning. De uitgangs stroom van de L293D is 600mA, dit is ruim voldoende om een baanvak aan te sturen.


Benodigdheden:
  • Arduino
  • L293D chip
  • 10K potentionmeter
  • 2x keramische veellagige condensator 1uF
  • Kabeltjes
  • breadboard
  • Externe 16V voeding

Circuit:
De aansluiting is als volgt:
De potentionmeter sluiten we aan op pin A0 (analoge ingang 0)
De PWM output pin 2 gaat naar de en2 pin van de L293D chip
Pin 22 gaat naar in4 van de L293D chip
Pin 23 gaat naar de in3 van de L293D chip
Voor het ontstoren zetten we over de uitgang (out3/gnd en out4/gnd) een keramische condensator van 1uF
Op +V van de L293D chip zetten we 5 volt
Op +motor van de L293D chip zetten we de plus van de externe voeding
Let op dat je de massa van de arduino en de externe voeding met elkaar verbind

Schema:


In de volgende code heb ik enkele random gegevens ingevoerd. bv. hoe lang het oponthoud is en hoe lang de trein rijd.
Code:

// ‘BliksemSnel’ modeltrein management
// by Tukker
// Rijsnelheid en richting met behulp van een L293D chip
int enablePin = 2;
int in1Pin = 22;
int in2Pin =23;
int potPin = 54;
int potValue = 0;
int opcnt = 0;
int opval = 0;
int snelheid = 0;
int drivemaxValue = 0;
int driveValue = 300; //400 is 1 minuut,2000 is 5 minuten enz.
int waitValue = 150; //400 is 1 minuut,2000 is 5 minuten enz.
int minValue = 35; //minimale waarde waar spanningsloos word gemaakt of juist spanning
int opafValue = 2;
boolean drive = false;
boolean opont = true;
boolean optrek = false;
boolean afrem = false;
boolean forward = true;
boolean backward = false;
void setup()
{
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(enablePin, OUTPUT);
  pinMode(switchPin, INPUT);
  pinMode(13, OUTPUT);
}
 
void loop()
{
  // ## blink LED op arduino board voor hello world ;)
  if (digitalRead(13) == HIGH) {
    digitalWrite(13, LOW);
  } else {
    digitalWrite(13, HIGH);
  }
  int potValue = analogRead(potPin) / 4;
  // trein staat stil
  if (opont == true) {
    if (opcnt == opval) {
      optrek = true;
      opont = false;
      opcnt = 0;
      opval = 0;   
      snelheid = 0;
      if ( forward == true ) {
        forward = false;
        backward = true;
        digitalWrite(in1Pin, HIGH);
        digitalWrite(in2Pin, LOW);
      } else {
        forward = true;
        backward = false;
        digitalWrite(in1Pin, LOW);
        digitalWrite(in2Pin, HIGH);
      }
    }
  }    
  // trein trekt op
  if (optrek == true) {
    if (opcnt <= potValue) {
      if ( opcnt > minValue ) {
        if ( snelheid < potValue ) {
          snelheid = snelheid + opafValue;
        }
      }
    }
    if (opcnt > potValue) {
      optrek = false;
      drive = true;
      drivemaxValue = random(0,driveValue);
      opcnt = 0;
    }
  }
  // trein rijd
  if (drive == true) {
    if (opcnt == drivemaxValue) {
      drive = false;
      afrem = true;
      opcnt = 0;
    } else {
      snelheid = potValue; 
    }
  }
  // afremmen trein
  if (afrem == true) {
    if (snelheid == 0) {
      afrem = false;
      opont = true;
      opval = random(0,waitValue);
      opcnt = 0;
      digitalWrite(in1Pin, LOW);
      digitalWrite(in2Pin, LOW);
    } else {
      if ( snelheid < minValue ) {
        snelheid = 0;
      } else {
        if ( potValue < snelheid ) {
          snelheid = potValue;
        } else {
          snelheid = snelheid - opafValue;
        }
      }
    }
  }
  analogWrite(enablePin, snelheid);
  opcnt++;
  delay(100);
}
    


L298

Ref: http://www.bliksemsnel.net/