shopify analytics

Beladen kolenwagons

Digitale servosturing

Digitale servosturing via Marklin Motorola protocol

Wissels aansturen met een MS1

S88 Terugmelders

Contact:
Geert.Giebens(at)gmail.com


 

 

Zelfbouw elektronica projecten met LocoNet

Ik ben al een tijd bezig met zelfbouw projecten met LocoNet. Informatie  en voorbeelden met LocoNet toepassingen kan je al vinden op het web. Maar een deel heb ik toch zelf moeten uitzoeken. Daarom, voor geďnteresseerde zelfbouwers, dacht ik dat het wel zinvol was hier een webpagina over te starten met mijn ervaringen met zelfbouw LocoNet projecten.

LocoNet is redelijk technisch, ik ga er van uit dat de lezer goed vertrouwd is met digitale elektronica; seriële communicatie; elektronische schema’s en Microchip microcontrollers (PIC µC). De software is geschreven in assembler. Deze software is oorspronkelijk ontworpen om te gebruiken voor terugmelders. Het is de bedoeling de software verder uit te breiden om ook te kunnen dienen om LED’s; servo’s; relais enzovoort aan te sturen. Ik heb de intentie een deel van de software te herschrijven in C. (als mijn hobbytijd het toelaat ;) )

Het kan natuurlijk zijn dat ik fouten heb gemaakt, of er delen voor verbetering vatbaar zijn. Graag een seintje dan.
 

Belangrijk om weten:

Het modelspoor communicatie protocol LocoNet ® ontwikkeld door Digitrax Inc. heeft copyright op de inhoud van hun protocol. Digitrax geeft wel zelf aan dat dit protocol mag gebruikt worden voor persoonlijk gebruik.

Voor een uitleg van dit protocol verwijs ik naar Personal Use Edition 1.0 SPECIFICATION van Digitrax. Ik leg hier enkel uit hoe ik het protocol praktisch toepas. Weliswaar volg ik het protocol niet exact, maar ik stel wel vast dat mijn interpretatie werkt.

De zelfbouw terugmelders met LocoNet zijn getest met een Intellibox II van de firma Uhlenbrock. En de data op het LocoNet is gevisualiseerd via JMRI software. Ik kan niet garanderen dat de terugmelders ook samen met andere, al of niet commerciële, apparaten correct werkt. Ik kan niet aansprakelijk gesteld worden voor de schade die, rechtstreeks of onrechtstreeks, het gevolg is van informatie verkregen via deze site.

 

Project LocoNet terugmelders

De LocoNet terugmelder, zoals hierna beschreven, is zodanig vereenvoudigd dat deze zeer gemakkelijk in te stellen is. In combinatie met het volgende project: S88 LocoNet Master kan je een zeer betrouwbaar terugmeldsysteem samenstellen voor een centrale met enkel maar een S88 bus.
Later is het de bedoeling om de LocoNet terugmelder de mogelijkheid te bieden om meer complex te programmeren. Dit kan dan via gebruik makend van System Variable (SV).


Foto: de allereerste uitvoering van mijn LocoNet terugmelder.

 

Korte verklaring volgende schema’s:

Kleurgebruik: Het groene deel is het fysieke deel van LocoNet (Enkel dat deel van LocoNet waarop communicatie  signalen komen te staan is voorgesteld). Zwart is hardware al aanwezig in de gebruikte µC. Blauw is software ondergebracht in een Interrupt Service Routine (ISR). Bruine pijlen zijn bytes die onderling doorgeschoven worden voor verwerking. Paars zijn buffers en flag’s die data doorgeven tussen het ISR en het Main program.

In het Main program hebben we het rode deel dat LocoNet data opmaakt en/of verwerkt. Het oranje deel verwerkt de bezetmeldingen tot een terugmelding.

In de assembler code staat meer uitleg over de werking van de software. De gebruikte afkortingen in de schema’s zijn meestal deze zoals ook gebruikt in de assembler code.

Schema 1:

Dit deel is ondergebracht in een INCLUDE FILE en werkt na initiatie volledig autonoom. Dit deel zal voor elk toekomstig LocoNet project gebruikt worden om de communicatie te regelen via de LocoNet bus.

Ingang LocoNet Receiver: Onderaan is de Receiver voorgesteld. Deze leest al de bytes die opdagen op LocoNet bus. Dit inlezen gaat volledig hardware matig. Als een byte ingelezen is, zal de Receiver ISR7 oproepen voor verwerking van de ingelezen byte.  Bij het ontvangen van een LocoNet ‘Opcode’ (byte bit 7=1) synchroniseert ISR7 dat er een nieuwe reeks data bytes gaan volgen en hoeveel.  Ook zal ISR7 de byte opslaan in een Receive Buffer en een Cheksum uitvoeren.

Uitgang LocoNet Transmitter: Midden is de Hardware Transmitter voorgesteld. Deze staat in voor het verzenden van bytes op LocoNet bus. Elke byte die verzonden wordt, wordt ook ingelezen door de Receiver voor Collision Detect (CD) in ISR7. Indien Collision Detect  dan zal er een Line Break gecreëerd worden  op LocoNet bus.

Ingang LocoNet Flank: Het bovenste deel volgt het LocoNet bus signaal op, maar leest geen data in. Deze flank gestuurde ingang meet via een timer volgens het protocol, vastgelegde tijden. Dit deel is nodig om te bepalen wanneer een device data (indien nodig) mag gaan verzenden. Ook staat dit deel in voor de Reset Line Break, indien een device deze zelf heeft opgewekt.

 

Schema 2:

Dit is het MAIN program:

 

Procedure Transmitdata: Het rode deel stelt de LocoNet opcode en data bytes op, om een bezetmelding door te sturen op LocoNet. De gegevens hiervoor worden genomen uit het ‘device adres’ en ‘melder infobyte’ uit een terugmeld buffer.

Macro Bittest: Het principe van bezetmelding met µC kan je verder lezen. Bij elke nieuwe detectie (in/uit) wordt een unieke ‘melder infobyte’ samengesteld en opgeslagen in een terugmeld (ring) buffer klaar voor verzending door Procedure Transmitdata.

 

Schema 3:

Procedure Decodeerdata:  Het rode deel decodeert de LocoNet data. Er zijn 2 LocoNet opcodes van belang:

Opcode OPC_SW_REQ zal in combinatie met een door de gebruiker externe switch (brugje) het device adres instellen. Dit adres wordt gehaald uit databyte 2 (SW1). (zie verder)

Via opcode OPC_GPON is het mogelijk de toestand van al de bezetmelders (32) door te sturen op LocoNet bus. 

 

Instellen device adres:

Dit is zeer eenvoudig gehouden. Bij eerste gebruik zal een terugmeld device bereik ingesteld zijn van melder 1 tot 32. Als je nu een brugje zet op PROGRAM ADRES en je toetst op de INTELLIBOX II schakelcontact 2 in (of uit), en je verwijderd het brugje, dan zal het device adres ingesteld zijn voor melders 33 tot 64. Schakelcontact 3 stelt een device in voor melder adres 65 tot 96 enz… Het komt er op neer dat elk schakelcontact een bereik van 32 melders instelt. Maximaal kan je met schakelcontact 128 een device adres instellen voor melders 4065 tot 4096.  Het is deze vereenvoudiging, waar ik het hiervoor over had. (Het device adres is rechtstreeks gekoppeld aan individueel adres terugmeld ingang.)

Uit het device adres wordt Priority Delay (PD) samengesteld. PD is dan voor elk terugmeld device verschillend. De kans op Collision is dan ook zeer klein.

 

Principe bezetmelding met µC:

Het principe, zoals ik het al enkele jaren toepas, is al door verschillende modelspoor zelfbouwers met succes overgenomen. Een correspondent uit Italie heeft deze zelfs toegepast voor stroomdetectie. Zie LINK.

Via een eenvoudig algoritme wordt een ingang getest of deze al of niet bezet is. Een digitale condensator, eigenlijk een software teller die op en neer kan tellen tussen 0 en 255, houd bij hoelang een bepaalde ingangstoestand al aanwezig is. Bij massadetectie laad de digitale condensator zich op (0 --> 255), indien geen massadetectie ontlaad deze (255--> 0). Deze digitale condensator heeft hier dezelfde functie als een fysieke condensator, namelijk stoorsignalen eruit filteren. Ook kortdurend slecht wielcontact word hiermee opgevangen. Een softwarematige Schmitt trigger meld een bezetmelding aan als de digitale condensator 66% is opgeladen (teller=170), en meld een bezetmelding af als deze tot 33% is ontladen. (teller=85) Een nieuwe bezetmelding komt zo in na 20ms. Slecht wielcontact mag tot 20ms duren voordat de melder daarop reageert.  De Schmitt trigger zal per ingang een specifieke byte samenstellen met info welke ingang iets te melden heeft. Deze byte wordt in een terugmeld buffer geschoven voor verzending op LocoNet.

 

PCB’s:

Ik heb diverse PCB’s uitgetekend en getest. Het verschil zit hem in 2 dingen: gebruik van RJ12 connectoren in combinatie met RJ45 connectoren (RJ45 met strait netwerkkabel kwam mij voordelig uit omdat ik deze in grote hoeveelheden met diverse lengtes had liggen).  Het andere verschil zit hem in hoe het LocoNet signaal ingelezen wordt: Via een spanningsdeler (R-R) of via een opamp. Uit testen is gebleken dat bij een niet te grote modelbaan een spanningsdeler voldoende is. Bij veel grotere modelbanen is een opamp uitvoering meer aangewezen.
In principe heb je maar twee RJ12 connectoren nodig. Maar de PCB’s  zijn voorzien om er eventueel 4 te plaatsen om zo ook bijvoorbeeld in ster te kunnen werken. (Een S88 bus bijvoorbeeld is een lineaire bus, 1xS88 in- en 1xS88 uitgang. Als het ware 1 groot schuifregister waar de positie van elk device belangrijk is om te weten met welke terugmelder je te maken hebt. Bij LocoNet maakt dat niet uit. Je kan de devices in serie; ster of een combinatie ervan plaatsen.)

De PCB’s zijn allen enkelzijdig en zelf eenvoudig na te maken. (PCB lay-outs zie verder)

foto: de diverse uitvoeringen van de PCB

Hierboven versie 1: met spanningsdeler en 2 x RJ12 en 2 xRJ45

Hierboven versie 2: met spanningsdeler en 4 x RJ12 (draadbrugje rechtsboven dient enkel gelegd te worden als je deze RJ12 aansluiting gebruikt. Reden: anders kon ik de print niet enkelzijdig houden)

Hierboven versie 3: met opamp en 4 x RJ12 (draadbrugje dezelfde reden als versie 2)

 

Richtprijs zelfbouw:

De gebruikte onderdelen zijn niet duur. Om een idee te geven: (onderdelen aangekocht in een Duitse elektronica webwinkel; richtprijs anno juni 2015 voor versie 2)

PCB (enkelzijdig lichtgevoelig) 100x53mm = 1.63/3=0.543€ (1/3 euroformaat)  
Weerstanden 36 x 0.02=0.72€
SIL weerstanden 0.112 x 4=0.448€  
Transistor 0.041€
Spanningsregelaar 0.112€
PIC 16F1519 2.24€
Diode 0.02 x 2=0.04€
Condensators 2 x 0.06 = 0.12€
RJ12 aansluiting 0.25 x 2=0.5€
Male connector 2pin 0.09€ (brugje niet bijgerekend)  

Totaal (zonder connectoren) = 4.74€

Ik laat de keuze voor soort connectoren over aan de gebruiker. Er zijn vele soorten met diverse prijskaartjes. (rastermaat=2,54mm)

Opties:

IC voet 40 pin 0.122€
Male connector 6pin 0.027€ (optie voor aansluiting PICKIT)
Connector 4x8pin 0.3 = 1.2€ (zoals op foto)  

Totaal (met connectoren) = 6.09€ of 0.19€ per bezetmeld ingang!

 

Testopstelling:

Er is redelijk wat getest met de LocoNet terugmelders. Met JMRI software heb ik duurtesten gedaan om Collision te testen.  Zie filmpje

 

Software en hardware:

De mogelijkheid bestaat dat er nog altijd wijzigingen volgen.

PDF files voor printout koperzijde zijn bijgevoegd. (ik print ze af met een inkjet printer op kalkpapier)

terugmelder loconet.pdf

terugmelder loconet2.pdf

terugmelder loconet3.pdf

De PCB’s lay-outs zijn getekend met Eagle.

terugmelder loconet.sch
terugmelder loconet.brd

terugmelder loconet2.sch
terugmelder loconet2.brd

terugmelder loconet3.sch
terugmelder loconet3.brd

De assembler code kan je zelf compileren, of gebruik maken van de reeds gecompileerde HEX-file.

LOCONET_16F15xx.INC

LNTM_PIC16F1519_v6p0.asm

LNTM_PIC16F1519_v6p0.HEX

 


S88 LocoNet Master :

Een S88 bus heeft wel eens problemen, zoals ik dat kan afleiden op diverse modelspoor forums. LocoNet heeft een zeer betrouwbare communicatie. Niet elke centrale heeft een LocoNet aansluiting. Meestal wel een S88 aansluiting. Het is mogelijk een S88 bus via een µC om te vormen tot een LocoNet Master die LocoNet terugmelders kan inlezen. Met de LocoNet terugmelders zoals hiervoor beschreven kan je zo tot 16 devices inlezen = maximum 512 bezetmeldingen. (maximum dat een S88 bus aankan is 496) Waarom een Master? Omdat deze schakeling de stroom voorziet voor de LocoNet bus, en zich gedraagt als Master. In die zin dat deze altijd prioritair voorrang heeft op LocoNet bus t.o.v. de terugmeld devices.

Als je nu geen Intellibox hebt om device adres in te stellen, kan dit via een brugje te plaatsen op de S88 LocoNet Master. Hiermee zet je op LocoNet bus dezelfde schakel opdracht zoals de Intellibox dat doet. Er zijn 16 posities waar je telkens één brugje mag plaatsen. Het spreekt voor zich dat positie 1 device adres 1 instelt (melder1-32), positie 2 device adres 2 (melder33-64) enzovoort. Verder moet de 5V spanning, die je gebruikt van de S88 bus, verhoogt worden tot 12V. Als je nu de S88 verbinding tussen de centrale en S88 LocoNet Master kort genoeg houd, heb je een zeer betrouwbaar terugmeld systeem.

Komt het toch voor dat er LocoNet data verkeerd wordt ingelezen (Error Check) en de terugmeld device heeft dit niet zelf achterhaalt, dan weet de S88 LocoNet Master niet wie dit bericht heeft gestuurd. In dit geval zal de S88 LocoNet Master onmiddellijk opcode ‘OPC_GPON’ op LocoNet sturen. Al de LocoNet terugmelder devices gaan dan de meldtoestand op dat moment van elke ingang doorsturen.

De indicatie LED's 1,2 en 3 zijn er om het data verkeer te volgen. LED1 geeft aan dat de S88 bus goed werkt. Deze LED moet altijd branden. LED2 licht even op als er data op LocoNet bus verschijnt. En LED3 gaat aan als er iets mis is met LocoNet bus, zoals een Linebreak. (niet erg, als dit maar enkele keren voorkomt...)
Linksboven in onderstaand schema is er nog een brugje, dit is voorlopig bedoeld om een Error Check te simuleren. Later gaat dit dienen om nog meer devices van een adres te voorzien, o.a. voor stroomdetectie ...

Het ontwerp zit nog steeds in testfase. Later meer hierover...

 

UPDATE 12/1/2016: Om toch van wal te steken, hier al wat uitleg over de S88 bus in het ontwerp:

Meer info over de S88 bus kan je hier op deze site lezen.  We gaan van de S88 bus enkel de CLOCK en LATCH signalen gebruiken. Deze beide signalen zullen elk een ISR program oproepen. Bij een positieve flank van de S88_LATCH zal ISR de inhoud van een 64 byte S88_BUFFER kopiëren naar een 64 byte S88_SCHUIFREGISTER. De logische toestand van BIT0 van de eerste BYTE wordt hierbij al op uitgang S88_DATA_OUT geplaatst.  Bij een negatieve flank van S88_CLOCK zal ISR de volledige inhoud van de 64 byte S88_SCHUIFREGISTER één plaats opschuiven. Het doorschuiven gaat niet door als de S88_LATCH nog hoog is! De logische toestand van BIT0 van de eerste BYTE wordt hierbij elke keer op uitgang S88_DATA_OUT geplaatst. (Eigenlijk wordt eerst BIT1 van de eerste BYTE al op S88_DATA_OUT geplaatst, en pas daarna wordt er geschoven) Deze manier van aanpak geeft de meest stabiele data overdracht tussen S88 LOCONET MASTER en de centrale die de S88 bus bediend. Merk ook op dat er maar één S88 bus aansluiting aanwezig is, en dus geen S88 DATA IN. Wat niet wegneemt dat deze schakeling ook  mee opgenomen kan worden in een zuiver S88 netwerk, maar dan wel als laatste.

Ook aangepaste software!

De software van de LOCONET_16F15xx.INC file is weer verder geoptimaliseerd naar versie LOCONET_16F15xx_V2p0.INC. Zo zal LN_FLANK (pin PORTB0) niet meer gebruikt worden.  Ik ga hiervoor nog meer gebruik maken van de aanwezige hardware in de µC om bepaalde taken eenvoudiger uit te laten voeren.
 

 


Nieuw project?

Het volgend LocoNet project zal dicht in de buurt komen waar ik ooit naar toe wil, namelijk één PCB met diverse in en uitgangen. Om zo seinen (LED's), wissels (servo’s), bezetmelders, drukknoppen enz…  in te lezen/aan te sturen. Ik overweeg mijn nieuwe modelbaan op te bouwen uit diverse modules die gemakkelijk hanteerbaar zijn. We zien wel...

 

Geert