dinsdag 24 oktober 2023

Automatisch rijden(6), Richting

De richting waarin een loc, trein gaat rijden. Lijkt eenvoudig, vooruit of achteruit. Maar een loc kan met zijn neus naar rechts staan of met zijn neus naar links. Met een baanplan in essentie een heen-en-weer nog steeds geen probleem, voor de start geef je de rijrichting en de stand van de loc op de rails aan.

Maar een baanplan met ovaal, rondgang of keerlus dan is een links/rechts aanduiding onvoldoende. Voor een rondgang kan dit nogwel, als we de richting niet links/rechts maar vanuit het midden bezien van het ovaal en dan denken als 'neus met de klok mee' of 'neus tegen de klok in'. Dit is zoals het in PenDelDCC is gedaan. 

Maar een keerlus dat gaat niet. Heeft de loc de keerlus gereden dan staat het op dezelfde rails in de zelfde rijrichting maar gekeerd op de rails en worden vervolg trajecten in de verkeerde richting gezocht.

De oplossing is gevonden in het bepalen van de trajecten, of routes. Een traject brengt de trein, loc van een beginmelder of station naar een doelmelder. Traject bestaat uit een rits railstukken aan elkaar, ieder railstuk in het traject heeft twee aansluitingen. Afhankelijk van de richting waarin dit traject wordt gereden, heeft een railstuk een aansluiting waar de trein erop komt en een aansluiting waar de trein het railstuk weer verlaat. Bepaald wordt de beginaansluiting van het hele traject en de eindeaansluiting. 

Van beide aansluitingen wordt bepaald of ze rechts of links ten opzichte van het centrum van het baanplan zitten. Zit een van de aansluitingen aan de ene kant en de andere aan de andere kant, dan wordt de stand van de loc door het rijden van dit traject niet gekeerd, zitten beide aansluitingen aan  dezelfde kant dan zal de loc na het rijden van dit traject gekeerd zijn.

Door dit mee te nemen in het bepalen van het volgende te rijden traject worden de juiste vervolgtraject gevonden in de goede rijrichting.

Mee eens, een ingewikkeld verhaal, inmiddels geïmplementeerd in WMapp en werkt perfect.

Een ander issue is het bepalen wanneer een trein het eindstation of doelmelder hoeft  bereikt.  Arduino project MelDers stuurt het bezet worden of weer vrij komen van een melder over de USB aan WMapp.

Periodiek testen we tijdens het rijden van het traject of de doel melder bezet is en is de loc op einde traject aangekomen. Maar...dat werkte niet goed, als de trein snel rijdt is de periode dat de melder actief is om meerdere redenen te kort. 

Oplossing is een lijst met melders. Als een route aan een loc wordt toegewezen dan wordt de doelmelder in deze lijst opgenomen. Wordt een melder actief, dan wordt gekeken of deze melder in de lijst voorkomt en als dat zo is dan wordt aangegeven dat deze bezet, actief is. Deze lijst wordt nu periodiek bekeken door het proces van het rijden van een loc op dit traject. ziet deze dat de melder bezet is, dus einde traject, onder nog veel meer wordt dan deze melder gewist uit deze lijst. Op deze manier onderbreekt het actief worden van de doelmelder het proces van rijden van een traject in plaats van dat af en toe wordt gekeken of de loc al in het doelstation is aangekomen. En dit werkt zonder fouten bij alle snelheden.

Wordt vervolgd....



donderdag 19 oktober 2023

Automatisch rijden(5), De eerste rit

 In deel 4 is bewezen dat het mogelijk is om met alleen het tekenen van een baanplan trajecten en routes te bepalen die een trein, locomotief kan rijden. Maar het is niet nodig alle mogelijke trajecten te bepalen voor het rijden. In het rijvenster van een loc kiezen we het station waar de loc staat. Een klik op het tekstvak 'station' toont een lijst met alle bezette melders die niet door een andere loc zijn bezet. Een klik in de lijst kiest het station waar de loc is. Ook kan de oriëntatie van de loc met een paar klikken worden ingesteld. Er zijn dan 4 mogelijkheden. Neus naar links of rechts en natuurlijk vooruit of achteruit rijdend. Deze instellingen zijn voorlopig even te bereiken met een knop die wisselt tussen 'auto' en 'stop'. Als auto dan kan de loc handmatig worden gereden, knop zet dan de loc naar automatisch  rijden. Dan toont de knop stop en werkt de knop als noodstop die het automatisch rijden en de loc direct stopt.  

Verder zie je in auto mode een knop die wisselt tussen rijden en wachten. Bij rijden start het de loc, bij wachten rijdt de loc door tot zijn doelstation en gaat dan niet meer verder. 

Dit zal er in latere versies heel anders uit gaan zien maar is nu nodig om de vele 'onder de motorkap functies' te kunnen programmeren. 

Dus huidige positie en richting waarin de loc gaat rijden gekozen en een druk op rijden en het automatische proces wordt gestart. 

In gewone mensentaal neergeschreven gaat dan het volgende gebeuren.

  • Alle mogelijke trajecten naar een ander station (melder)  worden bepaald in deze richting waarin de loc gaat bewegen. Deze worden in een lijst gezet met een volledige beschrijving van dit traject. Wissels en de stand van de wissel alsmede eventuele blokkades, denk dan aan een vaste gelijkvloerse kruising,  worden in deze beschrijving vermeld. Deze beschrijving heeft een opmaak die later weer door het programma kan worden gelezen. Het aantal gevonden trajecten is onbeperkt. Als voorbeeld een schaduwstation met 10 sporen. Vanuit de baan naar het schaduwstation zijn er dan minstens  10 verschillende trajecten mogelijk naar de 10 verschillende opstelsporen.
  • De lijst met mogelijke trajecten wordt nu doorzocht of er trajecten zijn waarin elementen zitten die bezet zijn door een andere loc. Wissels, blokkades of de stations. Deze 'bezette' trajecten worden uit de lijst verwijderd.
  • Uit de resterende trajecten wordt nu willekeurig eentje uitgezocht en daarvan wordt weer een traject gemaakt in een andere lijst met trajecten die deze specifieke loc achter elkaar gaat rijden.
  • Maar soms zijn er geen trajecten te vinden in deze richting. Denk daarbij aan een opstelspoor  of kopstation. Dan wordt de rijrichting omgezet. Daarna begint het proces opnieuw nu in de tegengestelde richting. Worden ook in deze richting geen trajecten gevonden, wat eigenlijk niet kan want hoe is die trein daar dan gekomen, dan wordt het automatisch rijden gestopt.
  • Er is dus een traject bepaald, trajectbeschrijving wordt uitgelezen, het doelstation waar de loc naar toe gaat. De wissels worden 1 voor 1 met tussenpozen ingesteld. Verder worden de opgenomen wissels, blokkades en het doelstation opgenomen in lijsten van respectievelijk bezette wissels bezette melders, en bezette blokkades. Het beginstation was al bezet gezet bij het kiezen waar de loc staat.
  • Nu wordt de snelheid van de loc ingesteld en gaat de loc rijden. Vertragen  en versnellen en afstands en snelheidsmetingen daar doen we nu nog niet aan dat is voor later.
  • De loc rijdt. Gekeken wordt naar mogelijke vrije trajecten bezien vanuit het doelstation en natuurlijk de huidige richting. Hetzelfde proces als hierboven al beschreven. Is er succesvol een 'vervolgtraject' bepaald dan wordt deze in de lijst van te rijden trajecten door deze loc gezet. We kunnen zo meerdere vervolg routes of trajecten  vastleggen maar voorlopig houden we het even bij 2. Het traject wat wordt gereden en het traject wat daaropvolgend wordt gereden. 
  • Loc bereikt het doelstation. Het gereden traject gaat uit de lijst, het vervolg traject is nu het huidige traject, doelstation wordt ingesteld, loc rijdt gewoon door. Een heel circus van bezet stellen en vrijgeven van melders, blokkades en wissels volgt waar ik nu even niet op inga. Is er geen vervolg traject gevonden, zoals bij alles bezet of een kopstation, opstelspoor dan stopt de loc. 
  • Loc rijdt dus altijd door van een opstelspoor naar een ander opstel spoor. Daar wordt gekeerd en loc rijdt de andere richting op.
Dat werkt dus nu. Het te downloaden versie heeft dit nog niet. Er zijn nog veel te veel andere issues die nog moeten worden toegevoegd voordat het automatisch rijden in de praktijk kan worden gebruikt.

Wordt vervolgd.....

zaterdag 30 september 2023

Automatisch rijden(4), richting

 In deel 3 ging het over het analyseren van de baan. Dat kan dus. Automatisch vanuit een melder kan worden bepaald hoe de verbindingen zijn naar andere melders. In het baanontwerp is dat een vast gegeven, een railstuk heeft dan altijd een aansluiting waar de trein het railstuk binnenkomt en een aansluiting, of meerdere aansluitingen bij wissels ofzo, waar de trein het railstuk weer verlaat. Dat is in een links en rechts oriëntatie vast te leggen, of zoals werkelijk bij het baanplan van WMapp in een aansluitnummer van 1 totenmet 8. Waarbij het lagere nummer altijd het ingaande en het hogere nummer het uitgaande aansluitpunt is. Ja, beste lezer, nu wordt het ingewikkeld.

Maar wel vast dus. Maar nu die trein, die is gezien de richting niet vast, hij kan vooruit of achteruit rijden en hij kan met zijn neus naar links of naar rechts staan. Verschillende rijrichting dus afhankelijk van deze twee parameters. Ach bij een heen- en weer baanplan redelijk constant, trein staat altijd met zijn neus dezelfde kant op, maar is er een ovaal of rondje of keerlus? Of draaischijf? Dan wisselt deze stand. 

Stand en richting kunnen bij start van het automatisch rijden worden ingegeven in WMapp maar zijn daarna dynamisch en worden in het automatisch rijden proces aanpast. Trein kan keren in een opstelspoor, of wanneer de treinen elkaar hebben vastgezet, deadlock is daar een goed veel gebruikt Nederlands woord voor. 

Bij draaischijven en keerlussen kan de stand van de loc veranderen. 

Daar ben ik dus nu best wel even een paar dagen mee aan het stoeien geweest en denk daar de oplossing voor gevonden te hebben. 

Wordt vervolgt....

vrijdag 15 september 2023

Automatisch rijden (3); Trajecten

Een belangrijk verschil in WMapp met andere trein programma's  of centrales is dat de trajecten en mogelijke routes die een trein kan rijden, niet handmatig hoeven te worden ingegeven maar dat ze automatisch aan de hand van het getekende baanplan worden berekend. 

Zeker was dit even avontuur om goed werkend te krijgen, maar is uitgebreidt getest en werkt feilloos. Nog niet opgenomen in de huidige versie zoals te downloaden, omdat je er in dit stadium als gebruiker nog niks aan hebt. Als maker van WMapp zie ik dit zeker als het bereiken van een belangrijke mijlpaal in de ontwikkeling van het programma.

Een traject in WMapp is de railverbinding tussen twee melders. Een begin melder, waar komt de trein vandaan, en een eindmelder, waar moet de trein naartoe. De melder zelf is een of andere vorm van sensor of schakelaar die actief wordt als er een trein op de plek van de melder is. Bij het automatisch rijden wordt een trein waarvan de positie bekend is, dus het programma weet bij welke melder het staat, gestuurd op een traject waarvan de begin melder overeenkomt met de bekende positie van de trein. Het programma weet dan, wanneer de eind melder van dit traject actief wordt, de nieuwe positie van deze trein. 

Als voorbeeld, in het programma koploper zijn er meerdere schermen waarmee het baanplan kan worden getekend, een ander waarmee blokken in het baanplan kunnen worden gezet en aan de blokken kunnen meerdere melders worden aangewezen. 

In WMapp werkt het anders. In baanontwerp teken je het baanplan met railstukken. Recht, bocht, linkse of rechtse wissel en gelijkvloerse vaste kruising. Aan een recht of bocht railstuk kun je dan een melder toevoegen. Vanzelfsprekend moet de melder ook op de modelbaan op deze plek zitten.

Na het laden van een baanplan, baanplannen kunnen een naam krijgen en kunnen worden opgeslagen in je computer, gaat WMapp het baanplan onderzoeken. Hierbij wordt onder veel meer alle mogelijke trajecten bepaald.

In een traject kunnen een onbeperkt aantal railstukken worden opgenomen. Ook wissels en de stand van deze wissels om het traject te kunnen rijden. Wil WMapp een traject laten berijden, moet het traject vrij zijn. Gekeken wordt of er wissels zijn opgenomen in het beoogde traject die ook zijn opgenomen in andere trajecten die al, door een andere trein, worden bereden. Zo een traject kan dan niet gekozen worden. Een kruising in een traject wordt opgenomen als een blokkade met hetzelfde doel. 

Dit wordt automatisch door WMapp gedaan. Als gebruiker hoef je alleen maar de modelbaan te tekenen. 

Echt uniek in WMapp is de mogelijkheid om in het baanplan ongelijkvloerse kruisingen op te nemen. Een spoor wat over een ander spoor gaat of er onderdoor. Dit is iets anders dan de 'lagen' die je vaak vindt in andere trein programma's of centrales. In WMapp kun je behalve het 'actieve' railstuk ook een railstuk als brug, dus over het actieve railstuk, en een railstuk als tunnel, onder het actieve railstuk, opnemen. Wissels en al het andere waar je op moet kunnen klikken kunnen alleen in het actieve rail worden geplaatst. En voor het plaatsen van een brug of tunnel railstuk moet er ook een actief railstuk in dat vakje zijn. Een brug is altijd een railstuk over een actief railstuk, of een tunnel er onder door.

Dit geeft unieke  mogelijkheden. Zeker kan een baanplan veel realistischer worden getekend zonder de cryptische verwijzingen naar andere lagen. Maar ook het schaduwstation kan in het zelfde baanplan direct worden getekend en verbonden. 

Wordt vervolgt....

maandag 4 september 2023

Melders(2) IRrail Infrarood detectie voor K-rail.

Sensoren, (terug)melders kunnen op meerdere manieren worden gemaakt. Traditioneel kennen we de 'massadetectie' en 'stroomdetectie'. Bij beide methoden moet er van een stukje spoor  1 railstaaf  worden geïsoleerd. Bij massadetectie kan dan dit geïsoleerde deel vaak direct op een detector, een S88 module, worden aangesloten. Bij stroomdetectie is nog wat techniek nodig welke meet of er op het geïsoleerde deel stroom wordt gebruikt. Is dat zo dan wordt de melder actief.

Maar bij beide moet de rails uit de baan worden genomen en geprepareerd. Voor een baan in aanbouw zeker geen probleem, maar een bestaande baan met misschien al scenery is dit zonder sloopwerkzaamheden niet te doen. Ook bij voortschrijdend inzicht, de geplaatste melder zit op de verkeerde plek, of we zijn er een  vergeten is dit een probleem. 

Een melder die bij een bestaande baan zonder slopen kan worden ingezet is dan nodig. Twee methoden zijn populair. Met magnetisme, reedcontacten of HALLsensoren. En de tweede methode is met infrarood licht. 

Er zijn nog meer mogelijkheden, maar daar ga ik nu verder even niet op door.

Beide hebben voor en nadelen. Op de Houten beurs heb ik hall sensoren en IRreflectie sensoren in verschillende uitvoeringen bij me. 

De micro-reflectie sensor heb ik zo gemaakt dat deze tot wel 2cm voorbij rijdende treinen kan detecteren.  Maakt deze sensor wel erg gevoelig voor zonlicht.

Recentelijk heb ik een nog kleinere ir- reflectiesensor gemaakt. Slechts 4x14mm. Deze past tussen de bielzen van K-rails. En misschien ook wel andere railsystemen, dat heb ik nog niet uitgeprobeerd. 

Deze sensor heb ik maximaal ongevoelig gemaakt voor direct daglicht, heeft ook maar een beperkt bereik. Maar de sensor zit in het midden van de rails, waar de reflecterende, stroomafnemer van de locomotief op ongeveer 1mm afstand van de sensor overheen komt.  

De afstand tussen de bovenkant van de sensor en de bovenkant van de 'pukkel'  van de K-rails is ongeveer 1mm. En de sleper, stroomafnemer, onder loc is blank metaal wat heel goed reflecteert. De sleper is ook relatief lang zodat een over de melder rijdende  trein de melder lang bezet houdt. In vergelijking met een naast de baan geplaatse IR sensor of HALLsensor.  Het resultaat een zeer betrouwbare melding.

Wagens hebben doorgaans geen sleper. Door op de onderkant van de wagen een klein, niet zichtbaar, spiegeltje te plakken, kunnen ook deze de melder activeren.

vrijdag 25 augustus 2023

Automatisch rijden(2)

 Automatisch rijden gaat een hele serie worden, daar is toch wel heel veel over te overdenken en schrijven. Dit is dus deel 2. 

Deel 1 leert dat met het tekenen van een modelbaan in het baanontwerp en het opgeven van 1 werkelijke afstand tussen twee melders alle andere waardes te berekenen moeten zijn, en dus automatisch rijden mogelijk is. 

Beginnen met definities van wat begrippen:

  • Traject, dit is een stuk baan, rails, tussen twee melders. Een traject heeft dus een 'meldervan', waarvan  een trein komt en een 'meldernaar', waar die trein naar opweg is. Een traject heeft een onbeperkt aantal railstukken, rechte en kromme rails, wissels en kruisingen. Maar alleen het eerste en het laatste railstuk heeft een melder. Hoe de in het traject opgenomen wissels (draaischijf, lift of rolbrug) moeten staan wordt ook in de beschrijving van een traject opgenomen.
  • RailBlok, expres noem ik het geen blok omdat dan de vergelijking met blokken in andere modelspoor programma's  verwarrend wordt, een railblok bestaat uit aaneengesloten trajecten die allemaal geen wissels of andere railsplitsingen hebben. Een stuk baan met 1 of meerdere melders. Een opstelspoor van wissel naar een stootblok met 1 melder halverwege is dan dus een railblok maar geen traject. Heeft dat opstelspoor twee of meer melders dan is het een railblok met meerdere trajecten. Een parade spoor, lang stuk spoor waar treinen zich van hun beste kant kunnen laten zien, is een railblok en kan uit meerdere trajecten bestaan. Op een railblok kunnen meerdere treinen rijden mits deze wel allemaal dezelfde richting opgaan. Er zijn nog veel meer factoren die hierbij een rol spelen maar dat komt later aan de orde.
  • Route, is wat een trein gaat rijden. Van de ene plek naar de andere plek. Wordt samengesteld uit railblokken en trajecten. Routes kunnen automatisch worden gekozen, maar er komt ook een optie dat je voor bepaalde treinen specifiek routes kan opgeven. De railstukken met melders kun je in het baanontwerp een naam geven zodat ook handmatig routes kunnen worden aangemaakt als: " rij van inhetdorpstation naar opdebergstation".
Na het starten van WMapp, het laden van een andere baanplan of aanpassen daarvan, moet het baanplan worden geanalyseerd. Trajecten en railblokken moeten worden bepaald. Tijdens het automatisch rijden worden enorme hoeveelheden gegevens als locsnelheden, lengtes van trajecten en nog veel meer bepaald. Bij het afsluiten van WMapp  wordt dat automatisch opgeslagen voor de volgende sessie. Het kan meerdere sessies duren voordat alle waardes zijn bepaald. Maar uiteindelijk weet WMapp alles van je locs en het banenplan wat er maar te weten valt. 

Analyse van het baanontwerp begint met het maken van een lijst van alle melders in het ontwerp.  Alle melders in de lijst worden een voor een bekeken.
Een melder kan alleen geplaatst worden op een recht railstuk of een bocht. Een railstuk kan in 8 richtingen worden gedraaid en heeft twee aansluitingen naar andere railstukken. De mogelijke aansluitingen worden genummerd 1 tm 8. De 'vanaansluiting', waar het traject begint, wordt bepaald, de 'naaraansluiting' wordt bepaald en gebruikt voor het vinden van het aansluitende railstuk. Van het gevonden aansluitende railstuk wordt de naaraansluiting bepaald welke op zijn beurt weer wordt gebruikt voor het vinden van het volgende aansluitende railstuk enzo door. Telkens wordt gekeken of het aansluitende railstuk een melder heeft. Is dat zo dan is het traject gevonden en wordt opgeslagen in de lijst met trajecten, en gaan we verder met de volgende melder in de lijst melders. 
Bovenstaande is al gerealiseerd en werkt foutloos. Maar alleen voor trajecten die alleen uit rechte en gebogen rails bestaan. 
Wordt als aansluitend railstuk een wissel, of ander 'railsplitsend' railstuk als draaischijf of rolbrug gevonden, dan wordt voor iedere mogelijke splitsing in een lijst opgeslagen het nummer van de melder waarvan we nu de trajecten aan het bepalen zijn,  de positie van dit gevonden railstuk,  de aansluiting waar dit railstuk begint en de stand van de splitsing. Bij een wissel is dat dan rechtdoor of afslaand, dus 2 splitsingen komen bij een wissel in de lijst, bij een draaischijf kunnen het er wel 30 zijn. De melder waarvan we nu het traject aan het bepalen zijn heeft dus meerdere trajecten. De volgende melder wordt bekeken.
Zijn alle melders bekeken dan komen de splitsingen in de gemaakte 'splitsingen' lijst aan de beurt. Van iedere railsuk met een splitsing worden de beide aansluitingen bepaald, de stand van de wissel is hiervoor al vastgelegd in de splitsing. Met de naaraansluiting wordt weer het aangrenzende railstuk bepaald en de zoektocht naar een melder en daarmee het complementeren van een traject gaat verder. Wissels in een wisselstraat geven weer nieuwe afsplitsingen in de lijst.
Het zoeken naar trajecten gaat altijd in een richting vanuit een melder, de trajecten kunnen straks wel in twee richtingen worden gereden. 

Morgen weer een Houten- beurs...wordt vervolgt.

donderdag 17 augustus 2023

Automatisch rijden

 WMapp is nu zover dat treinen en accessoires handmatig kunnen worden bedient. Maar hoe gaan we dit automatisch, vanzelf laten gebeuren. Er  bestaan al veel programma's die dit kunnen dus keuze genoeg, zou je denken. WMapp werkt uitsluitend met PendelDCC of een nog (door jezelf) te ontwikkelen USB>DCC interface. En alle bestaande trein programma's hebben vele opties voor verbinden met bestaande meestal commerciële centrales, maar zeker niet met PendelDCC.  

Koploper heb ik zelf jaren mee gewerkt. Voor de duidelijkheid, ik vind het een fantastisch programma met haast oneindige mogelijkheden. Een enorme prestatie van de maker waar heel veel modelspoorders heel veel plezier van hebben. In dit blog zal ik af en toe vergelijkingen aanhalen met koploper, nooit heb ik daarmee de bedoeling te zeggen dat mijn oplossingen beter zijn dan die in koploper (of andere programma's),  alleen dat ze anders zijn. 

In WMapp teken je een baanplan. Bestaat uit vierkante vakjes met een railstuk of iets anders. Rechte of kromme rail, kruising en linkse of rechtse wissel zijn als railstuk momenteel mogelijk. Een recht of krom railstuk kan een melder krijgen. Een vakje met een recht of krom railstuk heeft dus 2 aansluitingen, een wissel 3 en een ( vaste) kruising 4. De inhoud van het vakje kan in stappen van 45graden worden gedraaid. Ieder vakje heeft dan 8 aansluitplekken. De grenzende vakjes met railstukken komen met de aansluitplekken tegen elkaar. Een algoritme kan met deze informatie de routes berekenen tussen de railstukken met melders. De daarvoor nodige wissel stand wordt hierbij meegenomen. 

Om de werkelijke snelheden van locs te bepalen, nodig voor het optrekken en afremmen, is het voldoende om van 1 route tussen twee melders de werkelijk afstand tussen de melders op te geven. 

Alleen het tekenen van het baanplan en opgeven van 1 afstand is vanuit de logica geredeneerd voldoende om automatisch rijden mogelijk te maken. 

Wel kan het even duren voordat van alle locs alle 28 snelheidsstappen zijn gemeten. En aan de hand daarvan alle andere afstanden tussen de melders dus zullen deze waardes tussen de afzonderlijke rijsessies moeten worden opgeslagen. 




Een nieuw project: DCCdeKoder

 Echt actief ben ik met het blog niet echt. Al een tijd speel ik met het idee om een DCC decoder te maken voor vele toepassingen die de trad...