Auteur Topic: Analoog rijden met geluid - het project.  (gelezen 73224 keer)

0 leden en 1 gast bekijken dit topic.

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Analoog rijden met geluid - het project.
« Reactie #175 Gepost op: 17 april 2020, 18:18:30 »
Stereo?

Stereo in modeltreinen: da's niet zo heel zinvol....
Of toch wel?
Je kunt stereo ook zien als 2 mono kanalen. En dan is met één geluidsmodule in een dubbelloc in elk deel ander geluid weer te geven.




Volgens bronnen op internet was ook stereo geluid te halen uit de DFplayer mini (de MP3 speler die ik gebruik in mijn geluidsmodules) door twee speakers op de speaker uitgang aan te sluiten. Elke speaker is dan aan één kant verbinden met de massa (GND) en aan de andere kant met de speaker uitgang. Zoiets.




Maar dat werkt niet. Geen stereo geluid, maar de spanningsregelaar op de Arduino werd wel heel warm in de V188 dubbelloc waar e.e.a. al was ingebouwd.


^ Het motor deel van de dubbelloc krijgt alleen een speaker


^ De module komt in het motorloze deel. Ook hier een speaker


Nu is het niet zo héél erg dat er geen stereo (dubbel mono) is. Ik heb de verbinding van de speakers met de GND verbroken, waardoor de speakers nu in serie staan. Het stroomverbruik is nu weer normaal en er komt nog steeds geluid uit beide delen.

Maar... als het goed is komt uit de oortelefoonaansluiting van de MP3 speler wel stereo, alleen moet dat dan nog versterkt worden. Ik heb versterkertjes besteld van 21x18 mm. Daar is nog ruimte voor om in te bouwen.


^ Aan de voorkant is nog ruimte voor een versterkertje


Wie weet....

Nu is deze stereo oefening sowieso goed geweest om geluidsfragmenten te mengen. Dat en nog wat andere verbeteringen brengen me dan langzamerhand tot versie 3.0....
Maar daarover later meer.

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline SuperSylvester

  • Super Modelspoorder
  • ******
  • Berichten: 2.054
  • Thanked: 77 times
  • Geslacht: Man
Re: Analoog rijden met geluid - het project.
« Reactie #176 Gepost op: 17 april 2020, 19:20:14 »
Godfried van Bouillon!  :o in versie 4 ga je zeker surround 5.1 inbouwen?  ;D

Heb je dan de sound gemixt zodat rechts iets anders klinkt dan links?

Groet, Jack. Dwarsliggers houden het spoor recht....

H0 gelijkstroom, ECOS 2, Carsysteem, Periode pre-historie tot heden, grensoverschrijdend Nederlands

Offline Pierre

  • Super Modelspoorder
  • ******
  • Berichten: 7.918
  • Thanked: 334 times
  • Geslacht: Man
  • Woonplaats: Den Haag (Loosduinen)
    • Haagse Modelbouw Club
Re: Analoog rijden met geluid - het project.
« Reactie #177 Gepost op: 17 april 2020, 19:39:54 »
Mooi experiment Rob. Ben zeer benieuwd hoe dat afloopt. :)
Nou heb ik een vraagje. Is het niet mogelijk het geluid van één van de luidsprekertjes iets te vertragen? Dan lijkt het misschien ook of er twee motoren draaien. Ik denk nu even hardop hè ... Geen flauw idee of dat kan.
Groet Pierre.

Ik rommel wat met treintjes en bouwwerkjes in H0 (H0e) en ook een klein beetje in N  .... Scratchbuilding, kitbashing en weathering.  ;D Lid van de http://haagsemodelbouwclub.nl/

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Analoog rijden met geluid - het project.
« Reactie #178 Gepost op: 17 april 2020, 20:08:10 »
Tsja, beetje experienteren inderdaad...

Heb je dan de sound gemixt zodat rechts iets anders klinkt dan links?
Ja: 2 motoren die na elkaar starten (of stopgezet worden), elk op een kanaal. De ene motor loopt ook net iets sneller (5%) dan de andere.
Op de computer (met stereo) geeft dat wel een 'vol' geluid.

Verder zitten dan op het 'middenkanaal' de extra geluidsfuncties, zoals de hoorn en de remmen bij de motorgeluiden op links en rechts.

Nou heb ik een vraagje. Is het niet mogelijk het geluid van één van de luidsprekertjes iets te vertragen? Dan lijkt het misschien ook of er twee motoren draaien. Ik denk nu even hardop hè ... Geen flauw idee of dat kan.
Ik heb geen idee. Er is vast wel wat elektronica die dat kan. Lekker hardop blijven meedenken, Pierre!
Twee MP3 spelertjes kan natuurlijk ook. Maar zo'n versterkertje kost maar 1,50 euro, een extra MP3 met geheugenkaartje een tientje (vanuit Nederland).

Eerst maar even dat versterkertje afwachten.

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Pierre

  • Super Modelspoorder
  • ******
  • Berichten: 7.918
  • Thanked: 334 times
  • Geslacht: Man
  • Woonplaats: Den Haag (Loosduinen)
    • Haagse Modelbouw Club
Re: Analoog rijden met geluid - het project.
« Reactie #179 Gepost op: 18 april 2020, 10:18:27 »
Ja Rob ... twee spelertjes is natuurlijk nog beter. Dan gaat net als in het echt het toerental wel gelijk omhoog maar de slag van de zuigers niet helemaal synchroon. Dat lijkt me de mooiste oplossing. ;)
Groet Pierre.

Ik rommel wat met treintjes en bouwwerkjes in H0 (H0e) en ook een klein beetje in N  .... Scratchbuilding, kitbashing en weathering.  ;D Lid van de http://haagsemodelbouwclub.nl/

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Analoog rijden met geluid - het project.
« Reactie #180 Gepost op: 18 april 2020, 11:47:00 »
Hoi Pierre,
Ja Rob ... twee spelertjes is natuurlijk nog beter. Dan gaat net als in het echt het toerental wel gelijk omhoog maar de slag van de zuigers niet helemaal synchroon. Dat lijkt me de mooiste oplossing. ;)
Dit is precies wat ik eerst probeer te bereiken met de dubbel mono.... De geluidsbestanden zijn als zo gemaakt, dus dit is al enigszins te horen...

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Analoog rijden met geluid - het project.
« Reactie #181 Gepost op: 19 april 2020, 18:35:31 »
Goh. Sneller dan verwacht is de stereo versterker gearriveerd.
Even een proefopstelling,




En zowaar: luid en duidelijk 2 motoren, elk op een eigen speaker...

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Wim Corduwener

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 10.844
  • Thanked: 300 times
  • Geslacht: Man
  • Enschede (import)
    • Portfolio
Re: Analoog rijden met geluid - het project.
« Reactie #182 Gepost op: 19 april 2020, 22:15:58 »
Misschien geef ik m’n bek ook maar een douw:

Is in dat rijdende stereootje geen dopplereffect in te bouwen?
Trefwoorden:  Mac • Modulebouw • H0, H0e en 0e • Tijdperk III (1950-1960) • Nederlands (H0 en H0e) • Frans (1:45) • Gelijkstroom • Twee rails • Voorlopig nog even analoog • Scratchbuilding en Kitbutchering... en ik maak eigenlijk nooit wat af.

Meest recente projecten: Frans diorama 2.0 (Spoor 0e) en Verbouwing Magic Train (schaal 0e)

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Analoog rijden met geluid - het project.
« Reactie #183 Gepost op: 19 april 2020, 23:05:03 »
Tsja....
Is in dat rijdende stereootje geen dopplereffect in te bouwen?
Nu kan deze Lima loc behoorlijk snel, ik zal straks eens luisteren....  :o

Ondertussen zit de stereo (dubbel mono) er in.




Als je redelijk dicht bij de loc zit, kun je duidelijk horen dat eerst de ene loc start, en dan de andere. En daarna niet-synchroon lopende diesels... Ook op afstand is het geluid wat 'voller', al kan dat ook komen door een betere versterker (hifi?).

Ondertussen is ook de software aangepast en zitten alle nieuwe geluidsbestanden er op voor geluid 3.0

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Rein

  • Kruier
  • *
  • Berichten: 17
Re: Analoog rijden met geluid - het project.
« Reactie #184 Gepost op: 24 april 2020, 15:39:47 »
Ik ben nogal onder de indruk van dit geknutsel en vooral van de kwaliteit van het geluid.
In een grijs verleden heb ik wel eens geprutst met een SN76477 en dat klonk ook wel aardig, maar was veel te groot om in een loc te passen.
De laatste tijd was ik toch weer eens op zoek gegaan naar zoiets en ik had dit (met een PicAxe) en dit (met een Arduino) al wel gevonden, beide met hun eigen nadelen. En toen vond ik op Youtube de filmpjes van Rob.
Ik ben bezig om een klein HO baantje te bouwen en ik was van plan om mijn vertrouwde Weistra-regelaar weer te gebruiken, samen met de hoogfrequent  generator voor de verlichting. Dat heeft me altijd prima voldaan. Ik denk er nu over in plaats daarvan een Arduino in te zetten, maar dan misschien niet met een vaste PWM frequentie van 490 Hz, maar met een toenemende frequentie van ca. 20 tot ca. 120 Hz, zoals bij de Weistra-regelaar.
Robs idee om de geluidsfuncties met verschillende frequenties aan te sturen is geniaal in zijn eenvoud. Het lijkt een beetje op het meertreinensysteem van Salota (?): 5 treinen apart te bedienen via verschillende frequenties op de rijstroom.
Ik zit trouwens nog wel te dubben of ik de hoogfrequent ook weer ga gebruiken. Dat heeft natuurlijk wel het voordeel, dat de geluidsmodules altijd voldoende spanning hebben en dat de buffer-elco veel kleiner kan zijn. Nadeel is misschien, dat de frequentie (ca. 20kHz) hoorbaar zou kunnen worden, of storing geeft op radio, wifi e.d. of op de geluidsmodule zelf. Het is tenslotte een soort van blokspanning met heel veel harmonischen en met de rails heb je een enorme antenne. Gewoon proberen, denk ik en dan zien we het wel. Er kan altijd hier of daar nog wel een filtertje tussen.
Wat ik in ieder geval wil proberen te veranderen is de stop met de potmeter in de middenstand. Daar heb ik nooit aan kunnen wennen. Richting omschakelen dus met een schakelaar; het lijkt me niet heel ingewikkeld.
Wel een vraag nog aan Rob: is er een reden dat je de "analoge" ingangen van de Arduino gebruikt voor de functietoetsen en niet de digitale?
Eerst maar eens kijken hoe lang meneer Ali er over doet om de spulletjes hier te brengen en dan laat ik wel wat horen over de experimenten.
In tussentijd: nogmaals chapeau voor dit project.

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Analoog rijden met geluid - het project.
« Reactie #185 Gepost op: 24 april 2020, 16:30:15 »
Hoi Rein,

Dank voor alle veren, en leuk dat je hier ook mee aan de slag wil gaan.

is er een reden dat je de "analoge" ingangen van de Arduino gebruikt voor de functietoetsen en niet de digitale?
Nee, hoor, alleen esthetische: zo zitten alle 'input' pinnen mooi naast elkaar.

Met de hoogfrequente spanning er ook bij, zie ik nog wel mogelijk een "dingetje": de Arduino meet de (tijd tussen de) 'flanken' van de pulsen om de pulsbreedte van de rijstroom op de rails te meten. Een andere blokspanning op de rails kan die meting verstoren.
Overigens kun je met een  gelijkrichter, Elco, weerstandje en LEDs ook prima een vrij constante (binnen) verlichting maken. Een klein beetje rijstroom (= smalle puls) is al voldoende om de verlichting aan te zetten.

En een rijrichting schakelaar in plaats van een potmeter met middenstand is inderdaad vrij eenvoudig te doen. Ik overweeg nog om dat bij mij ook te veranderen: de rijrichting kan dan makkelijker worden omgeschakeld terwijl er stroom op de rails blijft en dus de verlichting e/o geluidsmodule aan blijft. Nu gaat het licht en geluid tussendoor even uit bij het rangeren, bijvoorbeeld.

In ieder geval succes!

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Analoog rijden met geluid - het project.
« Reactie #186 Gepost op: 28 juni 2020, 21:21:12 »
Ik had weer eens zin om een filmpje te maken.

Alle ontwikkelingen van de afgelopen tijd in gebundeld in "Geluid 3.0".
- omschakelen rijstroom
- gemengde geluidsfragmenten
- stereo
(en nog een verrassing op het eind)



groet,
Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Pierre

  • Super Modelspoorder
  • ******
  • Berichten: 7.918
  • Thanked: 334 times
  • Geslacht: Man
  • Woonplaats: Den Haag (Loosduinen)
    • Haagse Modelbouw Club
Re: Analoog rijden met geluid - het project.
« Reactie #187 Gepost op: 28 juni 2020, 22:45:26 »
Grandioos Rob. ;)
Groet Pierre.

Ik rommel wat met treintjes en bouwwerkjes in H0 (H0e) en ook een klein beetje in N  .... Scratchbuilding, kitbashing en weathering.  ;D Lid van de http://haagsemodelbouwclub.nl/
The following users thanked this post: ron.kraaijkamp

Offline ron.kraaijkamp

  • Kruier
  • *
  • Berichten: 11
  • Geslacht: Man
    • 2RSweb
Re: Analoog rijden met geluid - het project.
« Reactie #188 Gepost op: 30 juni 2020, 08:34:01 »
Hallo Rob,

Ik heb het hele draadje doorgelezen. Erg leuk en interessant.
Ben zelf ook plannen aan het maken om na 40 jaar weer te beginnen. Ik heb heel veel analoog materiaal en door de hoeveelheid vindt ik het niet lonen om digitaal te gaan rijden.
Jou project is een mooie combi.
Ik ben er nog niet uit of ik ook geluid op mijn baan wil gebruiken. Wel bijvoorbeeld de verlichting schakelen en met PWM de loc aansturen.
Hiervoor heb ik een Arduino Uno in huis en wacht nog op de motor aansturings print.

Mijn idee is om een lage frequentie te gebruiken voor langzaam rijden en een hogere voor hoge(re) snelheden.
Dat moet in de code voor de Arduino te programeren zijn.

Wat me in je filmpje van "Geluid 3.0" opviel is dat de twee locs onafhankelijk van elkaar rijden op hetzelfde baanvak. Heb ik iets gemist in dit draadje mbt aansturen van de locs op hetzelfde baanvak?

Ik blijf dit met plezier volgen en zodra mijn motor aansturings print binnen is, ga ik experimenteren.

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Analoog rijden met geluid - het project.
« Reactie #189 Gepost op: 30 juni 2020, 09:30:58 »
Hoi Ron,

Leuk dat je het analoge materieel weer "uit de mottenballen gaat halen".
Rijden met PWM geeft al meteen betere rijeigenschappen, juist ook goed merkbaar met wat ouder spul. Rails goed schoonmaken en een beetje ATF er op (http://www.h0modelspoor.nl/index.php?topic=3121), en dan rijdt ook oud materieel goed.

Mijn idee is om een lage frequentie te gebruiken voor langzaam rijden en een hogere voor hoge(re) snelheden.
Dat moet in de code voor de Arduino te programeren zijn.
Dat is zeker te programmeren, je kunt bijvoorbeeld de 'deler' van de klok voor de PWM aanpassen (al heb ik dat zelf nog niet gedaan), al zijn er ook andere manieren.
Maar waarom zou je een andere frequentie PWM doen bij lagere dan bij hogere snelheid?

Wat me in je filmpje van "Geluid 3.0" opviel is dat de twee locs onafhankelijk van elkaar rijden op hetzelfde baanvak. Heb ik iets gemist in dit draadje mbt aansturen van de locs op hetzelfde baanvak?
Ha, goed gezien. Je hebt niets gemist, hoor. Het is ouderwetse analoge techniek: dit spoor (spoor 2 op het vernieuwde station "Grauberg") heeft 3 vakken die van elkaar elektrisch geïsoleerd zijn en afzonderlijk zijn in- en uit te schakelen. Dat geeft dan operationele mogelijkheden hier met de waterkraan en de verbinding naar spoor 3.

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline ron.kraaijkamp

  • Kruier
  • *
  • Berichten: 11
  • Geslacht: Man
    • 2RSweb
Re: Analoog rijden met geluid - het project.
« Reactie #190 Gepost op: 30 juni 2020, 14:12:50 »
Leuk dat je het analoge materieel weer "uit de mottenballen gaat halen".
Rijden met PWM geeft al meteen betere rijeigenschappen, juist ook goed merkbaar met wat ouder soul. Rails goed schoonmaken en een beetje ATF er op (http://www.h0modelspoor.nl/index.php?topic=3121), en dan rijdt ook oud materieel goed.
De ATF truc ken ik inderdaad. Werkt goed.

Citaat
Dat is zeker te programmeren, je kunt bijvoorbeeld de 'deler' van de klok voor de PWM aanpassen (al heb ik dat zelf nog niet gedaan), al zijn er ook andere manieren.
Maar waarom zou je een andere frequentie PWM doen bij lagere dan bij hogere snelheid?
Ik heb begrepen dat een loc bij een lagere frequetie beter langzaam rijdt en dat voor hogere snelheden, een hogere frequentie beter is. De Weistra methode.
Rein noemde dit ook al, enkele berichten hierboven.

Dank je voor je bericht Rob

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Analoog rijden met geluid - het project.
« Reactie #191 Gepost op: 30 juni 2020, 16:12:31 »
Graag gedaan Ron.

En ik leer ook weer wat :)
Ik heb begrepen dat een loc bij een lagere frequentie beter langzaam rijdt en dat voor hogere snelheden, een hogere frequentie beter is. De Weistra methode.
Rein noemde dit ook al, enkele berichten hierboven.
Dat had ik even gemist, maar interessant.
Daarnaast is een frequentie van 20Hz niet of nauwelijks hoorbaar, De 490Hz hoor je, afhankelijk van hoeveel er trilt en meetrilt in de betreffende loc, met name bij stilstaande motor soms vrij goed.
Kan ik eens proberen. Een lager frequente betekent wel dat de Elco van de geluidsmodules een langere tijd te overbruggen heeft. Dus misschien valt dan de spanning te laag uit.

Daar is één manier om er achter te komen....
(dat wordt even programmeren)

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Analoog rijden met geluid - het project.
« Reactie #192 Gepost op: 30 juni 2020, 18:39:19 »
Lagere PWM frequentie kan vrij eenvoudig op de Arduino worden ingesteld door de 'deelfactor' met de timers aan te passen. Dan kom je op zijn laagst tot 30 Hz.

Code voor het instellen van D3 & D11:
TCCR2B = TCCR2B & B11111000 | B00000001; // for PWM frequency of 31372.55 Hz
TCCR2B = TCCR2B & B11111000 | B00000010; // for PWM frequency of 3921.16 Hz
TCCR2B = TCCR2B & B11111000 | B00000011; // for PWM frequency of 980.39 Hz
TCCR2B = TCCR2B & B11111000 | B00000100; // for PWM frequency of 490.20 Hz (The DEFAULT)
TCCR2B = TCCR2B & B11111000 | B00000101; // for PWM frequency of 245.10 Hz
TCCR2B = TCCR2B & B11111000 | B00000110; // for PWM frequency of 122.55 Hz
TCCR2B = TCCR2B & B11111000 | B00000111; // for PWM frequency of 30.64 Hz

Code voor het instellen van D5 & D6:
TCCR0B = TCCR0B & B11111000 | B00000001; // for PWM frequency of 62500.00 Hz
TCCR0B = TCCR0B & B11111000 | B00000010; // for PWM frequency of 7812.50 Hz
TCCR0B = TCCR0B & B11111000 | B00000011; // for PWM frequency of 976.56 Hz (The DEFAULT)
TCCR0B = TCCR0B & B11111000 | B00000100; // for PWM frequency of 244.14 Hz
TCCR0B = TCCR0B & B11111000 | B00000101; // for PWM frequency of 61.04 Hz

Code voor het instellen van D9 & D10:
TCCR1B = TCCR1B & B11111000 | B00000001; // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz
TCCR1B = TCCR1B & B11111000 | B00000010; // for PWM frequency of 3921.16 Hz
TCCR1B = TCCR1B & B11111000 | B00000011; // for PWM frequency of 490.20 Hz (The DEFAULT)
TCCR1B = TCCR1B & B11111000 | B00000100; // for PWM frequency of 122.55 Hz
TCCR1B = TCCR1B & B11111000 | B00000101; // for PWM frequency of 30.64 Hz

Ik heb het geprobeerd, en je kunt inderdaad op 30Hz nog wat langzamer kruipen dan op zo'n 490 Hz, lijkt het.
Maar mijn geluidsmodules trekken het niet. Dus ik hou het maar op de standaard 490Hz. Daar zijn m'n Elco's aan boord op afgestemd.

Maar weer wat geleerd :)
Als je alleen licht doet, is deze lage frequentie bij lage snelheden zeker een optie. En dan kun je bij stilstaan juist weer een hoge frequentie nemen, zodat de loc beter blijft staan.

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...
The following users thanked this post: ron.kraaijkamp

Offline ron.kraaijkamp

  • Kruier
  • *
  • Berichten: 11
  • Geslacht: Man
    • 2RSweb
Re: Analoog rijden met geluid - het project.
« Reactie #193 Gepost op: 2 juli 2020, 14:18:43 »
Gelijk maar geprobeerd Rob.
Indrukwekkend.

Ik denk er inderdaad aan om alleen licht te gebruiken.

Zodra ik mijn motorsturing binnen heb, ga ik de het opbouwen en proberen.

Offline ron.kraaijkamp

  • Kruier
  • *
  • Berichten: 11
  • Geslacht: Man
    • 2RSweb
Re: Analoog rijden met geluid - het project.
« Reactie #194 Gepost op: 16 juli 2020, 17:21:10 »
Lagere PWM frequentie kan vrij eenvoudig op de Arduino worden ingesteld door de 'deelfactor' met de timers aan te passen. Dan kom je op zijn laagst tot 30 Hz.

Code voor het instellen van D3 & D11:
TCCR2B = TCCR2B & B11111000 | B00000001; // for PWM frequency of 31372.55 Hz
TCCR2B = TCCR2B & B11111000 | B00000010; // for PWM frequency of 3921.16 Hz
TCCR2B = TCCR2B & B11111000 | B00000011; // for PWM frequency of 980.39 Hz
TCCR2B = TCCR2B & B11111000 | B00000100; // for PWM frequency of 490.20 Hz (The DEFAULT)
TCCR2B = TCCR2B & B11111000 | B00000101; // for PWM frequency of 245.10 Hz
TCCR2B = TCCR2B & B11111000 | B00000110; // for PWM frequency of 122.55 Hz
TCCR2B = TCCR2B & B11111000 | B00000111; // for PWM frequency of 30.64 Hz

Code voor het instellen van D5 & D6:
TCCR0B = TCCR0B & B11111000 | B00000001; // for PWM frequency of 62500.00 Hz
TCCR0B = TCCR0B & B11111000 | B00000010; // for PWM frequency of 7812.50 Hz
TCCR0B = TCCR0B & B11111000 | B00000011; // for PWM frequency of 976.56 Hz (The DEFAULT)
TCCR0B = TCCR0B & B11111000 | B00000100; // for PWM frequency of 244.14 Hz
TCCR0B = TCCR0B & B11111000 | B00000101; // for PWM frequency of 61.04 Hz

Code voor het instellen van D9 & D10:
TCCR1B = TCCR1B & B11111000 | B00000001; // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz
TCCR1B = TCCR1B & B11111000 | B00000010; // for PWM frequency of 3921.16 Hz
TCCR1B = TCCR1B & B11111000 | B00000011; // for PWM frequency of 490.20 Hz (The DEFAULT)
TCCR1B = TCCR1B & B11111000 | B00000100; // for PWM frequency of 122.55 Hz
TCCR1B = TCCR1B & B11111000 | B00000101; // for PWM frequency of 30.64 Hz

Ik heb het geprobeerd, en je kunt inderdaad op 30Hz nog wat langzamer kruipen dan op zo'n 490 Hz, lijkt het.
Maar mijn geluidsmodules trekken het niet. Dus ik hou het maar op de standaard 490Hz. Daar zijn m'n Elco's aan boord op afgestemd.

Maar weer wat geleerd :)
Als je alleen licht doet, is deze lage frequentie bij lage snelheden zeker een optie. En dan kun je bij stilstaan juist weer een hoge frequentie nemen, zodat de loc beter blijft staan.

Rob

Hallo Rob,
Ik heb mijn motorsturingsprint binnen.
En kan mijn locomotieven aansturen. EEn Lima loc piept wel erg voordat die weg rijdt. Dat ligt denk ik aan de frequentie, want wanneer ik een Lima loc met een decoder uitrust, piept er niets.

Nu ik toch aan het punt frequentie ben aangekomen.
Hierboven heb je een stukje code gezet. Waar voeg ik die toe in de originele code?
Ik maak gebruik van de eerste sketch die je geplaatst had.

Ron

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Analoog rijden met geluid - het project.
« Reactie #195 Gepost op: 16 juli 2020, 21:43:07 »
Hoi Ron,

Die zoemtoon heb ik ook bij sommige van mijn locs. Dat ligt aan het type motor en de behuizing. In een latere versie van de software heb ik ook nog een (ik geloof) 9% pulsbreedte bij stilstand gemaakt. Dan is het geluid ook wat minder.

Om naar 30 Hz te gaan voeg je in de setup () dit toe
   // PWM frequentie zetten
  TCCR1B = TCCR1B & B11111000 | B00000101; // for PWM frequency of 30.64 Hz at D9/10
Net voor dit stuk
   // in- en output pinnen initialiseren
  pinMode (richtingPin[0], OUTPUT);
  pinMode (richtingPin[1], OUTPUT);

Zo zet je voor elke snelheid de PWM op 30 Hz. Ik heb verder niet ge-experimenteerd met verschillende PWM frequenties bij hogere snelheden, omdat het voor mij niet werkte met geluid.
Overigens verwacht ik nu wel een flinke brom in je Lima loc.

succes,
Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Rein

  • Kruier
  • *
  • Berichten: 17
Re: Analoog rijden met geluid - het project.
« Reactie #196 Gepost op: 17 juli 2020, 22:24:56 »
Goedenavond,
Meneer Ali heeft eindelijk ook bij mij wat pakjes gebracht. De rijregelaar is opgebouwd en de eerste geluidsmodule ook. Die heb ik compleet met MP3 speler in elkaar gesoldeerd en dat bleek een vergissing. Zoals de dokter zei: testen, testen, testen en daar was nog wel een sketch voor :-[
Wat blijkt: de functietoetsen worden niet goed herkend, de rijsignalen wel. Soms gaat het goed en wordt de juiste functietoets herkend, soms een andere en soms ook twee of drie verschillende bij één toetsdruk.
Dat kan natuurlijk aan van alles liggen en ik heb allerlei dingetjes uitgeprobeerd: slechte kwaliteit van de toetsen (was het niet, ik gebruik dezelfde knopjes al jaren), overspraak tussen kanalen (niet op mijn simpele geluidskaart-scoopje), contactdender (ook niet). Ik heb nu het vermoeden, dat de spanning op de rails net iets te laag is. Op de multimeter levert de regelaar ca. 9,3 V op de uitgang en daar blijft dan in de module ong. 8 V van over. Dat is waarschijnlijk net te weinig om via de spanningsdeler betrouwbaar een logische 1 op de ingangspinnen te zetten. Morgen probeer ik de rijregelaar iets anders op te bouwen: er zit nu nog een brugcel in, die eigenlijk overbodig is. Dat moet dan een "winst" van ong. 1,5 V opleveren en dat zou dan net voldoende moeten zijn.

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Analoog rijden met geluid - het project.
« Reactie #197 Gepost op: 17 juli 2020, 22:49:34 »
Hoi Rein,

Nou, voor een eerste opbouw en test niet zo slecht. Dat gaat goed komen, hoor.
Ik heb ook wel wat zitten friemelen in de code, zowel aan de regelaar kant als aan de geluidsmodule, met het goed herkennen van de frequenties. Dus misschien kan nieuwere software ook helpen.

De een na laatste versie (2.6) van de regelaar (deze gaat nog uit in de middenstand). Met wat aanpassingen in de pulslengte van de speciale functies :)
/* PULSBREEDTEBESTURING VOOR MODELTREIN
 * versie 2.6 - maart 2019
 * Rob van Deursen
 * wijzigingen: speciale functies wat langer en 5 pulsbreedtes (i.p.v. 4)
 *
 * Motor snelheids regeling met potmeter of Infrarood (IR) afstandsbediening.
 * Ook geschikt voor "analoge" geluidsmodules middels 6 functietoetsen.
 *
 * ==> Kies hier welke besturing wordt gebruikt: <==
*/
const bool IRbesturing = false;   // zet deze waarde op true als IR ontvanger wordt gebruikt
                                  // bij false is de besturing met een potmeter en functietoetsen

/*
 * De motorbesturing gebeurt over 2 'analoge' uitvoer pinnen. Hier wordt met pulsbreedte modulatie
 * de (effectieve) uitgangsspanning ingesteld.
 * Elke rij-richting heeft 1 pin waarmee de pulsbreedte tussen 0 (uit) en 255 (maximaal) wordt geregeld.
 *   
 * Potmeter bediening
 * ------------------
 * De potmeter bestuurt de rijstroom volgens het het principe: "draai naar rechts, rij naar rechts".
 * Vanuit de middenpositie kan de snelheid daarmee in 2 richtingen worden geregeld.
 *
 * Bij starten van de Arduino moet de potmeter in de nul stand staan. Zo wordt bij een reset na kortsluiting
 * voorkomen dat er meteen weer spanning op de uitgang komt te staan. De indicator led knippert snel als
 * de potmeter niet op nul staat. De potmeter kan dan alsnog in het midden worden gesteld, waarna de bediening
 * start.
 *
 * Indicaties van de LED:
 *    - continue brandend: potmeter staat in "stop" bereik. Er is geen rijstroom.
 *    - langzaam knipperend: potmeter staat in "geluidsfunctie" bereik. Er is enige rijstroom om de geluidsmodule
 *      te starten, maar niet genoeg om de motor te laten draaien.
 *    - uit: gewone rijstroom in een van de rijrichtingen.
 *    - snel knipperend: potmeter moet eerst naar 0 (midden) worden gedraaid. Geen rijstroom.
 *   
 * Functietoetsen:
 * Er zijn tot 6 functietoetsen aan te sluiten. Elke toets verandert kort de frequentie van de rijstroom.
 * Deze frequentie-veranderingen worden door een geluidsmodule herkent en start daarmee speciale functies.
 *
 * 
 * IR afstandsbediening
 * --------------------
 * Infrarood afstandbedieningen kunnen ook worden gebruikt voor deze pulsbreedtebesturing.
 * Deze werkt als volgt:
 * Een InfraRood ontvanger vangt de signalen van de afstandsbediening op.
 * Deze wordt gedecodeerd en omgezet naar een rijrichting en snelheid.
 * Snelheid wordt geleidelijk geregeld. Elk commando levert een 'gewenste' snelheid
 * en rijrichting op. Vervolgens wordt langzaam geaccelereerd of gedecelereerd.
 * Rijrichting wisselt alleen als de snelheid 0 is.
 *
 * Indicaties met 3 leds:
 * 2 richting leds: geven draai-of rijrichting aan.
 *   - continue brandend: rijrichting is ingesteld en snelheid is de gewenste snelheid
 *   - knipperen: andere gewenste snelheid en/of rijrichting. Verandering is bezig
 * 1 'stop' led:
 *   - continue brandend: motor staat stil (snelheid = 0}
 *   - knipperend: er wordt afgeremd tot stop {gewenste snelheid = 0)
 *   - uit: motor draait / rijdt
 *   
 * Voor het ontvangen van het IR signaal is gebruik gemaakt van de IRremote bibliotheek
 * Elke IR afstandbediening kan worden gebruikt, daarvoer moeten de overeenkomstige codes in
 * dit programma worden gezet. De decosering wordt gedaan in de functie "VertaalIR()".
 * Er is standaard voorzien in het gebruik van de Keyes afstandsbediening, maar deze heeft geen
 * functietoetsen voor eventuele geluidsmodules.
 */


// ------------ Instellingen per invoer apparaat ----------

// === potmeter besturing ===

// gebruiksinstellingen
#define potmeterRuis      3    // drempelwaarde voor ruis op de potmeter, voorkomt 'jutteren'
#define potmeterMidden  512    // middenstand (= 0 stand) van de potmeter. Normaal ligt de waarde tussen 0 en 1023.
#define nulbereik        40    // bereik van de potmeter buiten het midden waarop de rijstroom 0 blijft
#define geluidbereik2    80    // bereik van af de nul-grens waarop de rijstroom op de minimale waarde blijft voor de geluidsmodule
#define geluidbereik    120    // bereik van af de nul-grens waarop de rijstroom op de minimale waarde blijft voor de geluidsmodule
#define maximaalbereik  500    // bereik waarop de maximale waarde wordt bereikt

// pin definities
#define potmeter         A7    //potmeter (snelheidsregelaar) pin
#define functietoets1    A5    // functietoetsen 1 t/m 6
#define functietoets2    A4
#define functietoets3    A3
#define functietoets4    A2
#define functietoets5    A1
#define functietoets6    A0
#define ledIndicator     13    // pin voor indicator led (bij gebruik potmeter bediening)

// === IR afstandsbediening ==

// gebruiksinstellingen
#define lusVertraging   30     // delay in ms in de hoofdlus
#define acceleratieStap 0.025  // stappen waarin snelheid toe- of afneemt
#define sprongWaarde    2.5    // snelheids 'sprong', bijvoorbeeld om te koppelen bij rangeren

// pin definities
#define receiver          7    // pin 1 van IR ontvanger naar Arduino digitale pin
#define ledVooruitPin     4    // pinnen voor vooruit/achteruit indicatie (alleen gebruikt bij IR)
#define ledAchteruitPin   2
#define ledStopPin        3    // pin voor stop


// ------------ Instellingen motor controller ----------

// uitvoer pinnen
#define richtingPin1     10    // pinnen voor vooruit en achteruit (dit moeten beide PWM pinnen zijn)
#define richtingPin2      9
#define aanloopPWM      50.0   // Pulsbreedte waarde (0-255) om aanloopweerstand motoren te overwinnen
#define maxPulsBreedte  250    // Maximale pulsbreedte voor de rijstroom (255 of kleiner, met geluid: max 250)


// ------------- Potmeter rijregeling variabelen ------

const int rijbereik = maximaalbereik - geluidbereik;
int potmeterWaarde      = potmeterMidden ;
int vorigePotmeterWaarde= potmeterMidden ;

int functietoets[] {functietoets1, functietoets2, functietoets3, functietoets4, functietoets5, functietoets6};
#define aantalFunctietoetsen 6


// -------------- Objecten en variabelen ------

#include <IRremote.h>
IRrecv irrecv(receiver);       // IR ontvanger object maken
decode_results results;
int IRcode = 0;                // code afgelezen uit IR ontvanger
String IRknop = "";            // de ingedrukte knop (of ingedrukt gehouden)

// regeling van snelheid en richting
int richting = 0;                    // rijrichting
int gewensteRichting = 0;            // gewenste rijrichting (rijrichting schakelt pas om bij snelheid 0)
float snelheid = 0;                  // huidige snelheid
float gewensteSnelheid = 0;          // gewenste snelheid
float acceleratie = acceleratieStap;
float sprong = 0;                    // toename in snelheid bij indrukken 'spring' knop
int richtingPin[] {richtingPin1,richtingPin2}; // pinnen voor vooruit en achteruit (PWM pinnen)


// ------------- Definities en variabelen voor geluidsmodule pulsen -----

//#define geluidAan           -.825     // snelheid om geluidsmmodule te starten (kleiner dan 0, snelheid 0 is aanloopPWM motoren)
//#define geluidAan2         -1.825     // snelheid om geluidsmmodule te starten (kleiner dan 0, snelheid 0 is aanloopPWM motoren)
#define geluidAan            -.125   // snelheid om geluidsmmodule te starten (kleiner dan 0, snelheid 0 is aanloopPWM motoren)
#define geluidAan2          -1.375   // snelheid om geluidsmmodule te starten (kleiner dan 0, snelheid 0 is aanloopPWM motoren)

// rijstroom             ~ 490.0     // gemeten periode (trilligstijd) 2020 us foor standaard PWM rijstroom (~490 Hz)
#define freqFunctie1       667.0     //  667 Hz (periode ~1500 us) ==> 1500
#define freqFunctie2       800.0     //  800 Hz (periode ~1250 us) ==> 1250
#define freqFunctie3      1000.0     // 1000 Hz (periode ~1000 us) ==>  990
#define freqFunctie4      1250.0     // 1250 Hz (periode  ~800 us) ==>  790
#define freqFunctie5      1667.0     // 1667 Hz (periode  ~600 us) ==>  590
#define freqFunctie6      2000.0     // 2000 Hz (periode  ~400 us) ==>  490
//#define pulsFunctie         40       // tijdsduur van de puls in ms
#define pulsFunctie           48     // tijdsduur van de puls in ms
#define functiepulsCorrectie  4.0     // correctie voor "handmatige" puls - Arduino tijd 1/5 periode
#define functiePulsIRfactor  0.8     // correctie voor vertraging Arduino door IR

float freqFunctie[] {freqFunctie1, freqFunctie2, freqFunctie3, freqFunctie4, freqFunctie5, freqFunctie6};
#define aantalFreqFuncties    6

int geluidFunctie = 0 ;               // huidige geluid functietoets


// -------------- Overige variabelen ------------------

int t=0;                             // algemene teller voor for... loops
int waardePWM;                       // huidige waarde van de pulsbreedte.
int vorigeWaardePWM;                 // vorige waarde van de pulsbreedte.

// LED indicatoren
unsigned long prevms = 0;            // knipperen laatste keer aan/uit
unsigned long curms = millis();      // knipperen nu
const long blnkint = 250;            // knipper-interval
int ledPins[] {ledVooruitPin, ledAchteruitPin, ledStopPin, ledIndicator} ;
int ledStatus[] {2,0,2,0};           // vooruit (aan), achteruit (uit), stop (aan), indicator (uit).
int blnk = HIGH;


//--------------- Setup na starten Arduino ---------------------

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);     // ingebouwde led op pin 13 uit
  digitalWrite(LED_BUILTIN, LOW); 
 
  // in- en output pinnen initialiseren
  pinMode (richtingPin[0], OUTPUT);
  pinMode (richtingPin[1], OUTPUT);
 
  pinMode (potmeter, INPUT);
  for (t = 0; t < aantalFunctietoetsen; t++) {
    pinMode (functietoets[t],INPUT);
    digitalWrite(functietoets[t],HIGH);
  }

  for (t=0; t<4; t++) {
    pinMode (ledPins[t],OUTPUT);
  } 

  // de gewenste besturing starten
  if (IRbesturing) {                // IR bediening
    irrecv.enableIRIn();            // Start de IR ontvanger
  }
  else {                            // potmeter bediening
    // bij potmeterbesturing moet bij het opstarten snelheid 0 zijn ingesteld
    // bij een reset door kortsluiting wordt zo voorkomen dat de rijstroom vanzelf aan gaat
    // led indicator knippert snel zolang potmeter niet op 0 is gesteld
    while (HaalSnelheid(analogRead (potmeter)) != 0) {
      // rijstroom uit bij opstarten
      analogWrite (richtingPin[0], 0);
      analogWrite (richtingPin[1], 0);
      digitalWrite(ledIndicator,digitalRead(ledIndicator) == 0);
      delay(100);
    }
    digitalWrite (ledIndicator,LOW);
  }

}

// --------------- Hoofd lus Arduino ---------------------------

void loop() {
// === IR besturing ===

  if (IRbesturing) {
    sprong = 0;
    if (irrecv.decode(&results)) {
      IRcode = results.value;
      if (IRcode != 0xFFFFFFFF) { // Geen toets herhaling
        IRknop = VertaalIR(IRcode);
      }
      ZetGewensteSnelheidEnRichting (IRknop);
     
      irrecv.resume();            // Doorgaan met IR codes ontvangen
    }
    // snelheid en richting aanpassen
    SnelheidAanpassen() ;
    SnelheidNaarPWM () ;       
    if (snelheid == 0) {          //motor staat stil, dus eventuele richtingverandering doorvoeren
      richting = gewensteRichting ;
    }
    // geluidsmodule bedienen
    if (IRknop.startsWith("-1G0")) {                  // geluid functieknop
      geluidFunctie = VertaalIRfunctie (IRknop);
    }
  IRknop = "";
  }
// === potmeter besturing ===

  else {                                        // geen IR besturing, maar potmeter met functieknoppem
    potmeterWaarde = analogRead (potmeter);
    if (abs(potmeterWaarde - analogRead (potmeter)) < potmeterRuis) {     // stabiele uitlezing
    // verander de snelheid met ruisonderdrukking van de ruis op de potmeter.
      if (abs (potmeterWaarde - vorigePotmeterWaarde) > potmeterRuis) {   // verandering groter dan de ruis
        snelheid = HaalSnelheid (potmeterWaarde);                         
        vorigePotmeterWaarde = potmeterWaarde;
        ledStatus[3] = 2;                         // stop = led continu aan
        if (snelheid == geluidAan) {
          ledStatus[3] = 1;                       // geluid bereik (niet rijden) = led knipperen
        } else if (snelheid > 0) {
          ledStatus[3] = 0;                       // rijden = led uit
        }
      }
      richting = (potmeterWaarde < potmeterMidden);
      SnelheidNaarPWM () ;
    }
    // Functietoetsen uitlezen
    geluidFunctie = HaalFunctieToets();
   }
// === voor zowel IR als potmeter ===

  // functie uitvoeren
  if (geluidFunctie > 0) {
    stuurPuls (freqFunctie[geluidFunctie-1],pulsFunctie, true); // stuur een puls voor functie 1-6 op geluidsmodule
    delay(93);                                        // voorkom ongewenste herhaling
    geluidFunctie = 0;                                // functie is uitgevoerd
  }
  // led indicators bijwerken
  ZetLedIndicators();
  for (t=0; t < 4; t++) {
    setLed(t,ledStatus[t]);
  }
 
  delay(lusVertraging);

}
//---------------- Functies --------------------

// === Algemene functies ===

// SNELHEID NAAR PWM OMREKENEN EN OP JUISTE PIN ZETTEN
// naar een pulsbreedte en op de juiste uitvoer pin gezet.
void SnelheidNaarPWM () {
  if (snelheid != 0) {
    waardePWM = aanloopPWM + (maxPulsBreedte-aanloopPWM)/9 * (snelheid + sprong);
  }
  else {
    waardePWM = 0;
  }
  analogWrite(richtingPin[richting == 0],0);      // niet richting pin altijd uit
  if (abs(waardePWM - vorigeWaardePWM) >1) {      // significante verandering PWM
                                                  // voorkom onnodig PWM schrijven: dit verandert de puls

    analogWrite(richtingPin[richting],(waardePWM)); // PWM op richting pin
    vorigeWaardePWM = waardePWM;                  // onthou vorige waarde
    //Serial.print(waardePWM);
  }

}
// ====

// LED AAN, UIT OF KNIPPEREN
// input: led number (0-3)
//        func: 0 = uit, 1=knipper, 2 = aan
void setLed (int led, int func) {
  // knipperstatus bijwerken   
  curms = millis();
  if (curms - prevms >= blnkint) {
    prevms = curms;
    blnk = !blnk;            // wissel blnk status
  }
  // leds uit, aan of knipperstatus
  if (func == 1) {           // dan knipperen
    digitalWrite(ledPins[led], blnk);
  }
 
  if (func == 0) {           // uit
    digitalWrite(ledPins[led], LOW);
  }
  if (func == 2) {           // aan
    digitalWrite(ledPins[led], HIGH);
  }
}
// ====

// STUUR PULS
// zet een signaal puls op de rijstroom met een andere frequentie dan de rijstroom
// Input: frequentie (maximaal 2.000 Hz)
//        tijdsduur van de puls (ms)
//        boolean PWM correctie of niet
void stuurPuls (unsigned int frequentie , unsigned long tijdsduur, boolean PWMcorrectie) {
  unsigned long s;
 
  //golf lengte en -vorm berekenen
  unsigned int deelGolf = (200000/frequentie) - functiepulsCorrectie;    // lengte kwart cyclus in micro sec, minus Arduino tijd
  if (IRbesturing) {deelGolf = functiePulsIRfactor * deelGolf; }
  unsigned int hc = 4* deelGolf;                        // lengte hoge cyclus, standaard is 4/5 hoog.
  unsigned int lc = 1* deelGolf;                        // lengte lage cyclus
  if (PWMcorrectie) {                                   // PWM correctie gevraagd
    if (waardePWM < 175) {                               // grove PWM correctie in 1/5, 2/5, 3/5 of 4/5 pulsbreedte (4/5 is standaard)
      hc = 3 * deelGolf;
      lc = 2 * deelGolf;
    }
    if (waardePWM < 125) {
      hc = 2 * deelGolf;
      lc = 3 * deelGolf;
    }
    if (waardePWM < 75) {
      hc = 1.2 * deelGolf;
      lc = 3.8 * deelGolf;
    }
    if (waardePWM < 35) {
      hc = 1 * deelGolf;
      lc = 4 * deelGolf;
    }
  }
 
  //puls op de rijstroom pin zetten
  s = millis() + tijdsduur;
  while (millis() < s) {
    digitalWrite(richtingPin[richting],HIGH);
    delayMicroseconds (hc);
    digitalWrite(richtingPin[richting],LOW);
    delayMicroseconds (lc);
  }
  analogWrite(richtingPin[richting],(waardePWM));
  delay (250);
}

// ===

// === potmeter bediening functies ===

// POTMETER WAARDE OMREKENEN NAAR SNELHEID
// input: AD waarde potmeter

float HaalSnelheid (int ADwaarde) {    // snelheid instellen op basis van de potmeter
  float s = abs (ADwaarde - potmeterMidden);
  if (s < nulbereik) {
    s = 0;
  }
  else {
    if ( s < geluidbereik2 ){
      s = geluidAan2;
      //Serial.println("!!!!");
    }
    else {
      if ( s < geluidbereik ){
        s = geluidAan;
        //Serial.println("!!!!");
      }
      else {
        // s = (constrain (s, geluidbereik, maximaalbereik) ) - geluidbereik;
        // s = 10 * s / maximaalbereik;
        constrain (s, geluidbereik, maximaalbereik);
        s = 8.25 * (s-geluidbereik) / (maximaalbereik-geluidbereik);
      }
    }
  }
 
  return s;
}
//===

// FUNCTIETOETSEN UITLEZEN
// geeft het volgnummer van de ingedrukte functietoets.
// 0 = geen toets
  int HaalFunctieToets () {
  int  f = 0;                        // toets volgnnummer
  int  k = 0;                        // ingedrukte toets (0 = geen)
  for (f=0; f < aantalFunctietoetsen; f++) {
    if (digitalRead(functietoets[f]) == LOW) {  //Deze toets is ingedrukt
      k = f+1;                       // onthou toets volgnummer
      //Serial.print(k);
    }
  }
 
  //if (k > 0) { delay (150);}
  return k;
}
// ===

// === IR bediening functies ===

// IR CODE VERTALING
// Vertaling van de IR codes naar knoppen c.q. acties
// input: integer met de ontvangen IR code
// output: string met code of actie
//         Numerieke toetsen geven het cijfer als string terug.
//         Alle niet-numerieke toetsen beginnen met "-1", zodat
//         deze makkelijk zijn te onderscheiden van de numerieke toetsen.

String VertaalIR(int code){       

  String b = "";
 
  switch(code) {
    // code vertaling KEYES afstandsbediening
    case 0xFFA25D: b="1"; break;     //numerieke toets is snelheid 0-9
    case 0xFF629D: b="2"; break;
    case 0xFFE21D: b="3"; break;
    case 0xFF22DD: b="4"; break;
    case 0xFF02FD: b="5"; break;
    case 0xFFC23D: b="6"; break;
    case 0xFFE01F: b="7"; break;
    case 0xFFA857: b="8"; break;
    case 0xFF906F: b="9"; break;
    case 0xFF9867: b="0"; break;
    case 0xFF6897: b="-1*"; break;    //* = sprong knop snelheidssprong (t.b.v. koppelen bij rangeren, bijvoorbeeld)
    case 0xFFB04F: b="-1#"; break;    //# = direct naar gewenste snelheid (geen acceleratie/deceleratie)
    case 0xFF18E7: b="-1^"; break;    //omhoog
    case 0xFF10EF: b="-1<"; break;    //links
    case 0xFF38C7: b="-1STOP"; break; //OK = noodstop
    case 0xFF5AA5: b="-1>"; break;    //rechts
    case 0xFF4AB5: b="-1V"; break;    //omlaag
    case 0xFFFFFFFF: b="-1R"; break;  //herhaal (repeat) laatste knop blijft ingedrukt

    // code vertaling SHARP GA074WJSA afstandbediening
    case 0x885B30D5: b="1"; break;
    case 0xE7E0CFB1: b="2"; break;
    case 0xA34F5A01: b="3"; break;
    case 0x22614D75: b="4"; break;
    case 0x96C5A8AB: b="5"; break;
    case 0x44ABD1FD: b="6"; break;
    case 0x1A5C4D:   b="7"; break;
    case 0x57A67691: b="8"; break;
    case 0x9543D7CF: b="9"; break;
    case 0xF4C976AB: b="0"; break;
    case 0x5CC96CE7: b="-1*"; break;    //kanaal wissel = sprong knop snelheidssprong (t.b.v. koppelen bij rangeren, bijvoorbeeld)
    case 0xCC00A5B7: b="-1#"; break;    //TV/VIDEO = direct naar gewenste snelheid (geen acceleratie/deceleratie)
    case 0x3E0C7005: b="-1^"; break;    //omhoog
    case 0xB10C7C8B: b="-1^"; break;    //channel up = ook omhoog
    case 0x503D6F71: b="-1V"; break;    //omlaag
    case 0x10921B67: b="-1V"; break;    //channel down = ook omlaag
    case 0x25D2E369: b="-1STOP"; break; //OK = noodstop
    case 0x6D5D1DB3: b="-1STOP"; break; //AAN/UIT = ook noodstop
    case 0xF43135:   b="-1>"; break;    //rechts
    case 0x4B12992B: b="-1>"; break;    //volume + = ook rechts
    case 0xA574865B: b="-1<"; break;    //links
    case 0x1BE8C80D: b="-1<"; break;    //volume - = ook links

// functietoetsen geluidsmodule
    case 0x47071827: b="-1G01" ; break;    //rood  = F1
    case 0xAA849FD1: b="-1G02" ; break;    //groen = F2
    case 0xA0A3EAD:  b="-1G03" ; break;    //geel  = F3
    case 0xC578C8FD: b="-1G04" ; break;    //blauw = F4
    case 0xAE90AC1D: b="-1G05";  break;    //sound = F5
    case 0xC7E0BECF: b="-1G06" ; break;    //menu  = F6
    case 0x28CBA803: b="-1G04" ; break;    //mute  = F4
     
    case 0x3FE6:     b="-1G<"  ; break;    //subtitle = minimalw PWM links
    case 0xA07CF2DB: b="-1G>"  ; break;    //end      = minimale PWM rechts
    case 0x66DC0563: b="-1G<<" ; break;    //hold
    case 0x496C0BC9: b="-1G>>" ; break;    //reveal


  //  case 0xFFFFFFFF: b="-1R"; break;  //herhaal (repeat) laatste knop blijft ingedrukt

 
    // Hier is ruimte om eventueel codes van andere afstandbedieningen te vertalen
 
  default:
    b = "-2Onbekend";
  }// End Case
 
  return b ;
}
// ====

// SNELHEID AANPASSEN - IR
// Deze functie berekent de nieuwe snelheid op basis van de
// ingestelde acceleratie.


void SnelheidAanpassen() {
  if (abs(snelheid - gewensteSnelheid) <= (acceleratieStap / 2)) {
    snelheid = gewensteSnelheid;
    acceleratie= 0;
  } else {
    snelheid += acceleratie;
  }
  if (snelheid == 0 && gewensteSnelheid == geluidAan && richting == gewensteRichting ) {
    snelheid == geluidAan;
  }
}
// ===


// ZET DE GEWENSTE SNELHEID EN RICHTING -IR
// Functie zet de gewenste snelheid, gewenste richting en gewenste
// versnelling (of vertraging) op basis van de knoppen die zijn
// ingedrukt op de afstandsbediening.

void ZetGewensteSnelheidEnRichting (String laatsteKnop) {
  if (laatsteKnop.toFloat() >= 0) {    //numerieke toets
    gewensteSnelheid = laatsteKnop.toFloat();
    if (snelheid < gewensteSnelheid) { acceleratie = acceleratieStap; }
    if (snelheid > gewensteSnelheid) {acceleratie = - acceleratieStap; }
  }
  else {                               // niet een numerieke toets
    if (laatsteKnop == "-1STOP") {       // noodstop
      acceleratie = -snelheid;
      gewensteSnelheid = 0;
    }
    if (laatsteKnop == "-1>") {              // knop naar rechts
      if (richting == 1 && snelheid != geluidAan) {                   // omkering tijdens het rijden
        gewensteSnelheid = 0;                // eerst afremmen naar 0
        acceleratie = - acceleratieStap;
        gewensteRichting = 0;
        laatsteKnop ="";
      }
      else {                                 // rijrichting hetzelfde
        if (snelheid == gewensteSnelheid  && snelheid < 9 && richting == 0) {  // gewenste snelheid is bereikt en nog niet max
         gewensteSnelheid  += .5 ;             
         acceleratie = acceleratieStap;
        }
      }
    }
    if (laatsteKnop == "-1<") {              // knop naar links
      if (richting == 0 && snelheid != geluidAan) {                   // omkering tijdens het rijden
        gewensteSnelheid = 0;                // eerst afremmen naar 0
        acceleratie = - acceleratieStap;
        gewensteRichting = 1;
        laatsteKnop ="";
      }
      else {                                 // rijrichting hetzelfde
        if (snelheid == gewensteSnelheid  && snelheid < 9 && richting == 1 ) {  // gewenste snelheid is bereikt en nog niet max
         gewensteSnelheid += 0.5;             
         acceleratie = acceleratieStap;
        }
      }
    }
    if (laatsteKnop == "-1V") {
      if (snelheid == gewensteSnelheid  && snelheid > 0 ) {  // gewenste snelheid is bereikt en nog niet max
         gewensteSnelheid -= 0.25;             
         acceleratie = -acceleratieStap;
      }
    }
    if (laatsteKnop == "-1^") {
      if (snelheid == gewensteSnelheid  && snelheid < 9 ) {  // gewenste snelheid is bereikt en nog niet max
         gewensteSnelheid += 0.25;             
         acceleratie = acceleratieStap;
      }
    }
    if (laatsteKnop == "-1#") {
      snelheid = gewensteSnelheid;      // sla het accelereren/decelereren over: direct naar gewenste snelheid
    }
    if (laatsteKnop == "-1*" && snelheid < 9 - sprongWaarde) {
      sprong = sprongWaarde;            // zet "sprong" aan zolang deze toets is ingedrukt.
    }
   
    if (laatsteKnop == "-1G<" ) {       // minimale stroom geluidsmodule aanzetten
      if (snelheid == 0){
        snelheid = geluidAan;
        gewensteSnelheid = geluidAan;
        acceleratie = 0;
        richting = 1;
        gewensteRichting = 1;
      }
      else {
        if (richting == 1  && snelheid > 0) {
          acceleratie = - acceleratieStap;
          gewensteSnelheid = geluidAan;
        }
      }
    delay(50);
    }
    if (laatsteKnop == "-1G>" ) {       // minimale stroom geluidsmodule aanzetten
      if (snelheid == 0){
        snelheid = geluidAan;
        gewensteSnelheid = geluidAan;
        acceleratie = 0;
        richting = 0;
        gewensteRichting = 0;
      }
      else {
        if (richting == 0 && snelheid > 0) {
          acceleratie = - acceleratieStap;
          gewensteSnelheid = geluidAan;
        }
      }
    delay(50);
    }
   
    if (laatsteKnop == "-1G<<" ) {     // minimale stroom geluidsmodule aanzetten
      if (snelheid == 0){
        snelheid = geluidAan2;
        gewensteSnelheid = geluidAan2;
        acceleratie = 0;
        richting = 1;
        gewensteRichting = 1;
      }
      else {
        if (richting == 1) {
          acceleratie = - acceleratieStap;
          gewensteSnelheid = geluidAan2;
        }
      }
    }
    if (laatsteKnop == "-1G>>" ) {     // minimale stroom geluidsmodule aanzetten
      if (snelheid == 0){
        snelheid = geluidAan2;
        gewensteSnelheid = geluidAan2;
        acceleratie = 0;
        richting = 0;
        gewensteRichting = 0;
      }
      else {
        if (richting == 0) {
          acceleratie = - acceleratieStap;
          gewensteSnelheid = geluidAan2;
        }
      }
    }
  }
}

// ====

// ZET LED INDICATOREN - IR
// zet juiste waarden op LED pinnen: indicatoren voor acties die bezig zijn
// (richting, snelheidsverandering en stop)
void ZetLedIndicators (){
  if (snelheid  == 0) {
    for (t = 0; t < 2 ; t++) {
      ledStatus [t] =0 ;         // richting Leds uit
    }
    ledStatus [2] = 2;           // stop led aan
    ledStatus [richting] = 2;     // juiste richting led aan
  }
  else {                       // motor draait
    if (gewensteSnelheid == 0) {
      ledStatus [2] = 1;         // stop led laten knipperen
    } else {
      ledStatus [2] = 0;
    }
    if (gewensteRichting != richting) { //richting verandering gewenst
      ledStatus [gewensteRichting] = 1;  // gewenste richting knipperen
    } 
    else {
      ledStatus [1-gewensteRichting] = 0; // andere richtingsled uit
      if (gewensteSnelheid != snelheid) { // snelheidsverandering bezig (en niet naar 0)
        ledStatus [gewensteRichting] = 1;
      }
      else {
        ledStatus [gewensteRichting] = 2;
      }
    }
  }
}
// ===

// HAAL IR FUNCTIETOETS OP
int VertaalIRfunctie (String g) {
  int f = 0;
    if (g == "-1G01") {
        f = 1;                                       // functie 1
    }
    if (g == "-1G02") {
        f = 2;                                       // functie 2
    }
    if (g == "-1G03") {
        f = 3;                                       // functie 3
    }
      if (g == "-1G04") {
        f = 4;                                       // functie 4
    }
    if (g == "-1G05") {
         f = 5;                                       // functie 5
    }
    if (g == "-1G06") {
         f = 6;                                       // functie 6
    }
    return f;
}
// ===

// --------------- einde schets ----------------



Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Analoog rijden met geluid - het project.
« Reactie #198 Gepost op: 17 juli 2020, 22:53:05 »
En de laatste versie van de geluidsmodule. Let op: deze heeft ook een instelling per loc voor rangeerstand (motor aan laten) en gemengd geluid bij de hoorn/fluit (functie 1).
Maar als je deze definities weg laat,  werkt die als de voorgaande versies van de geluidsmodule

  #define FunctieRijden       2000       // tijd voor gecombineerde hoorn/fluit en rijgeluid bij F1 (=110 + snelheid)
  #define Rangeerstand           4       // Loc heeft rangeerstand: motor start alleen als deze bewust is uitgezet (met deze functie)

Deze sketch heb ik even als bijlage toegevoegd, want die is te groot om als tekst in het bericht te zetten.

Overigens zou ik eerst de regelaar software aanpassen en dan even proberen.

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Analoog rijden met geluid - het project.
« Reactie #199 Gepost op: 17 juli 2020, 23:15:19 »
En misschien nog even wat voltages bij mijn opstelling
De input op de motorregelaar is net onder de 12 V (11,7). Max 12 V anders fikt de spanningsregelaar op de Arduino door.
De effectieve gemeten spanning op de rails is bij volle snelheid (97% pulsbreedte) : 9,6V
De input spanning van de geluidmodule (na gelijkrichten en Elco) meet ik meestal zo tussen de 8 en 8,6 V.
Op de laatste moet je minstens 7V hebben staan, anders komt je Arduino onder de 5V uit (spanningsverlies over de spanningsregelaar).

Succes!

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...