BeneluxSpoor.net forum

Vraag en antwoord => Digitaal => Topic gestart door: spock op 13 april 2021, 20:32:16

Titel: Mijn DCC accessoiredecoder, maar dan anders. Met MySQL, en ESP32.
Bericht door: spock op 13 april 2021, 20:32:16
Het is weer lente en de nieuwe accessoire decoders van verschillende fabrikanten vliegen om je oren.
Ieder met hun eigen voor- en nadelen. Ik heb al eens eerder een servowisseldecoder gemaakt op basis van een Arduino Micro welke was interegelen met een andere arduino via de i2c bus. Leuk project maar je merkt de beperkingen van een Arduino Micro.
Ik heb een elektronica en it achtergrond, dus je wordt er dan nogal snel bijgehaald als er een probleem is op de club. Ik heb nu al aardig wat ervaringen met verschillende accessoire decoders, maar dan vaak als deze in storing staan. Dat is wel de beste manier om ze echt te leren kennen.
Wat mij nogal stoorde was het feit dat al die accessoire decoders losse eilandjes zijn. Vaak (letterlijk) zwarte doosje met weinig informatie over de status. Het gebruikersgemak viel ook nogal tegen, zonder handleiding kom je er niet uit. Je merkt dat het techniek is uit het verleden met de toenmalige beperkingen.

Stel: Je hebt niet 1 of 2 decoders maar 30, wat voor eisen zou ik dan stellen? Dat geeft namelijk een heel andere dynamiek dan 1 of 2 decoders.

Ik wilde als basis het volgende maken:
- Flexibele en modulaire DCC accessoire decoder
- Alle configuratie,functionaliteit en instellingen komen vanuit uit een centrale plek.
- De decoders halen tijdens het opstarten hun configuratie op (daardoor eenvoudig uit te wisselen bij storing).
- Nieuwe functie kunnen maken zonder de firmware te hoeven updaten.
- De in- en uitgang modules worden via i2c modules aangesloten op de processor.
- De processor heeft zelf geen ingang of uitgang aansluitingen.
- Zo min mogelijk nog onder de baan komen voor updates
- functionaliteit en stabiliteit hebben meer prioriteit dan prijs

Als volgende was de pragmatisch invulling:
- De centrale plek wordt een MySQL database
- De processor is een ESP32 geworden. Dit is een soort Arduino op steroiden met Wifi functionaliteit.
- Er is  een oledscherm aamwezig waar relevate (fout)informatie wordt getoond.
- Alle communicatie gaat via Wifi
- De wifi-instellingen kunnen ingesteld worden met een smartphone.
- Er mogen meerdere uitgangsmodules aangesloten worden. Deze worden automatisch gedetecteerd tijdens opstarten.
- Er mogen meerdere ingangsmodules aangesloten worden. Deze worden automatisch gedetecteerd tijdens opstarten.
- Er is een statemachine gemaakt die zijn stappen dynamisch uit de database haalt. (dit voorkomt veel firmware updates)
- Update van de ESP32 geschied via OTA. (=via wifi, er hoeft geen usb of serieele kabel aangesloten worden)
- Alle decoders kunnen met het starten van 1 script worden geupdate naar een nieuwe firmwareversie.
- Na het opstarten meld de decoder zich aan bij de database en geeft zijn firmware versie door.
- De functies zijn te bedienen via een eenvoudige webinterface.
- Op dit moment is er PWM uitgang en servo functionaliteit.
- PWM heeft fading functionaliteit (nee, dit is geen typo)
- Servo heeft meerdere bewegingsmethodes(inclusief stuiteren en overschieten)
- voedingspanning van servo kan worden gemeten (en worden gemeld als deze te ver zakt)
- Maximaal 127 ingangen
- Aan een knopdruk kan een functie toegewezen worden. (bv: Rood sein van een NS-sein)

Ik ben echter wel verbaast over de kracht van de ESP32. Ik weet bv niet wat het maximale aantal uitgangen is. Dit komt omdat alles zo flexibel is dat daar op dit moment weinig over te vertellen is.
Er zijn op dit moment 2 limieten.
1) Het beschikbare geheugen. Dat is met een paar eenvoudige functies van 31 naar 33% gestegen.   
2) Roundtrip tijd moet minder dan 20ms zijn. 20ms is 20000us. De roundtrip tijd is nu 90us.

Aangezien er nog geen frontend is, maakt ik de machinestates van de statemachine in Excel en klop ze dan over in de database. Lijkt omslachtig, maar toch is deze methode sneller dan programmeren in C.

Op dit moment werkt het bovenstaande softwarematig. Nog te verbeteren: Eenvoud van afregelen.
De volgende stap is het ontwikkelen van pcb's voor de decoder en verschillende uitgangsprinten.

Dit is mijn grootste embedded project geworden met vele nieuwe uitdagingen.
Het heeft meer tijd gekost dan aanvankelijk gedacht, maar ja, ik ben ook een amateurprogrammeur.

mvg spock
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: Duikeend op 13 april 2021, 21:11:38
klinkt erg interessant (y) helaas ontbreekt me momenteel de tijd en kennis om hier een goede bijdrage aan te kunnen leveren dan wel zelf zo iets te maken.
zelf  heb ik dit soort dingen al eens eerder geknutseld met behulp van esp8266 en gebruikte dan een online database.
er draaide dan een webserver op de esp en daar kon je dan ook de configuratie in aanpassen. heet meen ik espeasy.
werkte hetzelfde maar was wel wat minder robuust :)
maar wat jij voorstelt klinkt erg leuk en ik hoop dat je het project ook met ons wil delen  ;D

ik mis trouwens in je verhaal nog de link met baan controle software zoals itrain, koploper of andere. is dat bewust gedaan?

en je hebt het over de machinestate. wat bedoel je daar precies mee? is dat wat je in de betreffende esp schiet of de terugkoppeling.
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: meino op 13 april 2021, 21:32:25
Dit interesseert mij ook wel. Alhoewel ik zelf eigenlijk reeds voorzien ben.
Maar kun je wat schema's maken. Want veel is mij nog onduidelijk, Een centrale MySql database, waar draait die op? De ESP's zijn dat de decoders (output modulen)? Of is de ESP het centrale systeem? en wat zijn dan de output- en inputsystemen bijv.

Groet Meino
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: spock op 13 april 2021, 21:57:27
Ik kan me voorstellen dat machinestate niets betekend.

De informatie is gelaagd opgebouwd.

In vereenvoudigde vorm:

1) Machine
2) Dienst
3) Recepten (machinestates)
4)   ---- State machine ----
4) Taken

Machine. Dat is een object wat je wilt aansturen (led, servo,sein). Hier wordt de koppeling naar DDC adres(sen) en dienst bepaald

Dienst. Definitie van een dienst en het aantal modes. Een dienst kan zijn: Aan/Uit, Knipper fading, Wissel met Servo, Wissel puls etc
Het aantal modes vor Aan Uit is 2 en bv voor NS sein is het 8.

Recepten. Voor elke modes moet er een recept aangemaakt worden. Dit recept wordt door de state machine afgehandeld.

State machine. Deze handeld de recepten af en stuurt commando's door naar de taken.

Taken: Dit zijn de basale aanstuurfuncties voor de hardware. Dit staat in de firmware, niet in de database. Dit zijn functies als dim een uitgang tot een bepaalde waarde in een bepaalde tijd. Dit loopt dan seperaat van de statemachine. Een soort minion, set and forget.


Ik heb geen besturingsprogramma benoemd omdat daar niet de uitdaging/beperking ligt. Het is een accessoire decoder die aan te sturen is via DCC. Daar kunnen alle programma's prima mee overweg. Over overweg gesproken, die dienst heb ik nog niet gemaakt ;).

mvg spock
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: spock op 13 april 2021, 22:14:25
Een MySQL database kan op veel verschillende platformen draaien. Windows, Mac, Linux. Mijn MySQL database draait op een RasPi3. Of je doet effe gek en huurt een MySQL server in de cloud  :P.

Met de decoder bedoel ik de ESP32 (de hersenen).

De uitgangsmodules zijn PCA9685. Dit zijn 16 poorts PWM uitgangen met i2c bus. Dit zijn leuke ic's met interessante mogelijkheden.

mvg spock
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: meino op 14 april 2021, 00:09:00
Dag

Ik proef OO (Object Oriented). Misschien handig om wat schema's te produceren. Ik weet niet of je UML kent, maar een Class diagram en een vorm van een Activity diagram (Sequence diagram, state diagram etc) zou voor mij veel verduidelijken.

Groet Meino
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: bask185 op 14 april 2021, 10:29:32
Citaat
Aangezien er nog geen frontend is, maakt ik de machinestates van de statemachine in Excel en klop ze dan over in de database. Lijkt omslachtig, maar toch is deze methode sneller dan programmeren in C.
Omdat ik ooit te veel vrije tijd heb besteed aan mijn eigen software tooling heb ik 'per ongeluk' iets handigs gemaakt waar je misschien iets aan heeft. Om een arduino project op te zetten laat ik een python script een project folder aanmaken. Ik kan dan handmatig modules uitkiezen die ik dan mee kopieer en er wordt een compileerbaar project gegenereed voor je.

Een van de dingen waarmee het begonnen is, is mijn state-machine generator. Ik heb een scriptje gemaakt wat een bollendiagram om kan zetten naar een kale state-machine die je dan alleen een beetje invulling hoeft te geven.

In een simpel programma genaamd: yEd graph editor kan ik dan een bollendiagram maken.
(https://raw.githubusercontent.com/bask185/State-Machine-Scripts/master/images/demo.png)

En met script kan je er dit van maken in een paar secondes:

(https://images.beneluxspoor.net/bnls/deleteme1-6076a14c23236.png) (https://images.beneluxspoor.net/bnls/deleteme1-6076a14c23236.png)

Het werkt nu nog met macro's maar die wil ik gaan vervangen door een meer generieke class.

Het idee is dus dat je alleen dingen hoeft in te vullen bijvoorbeeld
stateFunction( stateZ )
{
    entryState
    {
        Serial.println("entering state Z");
        someTimeT = 50 ;        // telt af naar 0
    }
    onState
    {
       
        if( !someTimeT) exitFlag = true;
    }
    exitState
    {
        Serial.println(F("time expired"));
        return true;
    }
}


// STATE MACHINE
extern bool demo()  // dit komt 1 op 1 over met het bollen diagram
{
    STATE_MACHINE_BEGIN

    State(stateX) {
        nextState( stateY, 0 ); } // je kan die 0 aanpassen om een vertraging te creeren, vollegdig optioneel

    State(stateY) {
        if( customVar == ERROR) nextState( stateZ, 0 );     // je kan hier een selectie naar welke state je wilt springen..
        else                    nextState( stateZ, 0 ); }   //  waarom en wanneer

    State(stateZ) {
        nextState( stateX, 0 ); }

    STATE_MACHINE_END
}
De functie 'demo()' roep je dan aan vanuit void loop of vanuit je eigen functies en de state machine doet dan zijn ding. Misschien dat je er iets aan heb, misschien ook niet  :P. Meer info en de scripts staan op m'n github pagina  (https://github.com/bask185/State-Machine-Scripts).

Dan zit er per ongeluk nog iets in waar je misschien wat aan heb. Die scripts genereren ook je IO files, waarom is dit belangrijk? Je hebt hebt het over I2C extenders met max 127 inputs. Als dit nu per toeval MCP23017 chips zijn, dan is het belangrijk. Mijn generateIO.py script genereert ook een tweetal functies genaamd mcpWrite() en mcpRead().

Ze doen hetzelfde als digitalWrite() en digitalRead() alleen dan voor al je Mcp23017 chips. Je vult dus een nummer in van 0-127 en de functies berekenen dan voor je, wat het adres is (de adressen moeten dan wel oplopend zijn, dus de eerste heeft 0x20 en de laatste heeft 0x27), ze berekenen welke port het betreft en welke pin er geset, gecleared of uitgelezen dient te worden. Ik heb de write functie zo gemaakt, dat je 1 pin tegelijk kan zetten, zonder de andere pinnen te beinvloeden.

Ik ben niet echt bekend met MySQL, maar het klinkt interessant. Een collega van me doet er wel eens dingen mee en ik ben er toch er wel van onder de indruk.
Ik heb nog wel 2 opmerkingen of eigenlijk ideeen waar je ook misschien iets aan heb. Als elke decoder WiFi heeft, wil je dan niet het aansturen en uitlezen van de decoders ook doen via WiFi? Dan maak je bijvoorbeeld een brug tussen WiFi en DCC en/of Loconet of Xpressnet. Dan hoef je geen DCC of Xpressnet/Loconet te bekabelen naar je accesoires. Alleen 12/18V, alle informatie van DCC artikelen en of terugmelders kan je dan via wifi naar je centrale node sturen die dan aan men's centrale is bekabeld. Het is slechts een idee natuurlijk, ik snap als je ontwerp al zover is dat dit out of the equation is.

Waar ik zelf ook wel een aan dacht is om een Wifi dongle te maken met ESP chip. De dongle kan je op een accesoiry prikken en dan kan je hem via Wifi configureren. Een ESP32 is een prima ding, maar je kan het als 'overkill' beschouwen gezien de simpele taken van het eind product. Voor de prijs maakt het natuurlijk niet zoveel uit, dus dan kan je natuurlijk net zo goed alsnog een esp op elke decoder zetten. Why not right?

Ik moet voor mijn elektronica project (https://forum.beneluxspoor.net/index.php?topic=98163.msg3222214976#msg3222214976) ook nog het een en ander aan printen maken met MCP23017 en met apparatuur om bijvoorbeeld magneet wissels te schakelen. Misschien dat er iets te combineren valt?

Mvg,

Bas

Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: Hennik op 14 april 2021, 14:24:08
Als elke decoder WiFi heeft, wil je dan niet het aansturen en uitlezen van de decoders ook doen via WiFi? Dan maak je bijvoorbeeld een brug tussen WiFi en DCC en/of Loconet of Xpressnet. Dan hoef je geen DCC of Xpressnet/Loconet te bekabelen naar je accesoires.

Als je zo begint, dan is dit denk ik ook zeer interessant: https://www.youtube.com/watch?v=e6NgUr4GQrk
Het gaat over modelbaanbesturing (sensors/throttles/panels) via het Internet Of Things (IoT)
De hier gelinkte video is een eerste uit de reeks. Inmiddels lijkt het me al een behoorlijk uitgebreid gedocumenteerd Doe Het Zelf project.
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: spock op 14 april 2021, 22:35:38
Hallo Meino,

Het zijn inderdaad een stel C++ classes. Zoals al eerder genoemd ben ik een amateurprogrammeur (met een voorkeur voor C) en dit is het eerste echt serieuze sprong in C++. Leren terwijl je het doet, met het bijbehorende vallen en opstaan.
Ik heb nooit wat gedaan met UML en bijbehorende methodes, dus daar kan ik weinig in betekenen.

mvg spock
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: spock op 14 april 2021, 23:32:16
Hallo Bas,

Bedankt voor je reactie. Probeer ze even stuk voor stuk af te lopen.

- Automatisch genereren van code. Van dit stukje zal ik niet gebruik maken omdat het afbreuk doet aan het basisprincipe van het ontwerp. Met het automatisch genereren gaat het weer richting los staande kastjes. Ik wil alle functionaliteit die in een dienst zit (dienst en recepten) uit de database halen. Dat werkt nu. En ik ben daar best trots op dat het nu werkt zoals het werkt.

- Input modules. Dat zijn inderdaad Mcp23017 modules. Bedankt voor het aanbod, echter de code voor het opvragen is al afgerond. Natuurlijk staat in een database tabel welke mode hij moet aanvragen bij indrukken of loslaten.

Ik heb nog wel 2 opmerkingen of eigenlijk ideeen waar je ook misschien iets aan heb. Als elke decoder WiFi heeft, wil je dan niet het aansturen en uitlezen van de decoders ook doen via WiFi? Dan maak je bijvoorbeeld een brug tussen WiFi en DCC en/of Loconet of Xpressnet. Dan hoef je geen DCC of Xpressnet/Loconet te bekabelen naar je accesoires. Alleen 12/18V, alle informatie van DCC artikelen en of terugmelders kan je dan via wifi naar je centrale node sturen die dan aan men's centrale is bekabeld. Het is slechts een idee natuurlijk, ik snap als je ontwerp al zover is dat dit out of the equation is.

Dat is misschien wel een optie. Maar ik kan me tijd maar 1 keer spenderen. Ik wil eigenlijk als eerste de hardware definitief  maken en PCB's maken (PCB's). De functionaliteit van input en output is strikt gescheiden, dat maakt het dan ook eenvoudig om er een extra inputfunctionaliteit bij te maken. Er zijn al 3 soorten input's: DCC, webinterface en de inputknoppen, dus een 4e is ook geen probleem. Het ontwerp is niet de beperking, die is modulair en gelaagd opgebouwd. Ik weet echter nog niet hoe stabiel Wifi is bij continue gebruik icm ESP32 in vergelijking met DCC. Laten we het maar op houden dat Rome ook niet in 1 dag gebouwd is  :) .

Laten we een keer overleggen of we samen wat hardware kunnen maken (ik denk eraan om wat met KiCad te proberen)

mvg spock

PS: zit jij bij de BMB groep van Leen?
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: meino op 14 april 2021, 23:52:56
Het zijn inderdaad een stel C++ classes. Zoals al eerder genoemd ben ik een amateurprogrammeur (met een voorkeur voor C) en dit is het eerste echt serieuze sprong in C++. Leren terwijl je het doet, met het bijbehorende vallen en opstaan.
Ik heb nooit wat gedaan met UML en bijbehorende methodes, dus daar kan ik weinig in betekenen.

Dat geeft niet, maar het zou prettig geweest zijn. Niet dat ik zelf veel gebruik maak van UML, meestal na afloop voor documentatie doeleinden.
Overigens denk ik dat je dat amateur wel weg mag laten. Iemand die een MySql database optuigt en daar in een data schema definieert en de data koppelt aan de Klassen die op een ESP uitgerold zijn, is wat mij betreft dat stadium al voorbij. Overigens dit deel is ook precies waar ik de meeste interesse in heb. Misschien wat code voorbeelden?

Groet Meino
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: bask185 op 15 april 2021, 13:09:24
Citaat
Maar ik kan me tijd maar 1 keer spenderen.
Mijn enige spijt in het leven, ik kan er slechts zoveel in doen  ;D

Ik heb een vraag en ik hoop dat ik geen ramen insla er mee.
Je gebruikt het woord input maar je zegt ook DCC
Citaat
Input modules
DCC is output only. Ik begrijp dat je MCP23017 als output modules moeten fungeren om wissels te kunnen schakelen

Ik heb al het een ander bedacht over het aansturen van wissels. Daar worden meerdere manieren voor gebruikt:
- dubbele spoel die geen eindafschakelingen hebben
- dubbele spoel die wel eindafschakeling hebben
- motor aandrijving die met ompoling werkt. (volgens mij die conrad wisselaandrijvingen)
- servo motor


Ik dacht er aan om zelf een MCP23017 pcb te maken met 16 mosfets er op waarmee je door middel van pulsen dus 8 wissels kan schakelen.

Om de wissels met eindafschakeling wilde ik een PCB maken met 16 DPDT relais er op. Je kan dan met elke output een DPDT relais schakelen waarbij een van de 2 spoelen continu naar massa wordt getrokken. Je zou hier ook andere magneet artikelen kunnen schakelen zoals een ontkoppelaar ofzo.

En met een kleine variatie kan je hetzelfde doen maar dan met ompoling.

Voor servo's gebruiken we natuurlijk de PCA9685  (y).

Ik heb tot op heden deze versie
(https://images.beneluxspoor.net/bnls/deleteme2_23.png)
Dat rechter ding wordt dan mijn node en die andere 2 zijn mcp printen. Deze specifiek zijn bedoeld om direct leds maar ook schakelaars op aan te sluiten. Daarvoor hebben ze een 330 ohm sil weerstand.

Aanvullend wil ik dus voor mezelf ook versies maken met stroomdetectie voor terugmelding, een versie voor LDR terugmelding en de bovengenoemde mosfet en relais versies voor wissels en relais ed.

Ik heb ook ooit met idee gespeeld om een basis print te maken en aanvullende printen die je als shield er op kon prikken. Dat zou een beetje ruimte besparen maar het zou ook weer duurder worden.

keuzes keuzes keuzes...

Citaat
Laten we een keer overleggen of we samen wat hardware kunnen maken (ik denk eraan om wat met KiCad te proberen)
vind ik prima  (y). Heb je zelf al ideeen over de uitwerking?

Mvg,

Bas
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: spock op 15 april 2021, 23:17:04
Hoi Bas,


Je gebruikt het woord input maar je zegt ook DCCDCC is output only. Ik begrijp dat je MCP23017 als output modules moeten fungeren om wissels te kunnen schakelen

DCC is uni-directioneel(even railcom buiten beschouwing). Bij een centrale is dan een DCC een output en voor een accessoiredecoder is DCC een input signaal.

Ik gebruik de MCP23017 alleen voor de knoppen ingangen. De uitgangen zijn allemaal de PCA9685 modules. Die zijn zo verdraaid handig, veelzijdig en spotgoedkoop dat ik me niet meer druk ga maken over MCP23017 als uitgang.

Ik ben vandaag bezig geweest met een onverwachte eigenschap van het ESP32 board, deze wil niet booten met 5 Volt voedingspanning (en via de USB).  Voor nood nu even een attiny ernaast gezet om het booten te regelen, maar dat had een ketting reactie tot gevolg. Atmel Studio updaten, AtmelIce updaten, Import van Arduino project crashed af, daarna een simpel Atmel Studio project aangemaakt. Eindelijk weer uitgevogeld hoe je de attiny maoest programmeren. Daarna de soldeerbout ter hand genomen om alles aan te sluiten en te modificeren. De TTGO boot nu correct maar de dag is weer voorbij.

Vwb die conrad-dingen. Ik heb er ergens nog 1 liggen, eens kijken of ik hem kan vinden. Er staat me nog iets van bij dat er een dc motor in zit die zichzelf mechanisch uitschakeld. Ik weet niet meer of je hem moet ompolen. Ik vond het intern allemaal fragiel.

Ik wil dit weekend er eens rustig over nadenken wat voor hardware eigenschappen ik wil. Ik kom er binnenkort op terug.
Bedank voor het geven van de verschillende opties.

mvg spock





Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: bask185 op 16 april 2021, 09:34:33
Citaat
Ik gebruik de MCP23017 alleen voor de knoppen ingangen.
Ah. dat was me niet duidelijk.

Wat ik me nu afvraag, waar gebruik je de knoppen precies voor? Als ik het goed snap, wil je ze gebruiken om direct wissels te schakelen (in schakelpaneel vorm) die aan dezelfde I2C bus liggen waarbij de processor voor je regelt welke wissel er bij welke knop geschakeld moet worden? En dat de je wissels dan ook nog eens met DCC kan aansturen?

Citaat
De uitgangen zijn allemaal de PCA9685 modules. Die zijn zo verdraaid handig, veelzijdig en spotgoedkoop...
Dat is zeker waar. Buiten servo's om, zou je ook nog dimbare ledjes kunnen maken en je kan de pinnen ook als een niet-pwm pin inzitten.

Ik neem aan je die breakout boards gebruikt met die 16 rood/geel/zwarte servo connectors? Die heb ik zelf ook, geweldige dingen. Ik zou zelf voor jouw toepassing voor deze dingen (en dit komt zojuist tijdens het tikken in me op) shields maken die je op deze connectors kan prikken. Of eigenlijk eerder een base waar je de pca in kan prikken daar de baseboard groter zal zijn in formaat. Dan kan je dit breakout board, wat is toegewijd aan servo motors, omtoveren tot een board voor relais/magneetwissels/ledstrips ofwel al het andere.

Je kan natuurlijk een PCB ontwerpen waar de pca chip los op zit, maar dan moet je SMD gaan solderen. Keuzes, Keuzes, Keuzes.

Ik weet niet wat de outputs aan mA's kunnen leveren maar je kan voor de grap eens proberen, of je zo'n relais direct kan aansturen:
(https://protosupplies.com/wp-content/uploads/2018/01/Relay-Breakout-Module-5V-1.jpg)
Het is gewoon een 5V relais met een optocoupler of tor er tussen.

Als dat werkt dan kan je ook deze hele relaiskaart gebruiken om dus 16 magneet wissels aan te sturen (wel met eindafschakeling)
(https://www.kiwi-electronics.nl/image/cache/cache/4001-5000/4322/main/cdd9-KW-2537-1-0-2-1000x667.jpg)

En met dupont kabels prik je hem zo aan de Pca waarbij je niet eens hoeft te solderen   ;D

Just my two sixteen cents  ;).

Mvg,

Bas
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: spock op 21 april 2021, 21:57:15
Wat ik me nu afvraag, waar gebruik je de knoppen precies voor? Als ik het goed snap, wil je ze gebruiken om direct wissels te schakelen (in schakelpaneel vorm) die aan dezelfde I2C bus liggen waarbij de processor voor je regelt welke wissel er bij welke knop geschakeld moet worden? En dat de je wissels dan ook nog eens met DCC kan aansturen?

De decoder is primair een DCC accessoire decoder en kan uitgebreid worden met knoppen waarmee je een bepaalde mode kun aanvragen. Dit staat gedefinieerd in de database (dit begint een standaard zin te worden).
De mcp23017 zit opdezelfde bus als de PCA's. Aangezien de MCP wordt uitgelezen op interrupt basis en dat de i2c bus op 800kHz loopt is daar geen slangehals.

Ik neem aan je die breakout boards gebruikt met die 16 rood/geel/zwarte servo connectors? Die heb ik zelf ook, geweldige dingen. Ik zou zelf voor jouw toepassing voor deze dingen (en dit komt zojuist tijdens het tikken in me op) shields maken die je op deze connectors kan prikken. Of eigenlijk eerder een base waar je de pca in kan prikken daar de baseboard groter zal zijn in formaat. Dan kan je dit breakout board, wat is toegewijd aan servo motors, omtoveren tot een board voor relais/magneetwissels/ledstrips ofwel al het andere.
Je kan natuurlijk een PCB ontwerpen waar de pca chip los op zit, maar dan moet je SMD gaan solderen. Keuzes, Keuzes, Keuzes.
En met dupont kabels prik je hem zo aan de Pca waarbij je niet eens hoeft te solderen   ;D

Dat zijn inderdaad de keuzes waar ik nog geen ei over heb gelegd. (Ik heb echter een wantrouwen voor de 1x1 dupont connectors.Handig voor prototyping, maar voor definitief, dank je wel)

De getoonde relais en zijn aan te sturen met een PCA. Elektrisch gezien is een optocoupler gewoon een led. En die andere is een transistor die aangestuurd wordt via een 1k5 weerstand, ook geen probleem.
Enigste waar je op moet letten is dat je een positief aktief relais schild kiest. De PCA zet standaard zijn uitgangen laag als deze opstart.

mvg spock
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: spock op 21 april 2021, 22:10:20
Overigens denk ik dat je dat amateur wel weg mag laten. Iemand die een MySql database optuigt en daar in een data schema definieert en de data koppelt aan de Klassen die op een ESP uitgerold zijn, is wat mij betreft dat stadium al voorbij. Overigens dit deel is ook precies waar ik de meeste interesse in heb. Misschien wat code voorbeelden?

Dank je wel voor het compliment.

Het opvragen van SQL met een ESP32 kan als volgt:

// Gebruikte library: MySQL_MariaDB_Generic

#include <MySQL_Generic_WiFi.h>

const char QUERY_POP_diensten[] = "SELECT DISTINCT accessoire.accDIENST,dienst.dienstNAAM,dienst.dienstNUMSTATES  FROM accessoire LEFT JOIN dienst ON accessoire.accDIENST = dienst.dienstID WHERE accessoire.accNODEID = %d ORDER BY accessoire.accDIENST ASC;";

void runQueryDienst(void)
{
    int funcstatus;
    funcstatus = 0;
    aantallokalediensten = 0;
    sprintf(query, QUERY_POP_diensten, node_id);
    openSQL();
    MySQL_Query query_mem = MySQL_Query(&conn);
    if ( !query_mem.execute(query) ) {  // Start de query
        Serial.print(F("Querying error : ")); 
        Serial.println(query);
        sqlleesfout = true;
        return;
    }
    row_values *row = NULL; // Lees een regel
     while ((row = query_mem.get_next_row()) != NULL) {
        strncpy(strtmp,row->values[1],29); strtmp[29] = '\0'; // copieer de naam van de dienst en terminate de string
        melddienstaan(atoi(row->values[0]),strtmp,atoi(row->values[2]));  // meld de dienst aan, [0] is global dienstid, [2] aantal states
    }
   sluitSQL();
}

Deze code is vereenvoudigd en opgeschoond voor de duidelijkheid.

mvg spock
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: bask185 op 21 april 2021, 23:01:28
Spock,

Per toeval ben ik vandaag op iets gewezen in mijn eigen ontwerp.

Je kan natuurlijk zonder moeite 128 inputs maken met de MCPs. Maar Gerard van Stel wees op het idee om de matrix methode te gebruiken om toetsen in te lezen.

Met 8 IO pinnen kan je dus 16 schakelaars inlezen. En als je alle 16 IO pinnen gaat multiplexen met elkaar kan je 64 pinnen inlezen met 1 MCP23017.
(https://www.gammon.com.au/images/Arduino/Keyboard%20Matrix1.png)

Ik denk niet dat het handig voor jouw is, omdat je serieuze dingen in je code zou moeten aanpassen en jij waarschijnlijk wel uit de voeten komt met 128 IO + je code was ook al af. Maar wie weet heb je er ooit iets aan  :P

Mvg,

Bas
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: spock op 21 april 2021, 23:29:41
Hallo Bas,

Bedankt voor het delen. Ik heb deze schakeling al eens eerder met een handheld apparaat en een arduino nano gebruikt.

Ik wil niet negatief overkomen, maar voor de decoder voegt het weinig toe omdat 127 inputs al overkill is. Ik wil de i2c bus zo vrij mogelijk houden voor het aansturen van de uitgangen in plaats van het aansturen en pollen van de ingangen. Qua kosten zie ik ook weinig voordelen.  Als de je kosten meerekend voor 64 knoppen dan is de prijs van een paar extra MCP's verwaarloosbaar.

Ik ga mijn tijd steken in het aanmaken van nieuwe diensten (AHOB en dwergsein). Net de dienst "Zwaailicht met flits" klaar.

mvg spock
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: bask185 op 22 april 2021, 09:22:07
omdat 127 inputs al overkill is
Ja dat vermoedde ik al  ;). Ik weet nog niet of het voor mij ook afdoende is, maar dat is voor jou natuurlijk niet van belang  :P

Citaat
Ik ga mijn tijd steken in het aanmaken van nieuwe diensten (AHOB
Ik heb eerder een simpel K&K programma voor een ahob voor met 1 of 2 sporen (https://github.com/bask185/ahob) geschreven. Misschien dat er iets van waarde in staat voor je? Als je alle digitalRead(), digitalWrite() en servo.write() functies vervangt door die van je zelf zou het ook met de MCPs en PCAs kunnen werken.

In ieder geval, ik volg het met interesse. Ik zie wel wat je er van maakt  (y)

Mvg,

Bas
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: spock op 22 april 2021, 10:32:24
Hallo Bas,

Bedankt voor het meedenken.
Ik kan de software niet gebruiken omdat ik de dienst niet in de taal C schrijf maar in de statemachine.
De code en de configuratie van een dienst staan in de database (alweer die zin  ;)).

Als voorbeeld de dienst "Zwaailicht met flits".
(https://images.beneluxspoor.net/bnls/Zwaailichtmetflits-6081307bcaae2.jpg) (https://images.beneluxspoor.net/bnls/Zwaailichtmetflits-6081307bcaae2.jpg)

De codes die in het blauwe kader staan zijn de recepten. De bovenste tabel komt in de dienstparameter database.
Dit heeft als voordeel dat, als ik later een frontend schrijf voor de configuratie, ik dan ga refereren aan de omschrijving in plaats van registers. Dus geen CV237786=4 meer, maar "IntensieFlits". Alle parameters kunnen per machine apart ingeregeld worden.

mvg spock
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: bask185 op 22 april 2021, 12:48:34
State machines staan er ook bij  :police:, maar die staan in .graphml formaat. Ik maak simpele bollendiagrammen in yEd.

Ik ben op het werk mensen ook aan het 'motiveren' om het te gebruiken. Bollendiagrammen zijn een goede manier van communiceren tussen software en hardware mensen.

Bas
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: gvandersel op 22 april 2021, 15:37:28
Hoi Spock,

Interessante zaken die je aan het maken bent. Doet mij denken aan een ooit door mij gemaakte tekening generator. Stond ook alles in een database. Ik heb de heren tekenaars nog nooit zo horen vloeken.
Echter ik blijf met een vraag zitten. Hoe maak je de laatste stap en waar. Van 'recept' naar code voor de machine.
Overigens als je alleen assescoires wil aansturen, zou je kunnen overwegn om je bus van DCC om te zetten naar een van de andere bussen. Die zijn vaak wel bidirectioneel. Kun je net zoveel parameters uitlezen als je wilt.

Verder nog een opmerking. DCC is niet zo snel, hoe breng je al die data voor de recepten en de recepten over van de centrale computer naar de randapparaten.
Voor een beetje modelbaan heb je gauw een stuk of wat assessoires nodig. Als die bij de opstart iedere keer geprogrammerd moeten worden,

Groet,

Gerard van der Sel.
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: bask185 op 22 april 2021, 15:39:47
Een 2e DCC bus zonder locomotieven kan misschien een uitkomst bieden? Accesoire instructies worden volgens mij niet herhaald en zijn zodoende sneller dan instructies voor locs?
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: spock op 22 april 2021, 19:06:01
Echter ik blijf met een vraag zitten. Hoe maak je de laatste stap en waar. Van 'recept' naar code voor de machine.

De vertaalslag van recept naar code wordt verzorgt door de statemachine. Dat is code welke in de decoder draait. Een recept bestaat uit een commando met 3 parameters. De recepten worden regel voor regel uitgelezen en uitgevoerd.
 


Overigens als je alleen assescoires wil aansturen, zou je kunnen overwegen om je bus van DCC om te zetten naar een van de andere bussen. Die zijn vaak wel bidirectioneel. Kun je net zoveel parameters uitlezen als je wilt.
DCC is niet zo snel, hoe breng je al die data voor de recepten en de recepten over van de centrale computer naar de randapparaten.
Voor een beetje modelbaan heb je gauw een stuk of wat accessoires nodig. Als die bij de opstart iedere keer geprogrammeerd moeten worden,

DCC is alleen een inputsignaal voor DCC commando's. De decoder haalt zijn configuratie elke keer op bij het opstarten via Wifi. Dat klinkt over de top, maar daardoor kun je eenvoudig nieuwe diensten uitrollen en verbeteren zonder dat de decoder opnieuw geprogrammeerd hoeft te worden. Ik maak hier de volgende onderscheid. Programmeren is het veranderen van firmware en configureren is het veranderen van de instellingen (de data uit de database). Het opstarten is vrij snel gebeurd. Het connecteren naar het wifi netwerk en het ophalen van zijn configuratie duurt ongeveer 20 seconden.
Het concept van de decoder is anders. Het zijn geen losstaande ongecontroleerde apparaten, maar de configuratie wordt centraal opgeslagen. Er kan met 1 commando alles gebackuped worden op de database server.  In die backup zitten dan de machine's, diensten, en de instellingen (intensiteiten van de led's, servo uitslagen, etc). Als de decoder door een defect vervangen moet worden, dan hoeft alleen de nieuwe decoder het id van de vorige decoder te krijgen en bij de volgende reboot van de decoder werkt alles weer (zonder dat er iets opnieuw afgeregeld hoeft te worden). Ik vind die opstartijd niet zo'n bezwaar, de Ecos 2 doet er langer over om te booten.


mvg spock



Titel: Re: Mijn DCC accessoiredecoder, maar dan anders
Bericht door: meino op 22 april 2021, 20:56:28
Dank je wel voor het compliment.

Het opvragen van SQL met een ESP32 kan als volgt:
......
mvg spock

Dank voor het voorbeeld. Ik had zelf ook al het een en ander gevonden. Ik blijf het een interessante exercitie vinden, vooral het concept van recepten met een generieke "finite state machine". Eigenlijk is het een uitwerking van een een Turing machine zoals Alan Turing oorspronkelijk beschreven heeft.

Groet Meino
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders. Met MySQL, en ESP32.
Bericht door: spock op 27 april 2021, 20:40:00
De diensten dwergsein en ahob zijn aangemaakt. Waar de dienst dwergsein binnen 10 minuten klaar was (ik had namelijk 10 minuten nodig om uit te zoeken dat dwergsein hetzelfde is als een ns-sein) was de AHOB toch even een ander verhaal.
Ik ben begonnen om voor de AHOB 1 dienst te maken waar alle functionaliteit in zat. Dat blijkt in de praktijk in een statemachine toch iets ingewikkelder te zijn dan eerst gedacht. Toen bedacht ik me dat de decoder al is opgebouwd om diensten zelfstandig parallel van elkaar uit te voeren.

Een Ahob bestaat eigenlijk uit een paar losse onderdelen
knipperlampen van boom en sein
2 servo besturingen voor de bomen
een constant brandende lamp aan het einde van de boom.
een signaal voor een geluidsmodule.

Ik heb een extra taak aangemaakt waarmee er een andere machine (met mode) aangeroepen kan worden.
De dienst voor de servo was er al en de dienst voor het afwisselend knipperen is extra aangemaakt.
Er is een hoofd AHOB dienst aangemaakt die de andere diensten op de juiste tijd aanstuurt.

De dienst behelst in totaal 23 parameters om hem naar smaak in te kunnen regelen, waarvan er 6 verplicht gedefinieerd moet worden (de pin aansluitingen).

Het was een leerzame exercitie.

mvg spock
Titel: Re: Mijn DCC accessoiredecoder, maar dan anders. Met MySQL, en ESP32.
Bericht door: spock op 22 mei 2021, 14:47:17
Er is weer wat voortgang in het project.

Er is veel tijd gaan zitten in de vele punten op de vele i's.

Om even een indruk te geven hoe het er nu uitziet een paar foto's.

De decoder terwijl deze boot en de data uit de database haalt.

(https://images.beneluxspoor.net/bnls/CLDC-Boot-LaadConf-60a8ef056a813.jpg) (https://images.beneluxspoor.net/bnls/CLDC-Boot-LaadConf-60a8ef056a813.jpg)

Het scherm als deze operationeel is.

(https://images.beneluxspoor.net/bnls/CLDC-werkscherm2-60a8ef0fd291a.jpg) (https://images.beneluxspoor.net/bnls/CLDC-werkscherm2-60a8ef0fd291a.jpg)

Er staan een aantal gegevens in het scherm.
Het decoder id
Het ipnummer
Aantal gevonden uitgangen en de maximale aantal aan te sluiten servo's
Een knipperende hartslag om te zien of deze wel of niet hangt
En eventuele foutmelding(en)


De decoder heeft een wifi interface en daarmee is het mogelijk om een webserver te maken.
Ik had al een paar losstaande websites gemaakt en deze zijn nu zo aangepast dat het een logisch geheel is.

Om te beginnen de hoofdpagina

(https://images.beneluxspoor.net/bnls/CLDC-Web-Hoofd-60a8ef1ff1607.jpg) (https://images.beneluxspoor.net/bnls/CLDC-Web-Hoofd-60a8ef1ff1607.jpg)

Er is een eenvoudige stelpunt pagina waar de machine veranden kan worden om even te testen. Dit is een pagina bedoeld voor gebruikers.

(https://images.beneluxspoor.net/bnls/CLDC-Web-Stelpunt-60a8ef29bc32b.jpg) (https://images.beneluxspoor.net/bnls/CLDC-Web-Stelpunt-60a8ef29bc32b.jpg)
Rood geeft de huidige status aan. Er worden alleen de hoofd machines getoond. Bijna alle tekst in de knoppen komt uit de database. Alleen als er geen passende tekst gedefinieerd is wordt er een standaard tekst getoond.

In de hoofd pagina kan voor ouderhoud gekozen worden. In deze eenvoudige pagina worden alle machines getoond (hoofd en sub machines). Deze pagina is voor de techneuten bedoeld  ;D.
(https://images.beneluxspoor.net/bnls/CLDC-Web-Onderh-60a8f49c74017.jpg) (https://images.beneluxspoor.net/bnls/CLDC-Web-Onderh-60a8f49c74017.jpg)

De instellingen van een machine kunnen bekeken worden onder de [parameters] knop.

Dan worden alle parameter van de machine getoond inclusief de waardes.
(https://images.beneluxspoor.net/bnls/CLDC-Web-Onderhoud-60a8ef3a3c8c7.jpg) (https://images.beneluxspoor.net/bnls/CLDC-Web-Onderhoud-60a8ef3a3c8c7.jpg)
Wil je de parameter wijzigen druk op [Wijzig]

Hier kan de parameter gewijzigd worden.
(https://images.beneluxspoor.net/bnls/CLDC-Web-Instelling-60a8ef44d049c.jpg) (https://images.beneluxspoor.net/bnls/CLDC-Web-Instelling-60a8ef44d049c.jpg)
Druk je op [Accepteer] dan wordt de waarde in het geheugen weggeschreven EN naar de database.

Door deze uitbreiding is de decoder een stuk gebruiksvriendelijker geworden.

De stabiliteit is nu best wel goed. In het begin had ik daar best wel twijfels over want een reboot na een paar minuten was niet ongewoon. Op dit moment werkt de decoder meerdere dagen zonder problemen.

Het wordt tijd om over de hardware na te gaan denken.

mvg spock

Titel: Re: Mijn DCC accessoiredecoder, maar dan anders. Met MySQL, en ESP32.
Bericht door: spock op 30 september 2021, 23:48:16
In een ander draadje werd melding gemaakt dat het uitmaakt hoe het DCC signaal wordt aangesloten of de decoder wel of niet werkt met de NMRA dcc library.
Aangezien hier ook gebruik wordt gemaakt van deze library maar eens getest of hier ook dit probleem is.

Ik kon helaas ook het probleem reproduceren dat de decoder maar op 1 manier werkt qua dcc-signaal aansluiting.
Wel apart, want ik heb de decoder meermalen willekeurig  aangesloten en nooit dit probleem opgemerkt.

Ik gebruikte tot nog toe de versie 2.0.5 van de nmraDcc library.
Ik heb voordat ik echt in de library code ging duiken, eerst de library geupdate naar de nieuwste versie (versie 2.0.10).

En voila, het probleem is weg.

mvg spock