treindetectie voor de blokdetectie

Treindetectie is essentieel voor de blokdetectie. De treinen (als er met meerdere tegelijk wordt gereden) moeten worden gedetecteerd omdat anders onbekend is waar ze zich bevinden.

Er is een uitgebreide uitleg te vinden op de pagina van NProject.org. Ik ga dit hier niet behandelen omdat dat nu teveel is en dit bericht voorbij schiet.

Ik ga me in dit bericht richten hoe ik de treinen ga detecteren.

Om te beginnen heb ik na zitten denken hoe ik dit het makkelijkste zou kunnen doen. Eén van de eisen is, dat de treinbaan wordt gestuurd door een Arduino (Mega). Ik wil dit doen, omdat ik hiermee toch een stevige microcontroller heb en deze kan koppelen aan een PC waar ik de gevens / besturing mee ga doen. Ook wil ik geen gebruik maken van aanpassingen die ik moet doen aan treinen / wagons en dergelijke. Hierdoor heb ik gekozen voor LDR’s. Dat zijn lichtgevoelige sensoren. Enkele weerstanden van 10k zijn ook nog nodig.

Een Arduino dus. Deze heeft een x aantal poorten, zowel digitaal als analoog. Hier wil ik gebruik van gaan maken. Alleen loop ik tegen het probleem aan, dat ik te weinig poorten heb om alle blokken (die ik nog moet uitzoeken) te kunnen meten.

Ik heb gekozen om gebruik te maken van de CD74HC4067. Dit is een analoge multiplexer waarop 16 analoge in/uitgangen kunnen worden aangesloten

Doordat de Arduino Uno al 6 analoge poorten heeft kan ik 6 x 16 (=96) analoge signalen hanteren. Dit moet voor het eerst wel voldoende zijn 🙂

Andere dingen die ik nodig heb zijn dus weerstanden van 10k en de LDR’s.

De kosten zijn eigenlijk verwaarloosbaar. 100 LDR’s voor $4,99 op ebay en 100 weerstanden van 10k voor $0,99 op ebay.com.

De multiplexer is het duurste. De versie hierboven kost $ 1,72 op dit moment van schrijven.

Dus uitgerekend voor 1 sensor heb ik de kosten van 1,72/16 = 10 cent + 5 cent voor de LDR + 1 cent voor de weerstand. Ik kom dus op 16 cent uit voor 1 sensor 🙂

Okee om te beginnen heb ik gebruik gemaakt van het volgende schema om het aan te sluiten op de Arduino

Er staat hier een waarde van R1 voor 100k, maar ik gebruik 10k. Dit geeft mij een makkelijker te monitoren waarde

Als dit is aangesloten op de Arduino, is er nog wat programmering nodig.

//Mux control pins
int s0 = 8;
int s1 = 9;
int s2 = 10;
int s3 = 11;

//Mux in “SIG” pin
int SIG_pin = 0;

void setup(){
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);

digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);

Serial.begin(9600);
}

void loop(){

//Loop through and read all 16 values
//Reports back Value at channel 6 is: 346
for(int i = 1; i < 16; i ++){
Serial.print(“Value at channel “);
if (i<10)
{
Serial.print(“0″);
Serial.print(i);
}
else
Serial.print(i);
Serial.print(” is : “);

//only check port 14 and 15
if ((i==15) ||(i==14))
{
Serial.print(readMux(i));

if ((readMux(i))>800)
Serial.println (“\tVrij spoor”);
else
Serial.println (“\tBezet melding”);
}
else
Serial.println(“”);
delay(100);
}

}

int readMux(int channel){
int controlPin[] = {s0, s1, s2, s3};

int muxChannel[16][4]={
{0,0,0,0}, //channel 0
{1,0,0,0}, //channel 1
{0,1,0,0}, //channel 2
{1,1,0,0}, //channel 3
{0,0,1,0}, //channel 4
{1,0,1,0}, //channel 5
{0,1,1,0}, //channel 6
{1,1,1,0}, //channel 7
{0,0,0,1}, //channel 8
{1,0,0,1}, //channel 9
{0,1,0,1}, //channel 10
{1,1,0,1}, //channel 11
{0,0,1,1}, //channel 12
{1,0,1,1}, //channel 13
{0,1,1,1}, //channel 14
{1,1,1,1}  //channel 15
};

//loop through the 4 sig
for(int i = 0; i < 4; i ++){
digitalWrite(controlPin[i], muxChannel[channel][i]);
}

//read the value at the SIG pin
int val = analogRead(SIG_pin);

//return the value
return val;
}

Op dit moment gebruik ik dit programmatje wat ik dan in de Arduino plaats en zo lees ik de waarden van de sensoren uit.

Hieronder een video van wat er gebeurt.

Geef een reactie