BeneluxSpoor.net forum

Vraag en antwoord => Digitaal => Topic gestart door: AP3737 op 08 January 2025, 22:11:20

Titel: Yet Another Servo Decoder
Bericht door: AP3737 op 08 January 2025, 22:11:20
Beste Forumlezers

In dit draadje wil ik iets vertellen over de servo decoder die ik momenteel aan het bouwen ben. Een aantal lezers denkt misschien "nog een servo decoder, is dat nodig?". Laat ik daarom beginnen met mijn motivatie hiervoor: ik stoor me aan de vele servo's die kabaal blijven maken, ook al staan ze stil.

Er zijn meerdere redenen waarom servo's die stilstaan toch lawaai  blijven maken. Naast de kwaliteit van de servo zelf, is het probleem vaak een slechte 5V servo voeding of een instabiel PWM-signaal. Ook een slechte afstelling van de eindpositie kan een probleem zijn, zeker als de servo slechts over een kleine hoek kan bewegen. Een goede servo decoder heeft daarom (volgens mij) de mogelijkheid om de servo spanning en/of het servo PWM signaal aan of uit te schakelen. Uiteraard moet zoiets netjes synchroon gebeuren, dus niet toevallig tijdens een puls.

De hard- en software ben ik zelf aan het maken. Hieronder twee foto's van de decoder. De eerste zoals die door JLCPCB bij mij aan de deur is afgeleverd, de tweede met alle componenten gemonteerd. Het gaat hier om een eerste test print, waarvoor ik, als ik het mij goed herinner, indertijd inclusief alles ongeveer 35 Euro heb betaald voor 5 printjes. Dit is echter niet de definitieve print; in een volgende versie zal ik een paar zaken aanpassen.
(https://images.beneluxspoor.net/bnls_2025/Servoprint-kaal-677ee8ea6e416.jpg) (https://images.beneluxspoor.net/bnls_2025/Servoprint-kaal-677ee8ea6e416.jpg)

(https://images.beneluxspoor.net/bnls_2025/Servoprint-Compleet-677ee8ea1ba57.jpg) (https://images.beneluxspoor.net/bnls_2025/Servoprint-Compleet-677ee8ea1ba57.jpg)

Wat opvalt is dat ik slechts 2 servo aansluitingen heb gemaakt, in plaats van 8, zoals je dat vaak elders ziet. Ik heb daarvoor twee redenen. De eerste is dat ik de kabeltjes naar de diverse servo's kort wil houden, om eventuele storingen te voorkomen. De tweede reden is dat servo's redelijk wat stroom kunnen trekken (meer dan 0,5A / servo, zie: https://www.youtube.com/watch?v=TszHV5l-uvg). Als 8 servo's gelijktijdig zouden bewegen, dan gaat er ergens iets mis.

Ik heb daarom gekozen voor een (TPS54331) Step-Down converter; dit is bij JLCPCB een basic part, is goedkoop en ruim voldoende. In de aanvoer leiding zijn twee weerstanden van 10 Ohm opgenomen, om de inrush stroom te beperken. Verder is de schakeling helemaal standaard.
(https://images.beneluxspoor.net/bnls_2025/Servo-Power-677ee8e97b9c2.png) (https://images.beneluxspoor.net/bnls_2025/Servo-Power-677ee8e97b9c2.png)

De 5V aansluiting van de servo kan aan en uitgeschakeld worden. Vaak neemt men daarvoor een MOSFET, maar ik heb een USB power IC genomen (LPW5209AB5F). Dat is (helaas) wel een extended part, maar kost bijna niets en heeft ingebouwde kortsluitingbeveiliging. Aan de uitgang zit een 10uF SMD-condensator, om de spanning stabiel te houden. Wat ik nog moet testen, is hoe snel dit geheel kan schakelen.

Ook voor de servo PWM leiding heb ik een (SN74LVC1G125DBVR) bus driver IC genomen (helaas ook een extended part). De Servo zit dus niet direct op een uitgang van de processor.
(https://images.beneluxspoor.net/bnls_2025/Servo-Aansluiting-677ee8e9745e9.png) (https://images.beneluxspoor.net/bnls_2025/Servo-Aansluiting-677ee8e9745e9.png)

De rest is relatief standaard, behalve dat ik voor het IC niet gekozen heb voor de vertrouwde 328 (Arduino Uno / Nano), maar voor een AVR DxCore processor. Dit is een relatief nieuwe processor, die (volgens mij) door Microchip een beetje gepushed worden als opvolgers van de Alom bekende Atmel ICs. Deze nieuwe generatie processoren zijn niet alleen goedkoper dan de oude, maar hebben ook veel betere peripherals, zodat voor een aantal taken veel elegantere oplossingen (= minder interrupts) mogelijk zijn.

Binnenkort verder.

Groet

Aiko
Titel: Re: Yet Another Servo Decoder
Bericht door: Karst Drenth op 08 January 2025, 23:25:02
Hoi Aiko,

Originele titel  ;D ;D


En origineel ontwerp (y)  Een DC-DC converter is idd de enige manier om een goede +5V te krijgen.

Alleen, het brommen in de eindstand is ook eenvoudig weg te nemen door het uitschakelen van de puls. Dat heeft als voordeel, dat je geen last krijgt van het "zwiepen"  van sommige servo's als de power er op komt.

Verder zou ik kiezen voor een snellere optocoupler voor je DCC.  Ik gebruik tegenwoordig alleen nog de TLP2358 van Toshiba. Mooi snel en subliemen flanken door de Push-Pull uitgang.

Maar dat power-switch IC is interessant ! Maakt de boel gelijk kortsluitvast (y) Ben wel benieuwd hoe je met die nieuwe uC een rotsvast PWM signaal gaat maken. Die dingen hebben idd leuke features aan boord.

Groet,
Karst

Titel: Re: Yet Another Servo Decoder
Bericht door: bask185 op 09 January 2025, 00:32:33
Leuk ontwerp. Ik ben wel nieuwsgierig naar waar al die connectoren voor zijn. Heb je DCC en power dubbel uitgevoerd om je bedrading makkelijker te maken?

Ik ben bij jlcpcb fan van de 6n137. Die is ook snel, tevens goedkoop en belangrijkste: ze hebben er ook een als 'prefered extended' part  (y). Die heeft me nog geen problemen gegeven.

Citaat
Er zijn meerdere redenen waarom servo's die stilstaan toch lawaai  blijven maken
vzik doen ze dat alleen als je ze pulsen blijft voeren. Ik laat ze tegenwoordig 500ms na het bereiken van de eindstand nog even doordrukken voordat ik de pulsen stop. Bij het finetunen met de knopjes methode vind ik dat fijn.

Citaat
waarvoor ik, als ik het mij goed herinner, indertijd inclusief alles ongeveer 35 Euro heb betaald voor 5 printjes
Is dat inclusief alle componenten die je er zelf op moet zetten?

Citaat
Als 8 servo's gelijktijdig zouden bewegen, dan gaat er ergens iets mis.
Dit is oplosbaar in software. Maar volgens mij is het ook een extreem uitzonderlijk scenario, dat je 8 servo's op 1 DCC decoder tegelijk kan laten bewegen. Met de multimaus red ik dat niet, misschien wel met iTrain. Maar ook daar zit standaard al iets van een vertraging tussen accessoire instructies.

Citaat
De rest is relatief standaard, behalve dat ik voor het IC niet gekozen heb voor de vertrouwde 328
Ik snap natuurlijk dat we voorruit moeten en oude chips vaarwel moeten zeggen op een gegeven moment. Maar ook de 328 hebben ze als een 'preferred extended' en voor deze simpele taak, 2 servo's en DCC decoderen.. It does get the job done. En arduino's servo library vind ik het goed doen. Ik gebruik die nog altijd. Ik weet eigenlijk niet in hoeverre Arduino die nieuwe dxcores ondersteunen.

Citaat
De eerste is dat ik de kabeltjes naar de diverse servo's kort wil houden
Dit probleem kan je wellicht goedkoper oplossen, door een setje van 2 printjes te maken die het signaal robuuster maken. Je kan dan bijvoorbeeld een zender maken die het signaal omzet naar een stroompje van 20mA ofzo en aan de ontvangende kant van dat stroompje weer een mooie 5V puls maken voor de servo.

(https://images.beneluxspoor.net/bnls_2025/afbeelding-677f09760c30b.png) (https://images.beneluxspoor.net/bnls_2025/afbeelding-677f09760c30b.png)

Als je langere servo kabels wel kan toepassen zonder problemen, kun je er meer op een decoder prakken. En dat scheelt kosten. En uiteraard microfoon snoer schijnt het ook erg goed te doen  ::). Ik heb ook wel eens een gerucht gelezen over aluminium folie om de kabel wikkelen, maar dat heb ik nog niet getest of gezien.

Wat bij het opstarten ook handig is om te doen bij servo's, is om eerst het signaal op de pin te zetten, dan de spanning in te schakelen en dan de puls weer uit te zetten. Dit zorgt er voor dat de servo's stil blijven staan bij het inschakelen (mits ze niet extern bewogen zijn terwijl de decoder uit was)  Die buck converter van je heeft een enable pin, die je daarvoor kan gebruiken. En anders doet een pull-up weerstand op de lijn ook een good job in servo's stil houden.

De uProcessor kan je in dat geval voeden met een extra LDO circuit.

Mvg,

Bas
Titel: Re: Yet Another Servo Decoder
Bericht door: Klaas Zondervan op 09 January 2025, 10:10:24
Dit probleem kan je wellicht goedkoper oplossen, door een setje van 2 printjes te maken die het signaal robuuster maken. Je kan dan bijvoorbeeld een zender maken die het signaal omzet naar een stroompje van 20mA ofzo en aan de ontvangende kant van dat stroompje weer een mooie 5V puls maken voor de servo.
Zo maak je iets wat al tamelijk ingewikkeld is nog ingewikkelder.

In het schema van Aiko zit een pull-up weerstand van 4k7 op de pulslijn. Het is effectiever om die weerstand dicht bij de servo te plaatsen. Zo maak je de signaallijn laagohmig en minder vatbaar voor externe stoorinvloeden.
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 09 January 2025, 20:33:55
Beste Karst, Bas en Klaas

Voordat ik verder ga, reageer ik eerst even op wat vragen en opmerkingen.

Originele titel  ;D ;D
Het duurde even voordat ik begreep waarom je de titel leuk vindt. Als excuus geldt dat ik nog geen koffie had gehad  ;D

Alleen, het brommen in de eindstand is ook eenvoudig weg te nemen door het uitschakelen van de puls.
In mijn volgende bijdrage kom ik daar op terug.

Verder zou ik kiezen voor een snellere optocoupler voor je DCC.  Ik gebruik tegenwoordig alleen nog de TLP2358 van Toshiba. Mooi snel en subliemen flanken door de Push-Pull uitgang.
Dank voor de suggestie. Ga ik waarschijnlijk doen bij een volgende versie.

Maar dat power-switch IC is interessant ! Maakt de boel gelijk kortsluitvast (y)
Ik moet eerlijk zijn: deze suggestie heb ik op het OpenDCC forum gekregen (dus niet zelf bedacht).

Ben wel benieuwd hoe je met die nieuwe uC een rotsvast PWM signaal gaat maken. Die dingen hebben idd leuke features aan boord.
In principe heel eenvoudig: ik gebruik de Compare Units (WO output) van de TCA timer(s). Ik ben daarvoor een nieuwe library aan het schrijven. Voordat ik die op GitHub zet, wil die nog wat verder testen met wat andere MegaTinyCore / DxCore processoren. Zie onderstaande foto met de Curiosity Nano's voor het test programma: AVR128DA48, AVR64DD32, AVR64EA48, MegaTiny 1, 2 en 3 series.
(https://images.beneluxspoor.net/bnls_2025/CuriosityNanos-678022ff5e428.jpg) (https://images.beneluxspoor.net/bnls_2025/CuriosityNanos-678022ff5e428.jpg)

Ik ben wel nieuwsgierig naar waar al die connectoren voor zijn. Heb je DCC en power dubbel uitgevoerd om je bedrading makkelijker te maken?
Precies. Dat doe ik bij veel van mijn decoders. Dan kan ik ze, als ik dat wil, mooi naast elkaar plaatsen.

Ik ben bij jlcpcb fan van de 6n137. Die is ook snel, tevens goedkoop en belangrijkste: ze hebben er ook een als 'prefered extended' part  (y). Die heeft me nog geen problemen gegeven.
Ik heb net even gekeken, maar die zit er ook op (LCSC C110020)

Ik laat ze tegenwoordig 500ms na het bereiken van de eindstand nog even doordrukken voordat ik de pulsen stop.
Zoals hierboven al aangegeven, kom ik daar in een volgende bijdrage op terug.

Is dat inclusief alle componenten die je er zelf op moet zetten?
Was dat maar waar  ;D

En arduino's servo library vind ik het goed doen. Ik gebruik die nog altijd. Ik weet eigenlijk niet in hoeverre Arduino die nieuwe dxcores ondersteunen
Afgelopen dagen ben ik behoorlijk diep in de standaard servo libraries gedoken en denk dat ik de werking wel begrijp. Het grote verschil met mijn aanpak is dat ze daar, in de ISR, de pulsjes in software genereren (digitalWrite()). Als er ook andere dingen op de processor draaien die interrupts genereren, kan de lengte van die pulsjes variëren (jitter). Verder is, bij de standaard libraries, de ISR erg omslachtig en duur (in CPU cycles). Je zou eens moeten lezen wat SpenceKonde daar op zijn GitHub DxCore over schrijft  ;D
Ik houd er juist van om nieuwe dingen te doen. DxCore is goedkoper dan de oude 328's 2560's, en heeft veel meer mogelijkheden. De 48/64 polige chips hebben 2 TCA timers, met ieder 3 hardware PWM kanalen (dus 6 in totaal). De oude 328 chips hebben slechts 2 hardware PWM uitgangen (en de 2560 is niet te betalen).

Wat bij het opstarten ook handig is om te doen bij servo's, is om eerst het signaal op de pin te zetten, dan de spanning in te schakelen en dan de puls weer uit te zetten.
Klopt. Kom ik op terug.

Zo maak je iets wat al tamelijk ingewikkeld is nog ingewikkelder.
Precies. Ik wil graag de bedrading zo simpel en overzichtelijk mogelijk maken. Ik zou inderdaad een printje op de servo kunnen plakken, met daarop de R en C. Om het simpel te houden heb ik daar niet voor gekozen.

Groet

Aiko
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 09 January 2025, 21:06:28
Ik had beloofd iets meer te vertellen over het aan en uitschakelen van het servo signaal. De ideeën heb ik hiervoor "geleend" van de OpenDCC site: https://www.opendcc.de/elektronik/opendecoder/servo_erfahrungen.html. Helemaal onderaan de pagina staan 6 methoden; ik heb daarvan opties 1, 2, 4 en 6 geïmplementeerd. Vooraf had ik methode 2, dus het hoog houden van de servo PWN leiding, nooit bedacht.

Ik heb voor mezelf wat documentatie gemaakt, zodat ik ook later nog weet hoe het werkt.

Onderstaand plaatje toont optie 1: het servo signaal blijft laag en komt vertraagd op. Om het PWM signaal laag of hoog te zetten, heb ik de servo library uitgebreid met een nieuwe methode: "constantOutput(value)" (de library is upwards compatible met bestaande servo libraries, maar heeft 2 extra methoden).
(https://images.beneluxspoor.net/bnls_2025/Start-1-6780273c6f23f.png) (https://images.beneluxspoor.net/bnls_2025/Start-1-6780273c6f23f.png)

Het is echter ook mogelijk de PWM output hoog te maken voordat het begint. Dat is dus optie 2. Alles is identiek, behalve dat "constantOutput" nu met de waarde 1 wordt aangeroepen.
(https://images.beneluxspoor.net/bnls_2025/Start-2-6780273c6f7b3.png) (https://images.beneluxspoor.net/bnls_2025/Start-2-6780273c6f7b3.png)

Tenslotte is het mogelijk het servo signaal uit te zetten. Vanzelfsprekend gebeurd dat, net als het aanzetten, netjes synchroon met het PWM signaal. Het PWM signaal zal dus nooit tijdens een puls worden aan of uitgezet. Om deze timing goed te krijgen, heb ik een tweede methode toegevoegd: "isReady()". Dit is een soort flag tussen ISR en gebruikersprogramma, en treedt synchroon met de puls exact iedere 20ms op. In plaats van 20ms, kan natuurlijk ook x maal 20ms gewacht worden met het uitschakelen van de 5V voor de servo.
(https://images.beneluxspoor.net/bnls_2025/Stop-67802896d69cf.png) (https://images.beneluxspoor.net/bnls_2025/Stop-67802896d69cf.png)

Voor mij het belangrijkste voordeel van de "isReady()" methode, is dat ik delay() statements in het hoofdprogramma niet meer nodig heb, De standaard voorbeelden in de servo library, zoals sweep.ino, gebruiken dergelijke delay() statements. Busy waiting is iets wat, in mijn opinie, een voorbeeld is van slecht programmeren. (Ja, ik weet dat je ook steeds de millis() timer kunt vragen. IsReady() vind ik wat intuïtiever).

Genoeg voor vandaag

Groet, Aiko
Titel: Re: Yet Another Servo Decoder
Bericht door: bask185 op 09 January 2025, 22:24:40
Ik snapte nooit waarom ze die pulsen in sequentie zetten. Het is ook wel grappig, als je alle 12 servo objecten naar 180 graden zet, dan klopt de frequentie niet eens meer  ::). Ik had ooit bedacht om alle pulsen tegelijk te starten dan te berekenen wie als eerste moet stoppen en zo voorts. Maar die arduino library doet het voor alsnog zo goed, dat ik er niet aan begonnen was. Ik heb eigenlijk nooit last van jitter.

Ik heb zelf wel een servoSweep library gemaakt. Daarin kon je min, max posities en snelheid opgeven. Hij maakt ook slim gebruik van het EEPROM geheugen. Die hardcoded min, max waardes worden alleen gebruikt als het EEPROM niet in orde is, dus bij een eerste keer opstarten na een nieuwe programma upload. Verder zitten er handige functies in om de posities te finetunen. En ik doe elke keer als de servo aangetuurd worden de stand opslaan. Dus of een 1 of een 0. Want dat zal je inmiddels wel doorhebben dat je bij het opstarten eerst wilt uitvogelen waar die servo was, voordat de spanning er af ging. Ik maak me ook niet echt zorgen dat ik ooit een keer tegen de max write cycles aanloop.

Citaat
De oude 328 chips hebben slechts 2 hardware PWM uitgange
Nee ze hebben er zes. Per hardware timer (3) kan je er 2 gebruiken. Ze hebben het ook wel slim gedaan in combinatie met millis() en micros(). Als je gaat bekijken wat de default instellingen zijn dan zie je dat de frequentie niet helemaal goed is voor millis() en micros(). Dat ISR doet om de zoveel iteraties een schikkel pulsje toepassen om te compenseren. Dat hebben ze bewust zo gedaan zodat je gelijktijdig de PWM kanalen van timer 0 en micros/millis kan gebruiken.

Zodra je ergens servo.attach aanroept werken die van timer 1 niet meer.

Side note:

Ik heb voor non-blocking delays ooit een leuke macro gemaakt. Hij gebruikt wel static en zodoende mag je niet hem toepassen in een class method. Maar ergens in je void loop of een functie kan die prima. Je hoeft niets ergens anders een object oid te declareren. Je kan dit zo neer plempen en dan werkt het.

#define REPEAT_US(x)    { \
                            static uint32_t previousTime ;\
                            uint32_t currentTime = micros() ;\
                            if( currentTime  - previousTime >= x ) {\
                                previousTime = currentTime ;
                                // code to be repeated goes between these 2 macros
#define REPEAT_MS(x)    { \
                            static uint32_t previousTime ;\
                            uint32_t currentTime = millis() ;\
                            if( currentTime  - previousTime >= x ) {\
                                previousTime = currentTime ;
                                // code to be repeated goes between these 2 macros
#define END_REPEAT          } \
                        }

En je loop kan je dan iets doen als

void loop()
{
    REPEAT_MS( 50 )
    {
        Serial.println("hello world") ;
    }
    END_REPEAT

    REPEAT_MS( 100 )
    {
        Serial.println("bye world") ;
    }
    END_REPEAT

Ik vond dat ff wat makkelijker dan een of andere timer library of task scheduler in te zetten  ;D.

Mvg,

Bas
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 10 January 2025, 10:25:19
Hi Bas

Je macro’s zijn wel leuk; ze maken de code wat leesbaarder. Misschien kan ik ze ook ergens wel gebruiken.

De traditionele 328 heeft één 16 bit timer, met twee compare units. Vandaar mijn opmerkingen dat je rechtstreeks (hardware) daarmee 2 servo’s kan sturen.

In de specificatie staat inderdaad wel dat het 6 PWM kan aansturen. Maar dat zijn dan 8 bit timers. Die zijn voor servo te onnauwkeurig en daarom niet bruikbaar als een bepaalde stand precies moet zijn, zoals bij wissels.

Je moet ergens een TOP waarde definiëren, zodat daar 20 ms in past. Je werkgebied is echter tussen 1 en 2 ms (544us / 2400us servo lib). Je resolutie is bij 8 bit te klein.

Groet, Aiko
Titel: Re: Yet Another Servo Decoder
Bericht door: Karst Drenth op 10 January 2025, 12:20:51
Ik had beloofd iets meer te vertellen over het aan en uitschakelen van het servo signaal. De ideeën heb ik hiervoor "geleend" van de OpenDCC site:

Komt me allemaal heel bekend voor ;) En lijkt verdacht veel op wat er in onze nieuwe YD8248 allemaal in te stellen is.

(https://images.beneluxspoor.net/bnls_2025/Servo-Props-Expert-678100b775674.png) (https://images.beneluxspoor.net/bnls_2025/Servo-Props-Expert-678100b775674.png)

En ja, RC-servo-sturing is een "wetenschap" op zich.  ;D

In de specificatie staat inderdaad wel dat het 6 PWM kan aansturen. Maar dat zijn dan 8 bit timers. Die zijn voor servo te onnauwkeurig en daarom niet bruikbaar als een bepaalde stand precies moet zijn, zoals bij wissels.

Je moet ergens een TOP waarde definiëren, zodat daar 20 ms in past. Je werkgebied is echter tussen 1 en 2 ms (544ms / 2400ms servo lib). Je resolutie is bij 8 bit te klein.

o.a. daarom gebruik ik voor de PWM generatie de PCA9685. Die kan ook netjes de 20ms verschuiving voor z'n rekening nemen. Stuur het ding aan via I2C, ruim snel genoeg om "zo nu en dan" een PWM waarde te sturen ;) Resultaat zijn absoluut stabiele servo pulsen en zonder enige jitter.  (y) Zo hebben we voor de standaard 90 graden range 512 stapjes, voor de 180 graden zelfs 1024. En dat is ruim meer resolutie dan de meeste servo's kunnen "weergeven".

Grtzz,
Karst
Titel: Re: Yet Another Servo Decoder
Bericht door: Menno op 10 January 2025, 23:55:59
[..]maar ik heb een USB power IC genomen (LPW5209AB5F). Dat is (helaas) wel een extended part, [..]
 heb ik een (SN74LVC1G125DBVR) bus driver IC genomen (helaas ook een extended part).
Wat betekent dat in vredesnaam? Ik zit voor m'n werk in de professionele elektronica (en heb daar een pittige cursus voor moeten volgen voor elk denkbaar probleem met printmateriaal en reparaties daar aan) maar deze term zegt me niets. (en dat zegt dan wel weer wat...)
Titel: Re: Yet Another Servo Decoder
Bericht door: bask185 op 11 January 2025, 00:05:06
Bij JLCPCB hebben ze iets van zoveel duizend rollen standaard in de assemblage lijnen zitten. Dat noemen zij basic parts.

Voor alles wat niet basic is, moeten zij een rol in de machine stoppen en dat kost 3$ aan arbeid fee.

Als je 5 printen bestelt met 5 extended parts. Kost elke print al 3$ meer vanwege deze extra kosten. Bestel je 50 printen, kost het per print maar 0.30$ meer.

Daarnaast hebben ze ook preferred extended parts. Ook voor deze moeten ze rollen wisselen maar dan zonder de 3$ rollen wissel fee.

Zo bestaat mijn spoeldecoder exclusief uit basic/preferred extended onderdelen met uitzondering de screwterminals. Dat maakt ze al vanaf kleine oplages al bijzonder goedkoop om te laten maken.

Mvg,

Bas
Titel: Re: Yet Another Servo Decoder
Bericht door: Dirk op 11 January 2025, 11:42:55
Wat betekent dat in vredesnaam? Ik zit voor m'n werk in de professionele elektronica (en heb daar een pittige cursus voor moeten volgen voor elk denkbaar probleem met printmateriaal en reparaties daar aan) maar deze term zegt me niets. (en dat zegt dan wel weer wat...)

Over je cursus? 
 :)
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 11 January 2025, 14:22:30
Komt me allemaal heel bekend voor ;) En lijkt verdacht veel op wat er in onze nieuwe YD8248 allemaal in te stellen is.
Mooi ding en met veel mogelijkheden.  :)
Ik "leen" veel van mijn ideeën van OpenDcc, en wil dus ook van hen de voorgeconfigureerde bewegingsprogramma's (armsein die nog na beweegt, ....) overnemen. Ik dacht niet dat jij dat hebt gedaan. Heb je daar een speciale reden voor?

Misschien een ideetje (die ik nog ga implementeren). Bij wisselaandrijving met Servo is het instellen van de beide uiterste standen vaak wat onhandig. Bij sommigen decoders krijg je wat knopjes, waarmee dat kan, maar dan weet ik nooit welk knopje ik nu weer moet drukken. Daarom wil ik het volgende doen: een ESP32 via een connector (en kort draadje) met de decoder verbinden. De ESP32 werkt dan als web server, zodat je met je mobieltje (gewone web pagina's) alle instellingen kan doen, met je neus bovenop de wissel. Lijkt me handig.

o.a. daarom gebruik ik voor de PWM generatie de PCA9685. Die kan ook netjes de 20ms verschuiving voor z'n rekening nemen. Stuur het ding aan via I2C, ruim snel genoeg om "zo nu en dan" een PWM waarde te sturen ;) Resultaat zijn absoluut stabiele servo pulsen en zonder enige jitter.  (y) Zo hebben we voor de standaard 90 graden range 512 stapjes, voor de 180 graden zelfs 1024. En dat is ruim meer resolutie dan de meeste servo's kunnen "weergeven".
De PCA9685 is een mooi IC daarvoor. Zie je ook in een aantal Arduino servo projecten. Ik neem aan dat jij vooral de mogelijkheid wilt hebben om goedkoop/vanuit 1 decoder 16 servo's aan te sturen (samen met de YD8291), en daarom voor dit IC hebt gekozen. Of zijn er ook andere redenen waarom je hiervoor hebt gekozen. Met andere woorden: wat kan de PCA9685 dat ik niet met de 16-bit timer in de processor kan (behalve dus meer kanalen).

@Bas: Bedankt voor de uitleg. Had ik niet beter kunnen doen :-)

Groet, Aiko
Titel: Re: Yet Another Servo Decoder
Bericht door: Jeroen Vreeken op 11 January 2025, 14:34:02
Bij wisselaandrijving met Servo is het instellen van de beide uiterste standen vaak wat onhandig. Bij sommigen decoders krijg je wat knopjes, waarmee dat kan, maar dan weet ik nooit welk knopje ik nu weer moet drukken.

Ik heb dat bij mijn servo decoder analoog gedaan. De atmega328 heeft 8 analoge ingangen en die gebruik ik om de eindstanden van de 4 pwm uitgangen te bepalen.
Afstellen is dan simpelweg een wissel poort activeren en dan aan de potmeter draaien tot de stand van het wissel goed is.
(https://images.beneluxspoor.net/bnls_2023/koffer-servo-6588c9424a01c.jpg)
Titel: Re: Yet Another Servo Decoder
Bericht door: Karst Drenth op 11 January 2025, 16:12:51
Ik "leen" veel van mijn ideeën van OpenDcc, en wil dus ook van hen de voorgeconfigureerde bewegingsprogramma's (armsein die nog na beweegt, ....) overnemen. Ik dacht niet dat jij dat hebt gedaan. Heb je daar een speciale reden voor?

Heb ik wel ;) (uiteraard instelbaar :P )

(https://images.beneluxspoor.net/bnls_2025/Servo-Props-Settings-67828821ee464.png) (https://images.beneluxspoor.net/bnls_2025/Servo-Props-Settings-67828821ee464.png)

Tevens massa-traagheid emulatie ( langzaam starten en stoppen )


De PCA9685 is een mooi IC daarvoor. Zie je ook in een aantal Arduino servo projecten. Ik neem aan dat jij vooral de mogelijkheid wilt hebben om goedkoop/vanuit 1 decoder 16 servo's aan te sturen (samen met de YD8291), en daarom voor dit IC hebt gekozen. Of zijn er ook andere redenen waarom je hiervoor hebt gekozen. Met andere woorden: wat kan de PCA9685 dat ik niet met de 16-bit timer in de processor kan (behalve dus meer kanalen).

De PCA is een universeel PWM chip. Naast de Servo pulsen, stuur ik er ook de resterende uitgangen mee aan. De YD8248 bevat als het ware een "halve" YD8116. En ja, 16 Kanalen is dan een pré ;)

Waarvan de decoder er maximaal 12 gebruikt. kanaal 1-4 puur en alleen servo, 9-16 met een "triple" functie: Servos, Relais of LEDs.

Ik heb dat bij mijn servo decoder analoog gedaan. ...
Afstellen is dan simpelweg een wissel poort activeren en dan aan de potmeter draaien tot de stand van het wissel goed is.

Ook dat kan de YD8248. Er zijn 4 beschikbare analoge ingangen die aan 0 of meerdere servo's toegewezen kunnen worden. ( zie plaatje hierboven ) Maar dat beperkt zich niet tot het instellen. De servo's kunnen er ook Analoog mee bediend worden. Dezelfde functie is ook Digitaal beschikbaar via een zelf te kiezen loc-adres, de servo draait dan mee met de stand van de (hand)regelaar. Tot slot, kan een servo ook nog als "Direct-DCCext" digitaal aangestuurd worden. Dat maakt het mogelijk om b.v. uit iTrain direct de stand van de servo te besturen.

Grtzz,
Karst
Titel: Re: Yet Another Servo Decoder
Bericht door: Karst Drenth op 11 January 2025, 16:43:06
Om bovenstaande te demonstreren: ;) een paar filmpjes.


https://youtube.com/v/cZTTgE4rfvs

Sein met "stuiteren" ;)



https://youtube.com/v/Z4kVSUMWT4s

Slagbomen met flink stuiteren :P en massa-simulatie.  8) De knipperlichten zitten in dezelfde pre-def als de slagbomen:

(https://images.beneluxspoor.net/bnls_2025/Crossing-Pre-Def-678290267201f.png) (https://images.beneluxspoor.net/bnls_2025/Crossing-Pre-Def-678290267201f.png)



https://youtube.com/v/f9u2jSisnCk

"Licht" functies. Outputs worden in LED mode aangestuurd.


Dit alles, plus nog een wissel met puntstuk-polarisatie volgens het 2-relay principe ( want oude Tillig Elite wissel ), wordt met maar 1 YD8248 aangestuurd. ( en er is zelfs nog  1 uitgang vrij :D :D )

(https://images.beneluxspoor.net/bnls_2025/Demo-Summary-678290b5c4eb4.png) (https://images.beneluxspoor.net/bnls_2025/Demo-Summary-678290b5c4eb4.png)

Zo ziet de bezetting er dan uit. :)


@aiko, excuus voor het "kapen" van je draadje. Maar dit is dé Servo-Decoder van de "echte "Yet Another...." ;) :P

Grtzz,
Karst
Titel: Re: Yet Another Servo Decoder
Bericht door: Ben op 11 January 2025, 17:04:07
Nice.....  (y)
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 11 January 2025, 20:47:18
@aiko, excuus voor het "kapen" van je draadje. Maar dit is dé Servo-Decoder van de "echte "Yet Another...." ;) :P
Zolang je dit soort leuke filmpjes blijft posten, ga zo door :)
Er kan veel met je decoder, en wat uitleg kan geen kwaad.  :)
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 12 January 2025, 16:51:58
Zo, we zijn weer een dagje verder. Mijn TCA Servo Library heb ik nu ook getest op de ATtiny 0, 1  en 2 series. Alles ging goed, tot het kiezen van de alternatieve pinnen voor de Waveforem Outputs (WO, Compare Units). Ik ben daarmee de hele dag bezig geweest, om na vele uren er achter te komen dat ik een kleine typefout had:
PORTMUX.TCAROUTEA |= PORTMUX_TCA0_2_bp; had
PORTMUX.TCAROUTEA |= PORTMUX_TCA0_2_bm; moeten zijn.
Iedereen die wel eens programmeert zal dat herkennen: uren bezig om dan een onbenullige typo te vinden.

Anyway, en kan nu verder met de AVR-DD en EA processoren. Probleem daarbij is dat voor deze processoren de standaard uploader op de Curiosity Nano's niet door DxCore ondersteund wordt / een nieuwe versie van avrdude geïnstalleerd moet worden. Ik zie wel hoe ik dat ga oplossen / hoeveel tijd me dat gaat kosten  ::)

Groet, Aiko
Titel: Re: Yet Another Servo Decoder
Bericht door: Karst Drenth op 12 January 2025, 19:47:53
PORTMUX.TCAROUTEA |= PORTMUX_TCA0_2_bp; had
PORTMUX.TCAROUTEA |= PORTMUX_TCA0_2_bm; moeten zijn.
Iedereen die wel eens programmeert zal dat herkennen: uren bezig om dan een onbenullige typo te vinden.

Ja... de naamgeving in de headers is niet altijd even gelukkig gekozen door Atmel :'(

Grtzz,
Karst
Titel: Re: Yet Another Servo Decoder
Bericht door: bask185 op 12 January 2025, 22:29:20
Gebruiken jullie nooit chatgpt voor simpele code reviews. Hij kan vaak ook assisteren met bug zoeken. Dingen als typo's vindt hij gewoon. Ik laat hem ook wel eens python scriptjes maken voor simpele dingen zoals PDF's van schema's te maken, licenties aan libraries toevoegen, ander simpel 'grunt work'. Natuurlijk vertrouw ik dat ding niet blindelings. Maar als dat ding zegt: deze regel heeft een typo of je hebt hier = ipv == getikt. Dan kan je minstens kijken of die gelijk heeft.

Citaat
Ik ben daarmee de hele dag bezig geweest
Jij liever dan ik. Ik heb na een dag werk, in dat soort dingen geen zin of fut meer. Daarom wil ik eigenlijk geen moeite doen om reeds bestaande wielen zoals servo en DCC libraries opnieuw uit te vinden als ik dat simpelweg niet hoef.

Ik heb het programma van mijn 8 voudige servo decoder gebouwd/samengesteld in ~45 minuten. Deze 3 regels alleen al vormen al 80% van wat de code daadwerkelijk moet doen.
#include nmradcc.h
#include servoSweep.h
#include debounce.h

Er zat wel geteld 1 hele bug in, en die kwam uit de nmra library ook. Die doet funny dingen met je EEPROM omtrent cv29 bij de initialisatie. Gevolg was dat servo object 3 als enige in het array zijn standen niet kon onthouden. Ik moest meteen aan die nmra library denken, omdat die de enige verdachte was. Even een EEPROM.write in commentaar zetten got the job done.

Maar nu kijk ik een gegeven paard niet in de bek. Ja die library is.. omslachtig neergekalkt en dat EEPROM verrampineren is ook erg "bijzonder" om dat zo te doen. Maar verder doet het wat het ook wat het moet doen. Ik moest een kleinigheidje er in hacken dat je gelijktijdig loc als accessoire instructies kon verwerken.

En als ik ooit een keer een programma geheugen probleem heb, kan ik er nog voor kiezen alles te strippen waar het woord CV in staat. Dat gebruik ik sws niet.

Mvg,

Bas
Titel: Re: Yet Another Servo Decoder
Bericht door: Karst Drenth op 12 January 2025, 22:36:13
Citaat van: bask185
Ik heb na een dag werk, in dat soort dingen geen zin of fut meer. ....

Gut, gut, gut Bas,

Wat mag jij ontzettend blij zijn dat ik nooit je chef geweest ben of dat zal worden....  ::) ::)
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 13 January 2025, 15:13:48
 ;D ;D ;D

@Bas: ik betwijfel of ChatGPT deze fout eruit had gehaald. Maar ik ben altijd bereid om dat te proberen. Hoe doe ik dat? (Een link met) het programma in ChatGPT posten, en dan vragen "beste ChatGPT, kan jij voor mij de fout vinden waarom de mutiplexer het niet goed doet? Of doe je dat via GitHub??

Tja, ieder heeft zo zijn/haar eigen hobby's. Ik ben misschien nog van de oude school, voor wie programmeren nog iets heeft van "schoonheid". Net als een kunstenaar, moet het resultaat "goed voelen". Het gaat bij mij niet om zo snel mogelijk, maar om zo goed mogelijk. Dat is voor mij de hobby. Ik begrijp dat anderen daarin anders kunnen staan.

Groet, Aiko
Titel: Re: Yet Another Servo Decoder
Bericht door: Karst Drenth op 13 January 2025, 21:34:26
...Ik ben misschien nog van de oude school, voor wie programmeren nog iets heeft van "schoonheid". Net als een kunstenaar, moet het resultaat "goed voelen". Het gaat bij mij niet om zo snel mogelijk, maar om zo goed mogelijk. ...

Inderdaad, schoonheid en elegance. Als je dat bereikt, is de code bijna vanzelf goed ;) En ja... idem, ook van de oude, Edsger Dijstra school ;)


Citaat van: AP3737
Zolang je dit soort leuke filmpjes blijft posten, ga zo door :)

Ok, dan komen er weer twee :P
https://youtube.com/v/wGxJgfM_BRY

https://youtube.com/v/sPVtVtUifag 

Dit keer van de langzaam aan beroemd/beruchte Faller segment-draaijschijf.
Ik had e.e.a. al een tijdje klaar, maar het was niet om aan te zien en al helemaal niet om aan te horen. De brug schokte en het geluid leek wel op een AK47 :O
Ik begon al aardig aan het aansturingsalgorithme te twijfelen, maar zag toen een YT filmpje met dezelfde verschijnselen. De oplossing daar was het vervangen van de bijgeleverde, originele Faller Servo.
En wel door een MG996E/180 van tante AliE. ;) 4 Van die servos kosten 24 Euro, dus de wat "duurdere" van AliE. Maar wel: Digitaal, 180 Graden en metalen tandwielen.
Het resultaat is zie zien en (niet) te horen in de filmpjes.

Grtzz,
Karst

P.S. De schijf loopt in de videos nog wat snel, dat heb ik inmiddels vertraagd. Dat ging nu ook goed (y)
Titel: Re: Yet Another Servo Decoder
Bericht door: bask185 op 13 January 2025, 22:26:53
Citaat
Hoe doe ik dat?
Het is gewoon een chat. Je gaat gewoon naar chatgpt.com, je kan met je google acount inloggen anders maak je een acount en dan kan je vragen stellen en opdrachten geven. Als je een beschrijving van je probleem geeft en code in de chat plakt, kan die je soms helpen. Het is echt best simpel. En zoals ik al zei python maken, of HTML is dat ding redelijk bedreven in, maar je moet wel testen. Soms maakt die onzin. Ik test hem wel eens uit. Ik gaf hem een stukje DCC code waarin pakketjes werden samengesteld. Ik liet 'it' er ook eentje maken, maar hij kreeg het niet voor elkaar.

Het was hem na een whopping 10 iteraties wel gelukt om automatische COM poort herkenning toe te voegen aan m'n batch files. Ik ben zo onbekend met batchnees, dat zou mij 10 avonden kosten ofzo  ;D

Citaat
Misschien een ideetje (die ik nog ga implementeren). Bij wisselaandrijving met Servo is het instellen van de beide uiterste standen vaak wat onhandig. Bij sommigen decoders krijg je wat knopjes, waarmee dat kan, maar dan weet ik nooit welk knopje ik nu weer moet drukken. Daarom wil ik het volgende doen: een ESP32 via een connector (en kort draadje) met de decoder verbinden. De ESP32 werkt dan als web server, zodat je met je mobieltje (gewone web pagina's) alle instellingen kan doen, met je neus bovenop de wissel. Lijkt me handig.
Dat is ook heel handig. Ik stond deze week op Rijswijk en ik heb 2 manieren ingebouwd om servo's in te regelen, heb ik ook een instructie filmpje van. Naast de knopjes, had ik de methode met de rijregelaar ook ingebouwd. Ik moest even 10 van die dingen ff inregelen. Ik kon dus vanaf boven mooi naar de wissels kijken en met de multimaus die ik had, kon ik mooi makkelijk met de draaiknop de servo arm aansturen. F1 om gebogen stand in te leren, F2 om recht in te leren. Het inleren ging rete snel en dit werkt met elk DCC systeem.

Zo'n WLAN ding lijkt me opzich ook wel leuk, want die kan je immers voor al je te maken apparaten gebruiken en je hebt een GUI.  Maar ik wilde dan weer niet die afhankelijkheid maken van een tool die je er dan bij moet nemen. Daarom begon ik met knopjes en voegde later die rijregelknop methode toe.

Maar met een WLAN throttle zijn of een phone met een app, kan dat inregelen ook al draadloos zoals het nu is. Een GUI is zeker leuk, maar nodig voor een servo decodertje? maybe.

Het allerlaatste wat ik wil is de noodzaak van een computer ofzo. Ik moet er niet aan denken dat ik met een laptop al die decoders langs moet om een instelling aan te passen. En ik zag nu ook, gezien de opbouw van de bak in kwestie, de knoppen waren nu niet de handigste methode, dat was de rijregelaar methode. De enige conditie waar je aan moet voldoen, is dat de servo vleugel op ongeveer 90 graden gemonteerd wordt. Maar dat geldt voor meer servo decoders vzik.

Mvg,

Bas
Titel: Re: Yet Another Servo Decoder
Bericht door: Karst Drenth op 14 January 2025, 23:02:39
....En ik zag nu ook, gezien de opbouw van de bak in kwestie, de knoppen waren nu niet de handigste methode, dat was de rijregelaar methode.

Ik ken heel toevallig de man die dat al in 2007 bedacht had en die methode sindsdien in duizenden verkochte servo-decoders zit. Zelfs "de concurrenten" hebben dat deels overgenomen.

Grtzz,
Karst
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 15 January 2025, 11:01:49
Gisteren ben ik bezig geweest met het testen van de servo code voor de TCA timers op de (relatief) nieuwe AVR-EA processoren. Ik had daarbij problemen dat de Multiplexer, dus het onderdeel waaraan je kan vertellen op welke pinnetjes van de chip de PWM signalen moeten komen. Het probleem was dat die Multiplexer soms een verkeerde poort koos. Uiteindelijk bleek het zo te zijn dat de Arduino (Dx)core voor de AVR-EA chips een andere default poort kiest als voor de Dx processoren. Achteraf is alles logisch, maar het duurt (bij mij) soms even voordat de logica doordringt.

Het is gewoon een chat. Je gaat gewoon naar chatgpt.com, je kan met je google acount inloggen anders maak je een acount en dan kan je vragen stellen en opdrachten geven.
Ik heb daar gisteren ook wat mee gespeeld. Maar voor de dingen waar ik nu mee bezig ben, levert het niets op (ik laat mij graag van het tegendeel overtuigen, dus ....  ::)).
AI en dus ook ChatGPT moet eerst met data gevoerd worden zodat het kan leren. Voorbeelden als shell-scripts (die al bijna 50 jaar bestaan) en webcode, waar het Internet mee vol staat, is al lang als "leermateriaal" aan ChatGPT aangeboden. ChatGPT is dus uitstekend in het presenteren van bestaande kennis.
Als je echter nieuwe dingen probeert, die nog niet als "leerstof" aan ChatGPT zijn aangeboden, dan komt ChatGPT niet met zinnige resultaten. Bij het soort problemen waarmee ik nu bezig ben, krijg ik verwijzingen naar een aantal Microchip "manuals" die ik al lang ken.

Inderdaad, schoonheid en elegance. Als je dat bereikt, is de code bijna vanzelf goed ;) En ja... idem, ook van de oude, Edsger Dijstra school ;)
Leuk dat je Dijkstra zo noemt; Nederlands beroemdste informaticus. Door je opmerking ben ik wel even gaan nadenken door wie ik dan vooral beïnvloed ben. Omdat ik van de Twentse School ben, zijn het bij mij vooral Gerrit Blaauw en Chris Vissers geweest. Blaauw was de hardware architect van de IBM-360, en leerde mij "orthogonaal ontwerp". Chris Vissers, voor wie ik nog lang heb mogen werken, zei vaak "het is een aardige jongen, maar geen echter Architect". Hij zag het ontwerpen van ICT systemen als kunst, zoals het ontwerpen van een huis. Je kan zelf wat stenen op elkaar metselen en hier en daar een raam monteren. Maar je kan ook een architect vragen, waardoor het veel mooier en beter wordt.

Dit keer van de langzaam aan beroemd/beruchte Faller segment-draaijschijf.
Ik had e.e.a. al een tijdje klaar, maar het was niet om aan te zien en al helemaal niet om aan te horen. De brug schokte en het geluid leek wel op een AK47 :O
Ik begon al aardig aan het aansturingsalgorithme te twijfelen, maar zag toen een YT filmpje met dezelfde verschijnselen. De oplossing daar was het vervangen van de bijgeleverde, originele Faller Servo.
En wel door een MG996E/180 van tante AliE. ;) 4 Van die servos kosten 24 Euro, dus de wat "duurdere" van AliE. Maar wel: Digitaal, 180 Graden en metalen tandwielen.
Wat je, terecht, aangeeft, is dat het niet de decoder alleen is, maar ik de servo zelf. Maar hoe weet je nu als gewonen modelbouwer welke servo's wel goed zijn en welke niet. Duurder hoeft niet per definitie beter te zijn. Iets wat in grote aantallen gemaakt wordt (zoals de SG90) kan goedkoper en daardoor misschien ook wel beter zijn dan iets waarvan maar een paar worden gemaakt. Zijn er, naast persoonlijke ervaringen, nog objectieve criteria die je als gewone modelbouwer kan gebruiken bij je keuze?

Groet, Aiko
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 19 January 2025, 17:10:42
Op GitHub heb ik nu een eerste versie van mijn servo library gezet: https://github.com/aikopras/Servo-TCA
Deze eerste versie is upwards compatible ten opzichte van de bestaande, standaard servo library's, en heeft als belangrijkste verschil dat het gebruikt maakt van de TCA timer op moderne 8-bit AVR-processoren(DxCore, megaTinyCore), waardoor het puls-signaal jitter-vrij is. Ik heb het nu met diverse processoren getest, en deze eerste versie lijkt goed te werken.

Voor de technisch geïnteresseerden heb ik hieronder 3 plaatjes toegevoegd, die laten zien wanneer precies de pulsjes worden gegenereerd als we meerdere servo's hebben aangesloten.

Het eerste plaatje hieronder toont de standaard servo library. Het illustreert dat de pulsjes voor verschillende servo's onmiddellijk na elkaar worden gegenereerd (D1 en D2). Dat wordt ook duidelijk als we de code voor de Interrupt Service Routine (ISR) van deze library bestuderen. Als er een timer interrupt optreedt, zet de ISR de puls voor de huidige servo uit (digitalWrite), en daarna de puls voor de volgende servo aan. Ook krijgt de timer een nieuwe waarde, die past bij de gewenste pulsbreedte voor deze nieuwe servo.
(https://images.beneluxspoor.net/bnls_2025/UNO-Standard-Servo-Library-678d1ac5be34a.png) (https://images.beneluxspoor.net/bnls_2025/UNO-Standard-Servo-Library-678d1ac5be34a.png)

De servo library van MoBaTools doet het, zoals uit onderstaand plaatje blijkt, wat anders. De pulsjes voor opeenvolgende servo's (W0, W1) vallen gedeeltelijk over elkaar heen. Het risico dat daarbij bestaat, is dat er eventjes stroom aan meerdere servo's moet worden geleverd, waardoor de servo voedingsspanning kan inzakken.
(https://images.beneluxspoor.net/bnls_2025/Mobatools-678d1ac59ea16.png) (https://images.beneluxspoor.net/bnls_2025/Mobatools-678d1ac59ea16.png)

Om dat laatste probleem te voorkomen, heb ik bij mijn library getracht de pulsjes voor meerdere servo's (W0, W1, W2) zo goed mogelijk over de tijd te spreiden. Mijn doel is de voeding voor de servo's zo gelijkmatig als mogelijk is, te belasten, zodat deze stabiel blijft.
(https://images.beneluxspoor.net/bnls_2025/TCA-Pulses-678d1ac62143e.png) (https://images.beneluxspoor.net/bnls_2025/TCA-Pulses-678d1ac62143e.png)
Het plaatje hierboven laat ook zien dat ik niet één ISR per 20ms nodig heb, maar (bij 3 servo's) drie ISRs per 20ms. Deze extra ISRs zijn nodig om de pulsjes over de tijd te kunnen spreiden. Ik had ook voor 1 ISR per 20ms kunnen kiezen, maar dan zouden de pulsjes voor de verschillende servo's precies gelijk beginnen. Dat wil ik dus niet.

Nu we het toch over ISRs hebben: ook bij de standaard servo library's is het aantal ISRs per 20ms niet één, maar één plus het aantal servo's (dus 1 meer dan bij mijn library). Bij mijn library kost een ISR ongeveer 6us (24Mhz processor), bij de standaard servo library varieert dat tussen de 10 en 20us (16 Mhz processor).

Zoals gezegd is dit nog maar een eerste versie van de library. De volgende stap is een uitbreiding met typische modelbaan specifieke functies, zoals de servo langzame bewegingen te laten maken, massatraagheid, pulsjes en/of spanning aan of uit te zetten etc. Hiervoor wil ik (dank aan C++) een nieuwe Class maken, die de bestaande Servo Class (inheritance) uibreidt met de gewenste nieuwe functies. Als ik geen onverwachte dingen tegenkom, zou deze nieuwe Class ook met bestaande servo libraries moeten kunnen werken. We zullen zien.

Groet, Aiko
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 15 June 2025, 16:28:52
Beste lezers

Het heeft lang geduurd, maar de servo decoder is nu "af". Het is behoorlijk complexe software geworden, maar ik ben tevreden. De code en een link naar de hardware is te vinden op GitHub: https://github.com/aikopras/AVR-Servo-2 (https://github.com/aikopras/AVR-Servo-2).

Nog even ter herinnering: ik ga niet voor een makkelijke en snelle implementatie, maar voor een kwalitatief hoogwaardige servo decoder. Daarom worden de servo pulsen door een PWM timer gemaakt om jitter te voorkomen. De servo puls, maar ook de servo voeding, kunnen in en uitgeschakeld worden, zodat er geen lawaai is als de servos in rust zijn. In de servo puls-leiding zit een driver, en de servo voedingslijn gaat via een USB power IC, en is kortsluit vast.

Wat ik zelf aardig vind, is dat de servo voorgedefinieerde curves kan aflopen; dat idee (en de curves) heb ik van OpenDCC. Hieronder de curve die ik standaard gebruik voor wissels.
(https://images.beneluxspoor.net/bnls_2025/02-move-A-684ed2365f47a.png) (https://images.beneluxspoor.net/bnls_2025/02-move-A-684ed2365f47a.png)

Er is keuze uit 12 curves, maar de gebruiker kan natuurlijk ook zelf een curve maken en in EEPROM zetten. Daarvoor kan gebruik gemaakt worden van PoM. Dankzij de RS-Bus is het ook mogelijk de waarde van CVs op te vragen. Het zou natuurlijk mooier zijn als dat ook via RailCom kon, maar dat komt misschien later op een volgend bord.

De servo positie sla ik steeds op in EEPROM. Omdat EEPROM een beperkte levensduur heeft, heb ik een circulaire buffer geïmplementeerd zodat ik (na iedere restart van de decoder) een positie verder schrijf in de circulaire EEPROM buffer.

Alhoewel alle settings met behulp van configuratie variabelen (CVs) kunnen worden ingesteld, heb ik ervoor gekozen om de positie van de wisseltongen alsmede de snelheid waarmee de servo beweegt, via een normale hand unit (zoals een Lokmaus of de LH100) mogelijk te maken. In plaats van een lange tekst heb ik een videootje gemaakt om te tonen hoe dat werkt: https://youtu.be/aXmgzEP85_A?si=MXEhgxmH1jcrmINr.

Groet
Aiko
Titel: Re: Yet Another Servo Decoder
Bericht door: Dennis1984 op 15 June 2025, 23:26:47
Mooi werk Aiko, ik ga binnenkort eens even in je source code neuzen om je code-implementatie te aanschouwen. In je video maken de servo's in ieder geval heel weinig geluid (ik moest hem flink hard zetten om überhaupt iets te horen) dus ook in dat opzicht: doel bereikt (y).

Ik heb de datasheet van de EEPROM die ik in mijn ontwerpen er nog even bij gepakt, maar die benoemen 4 miljoen write-cycles, dus ben dan wel benieuwd of jij een veel oudere chip hebt gebruiks ;). In ieder geval verwacht ik niet dat je daar snel aan komt.

Met vriendelijke groet,
Dennis
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 15 June 2025, 23:36:38
Hi Dennis

Dank  :)

Ik heb de datasheet van de EEPROM die ik in mijn ontwerpen er nog even bij gepakt, maar die benoemen 4 miljoen write-cycles, dus ben dan wel benieuwd of jij een veel oudere chip hebt gebruiks ;). In ieder geval verwacht ik niet dat je daar snel aan komt.

4 miljoen is wel heel veel. Maar gebruik jij een externe EEPROM? De EEPROM in normale microcontrollers heeft meestal een levensduur van 100.000 cycles.

Groet, Aiko
Titel: Re: Yet Another Servo Decoder
Bericht door: spock op 16 June 2025, 00:14:04
Ter info, een 256kb EEPROM kost €1,00.

mvg spock
Titel: Re: Yet Another Servo Decoder
Bericht door: bask185 op 16 June 2025, 08:38:21
Nah, deze is goedkoper en het is een 'preferred extended' part bij jlc  (y)
(https://images.beneluxspoor.net/bnls_2025/image-684fbba9cfe6c.png) (https://images.beneluxspoor.net/bnls_2025/image-684fbba9cfe6c.png)
Titel: Re: Yet Another Servo Decoder
Bericht door: Dennis1984 op 16 June 2025, 11:09:34
Mooi component, maar wel een beetje groot ;).

Ik heb inderdaad een losse I2c EEPROM gepland op mijn bordjes.

Met vriendelijke groet,
Dennis
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 02 July 2025, 21:58:33
Hi Karst (en anderen)

Nu de servo decoder klaar is (ik wil nog wel wat hardware varianten maken), ben momenteel aan het nadenken over een stepper aandrijving voor mijn micro steppers voor armseinpalen; zie bijdrage: https://forum.beneluxspoor.net/index.php?topic=108775.0.

Natuurlijk kan ik daar de Mobatools library of zo iets voor gebruiken, maar ik zoek eigenlijk wat “eleganters”. Daarbij kwam ik de PCA 9685 tegen, en herinnerde ik mij dat jij die eerder had genoemd.
Komt me allemaal heel bekend voor ;) En lijkt verdacht veel op wat er in onze nieuwe YD8248 allemaal in te stellen is.

o.a. daarom gebruik ik voor de PWM generatie de PCA9685.

Voor zover ik begrijp doet de YD8248 wel servos, maar geen steppers. Terwijl de PCA 9685 ook (volgens mij) goed stepper signalen kan maken. Is er een reden dat de YD8248 geen steppers doet? Of zie ik iets over het hoofd?

Groet, Aiko
Titel: Re: Yet Another Servo Decoder
Bericht door: bask185 op 02 July 2025, 22:20:51
De PCA9685 is niet geschikt voor de taak, wrong chip.  Je moet voor een stappenmotor een dedicated driver chip hebben. Zelf heb ik nog A4988 gebruikt, maar die maken hinderlijk hoge pitch geluidjes tijdens een microstep <- reden waarom je dedicated chip wilt. Je kan chatGpt vragen voor een andere die niet hinderlijk geluid maakt. Ze komen ook altijd op handige plug-in breakout boardjes, dus je hoeft alleen maar 2 strips aan female sockets te solderen en je plugt ze in.  En je kan nog SMD dingen er onder solderen als je ruimte mist.

Voor een stappenmotor moet je goed pulsjes klokken en tellen, dat is met een PCA niet te doen. Het is makkelijker om het direct met je uProcessor te doen. En zelfs als het kon, zou je alsnog iets van een buffer IC nodig hebben.

Ik was zelf ook bezig met een redesign voor nog een servo decoder. Deze heb ik dezelfde grootte gegeven als de spoel decoder zodat die compatibel is met dezelfde relais uitbreidingen voor unifrog en elektrofrog wissels. Maar zoals je kan zien op het schema, had ik toch een PCA gekozen. Ik kwam net een paar pinnen te kort, dan maar zo  ;D
(https://images.beneluxspoor.net/bnls_2025/afbeelding-686592da9ebbf.png) (https://images.beneluxspoor.net/bnls_2025/afbeelding-686592da9ebbf.png)

Mvg,

Bas
Titel: Re: Yet Another Servo Decoder
Bericht door: spock op 02 July 2025, 23:19:12
Je kunt dan eens naar de tmc2209 kunnen kijken, maar er zijn er nog veel meer.

Mvg spock
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 03 July 2025, 08:55:39
Beste Bas en Spock

Dat ik tussen microcontroller en stepper motor nog een driver moet hebben, begrijp ik. Dat had ik waarschijnlijk duidelijker in mijn bericht moeten zetten. Dat de TMCs veel stiller zijn dan de A4988 weet ik ook; op youtube heb ik zelfs een filmpje daarover gezet (bij mijn lift).

Waar het mij omgaat, is de PWM generatie. Maar ik was even vergeten dat je goed moet pulsjes tellen, en dat kan (voor zover ik weet) de PCA 9685 niet.

Dank!
Aiko
Titel: Re: Yet Another Servo Decoder
Bericht door: spock op 03 July 2025, 10:53:21
Hoi Aiko,

De PCA9685 is gemaakt om een pwm sgnaal te genereren, en dat doet tie nog goed ook (altijd meegenomen).
Het genereren van een puls voor een stappenmotor is een andere tak van sport.

Als je daar "iets" dieper in wilt duiken, is Klipper misschien iets voor je.
Klipper is software om een 3D-printer aan te sturen en de broncode staat op github. https://github.com/Klipper3d/klipper (https://github.com/Klipper3d/klipper)

mvg spock
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 19 July 2025, 13:54:31
Beste allen

Nu we weer thuis zijn van een 15 dagen treinreis door Zwitserland, is het tijd om verder te gaan met de decoders. Zoals eerder aangekondigd, heb ik voor de servo decoder een nieuwe en kleinere print gemaakt, ditmaal zonder relais maar met de AVR32DA48. Het schema is niet veel veranderd ten opzichte van het eerdere schema, dus die post ik hier niet opnieuw. Wel bleken er wat componenten opeens "extended" (=duurder) te zijn geworden, dus heb ik, waar mogelijk, die veranderd in "Basic" componenten. Als de print getest is en goed bevonden, zet ik het zoals gewoonlijk op OSHWLab en GitHub.

De kleinere opto-couplers / isolators die o.a. door Karst waren voorgesteld, heb ik (om niet te veel te veranderen) uiteindelijk toch niet op de print gezet. De afmetingen van deze print worden namelijk vooral bepaald door de connectoren, en niet door de componenten. Wel heb ik een derde servo uitgang toegevoegd, die ik straks kan gebruiken voor mijn Weinert Mein Gleis 1:9 DKW, waarvoor 3 servo's nodig zijn. Ook heb ik extra LEDs toegevoegd, die aangeven of ik een correct DCC en RS-Bus signaal ontvang.

(https://images.beneluxspoor.net/bnls_2025/Servo-Print-V2-687b86d3ceb31.png) (https://images.beneluxspoor.net/bnls_2025/Servo-Print-V2-687b86d3ceb31.png)


Groet, Aiko
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 19 July 2025, 17:35:25
Omdat het overzichtelijker is de discussies over DCC servo decoders, en DCC stepper decoders weer uit elkaar te halen, ben ik voor wat betreft de stepper decoder weer teruggegaan naar het oorspronkelijke draadje daarover: https://forum.beneluxspoor.net/index.php?topic=108775.msg3222552044#msg3222552044

Groet, Aiko
Titel: Re: Yet Another Servo Decoder
Bericht door: Karst Drenth op 28 July 2025, 10:38:02
Hi Karst (en anderen)

....maar ik zoek eigenlijk wat “eleganters”. Daarbij kwam ik de PCA 9685 tegen, en herinnerde ik mij dat jij die eerder had genoemd.
Voor zover ik begrijp doet de YD8248 wel servos, maar geen steppers. Terwijl de PCA 9685 ook (volgens mij) goed stepper signalen kan maken. Is er een reden dat de YD8248 geen steppers doet? Of zie ik iets over het hoofd?

ja... Ontbrekende ontwikkeltijd ;) En idd de PCA 9685 maakt geen stepper signalen. Dat laat ik een driver module doen. de PCA 9685 wordt dan gewoon als digitale uitgang gebruikt die de door de uC gegenereerde pulsen aan de stepper driver doorgeeft.

Grtzz,
Karst
Titel: Re: Yet Another Servo Decoder
Bericht door: AP3737 op 18 August 2025, 12:09:36
Als een project is afgerond, heb ik de neiging om onmiddellijk verder te gaan met het volgende project. Voor de lezers op een forum zoals deze, kan daardoor de indruk ontstaan dat het project nog steeds loopt, en dat nabouw (mocht daar al behoefte aan zijn) beter nog even kan worden uitgesteld. Daarom hierbij toch maar even een "status update".

(https://images.beneluxspoor.net/bnls_2025/Servo2-Decoder-68a2f422bbf0e.jpg) (https://images.beneluxspoor.net/bnls_2025/Servo2-Decoder-68a2f422bbf0e.jpg)
Hierboven, voor de volledigheid, een plaatje van de decoder voor 2 servo's. Een vergelijkbare foto heb ik al eens eerder geplaatst.

(https://images.beneluxspoor.net/bnls_2025/Servo2-Decoder-Ingebouwd-68a2f422a753f.jpg) (https://images.beneluxspoor.net/bnls_2025/Servo2-Decoder-Ingebouwd-68a2f422a753f.jpg)
En op bovenstaand plaatje "het bewijs" dat deze decoder nu echt in gebruik is. Deze decoder stuurt een Tillig Elite wissel aan, alsmede een Roco DKW-15. Deze eigen decoder vervangt een "merk" decoder die ik al meer dan 10 jaar geleden heb gekocht, en waarbij ik me bleef ergeren aan het "gebrom", ook al staat de servo stil.

Ik heb (en dat was alweer in 2022) vijf van deze decoders bij JLCPCB als test laten maken. Sindsdien is de ontwikkeling van mijn baan verder gegaan en ben ik, voor het zichtbare gedeelte, overgegaan op het Weinert Mein Gleis systeem. Dat is (in mijn optiek) het mooiste systeem wat momenteel op de markt is, en meneer Weinert heeft daarbij ook goed nagedacht over hoe de servo aandrijvingen het makkelijkst kan worden gemonteerd. En als je weer eens een tijdje op je rug onder de baan heeft liggen prutsen, dan weet je hoe belangrijk dat soort details zijn die de montage vereenvoudigen. Ik heb daarom ook de verleiding weerstaan om zelf servo-houders te ontwikkelen (of beter: een van de vele ontwerpen die op het Internet te vinden zijn te kopiëren), en heb de Weinert Mein Antrieb ook gewoon maar gekocht.

De hardware van bovenstaande decoder is, zoals bij mij gebruikelijk, te vinden op OSHWLab: https://oshwlab.com/aikopras/support-lift-controller_copy_copy_copy_copy (https://oshwlab.com/aikopras/support-lift-controller_copy_copy_copy_copy)
En de software staat op GitHub: https://github.com/aikopras/AVR-Servo-2 (https://github.com/aikopras/AVR-Servo-2)

Omdat de Weinert Mein Antrieb al een micro-switch voor de hartstuk polarisatie heeft, heb ik de relais op de "serie productie" servo decoder weggelaten. Verder heb ik (toch) een derde servo uitgang toegevoegd, omdat de Weinert slanke DKW (1:9) een derde servo gebruikt om een klein nokje te bedienen, die voor nog betrouwbaarder gebruik zorgt. Ook heb in de THT decoder vervangen door een SMD type, omdat je tegenwoordig bij JLCPCB met Custom Order Parts iedere component op de print kan laten zetten die je maar wilt. Verder heb ik wat extra LEDjes toegevoegd, en de grote 16-pins IDC connector weggelaten (ik weet nu immers wat ik wil  :))

(https://images.beneluxspoor.net/bnls_2025/Servo3-Decoder-68a2f424038b4.jpg) (https://images.beneluxspoor.net/bnls_2025/Servo3-Decoder-68a2f424038b4.jpg)
Hierboven een foto van de productie servo. Zoals je kunt zien, is de print beduidend kleiner geworden.
Ook deze print  zal binnenkort op OSHWLab en GitHub te vinden zijn.

Groet, Aiko