BeneluxSpoor.net forum
Vraag en antwoord => Digitaal => Topic gestart door: RudyB op 15 October 2015, 14:35:40
-
Als je ergens op de baan, of in rollend materieel, een kleine DCC accessory decoder nodig hebt, dan zou de ATtiny uitkomst kunnen bieden. Samen met de benodigde optocoupler komen de kosten voor een 4 output accessory decoder op nog geen €2,50.
Onderstaande link gaat naar de blog, met een video waar de ATtiny aangestuurd wordt vanuit de ECoS. Daar staan ook links voor de gebruikte hardware en software. Omdat deze ATtiny USB heeft, gaat het programmeren heel gemakkelijk ... net als bij een standaard Arduino. Hij heeft ook een voedingsadapter aan boord.
Link naar de ATtiny DCC Functiedecoder (https://rudysmodelrailway.wordpress.com/2015/10/15/use-an-attiny-with-usb-as-a-dcc-function-decoder)
(http://up.picr.de/23410162ar.jpg)
-
Leuk gedaan :) Het is alleen geen functiedecoder ;) Het is nog steeds een accessoires aangezien je hem op de ECoS schakelt als sein. Wat we onder een functiedecoder verstaan reageert op een loc adres. Maar goed, dat is software en dus zo aan te passen. Let dan wel op dat de 7805 op het boardje het eigenlijk al met 1 ledjes te heet krijgt met baanspanningen.
Hoeveel ruimte heb je over op die ATtiny's? Dit omdat er dus Software USB in de bootloader moet zitten...
Timo
-
Leuk, werkt al goed. Nu nog die kleine software aanpassingen zoals Timo zei en dan de baan op! (y)
-
Ik vind hem eigenlijk erg groot voor een 'kleine' functiedecoder... volgens mij is een Kuehn N45, dus een volledige dcc decoder, zo te zien al de helft of misschien wel een kwart van deze?
-
Klein zat. Met ledrol of Hufing ledstrip voor weinig geld schakelbare binnenverlichting. (y)
-
@Timo. Er is 6k ruimte voor software. Genoeg voor de DCC decoder SW en dan is er nog bijna 1k aan ruimte over.
-
Klein zat. Met ledrol of Hufing ledstrip voor weinig geld schakelbare binnenverlichting. (y)
Nou, voor H0 dan. Ik denk niet eens dat deze in een N wagon past... wat zijn de exacte maten?
-
Staat op de website van de link: 22×18 mm
-
Maar dat is dus absoluut geen "kleine" decoder, maar een monster ;D Een kuehn n45 is 11.7 x 8.9 mm... ok, deze ATtiny heeft wat andere, aardige features, maar hij is flink aan de maat... niet te gebruiken in rollend N materiaal in ieder geval.
-
Het lijkt me ook niet dat je een accessory decoder wil inbouwen in je rollend materieel...
-
accessory decoder = vast wal.
functie decoder = in materieel.
groet,
Gerard van der Sel.
-
Men noemt het zelf toch echt 'functie decoder':
https://rudysmodelrailway.wordpress.com/2015/10/15/use-an-attiny-with-usb-as-a-dcc-function-decoder/
-
En de betreffende schrijver noemt het hier een accessory decoder.....
Stap er overheen jowi...
-
Ja, balen, want ik zag het helemaal zitten.
-
Hij bedoelde kleine prijs 😊
Verstuurd vanaf mijn SM-G920F met Tapatalk
-
De verwarring functiedecoder / accessoiredecoder komt doordat Rudy het eerst een functiedecoder noemde in zijn post. Dit heeft hij later aangepast in de titel van dit topic maar niet in de tekst of op zijn site. Misschien nog een idee Rudy? Voorkom je veel verwarring mee omdat geldt wat Gerard aan gaf.
En ja, vergeleken met gangbare decoders is hij groot, maar de prijs is wel een stuk kleiner.
Overigs is het niet zo lastig om het wel te verbouwen tot functiedecoder. In de code moet SetBasicAccessoryDecoderPacketHandler vervangen worden door een juiste implementatie van SetExtendedAccessoryDecoderPacketHandler. Ook kan de opto dan komen te vervallen. Voeding deel bestaat dan uit een gelijkrichter (of 4 diodes) en een weerstand en een zener voor het signaal. Aan een eindtrap met een mosfet (bijvoorbeeld de IRF7313 of IRLML2502) valt dan niet te ontkomen. Dit omdat de spanningsregelaar op het board het al zwaar krijgt met alleen het onboard ledje (ook al zou ik die er bij gebruik als functiedecoder af slopen). Maar de regulator is prima voor de ATtiny zelf. Misschien nog wat condensatoren om de mix compleet te maken.
Het kan dus wel, maar het zijn wel weer losse onderdelen...
Timo
-
De verwarring functiedecoder / accessoiredecoder komt doordat Rudy het eerst een functiedecoder noemde in zijn post maar dit later heeft aangepast in de titel maar niet in de tekst of op zijn site. Misschien nog een idee Ruby? Voorkom je veel verwarring mee omdat geldt wat Gerard aan gaf.
Over verwarring gesproken, Timo ;D ;)
-
@Ronald, ben misschien blind ::) , ik mis het even... ???
Timo
-
Rudy...Ruby ;)
-
Rudy / Ruby
Let op het verschil tussen de d en de b ;D
-
Totaal off-topic.... sorry voor de inbreuk in het draadje. Kon het niet laten ;)
-
Oeps, dacht al dat ik het over het hoofd zag ::)
Timo
-
Ja jongens ... ik heb een verkeerd woord gebruikt ... het is een accessory decoder! Op de blog heb ik een paar aanpassingen gedaan om misverstanden to voorkomen.
@Henk. Ik denk dat een accessory decoder best in rollend materiaal kan om bijvoorbeeld coach verlichting te schakelen? Weet niet of ie goed tegen power glitches kan ... dan zal ie zichzelf misschien resetten. Om dat te voorkomen moet er wel een redelijke elco bij.
En ja ... hij is 22x18mm. Als het kleiner moet, kan je zelf een ATtiny85, een zener voor de DCC, een diodebrug en een voedingsadaptertje op een printje solderen. Op internet is wel te vinden hoe de software te laden is. Dan heb je nog steeds voor €3,- een kleine mobiele accessory decoder. Een functiedecoder kopen voor €15,- kan natuurlijk ook.
-
Door de discussie over wel of niet klein verliezen we eigenlijk de essentie van het draadje uit het oog. Ik heb zelf ook een aantal van die Digispark Kickstarters liggen. Naast deze uitvoering is er ook nog een Digispark Pro. Voor Arduino maatstaven "klein" met zijn 18.3 x 26.7. De pro heeft meer uit- ingangen dan zijn kleine broer.
Als je een functiedecoder of locdecoder nodig hebt die klein is dan kan je er beter één kopen. Maar als je je eigen functies wil gaan programmeren dan zijn deze Kickstarters uitstekend geschikt. Denk aan speciale verlichting of de rechtstreekse aansturing van servo's.
Als functiedecoder wel de juiste software er op zetten (zie opmerking Timo). En heb je meer stroom nodig dan 50mA dan wel een transistor op de uitgang gebruiken.
gr. Frits
-
Zou zelf accessoiredecoders en functiedecoders niet gaan wisselen. Maar het is zo in software opgelost.
Zelf zal ik alleen de ledjes niet voeden uit de uC zelf. Als eerste omdat de 7805 het al wel snel warm krijgt. Met een enkel ledje is dat al +-0,3W. Ook kan een enkele pin maar 40mA doen (en stookt de spanningsregulator al 0,6W!). Beter dus om de regulator alleen voor de uC te houden. Dan heb je daar ook geen grote condensator voor nodig om die te laten werken bij spanningsonderbrekingen.
Timo
-
Frits, je noemde in je reactie 'aansturing van servo'. Heb je de software daarvoor al draaiend? We (Spock en ik) zijn namelijk nog op zoek naar een voor ATtiny 16Mhz geschikte servo library.
-
Hoi Ruud, nee, ik kan je helaas (nog) niet helpen maar volgens mij moet dat met de standaard library lukken. Ik ben mijn huis aan het verbouwen en dat moet nu eerst af. Daarna komt de hobby weer. Succes Frits
Verstuurd vanaf mijn SM-G920F met Tapatalk
-
OK, succes met de verbouwing!
De standaard servo.h library doet het helaas niet, die bevat een 16 bit timer, de Tiny heeft een 8 bit timer. Er is iemand die de library omgezet heeft naar servo8bit.h voor de Tiny, maar die is dan weer voor een 8MHz klok, wij zitten op 16 MHz. Dan is er ook nog de oude SoftwareServo.h library, maar die kregen we ook nog niet aan de praat. Verder prutsen dus maar.
-
Bedankt. Is gelukkig bijna klaar. Kan ik eindelijk weer actief aan de hobby i.p.v. meelezen met jullie boeiende draadjes. V.w.b. de 8 bits timer, daar heb je helemaal gelijk in. Als je ff googlet op "attiny servo arduino" dan zie je genoeg oplossingen.
Waar je volgens mij nog rekening mee moet houden is of de DCC software niet in conflict is met de toe te passen servo library.
Maar goed, daar is het hobby voor. Het moet niet al te makkelijk zijn.......
gr. Frits
-
Even snel naar de 8bit servo library gekeken. Je kan deze wel aanpassen voor 16Mhz. Je moet dan wel timer1 gebruiken omdat timer0 niet op een prescaler van 128 kan lopen (loopt nu op prescaler van 64). Twee keer zo hoge klok dus twee keer zo hoge prescaler voor zelfde effect. Als ik eht zo even snel goed zie kan je in de .cpp na regel 533 toevoegen:
#elif F_CPU == 1600000L
//set counter1 prescaler to 128
//our F_CPU is 16Mhz so this makes each timer tick be 8 microseconds long
TCCR1 &= (1<< CS13); //set
Verder weinig ervaring met de ATtiny dus geen idee of er standaard al andere dingen op timer1 draaien...
Maar waarom zou je een Attiny gebruiken voor servo's? Arduino Pro Mini is maar iets groter en iets duurder dan die ATtiny printjes. En onder een baan moet dat makkelijk passen. Voor in een loc/wagon kan ik het nog snappen maar dan wil je toch al zelf een los printje maken. En een servo is nog best groot in een loc ;D
Timo
-
Maar waarom zou je een Attiny gebruiken voor servo's?
Gewoon, omdat het kan! ;D
gr. Frits
-
Ook maar eens volgen, mocht er ooit eens tijd overblijven om iets met Arduino en Tiny's te gaan doen...
-
Tsja, een servo op een Tiny valt een beetje in de categorie 'zinloos geweld'. 't Is zoals Frits zegt ... omdat het kan. :) Nou ja ... dat moet dan nog blijken.
-
Ik heb 4 servo's op een ATtiny draaien (ATtiny2313). Helaas zijn ze geprogrammeerd in asm.
Groet,
Gerard van der Sel.
-
Op een ATtiny2313 is het ook wel wat makkelijker. Die beschikt wel over een 16-bit timer :)
Timo
-
Klopt,
Maar het is met de 8 bit timer gedaan.
Groet,
Gerard van der Sel.
-
Gerard, da's niet fout! Worden de servo's via DCC aangestuurd, of zijn het van de DCC losstaande servo's?
-
Servo's zijn niet DCC gestuurd, maar Selectrix. Dat heeft er eigenlijk niets mee te maken. De logica (software) om de servo's aan te sturen staat "los" van de besturing. De besturing geeft commando's, die daarna door de servosoftware opgepakt worden. Besturing zegt ga naar afbuigend. Software zoekt de servostand bij afbuigend op en draait de motor daar heen. Ik ben nu met een Arduino bezig met Selectrix, maar als dat tot rust is gekomen wil ik me daar ook in DCC gaan verdiepen.
Groet,
Gerard van der Sel.
-
Gebruik je daarvoor een prescaler van 128 (@ clock van 20Mhz)? Wat is de resolutie die je haalt met de 8-bit timer?
Als je zou willen zou je de asm code inline kunnen gebruiken in de Arduino IDE en ze zo een C++ vriendelijke wrapper geven. Zie Inline Assembler Cookbook (http://www.nongnu.org/avr-libc/user-manual/inline_asm.html).
Timo
-
Nee de ATtiny draait op de interne klok (8 MHz) en de IO versnelling aan (ivm interrupt verwerking SX-bus).
De prescaler staat op 64 inderdaad.
Groet,
Gerard van der Sel.
-
Hallo Ruud,
Misschien kan je deze software (https://github.com/fri000/Servo8Bit) eens proberen. Volgens mij draait dit op een ATtiny85 op 16MHz.
Succes Frits
-
Hoi Frist,
Dat is de library dit Rudy in post 27 (http://forum.beneluxspoor.net/index.php/topic,66545.msg3221606334.html#msg3221606334) noemt en waar de discussie dus eigenlijk mee begon ;D Deze werkt zo dus alleen maar op een 8Mhz tiny. In post 29 (http://forum.beneluxspoor.net/index.php/topic,66545.msg3221606603.html#msg3221606603) gaf ik een toevoeging aan waarmee het ook op 16Mhz moet kunnen lopen met als verplichting dat timer 1 gebruikt wordt.
Timo
-
Ooo...dan zijn we weer terug bij af.......
Volgens de code zou hij op 16MHz moeten werken. Wellicht met jou toevoeging. Ik kan het momenteel helaas niet testen.
Gr. Frits
Verstuurd vanaf mijn SM-G920F met Tapatalk
-
In de code staat dit (zonder mijn toevoeging):
#ifdef USE_TIMER0
//reset the Timer Counter Control Register to its reset value
TCCR0B = 0;
#if F_CPU == 8000000L
//set counter0 prescaler to 64
//our FCLK is 8mhz so this makes each timer tick be 8 microseconds long
TCCR0B &= ~(1<< CS02); //clear
TCCR0B |= (1<< CS01); //set
TCCR0B |= (1<< CS00); //set
#elif F_CPU == 1000000L
//set counter0 prescaler to 8
//our F_CPU is 1mhz so this makes each timer tick be 8 microseconds long
TCCR0B &= ~(1<< CS02); //clear
TCCR0B |= (1<< CS01); //set
TCCR0B &= ~(1<< CS00); //clear
#else
//unsupported clock speed
//TODO: find a way to have the compiler stop compiling and bark at the user
#endif
#endif
#ifdef USE_TIMER1
//reset the Timer Counter Control Register to its reset value
TCCR1 = 0;
#if F_CPU == 8000000L
//set counter1 prescaler to 64
//our F_CPU is 8mhz so this makes each timer tick be 8 microseconds long
TCCR1 &= ~(1<< CS13); //clear
TCCR1 |= (1<< CS12); //set
TCCR1 |= (1<< CS11); //set
TCCR1 |= (1<< CS10); //set
#elif F_CPU == 1000000L
//set counter1 prescaler to 8
//our F_CPU is 1mhz so this makes each timer tick be 8 microseconds long
TCCR1 &= ~(1<< CS13); //clear
TCCR1 |= (1<< CS12); //set
TCCR1 &= ~(1<< CS11); //clear
TCCR1 &= ~(1<< CS10); //clear
#else
//unsupported clock speed
//TODO: find a way to have the compiler stop compiling and bark at the user
#endif
Doet dus aardig niets als de clock 16Mhz is ;D
De todo die de auteur daar overigens aanhaalt zou zo simpel zijn als daar toevoegen
#error Clock speed unsupported
;D
Timo
-
Ik las onderstaande in het programma en ging er van uit dat hij dan ook op 16MHz zou werken:
void delayMicroseconds(uint16_t us)
{
#if F_CPU >= 16000000L
// for the 16 MHz clock on most Arduino boards
// for a one-microsecond delay, simply return. the overhead
// of the function call yields a delay of approximately 1 1/8 us.