4 mei 2024

Kalkhaar's gids

Tutorials voor iedereen

Oponthoud schakeling

2 min gelezen

Deze 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

Geef een reactie

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.

Copyright © Alle rechten voorbehouden. | Newsphere door AF themes.