Voor vragen, commentaar, tips enz, mail me op ronald@ronaldwilmink.nl

4. Bezetmelding en blokken

Voor alle duidelijkheid: de volgende schema's zijn bedoeld voor analoge gelijkstroom banen.
Dus niet voor wisselstroom en digitaal.

Bezetmelding door stroomgebruik

Om een modelspoorbaan met een computer te kunnen besturen moet de computer weten waar zich op de baan treinen bevinden. Dat gebeurt met (blok)bezetmelders. Deze moeten betrouwbaar liefst goedkoop zijn.
Zoals eerder beschreven kun je de locomotief een signaal laten geven door gebruik van contactrails of reed relais.
Een andere manier is meten waar door een locomotief of een wagon met verlichting stroom wordt gebruikt. Dit is de manier die ik hier verderop zal uitleggen.

Compleet blok als bezetmelder

Een blok is een stuk spoorbaan zonder wissels met aan het eind een sein (of in elk geval een stuk rail dat stroomloos gemaakt kan worden zodat een trein daar stopt).
Heel blok is de bezetmelder In mijn eerste tests heb ik ervoor gekozen een compleet blok de bezetmelder te laten zijn. Verder reden in mijn tests alle treinen altijd één kant uit.
Voordeel:
- de computer weet na het starten van het besturingsprogramma waar zich de treinen bevinden.
Nadelen:
- Bij goederentreinen zonder verlichting is het vorige blok vrij zodra de locomotief het verlaten heeft, terwijl zich alle wagons zich nog in dat blok bevinden. Je moet dan met een timer werken. Bv 5 seconden nadat het blok vrij is is het pas echt vrij.
- Als een locomotief voor een rood sein staat gebruikt hij geen stroom. Om hem dan toch nog te kunnen detecteren moet er een klein hulp-spanninkje worden toegevoegd.
- Als een trein stil blijft staan door bv vieze rails is het blok waar hij zich bevindt volgens de computer ineens vrij, met aanrijdingen tot gevolg.
- Treinen kunnen alleen maar in één richting rijden.

In het schema hiernaast is de weerstand 1K, de diode een 1N4002, en de transistor een BC547.
Door een ingang van de MCP23017 aan de collector van de transistor te 'hangen' wordt die ingang naar 'laag' getrokken zodra er stroom van basis naar emitter loopt.
De hulpspanning, nodig om een voor het sein stil staande locomotief te kunnen detecteren heb ik hier niet ingetekend.
Doordat de min van de regeltrafo verbonden moet zijn met de min van de MCP23017 voeding, kun je alleen vooruit rijden.

Sensor bezetmelder

Een andere mogelijkheid is het gebruik van wat ik hier een sensor noem. Een kort stukje rail (bv één rechte rail) waarop stroomgebruik wordt gemeten. Zo'n sensor zit dan aan het eind van het blok, vlak voor het sein-stuk. Belangrijk is dat wanneer de locomotief de sensor bereikt de laatste wagon zich ook in het blok bevindt.
Het computerprogramma moet dan zo werken dat als een trein een blok gaat verlaten (sein op veilig) zowel dat blok als het volgende blok worden gezien als bezet.
Pas als de sensor bereikt is beschouwt de computer het zojuist verlaten blok als vrij.

sensor bezetmelder Voordelen:
- Geen timers nodig.
- Als een trein stil blijft staan gaat er niets mis.
- Geen hulpspanning nodig
Nadeel:
- Je moet de computer bij het opstarten laten weten waar zich treinen bevinden.

Dit bezetmelder schema heb ik gevonden op het forum van Beneluxspoor.
In het schema hier links is de weerstand 45 Ohm, de diodes zijn 1N4007, en de optocoupler is een PC844.
Aansluiting 1 komt van een ingang van de MCP23017.
Aansluiting 2 gaat naar de massa van de 5V voeding.
Doordat de stroomkringen van baan en RPi nu gescheiden zijn, de de bezetmelder in twee richtingen werkt, kan er ook achteruit worden gereden. Ik heb deze bezetmelder zelf nog niet getest, maar heb er wel vertrouwen in!

Bezetmelder testen

Sluit een draad aan van pin 1 van de MCP23017 (GPB0) naar de collector van de bezetmelder die je wilt testen.
Sluit een draad aan van de 5V massa naar de emitter van die bezetmelder.
Typ het volgende over in een leeg bestand en save het als bv test.py
Voer het programma uit door te typen: sudo python ./test.py
Het programma is weer te stoppen met Ctrl C of Ctrl X

import smbus
import time

bus = smbus.SMBus(1)

DEVICE = 0x20 # Device address first MCP23017
IODIRB = 0x01 # Pin direction B
GPIOB = 0x13 # Input register B
GPPUB = 0x0d # Pullup register B

# Init
bus.write_byte_data(DEVICE,IODIRB,0xff) # all pins GPB input
bus.write_byte_data(DEVICE,GPPUB,0xFF) # all pullups enabled

def LeesInput():
  mydata = bus.read_byte_data(DEVICE,GPIOB)
  return mydata

bCont = True

while bCont == True:
  invoer = LeesInput()
  if invoer & 0x01 == 0: # laag dus bezet
    Print "Bezet"
  else:
    Print "Vrij"

  time.sleep(0.2)

<<<<< vorige blz volgende blz>>>>>