Det er efterhånden nogen år siden, jeg sidst havde gang i jernbanedriften. Så hukommelsen skal genopfriskes på et par punkter:
- Hvordan er det smartest at dele sin bane op i blokke?
- Hvordan var mit layout repræsenteret på skærmen, når jeg havde JMRI til at styre jernbanedriften?
- Hvordan var det nu lige, at jeg havde sat mit JMRI udviklingsmiljø op? For jeg må hellere få det sat op igen. Det nytter ikke blot at installere JMRI. Der går ikke længe, før jeg får brug for at debugge eller at ændre og tilføje i Java koden.
Ovennævnte oplysninger er borte i den forstand, at jeg er gået fra Linux og over til Windows. Og jeg har ikke gemt screenshots af det, og har tilsyneladende ikke beskrevet det på disse sider.
Jeg genopfrisker hukommelsen ved at læse i JMRI dokumentationen og mine egne noter. Et par relevante links: https://www.jmri.org/help/en/html/doc/Technical/index.shtml og http://www.rr-cirkits.com/Clinics/Cleveland%202014/Control%20Panel%20Editor.pdf og http://www.rr-cirkits.com/Clinics/Cleveland%202014/Automatic%20Train%20Control%20using%20Warrants.pdf og https://lisby.dk/wordpress/?page_id=135 og https://lisby.dk/wordpress/?page_id=2424
Og så er der jo lige noget nyt, der også skal findes ud af, eksempelvis hvordan jeg bedst får inkluderet elevatoren i JMRI setup, warrant definitioner og mit Jython script til afvikling af warrants.
Udviklingsmiljøet baserer jeg på NetBeans. Det anbefaler JMRI. Og det gjorde jeg også “i gamle dage” Det har jeg noteret i en bisætning på disse sider.
Og jeg har en kopi af den XML fil, hvori mit gamle layout var defineret. Den kan jeg loade ind i JMRI, når jeg får det op at køre igen, så jeg kan se præcist, hvordan det var sat op i JMRI.
21/1-2025: OpenJDK 17 (se https://www.jmri.org/java/) og NetBeans 24 (se https://www.jmri.org/help/en/html/doc/Technical/NetBeans.shtml#installation) installeret. Nyeste JMRI klonet fra GitHub og bygget. PanelPro startet op og den gamle XML fil indlæst. Alt sammen for at producere det savnede screenshot:

De tre etager med OBlocks, signal masts og sporskifter siger lidt sig selv. De hvide OBlocks betyder, at de er frie. De grønne er allokeret af en warrant. Og havde der været et fysisk layout forbundet, så ville der også have været nogen røde (så vidt jeg husker) OBlocks, der hvor en sensor er aktiveret, fordi et lokomotiv trækker strøm fra skinnerne.
Nederst til venstre er der tre elementer for hvert tog (se https://lisby.dk/wordpress/?page_id=2424 for en definition af, hvad et tog er): En knap (implementeret som en intern sensor i JMRI) til at starte og stoppe toget og to tekst felter (variable i JMRI), der viser hhv. status og position for toget.
24/1: JMRI interfacet til elevatoren fungerer nu. Se https://github.com/kjlisby/train_elevator/tree/main/serial_elevator/JMRI.
Men det vides endnu ikke, om mit script til afvikling af warrants fungerer sammen med elevatoren. Det kræver meget mere fysisk bane med sensorer / blokke, DCC styrede sporskifter osv. at teste det.
25/1: Jeg begyndte dagen med at få samme information, som står på det fysiske display på elevatoren, frem på Control Panel’et via ovennævnte JMRI elevator-interface og dets JMRI variable. Og det endda med sort baggrund og store blå tal, ligesom på elevatoren selv.
Derudover brugte jeg lang tid på at mosle med skinnetilslutningen på højre side af de lige etager. Den sad en halv millimeter skævt, så de skinneender, der ligger løst inde i elevatoren, ikke kunne passere igennem. Hvilket lød meget grimt.
Som en del af det ændrede jeg lidt på kalibreringen af elevatorens højre side for etagerne 2, 4 og 6. Og det gjorde jeg inde fra JMRI’s scripting vinduer, idet jeg havde ovennævnte JMRI/elevator interface kørende, hvorfor jeg f.eks. kunne køre en kommando som:
ElevatorSingleton.sendCmd(“set levelfromcalibration 6 7000 7000”)
Jeg sluttede dagen med at sætte midtertråden på skinnen til etage 5. Endnu ikke loddet.
26/1: Så er der skinner på alle etager i forreste elevatorstol. Tre med og tre uden midterleder og tilslutning:

27/1: Midtertråd sat på skinnen til etage 7. Uden lodning. Og nu har jeg vist nok “knækket koden”: Fra hver ende skal tråden gennem de to første huller og vikles rundt om svellen ved tredje hul. Resten af vejen er det lutter små stykker fra et hul til det næste. Derved kan tråden gøres nogenlunde glat, samtidig med at bunden af skinnen er flad i begge ender.

28/1: Så er der skinner på etage 7. Næste problem er, at overgangen mellem elevator og omgivelser i højre side ikke rigtigt fungerer. Skinneenderne inde i og udenfor elevatoren støder sammen. Jeg skal nok have justeret det lidt. Og så skal jeg have tilsluttet og testet IR sensorerne, før jeg kommer alt for meget længere. Desuden skal jeg have checket (udskiftet) højre end-stop switch. Kalibreringen går nogen gange helt galt i højre side. Og jeg har set den være aktiv (ved en “get position” kommando) på et tidspunkt, hvor den slet ikke burde være det.
29/1: Jeg havde kun 1/2 time. Jeg fik løsnet skruerne, som holder den fejlende switch, en smule. Så må vi se, om det gør en forskel. Jeg klippede “vingerne”, der skal fungere som guide, af skinneenden på den ene hylde. Men det gjorde ingen forskel. Og jeg forsøgte at justere enden udenfor. Men den var allerede rykket så langt ud, som den kan komme. Jeg printer en ny ende udenfor elevatoren, som er 1/2 mm kortere, og som har mindre kugler til at guide. Jeg tror ikke, at guiden er nødvendig. Det ser ikke ud til, at centreringen er et problem, der hvor jeg klippede guiden helt væk.
31/1: To problemer løst og et problem delvis løst: Defekt end-stop switch i højre side, skinneenden i venstre side af især etage 9 samt meget støj fra stepper motorerne.
Jeg skiftede end-stop switchen. Det hjalp ikke. Det viste sig, at intern pullup på GPIO 19 ikke fungerer på ESP32. Der står ikke noget om det i den dokumentation, jeg kan finde. Men en googling afslørede, at andre har konstateret noget lignende. Jeg brugte meget tid på at forsøge at løse det i software. Men uden held. Mit endelige forsøg var disse linier:
#include <ESP.h>
gpio_pulldown_dis(GPIO_NUM_19);
gpio_pullup_en(GPIO_NUM_19);
gpio_set_pull_mode(GPIO_NUM_19, GPIO_PULLUP_ONLY);
Så jeg proppede en 4,7 kohm modstand på mellem 3,3 volt i kabelforbindelsen til den ene IR modtager og kabelforbindelsen til end-stop switchen. Og problemet forsvandt. Spændingen steg fra 2 til 2,7 volt. Jeg får i øvrigt brug for at gøre noget lignende for at skaffe 3,3 volt til de nye stepper motor drivere, som jeg lige har bestilt (se det følgende). Begge dele burde selvfølgelig gøres på elektronik printet. Og hvis jeg startede forfra på det, ville jeg nok bruge alle SPI pindene som netop det, så jeg kunne få SPI kommunikation til de nye drivere. Men jeg vil meget nødig starte forfra.
Jeg tror, at problemet skyldes, at GPIO 19 pr. default er MISO (dvs. data input) benet i default SPI interfacet. Måske ville det hjælpe, hvis jeg kunne finde ud af at omkonfigurere det. Men mon ikke hardware pullup er mere stabilt i længden?
Skinneenden i venstre side på etage 9 var helt gal. Den knækkede ganske enkelt. Jeg lavede nye ender både udenfor elevatoren og inde i etage 9. Faktisk hele tre forsøg på den indvendige, før det fungerede.
Og så er der støjen. Jeg brugte det meste af aftenen i går på at læse om støj fra steppermotorer og hvordan man måske kan løse det. Og det lader til at løsningen ligger i driverne. Mine TB6600 drivere får høvl i alle mulige tests på YouTube m.v. Bl.a. fordi de driver stepperne med noget der ligner en firkant-kurve. Dvs., at stepperne kører i hak. Det hjælper at køre med microsteps. Jeg har konfigureret til 8 microsteps, og det gør en ret stor forskel.
Det hjælper sandsynligvis også at sætte hastigheden op. Men det vil jeg helst ikke. Der skal ikke kastes rundt med mine tog.
Den del af homingen, hvor mit software leder efter det præcise sted, hvor end-stop switchene ikke længere er aktiveret, foregik ved at køre 20 steps (dvs. 1/10 omdrejning) af gangen. Fordi jeg har en teori om, at det derved foregår så passende langsomt, at jeg når at stoppe ved præcis samme step hver gang. Men det larmede. Så derfor satte jeg det op til 500 steps eller 2,5 omdrejning og satte til gengæld farten ned. I første omgang alt for meget, hvilket fik det til at lyde som et maskingevær, fordi hvert eneste step betød start og stop af motorerne. Men efter kun at have halveret hastigheden, samtidig med at de 8 microstep er indført, lyder det faktisk helt tåleligt.
Men skal det være rigtig godt, skal jeg ifølge ovennævnte tests skifte driverne ud med nogen fra Trinamic. De er nemlig i stand til at interpolere helt op til 1024 microsteps, hvilket får firkanten ændret til en næsten perfekt sinuskurve. Og ydermere har de nogen patenterede modes: “Based on TRINAMICs sophisticated SpreadCycle and StealthChop choppers, the driver ensures absolutely noiseless operation combined with maximum efficiency and best motor torque.” Det lyder jo godt. Så jeg har bestilt et par stykker:

Controlleren er ikke super kostbar. Men den har en masse funktionalitet, hvor man skal bruge det serielle interface (SPI) for at konfigurere detaljerne. Men jeg har tænkt mig at bruge den uden SPI, og derfor nøjes med et subset af, hvad den kan. Hvilket bl.a. er at tilpasse sig nogen karakteristika af motoren samt ovennævnte lave støjniveau.
2/2: Stik til end-stop switche og IR sensorer loddet på. Inklusive ovennævnte pullup modtand og 3,3 volt forsyning til de nye stepper drivere. Indtil videre har switchene været forbundet vha. kronemuffer og IR sensorerne slet ikke forbundet.

Dagens software ændring: Jeg havde lavet det sådan, at hvis en IR sensor melder optaget, ville en kommando om at starte bevægelse til en ny etage blive afvist. Den betingelse har jeg fjernet. For den er ikke nødvendig. Motorerne vil alligevel ikke køre, før alle fire IR sensorer melder klart spor. Desuden viser jeg nu et “B” i displayet, sålænge der er et spor blokeret.
Da jeg til sidst ville teste det hele, fik jeg et chok. Elevatoren trak sig skæv med det samme. Heldigvis har stepperne mistet en del moment efter at jeg indførte de 8 microsteps. Så motorerne “kammede over” uden at ødelægge noget.
Efter en del debugning med min “move” kommando fandt jeg ud af, at venstre side kunne køre både op og ned på kommando, mens højresiden kørte op, uanset om jeg kommanderede op eller ned. Og hvad var der sket? Jeg havde såmænd fået revet DIR ledningen ud af en kronemuffe.
8/2: Skinne monteret på etage 9.
9/2: Sidste skinne (etage 11) i forreste elevatorstol installeret. Teknikken til at montere midtertråden er:
Slib den kant af hullerne i svellerne, der vender ind mod midten af skinnen.
Monter dernæst i hver ende et stykke tråd, der først gøres fast i den 3D-printede skinne-ende med et lille stykke gaffatape, dernæst ned gennem de første to huller og op over svellen lige efter hullet, og sluttelig ned gennem det tredje hul, hvor enden bøjes hen under næste svelle.
Monter dernæst korte stykker tråd fra hul til hul. Lav et hak, der passer ned i næste hul og bøj den rundt om svellen, hvor forrige trådstykke går ned i hullet. Trådens længde passer, når den går fra svellen før det ene hul til anden svelle efter det næste hul.
Alle “samlinger” loddes på bagsiden. Og skinnen forsynes med ledninger, hvorefter der fastgøres seks stk. underlag med gaffatape. De to yderste skrånende, de midterste fire lige.


Desuden har jeg lagt et helt skinnestykke på alle lige etager, dvs. bagerste elevatorstol, således at jeg er klar til at måle, hvor lange stykker skinne, der skal loddes på, så skinnerne kommer til at passe til stolen.

10/2: Jeg har skåret skinneforlængelser til de nederste to lige etager (12 og 10). Jeg synes, at jeg målte meget præcist ud på alle lige etager, og fandt frem til 294 mm på alle seks etager. Men skinnen bugtede sig ret voldsomt. Jeg skar derfor 1 mm af, så forlængelsen nu er 293 mm, hvorefter skinnen på etage 12 kunne være der.
11/2: Skinneforlængelser til yderligere tre etager skåret. Og skinnerne til etagerne 10, 8, 6 og delvis 4 (billedet) monteret. Altsammen stadigvæk uden midtertråd, som er langt den største tidsrøver.

13/2: Jeg har tegnet banen op med blok- og sporskiftenumre, som forberedelse til at definere layoutet i JMRI:

Og jeg er begyndt at taste ind. Jeg har foreløbig fået defineret halvdelen af OBlocks’ene inklusive Portals, Paths og sporskiftere. Men der mangler rigtig meget endnu.
På hardware-fronten er sidste skinne kommet på plads i elevatoren. Fortsat dog uden strøm/midterleder på de lige etager.
14/2: Blok-nummereringen lavet helt om. Og jeg havde også glemt et sposkifte (T10 nedenfor).

Og hvorfor er det vigtigt? Fordi jeg gerne vil, at bloknummereringen følger sensor nummereringen. Og mine sensorer udgøres af tre print med hver 16 sensorer.
Så for at undgå at trække ledningerne frem og tilbage mellem de to sider af rummet, har jeg nu gjort det sådan, at et sensormodul (B33-48) nu dækker hele væggen øverst på tegningen, et andet (B17-32) det nederste højre hjørne af tegningen og et (B1-16) på væggen nederst på tegningen.
Samtidig har jeg afsat lidt huller i talrækken til bl.a. at kunne lave en udvidelse til venstre for på et tidspunkt at lukke hesteskoen, så det bliver en oval samt hvad “man” nu ellers finder på.
Desværre betyder ændringen, at jeg spildte en time i går på at definere OBlocks m.v., som nu skal gøres om. Hvilket jeg har gjort i dag. Dvs. (se “clinic”, som jeg linker til øverst på denne side):
- Start PanelPro.
- Vælg Tools -> Tables -> Sensors.
- Check at sensorerne fra kommandostationen er til stede eller lav nogen interne sensorer, som sidenhen kan skiftes ud med de fysiske ved at editere XML filen.
- Gentag øvelsen for sporskiftere.
- Åbn et nyt Control Panel.
- I menuen på denne vælges Add Item -> Occupancy Table.
- I det vindue, der åbnes, oprettes først alle OBlocks.
- Dernæst pr. OBlock tilføjes sensornavnet og der trykkes på Paths knappen, alle paths tilføjes (hvilket kræver, at man hopper til Portal vinduet og tilføjer de nødvendig Portaler), for hver Path trykkes på Turnouts og de relevante sporskiftere tilføjes.
Derefter fik jeg placeret de første få sporskifter og blok ikoner i det nye Control Panel.
Jeg brugte lidt tid på at finde ud af, hvordan man ændrer baggrundsfarven: Hold Ctrl tasten nede og klik på baggrunden. Så åbnes en dialogboks.
Dernæst oprettede jeg de første to Signal Masts og fik også placeret dem i panelet:
- I Panel Pro vælges menuen Tools -> Tables -> Signals -> Signal Masts.
- Tilføj to Signal Masts (en for hver retning) for hver eneste Portal. Jeg vælger Danish Simplified systemet, Indkørselssignal, virtuelt (altså kun inde i JMRI og ikke fysiske signaler).
- Gå tilbage til Occupancy Block Table vinduet og vælg signal tabellen i Tables menuen.
- Gå ind i det vindue, der derved åbnes, og tilknyt fra og til Oblocks og Portal til hver Signal Mast.
- Placer Signal Mast ikonerne i Control Panelet. Jeg fandt frem til, at nogenlunde passer at skalere ikonerne til 60%.
- Når hele panelet er defineret skal der defineres signal mast logic ved at højreklikke på hver signal ikon og definere hvilke sensorer, sporskifter og andre signaler, der skal styre pågældende signal.
- Sluttelig (fandt jeg ud af 27/3) skal Signal tabellen i Occupancy Block Table vinduet udfyldes, for at definere sammenhængen mellem Signal Masts, OBlocks og Portals, sådan at Warrants kan styres af signaler.
Lørdag 15/2: Alle lige etager kalibreret endnu en gang efter at have fået skinner. Desuden er der nu midterleder på etage 12 og 10. Og etage 8 er klar til lodning og ledning.
18/2: Så er der strøm på etage 8 og 6.
Det går knap så godt med mine nye stepper drivere, som jeg bestilte 31/1. Afsender påstod, at de blev afsendt 10/2. Men der er stadigvæk ingen track and trace information. Efter mange henvendelser har afsender nu endelig meddelt, at de ikke kan skaffe varen. Men jeg bliver nødt til at vente et par dage endnu, før jeg kan klage til AliExpress og få mine penge tilbage.
Til gengæld har jeg bestilt to andre drivere baseret på samme chip. Billigere, men ikke lige så gennemført. Det er kun et råt print, som jeg selv skal lave en kasse til (med plads og åbning til kølepladen). Se projektbeskrivelsen her.

20/2: Alle skinner har nu strøm på. Dvs. hele elevatoren er færdig +/- nogen nye stepper drivere, lidt pænere ledningsføring til ditto samt at lægge låget på elektronikboksen.
23/2: Lidt i limbo-mode. Foråret kommer snart, og så er det ikke futtogstid mere. Have-aktiviteter m.v. så småt ved at gå i gang. Jeg mangler de nye stepper-drivere for at gøre elevatoren helt færdig. Og hylderne skal males, før jeg for alvor går i gang med at bygge banen.
Så jeg har ryddet op i både garagen og tog-rummet. Dvs. lagt alt værktøj på plads og flyttet mit arbejdsbord på plads, så det ikke længere står inde under elevatoren. Der står i stedet to flyttekasser med ting og sager til at bygge banen af. De havde ellers haft ophold i entreen, siden elevatoren kom ind fra malerværkstedet.
Og så har jeg endnu en gang tænkt mig lidt om og fjernet blok 124 ovenfor. Det nytter ikke noget, at en warrant kun reserverer halvdelen af elevatoren. Så derfor prøver jeg nu i stedet at lade alle 12 etager hedde blok 24. Så må jeg holde tungen lige i munden, når jeg definerer warrants, så jeg bruger de rigtige blokke udenfor elevatoren, alt efter om toget holder på en lige eller en ulige etage.

12/3: Det meste af layoutet defineret i JMRI. Dog endnu ikke signaler og warrants. Sporskiftere redefineret i ECoS.

De nye stepper-drivere er endelig kommet til Holland. Så nu er det kun et spørgsmål om få dage.
16/3: Virtuelle Signal Masts inklusive logik defineret på den øverste halvdel af banen:

De nye stepperdrivere installeret. De gjorde elevatoren lydløs, når den står stille. Og mere lavmælt, mens den bevæger sig. Men jeg har observeret en underlig opførsel under homing, hvor den aldrig bliver færdig med at home. Jeg fik softwaren til at skrive mere information om, hvad der foregår. Men derved forsvandt problemet desværre, uden at jeg fandt ud af, hvad der i virkeligheden går galt.
Derudover har jeg monteret en gardinstang. Fruen har nemlig lovet at sy et gardin til at holde støv og sollys ude.

18/3: For at styre de to krydssporskiftere rigtigt er jeg gået over til LogixNG, som er noget nyt (for mig) i JMRI. Jeg skiftede fra Logix til LogixNG, fordi kun LogixNG tillader at sætte tilstanden af et sporskifte til “Inconsistent”. Og så er det nok meget godt at blive bekendt med LogixNG, som i det hele taget kan lidt mere.
Jeg har lavet seks conditionals for hvert sporskifte. Fire af denne type (for hver kombination af de to virtuelle sposkifteres tilstande):

Og to af denne type (for hver tilstand af det fysiske sporskifte):

Derved styrer de virtuelle sporskiftere de fysiske, samtidig med at en ændring på de fysiske invaliderer de virtuelle. Jeg bruger en intern sensor “IgnoreT5” og en timer i LogixNG til at sørge for, at en ændring af det fysiske sporskifte ignoreres, hvis ændringen skyldes ændringer af de virtuelle sporskiftere.
19/3: To konklusioner fra en hurtig lille tilføjelse af nogle få flere skinner: Det er ret smart at have de 10 mm flamingo på banen. Det er nemlig nok til at give plads til servoerne under sporskifterne. Derudover skal bredden på den bro, der skal forbinde de to sider af banen foran elevatoren alias blok 22 og 23 på tegningen ovenfor, være 14 cm, hvis det er en ren jernbanebro. Noget mere, hvis der også skal være plads til biler. Og det skal der måske? Jeg har tænkt på, at det skal være Lillebæltsbroen. Men jeg har indtil videre ikke tænkt veje ind i layoutet.

20/3: Resten af signalerne og signallogikken defineret, så der kan køres med SCWarrants. Når altså skinnerne bliver lagt. Hvilket kræver, at hylderne først kommer en tur i garagen for at blive malet. Og at broen bliver bygget og malet.

21/3: Da jeg kom hjem fra arbejde i dag, var det til en positiv overraskelse: Nu er der støvgardin foran elevatoren.

23/3: Lillebæltsbroen kan nu blive 2 cm smallere. Jeg har nemlig rykket den ene skinnestreng lidt længere væk fra elevatoren:

27/3: SCWarrants testet med nyeste JMRI version. 2 fejl, som begge er introduceret som følge af andre ændringer i JMRI, fundet og rettet. For det første var det ikke muligt at oprette en SCWarrant. Og for det andet virkede tracking af SCWarrants (dvs. visning i PanelPro af, hvor et tog under warrant kontrol befinder sig).
En tredje fejl var, at SCWarrants ikke var i stand til at finde signalerne. Og så er de ikke særlig Signal Controlled. Det viste sig dog, at det ikke var en fejl i koden. Det var bare mig, der ikke havde udfyldt signal tabellen i Occupancy Block tabel vinduet. Den tabel, som knytter blokke og portaler sammen med signaler. Det kunne have været lavet så smart, at den logik, der styrer hvilke aspekter signalmasterne skal vise, var nok. Men sådan er det med JMRI: Forskellige bidragydere kommer med hver deres funktionalitet. Og så bliver det i dette tilfælde nødvendigt med lidt dubleret data.
Desuden er der flere fejl, som jeg ikke har set på endnu. Men de skal rettes.
- Når man editerer en SCWarrant åbner vinduet eksempelvis altid med “almindelig warrant” valgt. Man kan godt ændre valget, og trykker man Save bliver warranten gemt som en SCWarrant. Men næste gang man åbner den i Edit mode ser den igen ud som en almindelig warrant. Så det er mest et irritationsmoment.
- Hvis man starter en SCWarrant uden at afgangs-blokken er optaget, går warrant list vinduet i baglås.
3/4: Ovenstående fejl rettet.
10/5-2025: Der er sat flere hylder op, og der er ryddet op i togrummet.

Under oprydningen røg der en hel pose med fejl- og prototype-print ud. Hvis man bliver klog af at fejle, må jeg være en vis mand nu.

24/8: Jeg fik konverteret garagen til malerværksted igen og fik de første to (ud af 4) stykker bane-underlag derud og givet grunder på den ene side:

