{"id":2143,"date":"2019-08-18T12:06:03","date_gmt":"2019-08-18T11:06:03","guid":{"rendered":"http:\/\/lisby.dk\/wordpress\/?p=2143"},"modified":"2024-10-01T13:22:27","modified_gmt":"2024-10-01T12:22:27","slug":"software-til-havetog","status":"publish","type":"post","link":"https:\/\/lisby.dk\/wordpress\/?p=2143","title":{"rendered":"2019 del 3 &#8211; Software til havetog"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Indledning<\/h2>\n\n\n\n<p>Denne gang er jeg p\u00e5 egen h\u00e5nd. Jeg kunne vel godt bruge JMRI p\u00e5 en Raspberry Pi. Men det ville kr\u00e6ve en smart m\u00e5de at definere og interface til en generaliseret Arduino styring.<\/p>\n\n\n\n<p>I stedet vil jeg producere noget kode, der er dedikeret til lige netop den bane, jeg bygger. Og det skal eksekvere p\u00e5 en ESP32. Og hvis dens 40 IO porte eller dens processor eller RAM ikke er tilstr\u00e6kkelig, s\u00e5 p\u00e5 flere Arduino-agtige moduler.<\/p>\n\n\n\n<p>For at implementere en p\u00e6n WEB-side i ESP32 f\u00e5r jeg muligvis brug for et micro SD kort til at indeholde ikoner m.v. Det er s\u00e5dan set heller ikke noget problem. Jeg har en adapter. Men det koster 4 IO porte:&nbsp;<a href=\"http:\/\/www.esp32learning.com\/code\/esp32-and-microsd-card-example.php\" target=\"_blank\" rel=\"noopener\">http:\/\/www.esp32learning.com\/code\/esp32-and-microsd-card-example.php<\/a><\/p>\n\n\n\n<p>Derudover kommer min hardware til at best\u00e5 af:<br>\n&#8211; to str\u00f8mforsyninger &#8211; en for hver af de to DAC\u2019er i ESP32, og samtidig en for den nordlige og en for den sydlige ende af banen, s\u00e5 to tog kan k\u00f8re samtidig med forskellig hastighed i hver sin ende af banen.<br>\n&#8211; en servo for hver sporskifte.<br>\n&#8211; et antal reed switche til at detektere togenes fysiske placering p\u00e5 banen.<br>\n&#8211; et antal rel\u00e6er til retningsskifte og til ind- og udkobling af vigespor.<br>\n&#8211; to tog. Indtil videre har jeg kun et tog. Men banen skal indrettes til to.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Software byggeblokke<\/h2>\n\n\n\n<p>Jeg kunne godt opbygge en styretavle best\u00e5ende af lysdioder og switche. Men jeg vil hellere udnytte ESP32\u2019erens WIFI til at implementere en WEB-side, der viser status og tager imod kommandoer. Minimum start og stop kommandoer.<\/p>\n\n\n\n<p>Softwaren skal derfor:<br>\n1. S\u00e6tte ESP32 op som access point, s\u00e5 hverken ESP32 eller min h\u00e5ndholdte device (smartphone, iPad eller lignende) beh\u00f8ver at v\u00e6re forbundet til en router.<br>\n2. Udstille en WEB-side som netop beskrevet.<br>\n3. Holde styr p\u00e5, hvor hver af de to tog befinder sig. Denne information skal gemmes i non-volatile memory, dvs. s\u00e5 informationen overlever en str\u00f8mafbrydelse.<br>\n4. Indeholde procedurer til at k\u00f8re et tog fra et vigespor\/perron til et andet. Det inkluderer at s\u00e6tte sporskifter og accelerere toget langsomt op og ned i fart.<br>\n5. Holde \u00f8je med events, dvs. om en reed switch rapporterer tilstedev\u00e6relsen af et tog og reagere herp\u00e5 ved at stoppe\/starte tog og at vende retningen af vendesl\u00f8jfer.<br>\n6. Sikre str\u00f8mforsyningerne, dvs. afbryde alt i tilf\u00e6lde af kortslutninger.<\/p>\n\n\n\n<p>En af udfordringerne ved Arduino verdenen er, at softwaren er enkelttr\u00e5det og ikke interruptstyret. Dvs., at der er en hovedl\u00f8kke, som kaldes igen og igen, men som kun m\u00e5 foretage sig meget simple operationer hver gang.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">F\u00f8rste prototype<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-1.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-1-300x225.jpg\" alt=\"image\" class=\"wp-image-2147\" srcset=\"https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-1-300x225.jpg 300w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-1-768x576.jpg 768w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-1-1024x768.jpg 1024w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><\/div>\n\n\n<p>Jeg har fluks kastet mig ud i at lave en prototype. Hardwaren ser s\u00e5ledes ud:Det best\u00e5r af en Weemos D1 mini (klon fra Kina), som er en ESP8266, en reed switch forbundet mellem D1\/GPIO5 og stel og en servo forbundet til stel, 5V og D2\/GPIO4.<\/p>\n\n\n\n<p>Jeg fandt nogle Arduino eksempler, som jeg kombinerede. S\u00e5 lige nu har jeg opstillingen til at agere access point og WEB server for en yderst simpel WEB-side, der opdaterer hvert andet sekund. Og hver gang afl\u00e6ser den status for reed switchen og drejer servoen alt efter om reed switchen er aktiveret (af en magnet) eller ej. Desuden indeholder siden status for reed switchen og den interne LED p\u00e5 Weemos\u2019en samt en mulighed for at t\u00e6nde eller slukke denne LED.<\/p>\n\n\n\n<p>Udover selve Arduino IDE\u2019en skal man ogs\u00e5 lige tilf\u00f8je support for ESP32. Der er m\u00e6ngder af instrukser tilg\u00e6ngelige, f.eks. denne:&nbsp;<a href=\"https:\/\/randomnerdtutorials.com\/installing-the-esp32-board-in-arduino-ide-mac-and-linux-instructions\/\" target=\"_blank\" rel=\"noopener\">https:\/\/randomnerdtutorials.com\/installing-the-esp32-board-in-arduino-ide-mac-and-linux-instructions\/<\/a><\/p>\n\n\n\n<p>Jeg har lagt min Arduino kode her: <a href=\"https:\/\/github.com\/kjlisby\/arduino_train.git\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/kjlisby\/arduino_train.git<\/a><\/p>\n\n\n\n<p>S\u00e5 er vi i gang. Jeg skal have koden struktureret p\u00e6nere og i flere filer, hhv. have gjort den objektorienteret og dermed lettere at l\u00e6se. WEB serveren skal eksempelvis v\u00e6re en klasse for sig selv. Og den skal ikke v\u00e6re flettet ind i koden, men ligge som filer p\u00e5 et micro SD kort, som i dette eksempel:&nbsp;<a href=\"https:\/\/startingelectronics.org\/tutorials\/arduino\/ethernet-shield-web-server-tutorial\/\" target=\"_blank\" rel=\"noopener\">https:\/\/startingelectronics.org\/tutorials\/arduino\/ethernet-shield-web-server-tutorial\/<\/a><\/p>\n\n\n\n<p>Jeg har i \u00f8vrigt fundet ud af, at en ESP8266 og en ESP32 (selvom der er rapporteret fejl p\u00e5 denne funktion p\u00e5 sidstn\u00e6vnte) kan fungere b\u00e5de i AP (access point) og STA (station) mode samtidig. Det er meget smart, for s\u00e5 kan jeg tilg\u00e5 den via hjemmenetv\u00e6rket, n\u00e5r den er t\u00e6t nok p\u00e5 routeren, og direkte, n\u00e5r jeg vil v\u00e6re mere sikker p\u00e5 at forbindelsen skal v\u00e6re helt stabil.<\/p>\n\n\n\n<p>Desuden har jeg fundet en glimrende kilde til viden om HTML5, Javascript, C++ og en del andre besl\u00e6gtede emner:&nbsp;<a href=\"https:\/\/www.w3schools.com\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.w3schools.com\/<\/a> Jeg er ikke i stand til at vurdere sidens niveau indenfor alle emnerne. Men i hvert fald C++ delen kunne godt v\u00e6re mere udt\u00f8mmende beskrevet.<\/p>\n\n\n\n<p>En anden hj\u00e6lpekilde, der viste sig at v\u00e6re til meget god hj\u00e6lp er Programming Guiden fra Espressif (firmaet bag ESP). Specielt afsnittet om fatal errors, som hjalp mig videre med null-pointer fejl:&nbsp;<a href=\"https:\/\/docs.espressif.com\/projects\/esp-idf\/en\/latest\/api-guides\/fatal-errors.html\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.espressif.com\/projects\/esp-idf\/en\/latest\/api-guides\/fatal-errors.html<\/a><\/p>\n\n\n\n<p>En anden \u201clille\u201d ting er ikoner. Jeg har pr\u00f8vet at lave en animeret GIF med noget, der ligner skinner med sveller. Ideen er, at bruge en animeret gif, s\u00e5 skinnerne bev\u00e6ger sig for at signalere, at der er sp\u00e6nding p\u00e5. Men jeg har fundet ud af, at en animeret udgave af en simpel punkteret linie fra Powerpoint fungerer meget bedre.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Software arkitektur &#8211; ESP32<\/h2>\n\n\n\n<p>Selvom en ESP32 ikke fylder meget og ikke er s\u00e6rlig potent heller, s\u00e5 kommer min togstyring alligevel til at best\u00e5 af en hel del kodelinier. For at g\u00f8re det hele nogenlunde overskueligt vil jeg udnytte, at Arduino IDE sproget i virkeligheden er C++, selvom de fleste eksempler, jeg kan google mig til er ikke-objektorienteret ANSI C. Men ved at g\u00f8re min kode objektorienteret kan jeg isolere detaljerne i et antal klasser og objekter. Det f\u00f8lgende er udgangspunktet. Det endelige resultat kommer til at kunne ses p\u00e5 <a href=\"http:\/\/github.com\/kjlisby\/arduino_train\" target=\"_blank\" rel=\"noopener\">github.com\/kjlisby\/arduino_train<\/a>:<\/p>\n\n\n\n<p><u><b>Klasse<\/b>: WEBserver<\/u><br>\n<b> Metoder<\/b>: Constructor, Init, GetServer, GetSDCard<br>\n<b> Semantik<\/b>: Der skal kun v\u00e6re et enkelt objekt af denne klasse, som implementerer en WEB server. Det afh\u00e6nger helt og holdent af indholdet af SD kortet, hvad WEB serveren kan. For det er p\u00e5 SD kortet, at HTML\/CSS\/Java Script filerne ligger.<br>\n&#8211; <b>Constructoren<\/b> s\u00e6tter s\u00e6tter ESP32 op i STA_AP mode, dvs. b\u00e5de station og access point mode. Dern\u00e6st skabes en WEB server og micro SD kortl\u00e6seren initialiseres. Desuden s\u00e6ttes der diverse hooks op, s\u00e5 visse WEB adresser vil vise, hvad der er p\u00e5 SD kortet.<br>\n&#8211; <b>Init<\/b> g\u00f8r constructorens arbejde f\u00e6rdig, idet den starter WEB serveren. Det vigtige ved Init metoden er dog det man kan g\u00f8re efter at WEBserver objektet er skabt, men f\u00f8r Init kaldes: Her tilf\u00f8jer jeg flere hooks for at f\u00e5 de \u00f8vrige klasser i spil, s\u00e5 f.eks. status af IO porte kan l\u00e6ses via AJAX \/ Java Script af en WEB-side i en browser p\u00e5 en PC, iPad, mobiltelefon eller en anden device.<br>\n&#8211; <b>GetServer<\/b> returnerer en pointer til selve WEB serveren. Det skal bruges dels til at g\u00f8re ting og sager med WEB serveren f\u00f8r Init kaldes og dels til at kalde&nbsp;server.handleClient inde i loop funktionen.<br>\n&#8211; <b>GetSDCard<\/b> returnerer tilsvarende en pointer til SD kortet, s\u00e5 jeg kan f\u00e5 fat i det til at persistere status der.<\/p>\n\n\n\n<p><u><b>Klasse<\/b>: PowerSupply<\/u><br>\n<b> Metoder<\/b>: SetVoltage, SetPolarity, ReadVoltage, ReadPolarity, ReadStatus, Reset<br>\n<b> Semantik<\/b>: Der skal instantieres et objekt af denne klasse for hver str\u00f8mforsyning i systemet. Lige nu tror jeg, at jeg f\u00e5r brug for to, nemlig en i hver ende af banen. Klassen bruger en DAC output port til at s\u00e6tte sp\u00e6ndingen, en input port til at sense, om der er sket en kortslutning, og i givet fald s\u00f8rge for at slukke for udgangssp\u00e6ndingen og en digital output port til at styre et rel\u00e6, der bestemmer polariteten.<br>\n&#8211; <b>Constructoren<\/b> g\u00f8r ikke noget s\u00e6rligt udover at s\u00e6tte portmodes og initielt s\u00e6tte sp\u00e6nding og polaritet til +0V.<br>\n&#8211; <b>SetVoltage<\/b> s\u00e6tter v\u00e6rdien af output porten, s\u00e5 den \u00f8nskede udgangssp\u00e6nding opn\u00e5s.<br>\n&#8211; <b>SetPolarity<\/b> s\u00e6tter rel\u00e6et til den \u00f8nskede polaritet.<br>\n&#8211; <b>ReadVoltage<\/b> l\u00e6ser v\u00e6rdien af DAC porten og oms\u00e6tter den til den faktiske sp\u00e6nding.<br>\n&#8211; <b>ReadPolarity<\/b> l\u00e6ser hvordan polariseringsrel\u00e6et er sat.<br>\n&#8211; <b>ReadStatus<\/b> returnerer enten true (alt OK) eller false (kortslutning detekteret og str\u00f8mforsyningen derfor lukket ned).<br>\n&#8211; <b>Reset<\/b> genstarter str\u00f8mforsyningen (p\u00e5 +0V) efter en kortslutning.<\/p>\n\n\n\n<p><u><b>Klasse<\/b>: Layout<\/u><br>\n<b> Metoder<\/b>: Constructor, Pulse, UpdateTrainPosition, GetStatus, UpdateStatus, ChangeState<br>\n<b> Semantik<\/b>: Her er logikken for lige netop mit layout implementeret. Der skal naturligvis kun v\u00e6re en enkelt instans af denne klasse. Det er dette objekts constructor, der instantierer PowerSupply, Turnout og Siding objekter. Og det er ogs\u00e5 her, at der registreres en metode for AJAX \/ Java Script koden i WEB siden, s\u00e5 man herfra kan kalde de \u00f8vrige metoder i Layout klassen, s\u00e5vel som ChangeState metoderne i Turnout og Siding klasserne.<br>\n&#8211; <b>Constructor<\/b> er beskrevet ovenfor.<br>\n&#8211; <b>Pulse<\/b> skal kaldes s\u00e5 ofte som muligt, dvs. i Arduino loop() funktionen. Det er Pulse, der checker alle Contact objekter og (via callback) tager action, hvis et tog detekteres.<br>\n&#8211; <b>UpdateTrainPosition<\/b> kaldes n\u00e5r et tog er detekteret ved en reed switch. Opdaterer status &#8211; ogs\u00e5 p\u00e5 SD kortet samt tager passende action i forhold til sidings, str\u00f8mforsyninger m.v.<br>\n&#8211; <b>GetStatus<\/b> bruges af WEB siden til at hente den totale status for, hvor begge tog befinder sig, hvordan sporskifterne st\u00e5r, sp\u00e6nding og polariseringfor str\u00f8mforsyningerne og hvordan vigesporene er koblet.<br>\n&#8211; <b>UpdateStatus<\/b> bruges ogs\u00e5 af WEB siden til samme form\u00e5l som GetStatus. Men svaret p\u00e5 UpdateStatus indeholder kun \u00e6ndringerne siden seneste kald til GetStatus. Dette er for at speede tingene op, men betyder til geng\u00e6ld, at der kun kan v\u00e6re \u00e9n device med \u00e9n WEB side i brug.<br>\n&#8211; <b>ChangeState<\/b>&nbsp;bruges af WEB siden til at t\u00e6nde og slukke for hele layout\u2019et. N\u00e5r der slukkes, k\u00f8rer begge tog videre, indtil de er parkeret p\u00e5 rette plads.<\/p>\n\n\n\n<p><u><b>Klasse<\/b>: Contact<\/u><br>\n<b> Metoder<\/b>: Constructor, CheckSwitch, RegisterCallback<br>\n<b> Semantik<\/b>: Repr\u00e6senterer en reed switch, som kan f\u00f8le, om et tog passerer.<br>\n&#8211; <b>Constructor<\/b> initialiserer den input port, som switchen er koblet til.<br>\n&#8211; <b>CheckSwitch<\/b> skal kaldes meget hyppigt for at afl\u00e6se portens status.<br>\n&#8211; <b>RegisterCallback<\/b> bruges til at fort\u00e6lle et Contact objekt, hvilken aktion, der skal tages, hvis et tog registreres i et CheckSwitch kald.<\/p>\n\n\n\n<p><u><b>Klasse<\/b>: Turnout<\/u><br>\n<b> Metoder<\/b>: Constructor, SetStatus, GetStatus<br>\n<b> Semantik<\/b>: Styrer et sporskifte vha. en output port sat op i PWM mode. Et sporskifte ejes enten af et Siding objekt eller et ReverseLoop objekt.<br>\n&#8211; <b>Constructor <\/b>Initialiserer output porten og s\u00e6tter sporskiftet til \u201cClosed\u201d.<br>\n&#8211; <b>SetStatus<\/b> S\u00e6tter sporskiftet til \u00f8nsket tilstand.<br>\n&#8211; <b>GetStatus<\/b> L\u00e6ser sporskiftets tilstand og returnerer enten \u201cClosed\u201d eller \u201cThrown\u201d.<\/p>\n\n\n\n<p><u><b>Klasse<\/b>: PassingSidingSelector<\/u><br>\n<b> Metoder<\/b>: Constructor, SetStatus, GetStatus<br>\n<b> Semantik<\/b>: Styrer to modsat rettede parallelle spor, hvor to tog kan passere hinanden p\u00e5 en ellers enkeltsporet str\u00e6kning. To sporskifter og to dobbeltpolede skifterel\u00e6er styres. Hvert rel\u00e6 (et for hvert spor) kobler sporet til enten den nordlige eller den sydlige del af banen.<br>\n&#8211; <b>Constructor<\/b> s\u00e6tter det sydg\u00e5ende spor til at h\u00e6nge sammen med den nordlige halvdel af banen og det nordg\u00e5ende spor til at h\u00e6nge sammen med den sydlige del af banen.<br>\n&#8211; <b>SetStatus<\/b> s\u00e6tter et af sporene til at v\u00e6re koblet til enten den sydlige eller den nordlige del af banen. N\u00e6rmere bestemt s\u00e6ttes rel\u00e6et for det p\u00e5g\u00e6ldende spor i den \u00f8nskede tilstand, og sporskiftet i den relevante ende af sporet s\u00e6ttes.<br>\n&#8211; <b>GetStatus<\/b> returnerer status for enten det ene eller det andet spor. Status kan v\u00e6re enten \u201cNorth\u201d, \u201cSouth\u201d eller \u201cundefined\u201d.<\/p>\n\n\n\n<p><u><b>Klasse<\/b>: ParallelSidingSelector<\/u><br>\n<b> Metoder<\/b>: Constructor, SetState, GetStatus<br>\n<b> Semantik<\/b>: Styrer to ensrettede parallelle spor, hvor togene altid k\u00f8rer i samme retning.<br>\n&#8211; <b>Constructor<\/b> g\u00f8r ikke noget udover at initialisere til det ene spor.<br>\n&#8211; <b>SetStatus<\/b> skifter mellem to perroner p\u00e5 en station, dels ved at skifte status for sporskifterne i hver ende og dels ved at skifte et rel\u00e6, som giver str\u00f8m i skinnerne p\u00e5 enten det ene eller det andet spor.<br>\n&#8211; <b>GetStatus<\/b> returnerer navnet p\u00e5 det aktive spor.<\/p>\n\n\n\n<p><u><b>Klasse<\/b>: ReverseLoop<\/u><br>\n<b> Metoder<\/b>: Constructor, SetStatus, GetStatus<br>\n<b>Semantik<\/b>: Styrer en vendesl\u00f8jfe, dvs. et sporskifte og polariseringen af en str\u00f8mforsyning.<br>\n&#8211; <b>Constructor<\/b> Associerer med Turnout og PowerSupply objekter og s\u00e6tter status til \u201cInBound\u201d.<br>\n&#8211; <b>SetStatus<\/b> s\u00e6tter polarisering og sporskifte alt efter om toget er p\u00e5 vej ind i eller ud af vendesl\u00f8jfen.<br>\n&#8211; <b>GetStatus<\/b> returnerer enten \u201cInBound\u201d eller \u201cOutBound\u201d.<\/p>\n\n\n\n<p><u><b>Klasse<\/b>: StatusStorage<\/u><br>\n<b> Metoder<\/b>: Constructor, Store, Get<br>\n<b> Semantik<\/b>: Gemmer status (Layout.GetStatus) p\u00e5 SD kortet, s\u00e5 det kan hentes igen efter en str\u00f8mafbrydelse.<br>\n&#8211; <b>Constructor<\/b> associerer objektet med SD kortet, som allerede skal v\u00e6re initialiseret.<br>\n&#8211; <b>Store<\/b> gemmer status.<br>\n&#8211; <b>Get<\/b> henter status.<\/p>\n\n\n\n<p><u><b>Klasse<\/b>: Status<\/u><br>\n<b>Metoder<\/b>: Constructor, Get, Set,&nbsp;Serialize<br>\n<b>Semantik<\/b>: Denne klasse indeholder ingen logik og styrer ingenting. Den er blot en b\u00e6rer af status for hele banen.<br>\n&#8211; <b>Constructor<\/b>&nbsp;Initialiserer alle attributter.<br>\n&#8211; <b>Get og Set<\/b>: Der findes Get og Set metoder for hver enkelt attribut.<br>\n&#8211; <b>Serialize<\/b> konstruerer et format, der dels kan bruges til persistering og dels kan bruges til at svare p\u00e5 HTTP foresp\u00f8rgsler fra WEB siden. Til sidstn\u00e6vnte skal der kunne peges p\u00e5 en baseline status, s\u00e5 kun forskellene rapporteres til WEB siden..<br>\n<b>Attributter<\/b>:<br>\n&#8211; <b>Train1Position<\/b>: Current position of a train<br>\n&#8211; <b>Train2Position<\/b>: Current position of the other train<br>\n&#8211; <b>SidingSouth<\/b>: Indicates which of the two sidings that currently is part of the southern reverse loop.<br>\n&#8211; <b>SidingEast<\/b>: Indicates if the eastern siding is currently part of the northern or southern part of the layout (can be \u201cundefined\u201d).<br>\n&#8211; <b>SidingWest<\/b>:&nbsp;Indicates if the western&nbsp;siding is currently part of the northern or southern part of the layout (can be \u201cundefined\u201d).<br>\n&#8211; <b>ReverseLoopNorth<\/b>: Voltage on the northern reverse loop. Positive, if the polarity corresponds to \u201cInBound\u201d, negative if \u201cOutBound\u201d.<br>\n&#8211; <b>ReverseLoopSouth<\/b>: Same for southern reverse loop.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Software arkitektur &#8211; HTML<\/h2>\n\n\n\n<p>WEB siden best\u00e5r af 3 filer, som gemmes p\u00e5 SD kortet:<\/p>\n\n\n\n<p><b>togbane.htm<\/b>: En ret kortfattet HTML5 definition af siden, hvor der er defineret et ikon for hver blok p\u00e5 banen, 2 ikoner for hver sporskifte samt knapper m.v. nok til at kunne starte\/stoppe k\u00f8rslen og se status. Sporikonerne er som udgangspunkt \u201ckolde\u201d JPEG filer, der illustrerer spor uden sp\u00e6nding. N\u00e5r der kommer sp\u00e6nding p\u00e5 sporene, kan Java Script koden udskifte disse JPEG filer med animerede GIF\u2019er, som f\u00e5r sporene til at se ud som om de bev\u00e6ger sig i den retning, som svarer til polariseringen.<\/p>\n\n\n\n<p>Hvorvidt togene skal kunne k\u00f8res manuelt er TBD. I s\u00e5 fald f\u00e5r jeg brug for at g\u00f8re sporskifter ikonerne aktive, s\u00e5 sporskifterne skifter, n\u00e5r jeg trykker p\u00e5 dem, sidesporene ligeledes aktive, s\u00e5 jeg kan styre rel\u00e6erne, samt jeg f\u00e5r behov for sliders m.v. til at styre str\u00f8mforsyningerne. Og desuden flere hooks ind i ESP32 koden.<\/p>\n\n\n\n<p><b>togbane.css<\/b>: Styling af alle elementerne p\u00e5 siden.<\/p>\n\n\n\n<p><b>togbane.js<\/b>: Implementerer UI logikken, dvs. de aktioner, der skal tages, n\u00e5r brugeren trykker p\u00e5 WEB sidens knapper og ikoner, samt et hyppigt kald til Layout.GetStatus hhv. Layout.UpdateStatus, hvor WEB siden hele tiden holdes opdateret i henhold til den status, som ESP32 rapporterer. Bliver muligvis delt op i flere filer svarende til de C++ klasser, der findes i ESP32 enden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Status ultimo august<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/E31B63B2-0929-47C5-8DF8-DFB6EBCDFE5F.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"248\" src=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/E31B63B2-0929-47C5-8DF8-DFB6EBCDFE5F-300x248.jpeg\" alt=\"E31B63B2-0929-47C5-8DF8-DFB6EBCDFE5F\" class=\"wp-image-2179\" srcset=\"https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/E31B63B2-0929-47C5-8DF8-DFB6EBCDFE5F-300x248.jpeg 300w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/E31B63B2-0929-47C5-8DF8-DFB6EBCDFE5F-768x634.jpeg 768w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/E31B63B2-0929-47C5-8DF8-DFB6EBCDFE5F-1024x845.jpeg 1024w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/E31B63B2-0929-47C5-8DF8-DFB6EBCDFE5F.jpeg 1061w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/2B89E9E5-E764-492C-A334-B2880D02A0FB.gif\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"11\" src=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/2B89E9E5-E764-492C-A334-B2880D02A0FB-300x11.gif\" alt=\"2B89E9E5-E764-492C-A334-B2880D02A0FB\" class=\"wp-image-2180\"\/><\/a><\/figure><\/div>\n\n\n<p>Jeg er s\u00e5 sm\u00e5t ved at finde ud af, hvordan man laver en HTML5 side. Jeg har lavet mig en animeret gif, som er det gennemg\u00e5ende element p\u00e5 siden: <\/p>\n\n\n\n<p>Siden er m\u00e5ske noget rustik i udseendet. Men det er jeg lidt ligeglad med. Den skal bare v\u00e6re overskuelig, brugbar og responsiv. Og den skal tilpasse sig sk\u00e6rmst\u00f8rrelsen, s\u00e5 den kan bruges p\u00e5 vilk\u00e5rlige devices. Og det er altsammen opfyldt indtil videre.&nbsp;Knapperne er blot en prototype. De bliver fjernet igen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Status medio september<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/1B90BEA0-EF16-4BCF-81C9-AA8CDB0E1B80.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/1B90BEA0-EF16-4BCF-81C9-AA8CDB0E1B80-300x225.jpeg\" alt=\"1B90BEA0-EF16-4BCF-81C9-AA8CDB0E1B80\" class=\"wp-image-2190\" srcset=\"https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/1B90BEA0-EF16-4BCF-81C9-AA8CDB0E1B80-300x225.jpeg 300w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/1B90BEA0-EF16-4BCF-81C9-AA8CDB0E1B80-768x576.jpeg 768w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/1B90BEA0-EF16-4BCF-81C9-AA8CDB0E1B80-1024x768.jpeg 1024w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/747524C4-A0C3-436A-9D7E-82913A719DDC.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/747524C4-A0C3-436A-9D7E-82913A719DDC-300x225.jpeg\" alt=\"747524C4-A0C3-436A-9D7E-82913A719DDC\" class=\"wp-image-2191\" srcset=\"https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/747524C4-A0C3-436A-9D7E-82913A719DDC-300x225.jpeg 300w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/747524C4-A0C3-436A-9D7E-82913A719DDC-768x576.jpeg 768w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/747524C4-A0C3-436A-9D7E-82913A719DDC-1024x768.jpeg 1024w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><\/div>\n\n\n<p>Der sker ikke s\u00e5 meget. Men i aften har jeg f\u00e5et lavet mig en prototype p\u00e5 et servodrevet sporskifte. F\u00f8rste fors\u00f8g gik ikke s\u00e5 godt. Katten m\u00e5 v\u00e6re l\u00f8bet med m\u00e5let. Dvs., hvis jeg ellers havde en kat. Men i hvert fald havde jeg glemt at tage hensyn til NEM 102 og 103 normerne:En lidt udvidet l\u00f8sning, der tager hensyn til normerne, ser ud til at give god plads til et tog:Pladen er skruet p\u00e5 sporskiftet med to 3 mm skruer i de huller p\u00e5 sporskiftet, som er beregnet til de originale Piko (eller LGB) sporskiftedrev.<\/p>\n\n\n\n<p>Pladen er lige nu kun et stykke stift pap. Men det skal naturligvis erstattes af noget vejrfast som f.eks. plexiglas. Eller endnu bedre, s\u00e5 vil jeg 3D printe et eller andet som kan ligne et sporskiftedrev fra virkeligheden, som har en form, der kan f\u00e5 regnvandet til at l\u00f8be af, som kan indkapsle servoen og holde den fast uden skruer og som har lidt kanter, der kan stive konstruktionen af. Jeg har bare ikke f\u00e5et k\u00f8bt den der 3D printer endnu&#8230;..<\/p>\n\n\n\n<p>Servoen vender p\u00e5 hovedet, fordi regnvand p\u00e5 den m\u00e5de ikke kan l\u00f8be ind ved akslen, hvor servoen bev\u00e6ger sig. Og bunden af servoen, som dermed vender opad, har jeg t\u00e6nkt mig at d\u00e6kke fuldst\u00e6ndig til med silikone.<\/p>\n\n\n\n<p>Og det ber\u00f8mmelige stykke pianotr\u00e5d er lige nu p\u00e5 1 mm. Jeg skal have lidt erfaring med denne skinnest\u00f8rrelse for at finde ud af om det er den bedste dimension. Men p.t. \u00f8del\u00e6gger det i hvert fald ikke sporskiftet. For pap-pladen skal nok give efter.<\/p>\n\n\n\n<p>Nu mangler jeg blot, at flere dingenoter ankommer fra Kina. Reed switche med plastikhus i stedet for glasr\u00f8r, ESP 32, k\u00f8leplader til de kraft-transistorer, der allerede er ankommet, m.v..<\/p>\n\n\n\n<p>Jeg har k\u00f8bt skinner inklusive det sporskifte, der ses p\u00e5 billederne, til at udvide cirklen fra starts\u00e6ttet til at v\u00e6re den lille vendesl\u00f8jfe, som p\u00e5 et tidspunkt skal udg\u00f8re den nordlige ende af banen i haven. Planen er, at toget skal k\u00f8re frem og tilbage i den vendesl\u00f8jfe rundt om juletr\u00e6et i \u00e5r. Det giver mig tre m\u00e5neder fra nu.<\/p>\n\n\n\n<p>Lige nu mangler jeg tid (s\u00e5 l\u00e6nge vejret er godt, bruges fritiden helst udend\u00f8rs), som ydermere skal balanceres mellem have- og juletoget og min \u201crigtige\u201d bane, som stadigv\u00e6k mangler enhver form for landskab. Jeg har dog pr\u00f8vek\u00f8rt det, og det k\u00f8rer fint. Og s\u00e5 har jeg \u201cjusteret\u201d lidt p\u00e5 flamingoafsk\u00e6rmningerne p\u00e5 fronten af banen, dvs. limet en kant p\u00e5 for at g\u00f8re noget af det bredere, samt sk\u00e5ret lidt andre steder, s\u00e5 de lange vogne kan komme forbi. Der skal dog sikkert justeres mere.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">10. oktober<\/h2>\n\n\n\n<p>I dag dumpede der en ESP32 ind i postkassen. Og k\u00f8leplader til krafttransistorerne. Selve transistorerne ankom for nogle uger siden.<\/p>\n\n\n\n<p>Og jeg har fundet en gammel 20 volt PC str\u00f8mforsyning, der burde kunne fungere til form\u00e5let.<\/p>\n\n\n\n<p>Desuden har jeg fundet et 3D print, som kan transmogryffe en servo til et sporskiftedrev:&nbsp;<a href=\"https:\/\/www.thingiverse.com\/thing:3883510\" target=\"_blank\" rel=\"noopener\">https:\/\/www.thingiverse.com\/thing:3883510<\/a><\/p>\n\n\n\n<p>Jeg m\u00e5 have m\u00f8vet mig adgang til en 3D printer snarest og f\u00e5 s\u00e5dan en printet. Ellers n\u00f8jes jeg med papstykket p\u00e5 billederne ovenfor. Det fungerer til stuebrug.<\/p>\n\n\n\n<p>Nu kan jeg s\u00e5 sm\u00e5t begynde at bygge styringen til havetoget. Jeg mangler stadigv\u00e6k 1W modstande til kortslutningssikringen. Desuden mangler jeg de rigtige omskifter rel\u00e6er til at vende polariteten. Men jeg har et 4-rel\u00e6 modul, som nok godt kan bruges til en start.&nbsp;Og&nbsp;jeg kan godt vove at bygge en vendesl\u00f8jfe rundt om juletr\u00e6et uden kortslutningssikring.<\/p>\n\n\n\n<p>Pga. det lune vejr er der dog stadigv\u00e6k tomater i drivhuset, s\u00e5 der g\u00e5r noget tid endnu, f\u00f8r der bliver gjort mere ved toget.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">16.++ oktober &#8211; 3D printede objekter er i hus<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-4.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-4-300x225.jpg\" alt=\"image\" class=\"wp-image-2198\" srcset=\"https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-4-300x225.jpg 300w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-4-768x576.jpg 768w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-4-1024x768.jpg 1024w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><\/div>\n\n\n<p>Rigeligt med isoleringsstykker til at lave en vendesl\u00f8jfe. Faktisk nok til to. Og ogs\u00e5 bemeldte sporskiftedrev.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-5.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-5-300x225.jpg\" alt=\"image\" class=\"wp-image-2204\" srcset=\"https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-5-300x225.jpg 300w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-5-768x576.jpg 768w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-5-1024x768.jpg 1024w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/AE0DEA8F-460D-4BF2-8D82-6F37D61C7338-e1571676501268.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/AE0DEA8F-460D-4BF2-8D82-6F37D61C7338-e1571676501268-300x225.jpeg\" alt=\"AE0DEA8F-460D-4BF2-8D82-6F37D61C7338\" class=\"wp-image-2206\" srcset=\"https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/AE0DEA8F-460D-4BF2-8D82-6F37D61C7338-e1571676501268-300x225.jpeg 300w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/AE0DEA8F-460D-4BF2-8D82-6F37D61C7338-e1571676501268-768x576.jpeg 768w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/AE0DEA8F-460D-4BF2-8D82-6F37D61C7338-e1571676501268-1024x768.jpeg 1024w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/AE0DEA8F-460D-4BF2-8D82-6F37D61C7338-e1571676501268.jpeg 2048w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/12BD2411-445F-4565-AF3C-A6E8AE2B4486.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"218\" src=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/12BD2411-445F-4565-AF3C-A6E8AE2B4486-300x218.png\" alt=\"12BD2411-445F-4565-AF3C-A6E8AE2B4486\" class=\"wp-image-2215\" srcset=\"https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/12BD2411-445F-4565-AF3C-A6E8AE2B4486-300x218.png 300w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/12BD2411-445F-4565-AF3C-A6E8AE2B4486-768x558.png 768w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/12BD2411-445F-4565-AF3C-A6E8AE2B4486-1024x744.png 1024w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/12BD2411-445F-4565-AF3C-A6E8AE2B4486.png 1556w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><\/div>\n\n\n<p>Og jeg er i gang med at lave en fuglerede med ESP32 som midtpunkt, reed switch med pull-up modstand (der er ingen intern pullup i ESP32 p\u00e5 de GPIO porte, som jeg vil bruge), transistorer til at udg\u00f8re en str\u00f8mforsyning&nbsp;som den tidligere beskrevne, servoficeret sporskifte vha. det 3D printede og s\u00e5 lige et trimmepotentiometer til at give kortslutningssikringen noget at arbejde med. For jeg vil ikke have et tog til at k\u00f8re, f\u00f8r jeg har testet str\u00f8mforsyningen p\u00e5 skrivebordet:F\u00f8rste billede viser begyndelsen, n\u00e6ste billede viser samme opstilling men tilf\u00f8jet en 20 volt str\u00f8mforsyning fra en for l\u00e6ngst kasseret PC samt det rel\u00e6modul, der i f\u00f8rste omgang kan bruges til polvendingen. Jeg har tegnet fuglereden op i et diagram, hvor jeg ogs\u00e5 har medtaget resten af str\u00f8mforsyningen (TIP102 transistor, diode over udgangen, 5 volt str\u00f8mforsyning m.v.). Mht. 5 volt forsyningen, s\u00e5 kan den nok ikke drive 6 servoer, som der ender med at blive brug for. S\u00e5 p\u00e5 det tidspunkt m\u00e5 jeg erstatte den med en kraftigere ekstern eller supplere med endnu en 7805:<\/p>\n\n\n\n<p>St\u00f8rste problem med at f\u00e5 det hele til at fungere stabilt var at finde ud af, hvad der skal forsynes med 5 volt hhv. 3,3 volt. Jeg har f\u00e5et k\u00f8bt en SD kort adapter og et rel\u00e6modul, der skal have 5 volt. Rel\u00e6modulet dog 3,3 volt til logikken og 5 volt kun til selve rel\u00e6erne. Det mest luskede var, at SD adapteren <i>n\u00e6sten<\/i> fungerede med 3,3 volt. Dvs. det fungerede et par dage, derefter ikke. Men s\u00e5 rodede jeg lidt med ledningerne i fuglereden, og det virkede igen (formentlig helt tilf\u00e6ldigt) i et par dage.<\/p>\n\n\n\n<p>Desuden har jeg lavet noget af den software, der skal til. Og denne gang nogenlunde skarpt opdelt i C++ klasser som beskrevet ovenfor.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ultimo oktober<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/BoardLayout.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"196\" src=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/BoardLayout-300x196.png\" alt=\"BoardLayout\" class=\"wp-image-2232\" srcset=\"https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/BoardLayout-300x196.png 300w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/BoardLayout-768x501.png 768w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/BoardLayout-1024x668.png 1024w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/EC39E8A4-86EE-4ADC-8B85-9694FC030CE8.png\"><img loading=\"lazy\" decoding=\"async\" width=\"179\" height=\"300\" src=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/EC39E8A4-86EE-4ADC-8B85-9694FC030CE8-179x300.png\" alt=\"EC39E8A4-86EE-4ADC-8B85-9694FC030CE8\" class=\"wp-image-2217\" srcset=\"https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/EC39E8A4-86EE-4ADC-8B85-9694FC030CE8-179x300.png 179w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/EC39E8A4-86EE-4ADC-8B85-9694FC030CE8-768x1285.png 768w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/EC39E8A4-86EE-4ADC-8B85-9694FC030CE8-612x1024.png 612w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/EC39E8A4-86EE-4ADC-8B85-9694FC030CE8.png 920w\" sizes=\"(max-width: 179px) 100vw, 179px\" \/><\/a><\/figure><\/div>\n\n\n<p>Jeg har f\u00e5et omformet diagrammet til noget, der kan loddes sammen p\u00e5 et strip-board, s\u00e5 det ogs\u00e5 kan bruges i virkeligheden:Som det ses har jeg gjort plads til to str\u00f8mforsyninger med polariseringsrel\u00e6er (hvor jeg i mellemtiden har f\u00e5et de rigtige kompakte, der fungerer med 3,3 volt), seks servoer\/sporskifter og fire reed rel\u00e6er. Stort set hvad der bliver brug for i det endelige havetog. Oversigten over, hvordan jeg bruger GPIO portene p\u00e5 ESP32, ser s\u00e5dan ud. Der bliver brug for flere GPIO porte til at styre rel\u00e6er og til flere reed switche. Derfor I2C pindene:Desuden er jeg s\u00e5 klar med softwaren, at n\u00e6ste skridt, n\u00e5r jeg har f\u00e5et loddet hardwaren sammen og testet str\u00f8mforsyningerne, at pr\u00f8ve det af p\u00e5 det fysiske tog. Hvis det fungerer, er jeg klar til at holde jul.&nbsp;Jeg har s\u00e5ledes kodet&nbsp;logikken til en vendesl\u00f8jfe, logikken til i det hele taget at k\u00f8re toget og ikke mindst de hooks p\u00e5 ESP32, som skal f\u00e5 siden til at h\u00e6nge sammen med str\u00f8mforsyning m.v. og at g\u00e5 ind i og ud af auto-mode. Jeg har samtidig tilsvarende udvidet WEB siden inklusive Javascript koden.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/EABB8EE3-E18B-4B2D-83FB-9FF7BED177DA.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/EABB8EE3-E18B-4B2D-83FB-9FF7BED177DA-300x225.jpeg\" alt=\"EABB8EE3-E18B-4B2D-83FB-9FF7BED177DA\" class=\"wp-image-2229\" srcset=\"https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/EABB8EE3-E18B-4B2D-83FB-9FF7BED177DA-300x225.jpeg 300w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/EABB8EE3-E18B-4B2D-83FB-9FF7BED177DA-768x576.jpeg 768w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/EABB8EE3-E18B-4B2D-83FB-9FF7BED177DA-1024x768.jpeg 1024w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-6.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"http:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-6-300x225.jpg\" alt=\"image\" class=\"wp-image-2235\" srcset=\"https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-6-300x225.jpg 300w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-6-768x576.jpg 768w, https:\/\/lisby.dk\/wordpress\/wp-content\/uploads\/2019\/08\/image-6-1024x768.jpg 1024w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><\/div>\n\n\n<p>Og et par billeder fra den praktiske opbygning:<\/p>\n\n\n\n<p>\u00a0<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Indledning Denne gang er jeg p\u00e5 egen h\u00e5nd. Jeg kunne vel godt bruge JMRI p\u00e5 en Raspberry Pi. Men det ville kr\u00e6ve en smart m\u00e5de at definere og interface til en generaliseret Arduino styring. I stedet vil jeg producere noget kode, der er dedikeret til lige netop den bane, jeg bygger. Og det skal eksekvere &hellip; <a href=\"https:\/\/lisby.dk\/wordpress\/?p=2143\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">2019 del 3 &#8211; Software til havetog<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2143","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/lisby.dk\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2143"}],"collection":[{"href":"https:\/\/lisby.dk\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lisby.dk\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lisby.dk\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lisby.dk\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2143"}],"version-history":[{"count":15,"href":"https:\/\/lisby.dk\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2143\/revisions"}],"predecessor-version":[{"id":3623,"href":"https:\/\/lisby.dk\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2143\/revisions\/3623"}],"wp:attachment":[{"href":"https:\/\/lisby.dk\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2143"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lisby.dk\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2143"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lisby.dk\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}