Oponthoud schakeling
2 min gelezenDeze post komt oorspronkelijk van bliksemsnel.net en beschrijft een wijze die gebruikt kan worden om een modelspoor locomotief aan te sturen op het modelspoor welke enige tijd stil gaat staan en weer optrekt.
Voor deze sketch wordt de rijsnelheid met behulp van een TIP122 gebruikt.
/*
Project 'Oponthoud schakeling'
Project details at https://www.kalkhaar.nl/oponthoud-schakeling/
Author 'Marcel Kalkhaar'
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
int potPin = 0;
int railroadPin = 3;
int potValue = 0;
int opcnt = 0;
int opval = 0;
int snelheid = 0;
int drivemaxValue = 0;
int driveValue = 500; //400 is 1 minute,2000 is 5 minutes
int waitValue = 300; //400 is 1 minute,2000 is 5 minutes
boolean drive = false;
boolean opont = true;
boolean optrek = false;
boolean afrem = false;
void setup()
{
pinMode(railroadPin, OUTPUT);
pinMode(13, OUTPUT);
}
void loop()
{
// blink onboard LED on pin 13
// does the arduino work ;)
if (digitalRead(13) == HIGH)
{
digitalWrite(13, LOW);
} else {
digitalWrite(13, HIGH);
}
potValue = analogRead(potPin) / 4;
// train stand
if (opont == true) {
if (opcnt == opval) {
optrek = true;
opont = false;
opcnt = 0;
opval = 0;
snelheid = 0;
}
}
// train pulls up
if (optrek == true) {
if (opcnt = potValue) {
snelheid = opcnt;
}
if (opcnt = potValue) {
optrek = false;
drive = true;
opcnt = 0;
}
}
// train drives
if (drive == true) {
if (opcnt == driveValue) {
drive = false;
afrem = true;
opcnt = 0;
} else {
snelheid = potValue;
}
}
// train slows down
if (afrem == true) {
if (snelheid == 0) {
afrem = false;
opont = true;
opval = random(0,waitValue);
opcnt = 0;
} else {
// potValue no longer included because you slow down
snelheid = snelheid - 1;
}
}
// set speed of the train
analogWrite(3, snelheid);
// counter
opcnt++;
// a small delay for stability
delay(150);
}
Uitleg:
Net zoals bij de rijsnelheid schakeling kan je de rijsnelheid instellen met de potentionmeter.
De trein rijdt een X aantal seconden. Deze kan je instellen bij `int driveValue = 500;` 400 is een minuut
De wachttijd is willekeurig, tussen de 0 en Xmax seconden. Xmax kan je instellen bij `int waitValue = 300;`
Hierbij is 400 weer een minuut.
De delay `delay(150);` is de delay van de loop maar word ook meegenomen in je optrek/afrem snelheid.
Zet je deze lager dan zal de optrek/afrem snlheid versnellen.
Als je hem hoger zet dan zal de optrek/afrem snelheid vanzelfsprekend langzamer gaan.
Als je spanning op de schakeling zet zal de trein optrekken en vervolgens X aantal seconden rijden.
Hierna remt hij af en blijft hij een X aantal seconden stil staan waarna hij weer optrekt.
Extra:
Je zou hier natuurlijk ook nog een willekeurige rijtijd in kunnen programmeren.
Verander dan de volgende code:
// train pulls up
if (optrek == true) {
if (opcnt <= potValue) {
snelheid = opcnt;
}
if (opcnt = potValue) {
optrek = false;
drive = true;
opcnt = 0;
}
}
// train drives
if (drive == true) {
if (opcnt == driveValue) {
drive = false;
afrem = true;
opcnt = 0;
} else {
snelheid = potValue;
}
}
naar:
// train pulls up
if (optrek == true) {
if (opcnt = potValue) {
snelheid = opcnt;
}
if (opcnt = potValue) {
optrek = false;
drive = true;
drivemaxValue = random(0,driveValue);
opcnt = 0;
}
}
// train drives
if (drive == true) {
if (opcnt == drivemaxValue) {
drive = false;
afrem = true;
opcnt = 0;
} else {
snelheid = potValue;
}
}
Vergeet hierbij niet dat drivemaxValue declared moet worden.
Voeg dus toe boven `int driveValue = 500; //400 is 1 minuut,2000 is 5 minuten enz.`
int drivemaxValue = 0;
De sketch kunt U hier downloaden.
De sketch met willekeurige rijtijd kunt U hier downloaden.
Originele post op bliksemsnel.net maar verhuisd naar kalkhaar.nl
Veel plezier,
Marcel Kalkhaar