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.....

SchakelBord

Tijdje niet gepost. Werk aan WMapp staat even stil omdat ik aan andere projecten momenteel werk. Een robot schip, werknaam RoBoot waarmee st...