Arduino DCC decoder met verschillende functies

Gestart door Dirkh, 10 maart 2017, 21:45:31 PM

Dirkh

Volgend arduino projectje: Ik had een functie decoder nodig die verschillende mogelijkheden had. O.a. met een vertraging bepaalde functies schakelen. Ook wilde ik dat de servo's stabiel blijven bij het in en uitschakelen, daarvoor wordt de positie van de servo telkens opgeslagen in EEPROM en uitgelezen bij het opstarten. De arduino kan tot 100000 keer schrijven in de EEPROM dus de servo kan 100000 keer schakelen. Ik denk dat de servo eerder gaat versleten zijn dan de arduino.
Het resultaat valt best mee, slechts een zeer kleine beweging bij het opstarten die ook automatisch na het opstarten word gecorrigeerd.

Eerste functie gewoon servo draaien en in het midden van de draaihoek een relais laten schakelen voor de puntstuk polaisatie
filmpje van de testopstelling : https://goo.gl/photos/MhoiWbQuNeUVxNd48

Tweede functie , knipperlicht inschakelen en na een bepaalde tijd de servo bewegen, bij het afschakelen eerst de servo terug zetten en dan het knipperlicht uitschakelen.
filmpje :  https://goo.gl/photos/AovvfzknBfhMtoTf8

Verder zijn er nog verschillende mogelijkheden zoals gewoon iets schakelen , een puls van een bepaalde duur geven , flikker licht met instelbare tijden, en alternerende flikker lichten Alle functies kunnen vertraagd worden bij het inschakelen of uitschakelen.
Per servo kunnen ook de hoeken en snelheid ingesteld worden.

Met een arduino pro mini kunnen er 14 functies geconfigureerd worden of 7 servos met puntstuk.
Ik moet nog wel testen met 7 servo's aangesloten maar voor het ogenblik werkt het al behoorlijk. Nog wat kleine aanpassingen om enkele schoonheidsfouten wegwerken en de code nog wat optimaliseren en de decoder kan onder de baan.

Voor de geïnteresseerden is hier de code te vinden : https://drive.google.com/open?id=0B-DQeMTClyTKamdQelh4bkpETk0


Om de servo hoeken en de snelheid te bepalen heb ik ook een servo_tune programm, hiermee kan via een putty sessie via het toetsenbord de servo ingesteld worden. De gevonden waarden kunnen dan overgenomen worden in het decoder programma.
de code : https://drive.google.com/open?id=0B-DQeMTClyTKR3hKVnZJdERnajA

uitleg voor het gebruik is in commentaar te vinden in de programma code voor beide.

Freek

Dat ziet er alvast zeer goed.
Heeft de arduino geen functie die een powerdrop kan detecteren? Dan zou je eventueel pas op dat moment de waardes gaan wegschrijven en alleen dan. Ik weet niet of dit aanwezig is op arduino, ik ben daar zo niet in thuis. Maar aangezien de meeste atmel's dit hebben zou ik denken een arduino ook. Of je zou het kunnen wegschrijven naar een externe EEPROM zodat je die kan vervangen?

Maar ik denk ook wel dat je servo eerder versleten zal zijn  :D.



dani

#2
zelfs als je eeprom van de arduino kapot gaat , zo een pro mini kost nog geen 2 euro bij de massa-chinees :-)

Leuk projectje.  Waarom slechts 14 functies ?

Eens je programma in orde is en je definitieve versie draait kan je  toch meer gebruiken ?

Digitale in/out  0-14   (dus  14 stuks )
Analoge poorten :  0-7   (dus 8 stuks)

Hiervan moet je één poortje opofferen voor je DCC signaal, en kunnen A6 en A7 enkel gebruikt worden voor echt "analoge" ingang. de rest kan ook digitaal uitgang schakelen.

Dus je hebt D0...D13 en dan gewoon verder tellen  (A0=14... A1=D15.. A2=D16..A3=D17..A4=D18..A5=D19)

In feite kan je dus  D0 tot D20 gebruiken, minus de pin voor je signaal  = 19 kanalen.

a  ja voor ik het vergeet, NIET alle poorten kunnen een PWM genereren, dus je bent beperkt in aantal servo's.
De  ATMega328P chip op dit bordje ziet er zo uit :



maar dan wel met die  extra 16 en 17 ingangen er nog bij.

Dus enkel pins 3,5,6,9,10 en 11 ondersteunen "native" pwm. 
Je kan echter wel  "softservo.h" bibliotheer inschakelen om de rest van de pins ook te laten doen alsof ze PWM pins zijn.

Ik volg dit projectje, het is een leuke toepassing.
De kruik is te water gegaan...
De kruik is niet meer.

Dirkh

@Dani

Ik ben maar een amateur programmeur, dus de code is nog niet optimaal en zal dat misschien wel nooit worden  ;D.
Ik heb maar nood aan 14 uitgangen per pro mini dus heb ik nog niet getest met die extra uitgangen. Normaal zou dat ook moeten werken met alle pinnen.
Volgens de arduino uitleg kan je met de servo library 12 servo's aansluiten op een pro mini, nadeel je verliest blijkbaar de pwm functie op pinnen 9 en 10.
Ik moet nog verder testen en dan de beschrijving verder aanpassen om aan te geven welke functies op welke pin kunnen gebruikt worden.
Die Softservo library lijkt mij interessant. Die ga ik eens verder bekijken, vooral het voorbeeld dat erbij zit met de interrupt om de servo beweging te timen .
Maar ik mis daar wel de writeMicroseconds() functie in. Ik heb ondervonden dat met gebruik te maken van writeMicroseconds() de servo meer gelijkmatiger loopt. (+/- 5 extra stappen per graad verdraaiing ipv verdraaiing per graad met de write functie)   Het zal ook wel een beetje afhangen van de gebruikte servo's.

Ik heb nog wat extra werk om alles verder uit te zoeken en te testen. Voor het ogenblik heb ik enkel pinnen 3,4,5 en A0 gebruikt om servo's te testen de rest moet ik nog nakijken.
Ik wil ook nog een servo.detach() inbouwen om de servo los te koppelen van zodra hij de eindpositie heeft bereikt om bij belasting op de servo arm te voorkomen dat de servo blijft brommen en veel stroom trekken.

Er zit nog ergens een programmeer foutje in waardoor als je tijdens het bewegen van de servo een volgende commando stuurt de servo niet tot het einde van de beweging gaat en ook niet reageert op het nieuwe commando.  >:(

Er is nog werk aan  :) Maar dat zal voor vanavond zijn, veel te goed weer vandaag om binnen te zitten, eerst wat vitamine D opdoen in de zon.  :D

Dirkh

Nieuwe versie gemaakt, terug gebaseerd op een decoder van Ruud Boer.

Deze kan 16  accessoires aansturen en max. 12 servo's

Wijzigingen t.o.v. de originele versie

DCC offset voor multimaus toegevoegd (offset of 5) kan gewijzigd worden in lijn 168
De  BasicAccDecoderPacket_Handler aangepast zodat hij nu slecht een maal reageerd op een DCC command (multimaus herhaald commando's enkele keren soms)
De laatste positie van een servo wordt gestockeerd in de EEPROM en wordt gezet bij opstarten
De laatste stand van een accessoire wordt gestockeerd in in EEPROM en wordt gezet bij opstarten
Een servotimer voor elke servo apart zodat de snelheid van elke servo apart kan ingesteld worden
Een extra optie bij servo om een frogpin te bepalen die geschakeld wordt in de midden positie tussen on en off hoek van de servo
attach / detach bij servo bijgevoegd om power drain van de servo te vermijden bij belasting op de eindpunten.

Source code :
https://drive.google.com/file/d/0B-DQeMTClyTKZHRuOWZLSlNYa1U/view?usp=sharing