SerVocontrol bestaat uit een standaard Arduino Uno met daarop gestoken de SerVocontrol shield.
Op de shield een 7805 liniare voeding IC die van de aangesloten 9V een 5V maakt, nodig voor de VCC van de overige Ic's en de smartleds die op 5V werken.
De arduino heeft zijn eigen voeding IC's. De Vin op de arduino is doorverbonden met de Vin van de shield.
Een IN4007 diode zit op de shield om te beschermen tegen per abuis verkeerd aansluiten van de de voedingsspanning.
2 SN74HC595 IC's shiftregisters geven de arduino 16 extra output pinnen.
Een 6N137 optocoupler is een zeer snel werkende optocoupler en wordt algemeen gebruikt om het DCC signaal galvanisch ontkoppeld aan de microcontroller, in dit geval de arduino op PIN2, aan te bieden. Een gele led brand als er een DCC signaal is aangesloten.
9 drukknoppen en 9 smartleds WS2812d vormen de UI (user interface).
2,54 pitch dupont pinnen. Voor de verbinding naar de arduino. Een 3 pins aansluiting voor extra WS leds chips. Een 8 pins matrix aansluiting voor extra schakelaars. K(olom)1-k2-k3-k4-R(ij)1-r2-r3-r4.
Verder nog een handvol diodes en weerstanden.
Onderstaand het schema van de shield.
De sketch zelf kun je bekijken en/of downloaden van mijn github account.
Voor privé hobbygebruik vrij te gebruiken, voor een commerciële toepassing, neem dan even contact met me op.
In de sketch zijn enkele verschillende processen te onderscheiden:
DCC decoder, vanaf versie 3.01 is de nieuwste decoder, die gratis beschikbaar wordt gesteld door de NMRA, gebruikt.
Servo aansturing, 8 servo's, een servo krijgt voor een goede werking ongeveer een 50x per seconde een puls met de informatie welke stand het moet aannemen. De lengte van de puls valt (meestal, daar is een rits van uitzonderingen op tegenwoordig) tussen de 1 milliseconden voor volledig linksom naar 2 milliseconden voor helemaal rechtsom. Dus in theorie zouden met 1 timer van de arduino dus 1000(ms)/50(pulsfrequentie)=20 servo's aan te sturen zijn. Iedere servo heeft een current position, een requested position en een target position. Current position zegt waar de servo nu is, target position is waar de servo met de volgende puls naar toe moet gaan, requested position is de positie die uiteindelijk bereikt moet worden. Om de beurt worden de servo's bekeken. Als de requested position afwijkt van de current position dan wordt aan de hand van de ingestelde servo snelheid een nieuwe target position berekend, deze positie wordt gecodeerd naar een bepaalde tijdsduur, de timer wordt ingesteld op deze tijdsduur de datalijn naar deze servo wordt hoog gezet als start van de stuurpuls. Wanneer de timer afloopt wordt een interrupt gestart. De ISR van deze interrupt zet de datalijn van de servo weer laag. De servo-teller gaat naar de volgende servo.
Drukknoppen en schakelaars uitlezen. Periodiek worden de schakelaars uitgelezen, deze methode ondervangt tevens het denderen van schakel contacten.
Aansturen smartleds. hiervoor gebruik gemaakt van de fastled library. Als er een kleur van een van de neopixels moet worden aangepast wordt er een flag gezet. Periodiek 1x per 255 ISR aanroepen wordt deze flag getest, als waar dan worden de neopixels opnieuw ingesteld. De fastled library handelt dit allemaal af. Van de externe neopixels kan met een instelling de kleuren volgorde worden ingesteld. Dit wijkt nog wel eens af.
EEPROM, hiervoor gebruik gemaakt van de standaard arduino EEPROM library. Om zo veel als mogelijk te voorkomen dat servo's na power-up heftige bewegingen maken, wordt de current position van de servo's opgeslagen in EEPROM. Bij power-up van de arduino worden deze posities weer teruggelezen. Het aantal write cycli van de arduino EEPROM is gegarandeerd tot 100.000. Voor de opslag van de posities zijn 30 bytes nodig. Bij ieder power-up van de arduino wordt een oplopende serie van 30 bytes aangewezen als geheugen array voor deze 30 bytes. Verder wordt het aantal writes nog beperkt doordat de current position pas wordt geschreven als alle servo's inactief zijn. Hierdoor is het aantal power-ups van de arduino gegarandeerd tot 1.000.000. Bij een normaal gebruik waarbij gemiddeld de arduino 3x per dag wordt aangezet zal de arduino 100 jaar gegarandeerd blijven werken.
Voor meer info kun je altijd emailen.