H0 Modelspoor Forum

Modelbaanbesturing => Elektronische en digitale techniek => Topic gestart door: Rob op 28 april 2018, 22:04:45

Titel: Analoog rijden met geluid - het project.
Bericht door: Rob op 28 april 2018, 22:04:45
Na alle experimenten met geluid aan boord is het tijd geworden een draadje te starten over het project

Analoog rijden met geluid


Het prototype van de geluid (en licht) module is in de railbus ingebouwd en werkt tot nu toe naar behoren. Hier een filmpje over het prototype en de introductie van het project.



Het geheel bestaat uit 2 onderdelen:

De belangrijkste reden om dit project te starten, en niet over te stappen op bijvoorbeeld een digitaal systeem, is de bestaande analoge verzameling aan locs en treinstellen. Met deze opstelling kunnen alle locs, met of zonder geluidsmodule, op hetzelfde systeem blijven rijden. Ombouw kan dus geleidelijk en tegen relatief lage kosten. Daarnaast vind ik het gewoon leuk een met elektronica, programmeren en geluidsbewerking te stoeien.

Alvast even een indicatie van de kosten. Deze worden sterk bepaald waar je spullen besteld (dichtbij is wat duurder, maar veel sneller dan spullen van tante Ali):
- pulsbreedtebesturing: 15 - 25 euro (relatief duur zijn de knopjes voor de 6 functietoetsen)
- geluidsmodule 10 - 20 euro per stuk
Bij de bouwbeschrijving komt een lijst met benodigde onderdelen en dan kunnen ook de kosten wat nauwkeuriger worden aangegeven.

Zoals in het introductiefilmpje al is aangekondigd, wordt de volgende geluidsmodule in een stoomtrein, de BR50, ingebouwd. Ik heb nog niet alle spullen uit China, maar ondertussen ben ik wel alvast begonnen met het zoeken naar de ruimte voor de componenten van de geluidsmodule in deze loc.

(http://www.xs4all.nl/~robvd/Forum/BR50Explosie.jpg)

De opbouw van de geluidsmodule is afhankelijk van waar de spullen passen. De voeding op de Arduino is in ieder geval al iets compacter geworden dan het prototype ....

Volgende stap: de bouwbeschrijving van de pulsbreedtebesturing met draaiknop...

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 29 april 2018, 12:31:36
Ik blijf je vol spanning volgen en wachten op de schema's Rob. Mijn interesse is zeer zeker gewekt door je voor dit project. Top man! ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 30 april 2018, 18:50:50
Dank je, Pierre.
Voor het eerste deel zal ik je niet heel veel langer in spanning laten. Ik ben aardig aan het friemelen geweest om het experimentele gebeuren, dat vooral met proberen tot stand gekomen, om te zetten naar iets reproduceerbaars. Dat is ondertussen gelukt (onder meer door de draadjes van het probeer-spoor vast te solderen!). Aansluitschema, code en filmpje volgt snel.
Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 30 april 2018, 20:46:25
De pulsbreedte besturing
Met pulsbreedte besturing kan analoog worden gereden en zijn er mogelijkheden voor geluid aan boord van de treinen. Ook zonder geluid is deze besturing te gebruiken voor analoge treinen. Het voordeel is dat (langzaam) rijden beter gaat.

In dit bericht een filmpje over de bediening van de pulsbreedtebesturing, het aansluitschema, de code voor de Arduino, een stuklijst en wat aanwijzingen voor de opbouw.

Bediening

Hoe het een en ander in de praktijk werkt, is te zien in dit filmpje.



Aansluitschema

Voeding, motorcontroller, Arduino en de bediening wordt als volgt aangesloten.

(http://www.xs4all.nl/~robvd/Forum/PWMschema.jpg)


De ingang van de besturing neemt elke gelijk of wisselspanning tussen 5 en 35 V, dus ook een conventionele treintrafo voldoet. Belangrijk is dat de trafo niet te sterk is; het is de bedoeling dat de spanning 'dipt' als er kortsluiting op de baan ontstaat. Een trafo van rond de 35 Watt (VA) is prima.
De gelijkrichter zorgt er voor dat de ingangstroom altijd goed op de step up/down print komt. Deze is ingeregeld op een uitgangsspanning van 11,5 V. Let op: Deze spanning moet worden ingeregeld voor de rest wordt aangesloten (bij mij was de uitgang 20V af fabriek, en dat is meer dan de Arduino aan kan).
De voeding levert stroom aan de motorcontroller (en daarmee ook aan de trein) en aan de V-IN van de Arduino. De Arduino heeft een ingebouwde uitgang voor een gestabiliseerde 5V, waarmee de potmeter als 'spanningsdeler' naar de massa wordt aangesloten.
De stand van de potmeter wordt uitgelezen op de analoge ingang A7. Deze wordt omgerekend naar een puls voor de rijstroom op 'analoge' uitgangen D09 en D10 van de Arduino. Deze zijn verbonden met de aansturing van de motorcontroller (een pin voor elke richting).
Verder zijn 6 druktoetsen op pinnen A0-A5 verbonden met de massa, dit zijn de functietoetsen voor de geluidsmodule. Een LED op pin D13 geeft informatie over de rijstroom. Dit is dezelfde pin als de op de Arduino ingebouwde LED, dus eventueel kan van deze LED worden afgezien.


Programmacode (sketch)

De code voor de Arduino:
/* PULSBREEDTEBESTURING VOOR MODELTREIN
 * versie 2.0 - mei 2018
 * Rob van Deursen
 *
 * 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        60    // bereik van de potmeter buiten het midden waarop de rijstroom 0 blijft
#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    A0    // functietoetsen 1 t/m 6
#define functietoets2    A1
#define functietoets3    A2
#define functietoets4    A3
#define functietoets5    A4
#define functietoets6    A5
#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      65.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 t.b.v. IR bediening ------

#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)

// 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 functiepulsCorrectie 5.0     // correctie voor "handmatige" puls - Arduino tijd 1/4 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 kortsliting 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);
    }
  }
// === 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) = lijd 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 kwartGolf = (250000/frequentie) - functiepulsCorrectie;    // lengte kwart cyclus in micro sec, minus Arduino tijd
  if (IRbesturing) {kwartGolf = functiePulsIRfactor * kwartGolf; }
  unsigned int hc = 3* kwartGolf;                       // lengte hoge cyclus, standaard is 3/4 hoog.
  unsigned int lc = kwartGolf;                          // lengte lage cyclus
  if (PWMcorrectie) {                                   // PWM correctie gevraagd
    if (waardePWM < 90) {                               // grove PWM correctie in 1/4, 1/2 of 3/4 pulsbreedte (3/4 is standaard)
      hc = kwartGolf;
      lc = 3 * kwartGolf;
    } else if (waardePWM < 170) {
      hc = 2 * kwartGolf;
      lc = 2 * kwartGolf;
    }
  }
 
  //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));
}

// ===

// === 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 < geluidbereik ){
      s = geluidAan;
      //Serial.println("!!!!");
    }
    else {
      s = (constrain (s, geluidbereik, maximaalbereik) ) - geluidbereik;
      s = 10 * s / maximaalbereik;
    }
  }
 
  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 (60);}
  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 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;
  }
}
// ===


// 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) {                   // 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) {                   // 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 (snelheid == 0 && gewensteSnelheid == 0) {
        if (laatsteKnop == "-1G<" ) {     // minimale stroom geluidsmodule aanzetten
        snelheid = geluidAan ;
        gewensteSnelheid = geluidAan;
        richting = 1;
        gewensteRichting = 1;
      }
      if (laatsteKnop == "-1G>" ) {     // minimale stroom geluidsmodule aanzetten
        snelheid = geluidAan ;
        gewensteSnelheid = geluidAan;
        richting = 0;
        gewensteRichting = 0;
      }
    }
   
  }
}

// ====

// 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 ----------------



De code voorziet in bediening van de pulsbreedte met potmeter en functietoetsen of met infrarood afstandsbediening. Standaard staat deze op "potmeter".


Lijst van onderdelen

De volgende onderdelen zijn gebruikt (aangegeven prijzen zijn Nederlandse prijzen)

Totale prijs komt dan op 24,20, zonder verzendkosten.
Bij bestelling van (een deel) van de spullen bij tante Ali, kunnen de kosten flink omlaag (en levertijden omhoog). Zo heb ik 5 Arduino's gekocht voor $12. Deze Arduino's kunnen ook in de geluidsmodules worden gebruikt.


Enkele aanwijzingen voor de opbouw

Enig gereedschap is nodig, zoals een voltmeter (multimeter) voor het instellen van de voeding, een soldeerbout, een computer  met de Arduino software (de zogenaamde IDE, gratis te downloaden), en een USB kabel met mini USB (niet de micro USB van je telefoon, maar de iets grotere stekker).
Zoals gezegd: let op met de voeding: eerst het uitgangsvoltage instellen, dan pas andere spullen aansluiten.


Als de pulsbreedte besturing klaar is, kan elke analoge loc hierop rijden. Dus je hoeft niet te wachten op de geluidsmodules om deze rijstroom besturing te gebruiken.

Tot zover de bouwbeschrijving.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 1 mei 2018, 20:58:07
Rob, weer bedankt voor de info!

Ik ga eens bedenken of dit een betere oplossing is voor mijn analoog systeem.
Vooral geluid per trein en lichten aan en uit zetten zal doorslag geven.

Mvg mark
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 2 mei 2018, 22:37:50
Graag gedaan, Mark. En denk gerust nog na over de oplossing die voor jouw het beste is  :)

Ondertussen heb ik voor de pulsbreedte besturing een paneeltje gemaakt.

(http://www.xs4all.nl/~robvd/Forum/PWMbesturing03.jpg)


Aan de onderkant ziet dat er zo uit. Er is een massa draad die alle knoppen en de LED met de "GND" verbind. Verder zijn alle aansluitingen met stekkertjes gemaakt die zo op de pinnen van de Arduino passen.

(http://www.xs4all.nl/~robvd/Forum/PWMbesturing04.jpg)


En dan alles meteen maar op de "fahrpult" geïnstalleerd. Het is wel een beetje een Tele-Tubby paneel geworden met de gekleurde, ronde knoppen, maar goed... Ik heb dezelfde kleuren gebruikt als de toetsen op de afstandsbediening (daar zijn de gekleurde  teletext knoppen en 2 andere gebruikt als functie toetsen).


(http://www.xs4all.nl/~robvd/Forum/PWMbesturing05.jpg)


Dan wordt het langzamerhand tijd om verder te gaan met geluid in de BR50. Die geluidsmodule wordt alweer wat anders dan het prototype in de railbus. Met name de besturing van de MP3 wordt iets anders, waardoor ik een draad tussen Arduino en MP3 kan besparen en software kan bijwerken met aangekoppelde MP3 speler.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 5 mei 2018, 18:21:29
BR50 met geluid - deel 1: de hardware

Afgelopen dagen aan het priegelen geweest om een geluidsmodule in te bouwen in de BR50. De module komt in de ketel en het speakertje er onder.
Dus eerst het lood in de ketel wat dunner gemaakt. Ik gebruik een stukje karton om de module op te bouwen. Daar kan ik de componenten op lijmen en het isoleert meteen de prints van het lood er onder.

(http://www.xs4all.nl/~robvd/Forum/BR50_02.jpg)


Het was even puzzelen om de module zo laag te houden dat deze in de ketel past. Hij klemt een beetje, dus de gele aansluitdraden dienen meteen als 'trek stang' om de module weer uit de ketel te krijgen. Dat is met name nodig om software te kunnen wijzigen. De opbouw is verder zodanig dat de USB aansluiting met enige moeite is te bereiken. De sleuf voor de geheugenkaart zit op de kop, zodat deze eventueel eenvoudig is te wisselen om de geluidsbestanden te veranderen

(http://www.xs4all.nl/~robvd/Forum/BR50_03.jpg)


Daarna de rijstroom opgepakt van de draden naar de motor, en de speaker onder de ketel geplakt. Tijd om de boel te monteren.

(http://www.xs4all.nl/~robvd/Forum/BR50_04.jpg)


Natuurlijk gaat er nog van alles mis als de boel eenmaal is ingebouwd en soms moet de module even worden "uitgelezen" en nieuwe software worden geüpload.

(http://www.xs4all.nl/~robvd/Forum/BR50_05.jpg)


Maar het werkt!
(in deze video is het geluid nog niet helemaal goed. In het volgende bericht staat een video met sterk verbeterde geluiden)

! No longer available (http://www.youtube.com/watch?v=cRb95Z0ca_E#)


Ik heb nog wat moeite om goede geluidsfragmenten te maken waarbij een rijdende loc voldoende luid is (zodat die boven de motor uit komt). Maar daar ga ik nog even verder mee. Het is in ieder geval vrij eenvoudig het micro-SD kaartje er uit te halen om er nieuwe MP3's op te zetten

(http://www.xs4all.nl/~robvd/Forum/BR50_06.jpg)


Na wat gepuzzel met de hardware, met name consistent de rijstroom kunnen 'lezen' viel niet mee, lijkt dat deel nu redelijk stabiel. Daarvan volgt binnenkort een aansluitschema.

De software is nog in ontwikkeling (met name om te compenseren voor wat storingen bij het rijden en de MP3 speler die daarvan af en toe op hol slaat). Wat stroom opname betreft is de railbus veel gelijkmatiger dan zo'n lange stoomloc.

En natuurlijk nog verder met betere geluiden maken...

Maar tot zover ben ik tevreden...

Rob

Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 5 mei 2018, 19:20:51
Goed bezig Rob maar ... het gaat mij nu al boven mijn pet. :o
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 6 mei 2018, 22:01:19
Dank, Pierre. Ik probeer (uiteindelijk) tot een zo eenvoudig mogelijke bouwbeschrijving te komen.

Nu was ik wel tevreden met de technische mijlpaal van de inbouw van het geluid in de BR50, maar het geluid zelf was ik nog niet zo blij mee.
Ondertussen wel.

Dus hierbij een "officieel" project bericht.



Aansluitschema's en testsoftware voor de module volgen snel.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 6 mei 2018, 22:36:58
Ik ben er stil van.  :o
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: GéJé op 7 mei 2018, 00:48:18
Ik vind het resultaat echt fantastisch.
Knap werk!

groet,
Gert-Jan
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 7 mei 2018, 13:18:25
Man .. man .. wat een knap werk! :o Zo vind ik het (misschien) ook wel leuk om met mijn treinen te rijden. 8)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Wim Corduwener op 7 mei 2018, 17:08:48
Zo vind ik het (misschien) ook wel leuk om met mijn treinen te rijden. 8)
Ook wel lullig: heb je een modelspoorbaan en dan vind je het misschien wel leuk om met treinen rond te rijden.  ::)
Nah, ik heb eigenlijk ook niks met treinen. Eigenlijk heb ik alleen treinen om een beetje mee te kunnen doen op dit forum.  ;D
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 7 mei 2018, 23:53:24
Heren, dank voor alle lof. En dan nu...

Aansluitschema's van de geluidsmodule

De geluidsmodule is opgebouwd rond een Arduino Nano, waaraan vier functionele delen zijn toegevoegd:


Voeding en sensoren
Om de opbouw overzichtelijk te houden, beginnen we met de eerste 2 delen: de voeding en sensoren. Dat ziet er zo uit

(http://www.xs4all.nl/~robvd/Forum/SchemaModule2.jpg)


De voeding bestaat uit een bruggelijkrichter (1) met een flinke Elco (of meerdere Elco's parallel) van minstens 1400 uF. Voor de railbus en BR50 had ik ruimte voor 2200 uF. De gelijkrichter zorgt voor de juiste polarisatie in beide rijrichtingen
De + van de gelijkrichter gaat naar de V-IN van de Arduino, de - naar de Groond (GND).
Voor het meten van de pulsbreedte en de veranderingen in de frequentie zijn twee (input) pinnen van de Arduino over weerstanden verbonden met de rijstroom voordat deze gelijk gericht is. Elke pin heeft 2 weerstanden: een van de rijstroom naar de pin en een van de pin naar de GND. Deze opstelling is er een zogenaamde spanningsdeler, waarmee

Met dit deel aan de Arduino gebouwd (gelijkrichter, Elco en 4 weerstanden) is de 'input' van de module al te testen, voordat de andere delen worden gebouwd. Daar heb ik wat testsoftware voor. Die komt binnenkort met een korte demo.


MP3 speler en LED schakeling
En dan het output gedeelte: MP3 speler en licht (LED) schakeling

(http://www.xs4all.nl/~robvd/Forum/SchemaModule3.jpg)


Van de MP3 speler worden 6 van de 16 pinnen gebruikt: 2 voor de stroomvoorziening, 2 voor de seriële communicatie waarmee bestanden worden geselecteerd om af te spelen, en 2 voor de speaker. Voor de seriële verbinding zijn 2 weerstanden van 1k ohm tussengevoegd om de verschillende werkspanningen (5V Arduino, 3,3 V MP3 speler) te overbruggen. De MP3 speler krijgt stroom uit de 5V uitgang van de Arduino.

De LED verlichting wordt geschakeld met een NPN transistor op de 3,3V uitgang van de Arduino. De aansturing gebeurt over een 1k ohm weerstand van een output pin. Hier wordt pin D11 gebruikt, waardoor de LED ook te dimmen is. Dat kan handig zijn voor binnenverlichting, maar biedt ook mogelijkheden voor een imitatie van een zwaailicht (afstand bestuurde rangeerloc) of het gloeien van kolen, en zo meer.
In principe is het mogelijk meerdere 'schakelaars' (transistors) aan te brengen. Enige beperking is het relatief geringe vermogen dat beschikbaar is voor de module als de trein stil staat.


De hele module
De module is voor geluid en/of licht. En/of, want de lichtschakelaar kan achterwege worden gelaten als alleen geluid nodig is. En zonder MP3 speler kan alleen licht worden geschakeld. Dit laatste is misschien een optie om licht in wagons aan en uit te doen.

Maar met alle mogelijkheden, is dit het geheel:

(http://www.xs4all.nl/~robvd/Forum/SchemaModule1.jpg)


De daadwerkelijke opbouw is sterk afhankelijk van de ruimte in de betreffende loc, treinstel of wagon. Eventueel kunnen ook andere pinnen worden gebruikt als daarmee de opbouw beter past in de beschikbare ruimte. Ander pin gebruik is eenvoudig om in de software te definiëren.

Ik ben begonnen aan de 3e geluidsmodule. Binnenkort een bericht over hoe deze wordt gebouwd en getest.

Rob

Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Dirk T op 8 mei 2018, 09:44:26
Je bent weer lekker bezig!

Voor het meten van de pulsbreedte en de veranderingen in de frequentie zijn twee (input) pinnen van de Arduino over weerstanden verbonden met de rijstroom voordat deze gelijk gericht is. Elke pin heeft 2 weerstanden: een van de rijstroom naar de pin en een van de pin naar de GND. Deze opstelling is er een zogenaamde spanningsdeler, ...

Betekent dat, dat D3 (pin 6) en D5 (pin 8 ) in je tekening doorverbonden zijn met D6 (pin 9) en D7 (pin 10)? Anders zie ik niet hoe je spanningsdeler werkt.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 8 mei 2018, 11:25:18
Goed gezien, Dirk.

Foutje in de tekening!
Ik heb op het laatste moment pinnen D3 en D5 naar pinnen D6 en D7 gezet. En daarmee vergeten de paarse lijnen aan te passen: die moeten dus ook naar D6 en D7.
Ik pas vanavond de tekeningen aan.
Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 8 mei 2018, 19:21:38
Tekeningen zijn aangepast. Ik moest wel even de pagina verversen (ctrl + F5) om de nieuwe schema's te zien.
Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 10 mei 2018, 11:35:42
Geluidsmodule: opbouw van de voeding en rijstroom sensoren.

Ik ben begonnen met de volgende module in een V100 van Fleischmann. Deze loc is makkelijk te openen en daarmee erg geschikt voor het vervolmaken van de software. In de huidige (erg simpele) aansturing van de MP3 speler gaat tijdens het rijden de module af en toe op stil, met name als de rijstroom enkele keren kort hapert.
Dat is op te lossen door de communicatie met de MP3 speler te verbeteren (zoals ook herkennen dat een foutmelding wordt gestuurd). Maar dan is een loc met makkelijk bij te werken software wel handig.
Bovendien biedt de bouw van deze geluidsmodule de mogelijkheid om een en ander in beeld te brengen.

In dit eerste deel van de opbouw van de module: voeding en rijstroom sensoren. Opbouw en test.



In de video wordt gebruik gemaakt van deze software om de module te testen:

/* GELUIDSMODULE TESTER
 * Testprogramma voor geluidsmodules voor analoge h0 trein
 * Geeft aan welke signalen door de module worden herkend.
 * Meet de puls op 2 pinnen verbonden met de rijstroom.
 * Programma wacht op herkenbaar signaal op een van de pinnen.
 * Bij herkenbaar signaal (d.w.z periode kleiner dan 2020 us
 * en groter dan 0) wordt de rijpin en pulsbreedte in % weergegeven.
 * Ook speciale frequenties voor de functies (1-6) worden herkend
 * en aangegeven.
 * Output op de seriële (USB) poort. Waarden zijn uit te lezen met
 * de serial monitor op de computer.
 *
 * Alleen als de waarde verandert wordt een nieuwe regel met
 * informatie 'geprint'.
 */
 // ==> Geef hier de 2 pinnen op waarmee de rijstroom wordt gemeten <==
#define rijpin1 6
#define rijpin2 7

// --- DEFINITIES ----
#define pullup               false    // geeft aan of de interne pullup weerstand gebruikt moet worden
#define maxpulsbreedte       5000     // hoe lang wachten (minimaal 2x periode)


// Frequenties (Periodes) op de rijstroom
#define rijPeriode            2020    // rijstroom puls in us
#define functie_01_Periode    1500    // Periode (freq.) functie 1
#define functie_02_Periode    1250    // Periode (freq.) functie 2
#define functie_03_Periode     990    // Periode (freq.) functie 3
#define functie_04_Periode     790    // Periode (freq.) functie 4
#define functie_05_Periode     590    // Periode (freq.) functie 5
#define functie_06_Periode     490    // Periode (freq.) functie 6
#define pulsruis                40    // maximaal verschil in gemeten Periodes (ruis)
#define minhoog                200    // minimaal "hoog" signaal

#define elcoLaadtijd          1000    // oplaadtijd van de Elcos (ms) = tijd tot stabiele pulsmeting

// ---- VARIABLEN ----

int rijpin[] {rijpin1, rijpin2};

// pulse meting variabelen: lengte 'hoog', 'laag' en trillingstijd (periode). Alle tijden in us.
double pulsbreedteHoog;
double pulsbreedteLaag;
double pulsPeriode;
double pulsbreedteHoog2;
double pulsbreedteLaag2;
double pulsPeriode2;

int vooruit = 1;                    // richting: bepaalt welke pin wordt uitgelezen voor de rijstroom puls
int pulsbreedte = 0;                // pulsbreedte in %
int vorigePulsbreedte = 0;          // vorige pulsbreedte om verandering vast te stellen
int functie = 0;                    // speciale functie frequentie gemeten
int vorigeFunctie = 0;


void setup() {
   
  pinMode     (rijpin[0],INPUT);
  digitalWrite(rijpin[0],pullup);
  pinMode     (rijpin[1],INPUT);
  digitalWrite(rijpin[1],pullup);

  Serial.begin(9600);
  Serial.println("Geluidsmodule gestart.");

  delay(elcoLaadtijd);       // wacht op stabiele puls (na opladen Elco)

  getSignaal();              // zoek naar signaal op de pinnen
}

void loop() {
// lees de huidige rijpin uit
  pulsbreedteHoog = pulseIn(rijpin[vooruit], HIGH, maxpulsbreedte);
  pulsbreedteLaag = pulseIn(rijpin[vooruit], LOW, maxpulsbreedte );
  pulsbreedteHoog2 = pulseIn(rijpin[vooruit], HIGH, maxpulsbreedte);
  pulsbreedteLaag2 = pulseIn(rijpin[vooruit], LOW, maxpulsbreedte );
  pulsPeriode = pulsbreedteHoog + pulsbreedteLaag;
  pulsPeriode2 = pulsbreedteHoog2 + pulsbreedteLaag2;

// beoordeel het signaal
  if (pulsPeriode > rijPeriode + pulsruis || pulsPeriode < pulsruis ) {
  // geen herkenbaar signaal meer
    getSignaal();             // zoek naar signaal op een van de rojpinnen
    vorigePulsbreedte = 0;    // forceer weergave zodra signaal gevonden
  } else
  // herkenbaar signaal
  {

// bepaal welk signaal (frequentie) is ontvangen en voer bijbehorende functie uit
    if (abs (pulsPeriode - rijPeriode) < pulsruis) {
      // normale rijstroom: bereken pulsbreedte (in %)
      pulsbreedte = 100 * pulsbreedteHoog / rijPeriode;
    }
     
    functie = getFunctie();

    // resultaten weegeven als er iets is veranderd.
    if (abs(vorigePulsbreedte - pulsbreedte) > 1 || functie != vorigeFunctie ) {
      // meer dan 1% pulsbreedte verschil of functietoets ingedrukt
      Serial.print ("Rijpin: ");
      Serial.print (vooruit + 1);
      Serial.print (" || Pulsbreedte: ");
      Serial.print (pulsbreedte);
      Serial.print("% ");
      Serial.print (" || Functie: ");
      Serial.println(functie);
      delay(10);
      vorigePulsbreedte = pulsbreedte;
      vorigeFunctie = functie;
    }   
  }
}

// SIGNAAL ZOEKEN
// functie om te wachten op een herkenbaar signaal op een van de rijpinnen.
void getSignaal() {
  Serial.println ("Module wacht op herkenbaar signaal.");
 
  // zolang geen rijstroom periode en geen "hoog"  signaal is gevonden
  // blijft deze lus om-en-om op elk van de rijpinnenm meten.
  do {
    vooruit = (!vooruit);                   // wissel van rijpin
    pulsbreedteHoog = pulseIn(rijpin[vooruit], HIGH, maxpulsbreedte);
    pulsbreedteLaag = pulseIn(rijpin[vooruit], LOW , maxpulsbreedte);
    pulsPeriode = pulsbreedteHoog + pulsbreedteLaag;
    delay(50);
    Serial.print(".");                      // elke poging: "."
    delay(200);
  } while (abs(pulsPeriode - rijPeriode) > pulsruis || pulsbreedteHoog < minhoog);

  // Signaal gevonden. Geef dit aan op de seriële bus
  Serial.println("!");
  Serial.print("Herkenbaar signaal gevonden op rijpin ");
  Serial.print(vooruit+1);
  Serial.println(".");
}

// HERKEN FUNCTIE-FREQUENTIE
// functie voor het checken van functie-frequenties
// op de puls (functietoets).
int getFunctie () {
  int f = 0;

  if (abs (pulsPeriode - functie_01_Periode) < pulsruis && abs (pulsPeriode2 - functie_01_Periode) > pulsruis) { f = 1;}
  if (abs (pulsPeriode - functie_02_Periode) < pulsruis && abs (pulsPeriode2 - functie_02_Periode) > pulsruis) { f = 2;}
  if (abs (pulsPeriode - functie_03_Periode) < pulsruis && abs (pulsPeriode2 - functie_03_Periode) > pulsruis) { f = 3;}
  if (abs (pulsPeriode - functie_04_Periode) < pulsruis && abs (pulsPeriode2 - functie_04_Periode) > pulsruis) { f = 4;}
  if (abs (pulsPeriode - functie_05_Periode) < pulsruis && abs (pulsPeriode2 - functie_05_Periode) > pulsruis) { f = 5;}
  if (abs (pulsPeriode - functie_06_Periode) < pulsruis && abs (pulsPeriode2 - functie_06_Periode) > pulsruis) { f = 6;}

  return f;
}
// --- einde ---


Ondertussen ga ik de MP3 speler en speaker inbouwen. Verslag volgt...

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 10 mei 2018, 18:47:46
Geluidsmodule: De MP3 speler (DFplayer)

Ik was vandaag lekker bezig met de V100, dus hierbij het verslag van het inbouwen van de MP3speler.



En hier de Arduino sketch voor het testen van de MP3 speler:

/* DFPLAYER TESTER
 * Testprogramma voor geluidsmodules voor analoge h0 trein
 * Test de seriële communicatie met de DFplayer (MP3 speler)
 *
 * De communicatie gaat met "soft serial" op 2 digitale pinnen
 * naar keuze. Het programma speelt de bestanden in volgorde
 * af, te beginnen bij 001.mp3, dan 002.mp3, etc.
 * Afspeeltijd per bestand is instelbaar.
 */


#define MP3RX          9    // serial receive pin, verbonden met transmit van DFplayer
#define MP3TX          8    // serial transmit pin, verbonden met receive van DFplayer
#define afspeeltijd 8000    // in ms


# define Start_Byte 0x7E
# define Version_Byte 0xFF
# define Command_Length 0x06
# define End_Byte 0xEF
# define Acknowledge 0x00  //Returns info with command 0x41 [0x01: info, 0x00: no info]


int LED = 13;
int x=0;
bool MP3play = false;    // MP3 playing y/n

#include <SoftwareSerial.h>

SoftwareSerial MP3Serial(MP3RX, MP3TX); // RX, TX

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);


  MP3Serial.begin(9600);
  pinMode(LED, OUTPUT);
  digitalWrite (LED, HIGH);


  execute_CMD(0x3F, 0, 0); // Send request for initialization parameters
  delay (1000);
  execute_CMD(0x06, 0, 28); // Set the volume to medium (0x00~0x30)
  delay (100);
  execute_CMD(0x07, 0, 0);  //
  delay (100);
}

void loop() {
  // put your main code here, to run repeatedly:
 
 if (MP3Serial.available()) {  // er is iets aangekomen op de seriele bus
    delay(20);
    while(MP3Serial.available()) {  // serieel uitlezen
      Serial.print(MP3Serial.read(),HEX);
      Serial.print(".");
    }
    Serial.println("||");
    MP3play = false;
  }
  if (!MP3play) {
      x++;
      MP3play = true;
      execute_CMD (0x03, 0, x);
      delay(afspeeltijd);
      MP3play=false;
  }
}

// DF serial command code
void execute_CMD(byte CMD, byte Par1, byte Par2) // Excecute the command and parameters
{
 // Calculate the checksum (2 bytes)
 int16_t checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);

 // Build the command line
 byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge, Par1, Par2, checksum >> 8, checksum & 0xFF, End_Byte};

 //Send the command line to the module
 for (byte k=0; k<10; k++)
 {
  MP3Serial.write( Command_line[k]);
 }
}

Tot zover weer...

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 12 mei 2018, 23:44:26
Geluidsmodule: geluidsfragmenten maken en lichtschakeling

In dit laatste deel van de opbouw van de geluidsmodule een filmpje over het maken van de geluidsfragmenten en de lichtschakeling van de module.Het is misschien even doorbijten, maar ik heb geprobeerd het bewerken van de geluidsfragmenten duidelijk in beeld te krijgen... Veel computerwerk, dus.

Verder de code voor de Arduino en een stuklijst voor de onderdelen.

Maar eerst: hoe maak je het geluid en het licht.



Arduino programma (sketch)

Dan de code voor de geluidsmodule. Nog in versie 0.9.2.... Ik werk nog aan de laatste verbeteringen bij het haperen van de rijstroom....

/* GELUIDSMODULE
 * versie 0.9.2, Mei 2018 - Rob van Deursen
 * Rijstroom afhankelijk geluid voor analoge modeltreinen.
 * Module vereist rijstroom met pulsbreedte modulatie en heeft dan de volgende functies:
 *    - Startgeluid (starten van een motor, bijvoorbeeld
 *    - Stationair geluid
 *    - Rijstroom afhankelijke geluiden tijdens het rijden
 *    - 4 geluidsfuncties, te bedienen met frequentie-veranderingen op de rijstroom
 *    - 2 andere functies (licht schakelen, bijvoorbeeld)
 * Per loc of treinstel zijn andere definities mogelijk voor de gebruikte pinnen op de
 * Arduino en voor de geluiden op de MP3 speler (DFplayer).
 * De geluiden staan in map "MP3" op de geluidskaart.
 */


// ----- DEFINITIES PER MODULE -----

// === V100 ===
// ----- Pin definities ------
#define pulsbreedtePin1        6       // digitale pin voor PWM rijspanning richting 1
#define pulsbreedtePin2        7       // digitale pin voor PWM rijspanning richting 2
#define lichtPin              11       // Liever niet pin 13, eventueel PWM = dimbaar licht.
#define MP3RX                  9       // serieel receive (van MP3 speler)
#define MP3TX                  8       // serieel transmit (naar MP3 speler
// ----- rijstroom en geluid/licht instellingen ------
#define aantalSnelheden        1.1       // aantal rijsnelheden (exclusief 0), 0 geeft stationair geluid
#define nulPWM               700.0   // PWM pulsbreedte (in us) om aanloopweerstand v.d. motor te overwinnen
#define stapPWM              150.0   // PWM pulsbreedte (in us) verschil om geluidstap te maken (2020 is 100%)
#define startgeluid            1     // 001.mp3
#define stationair             2     // 002.mp3
#define rijden1                3     // 003.mp3
#define geluidsfunctie1        4     // 004.mp3 (bel)
#define geluidsfunctie2        5     // 005.mp3 (Hoorn)
#define geluidsfunctie3        6     // 006.mp3 (kolen scheppen)
#define geluidsfunctie4        7     // 007.mp3 (motor afzetten)
#define lichtfunctie           5     // functie 5 is licht aan/uit
// MP3 speler (DFplayer)
#define volume                22     // geluidsvolume (0-47)
#define equalizer              0     // equaliser 0-5: normal, pop, rock, jazz, classic, base

/*
// === VT98 (RAILBUS) ===
// ----- Pin definities -----
#define pulsbreedtePin1          3       // digitale pin voor PWM rijspanning richting 1
#define pulsbreedtePin2          4       // digitale pin voor PWM rijspanning richting 2
#define lichtPin                11       // Liever niet pin 13, eventueel PWM = dimbaar licht.
//#define MP3RX                  9       // serieel receive (van MP3 speler)
//#define MP3TX                  8       // serieel transmit (naar MP3 speler
// ----- rijstroom en geluid/licht instellingen -----
#define aantalSnelheden        3.1       // aantal rijsnelheden (exclusief 0), 0 geeft stationair geluid
#define nulPWM               515.0   // PWM pulsbreedte (in us) om aanloopweerstand v.d. motor te overwinnen
#define stapPWM              210.0   // PWM pulsbreedte (in us) verschil om geluidstap te maken (2020 is 100%)
#define stationair             1     // 001.mp3
#define rijden1                2     // 002.mp3
#define rijden2                3     // 003.mp3
#define rijden3                4     // 004.mp3
#define startgeluid            5     // 005.mp3
#define geluidsfunctie1        8     // 008.mp3 (hoorn - lang)
#define geluidsfunctie2        7     // 007.mp3 (hoorn - kort)
#define geluidsfunctie3        0     // geen functie
#define geluidsfunctie4        6     // 006.mp3 (motor uitzetten)
#define lichtfunctie           6     // functie 6 is licht aan/uit
// MP3 speler (DFplayer)
#define volume                24     // geluidsvolume (0-47)
#define equalizer              5     // equaliser 0-5: normal, pop, rock, jazz, classic, base
*/
/*
// === BR50 ===
// ----- Pin definities -----
#define pulsbreedtePin1        3       // digitale pin voor PWM rijspanning richting 1
#define pulsbreedtePin2        5       // digitale pin voor PWM rijspanning richting 2
                                       // LET OP! pin 5 lijkt niet de meeest betroubare pin
                                       // hier zit ook een timer/count functie op waarvan het lijkt dat 
                                       // pdeze de ulsbreedte meting verstoort, met name bij het wisselen
                                       // van de pulsbreedte!
#define lichtPin              11       // Liever niet pin 13, eventueel PWM = dimbaar licht.
#define MP3RX                  7       // serieel receive (van MP3 speler)
#define MP3TX                  6       // serieel transmit (naar MP3 speler

// ----- rijstroom en geluid/licht instellingen -----
#define aantalSnelheden        6.1       // aantal rijsnelheden (exclusief 0), 0 geeft stationair geluid
#define nulPWM               510.0   // PWM pulsbreedte (in us) om aanloopweerstand v.d. motor te overwinnen
#define stapPWM              150.0   // PWM pulsbreedte (in us) verschil om geluidstap te maken (2020 is 100%)
#define startgeluid            1     // 001.mp3
#define stationair             2     // 002.mp3
#define rijden1                3     // 003.mp3
#define rijden2                4     // 004.mp3
#define rijden3                5     // 005.mp3
#define rijden4                6     // 006.mp3
#define rijden5                7     // 008.mp3
#define rijden6                8     // 008.mp3
#define geluidsfunctie1        9     // 009.mp3 (fluit - kort)
#define geluidsfunctie2       10     // 010.mp3 (fluit - kort)
#define geluidsfunctie3       11     // 011.mp3 (kolen scheppen)
#define geluidsfunctie4       12     // 012.mp3 (nader te bepalen functie)
#define lichtfunctie           0     //  geen licht functie
//MP3 speler (DFplayer)
#define volume                32     // geluidsvolume (0-47)
#define equalizer              0     // equaliser 0-5: normal, pop, rock, jazz, classic, base
*/


// ----- ALGEMENE DEFINITIES -----
//      technische definities MP3 speler
#define Start_Byte 0x7E
#define Version_Byte 0xFF
#define Command_Length 0x06
#define End_Byte 0xEF
#define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info]

// Definities voor de elektronica
#define elcoLaadtijd           800    // oplaadtijd van de Elcos (ms) = tijd tot stabiele pulsmeting
#define pullup false                  // gebruik van interne pullup weerstanden op rijpinnen ja/nee (true/false)

// Frequenties (Periodes) op de rijstroom
#define rijPeriode            2020    // rijstroom puls in us
#define functie_01_Periode    1500    // Periode (freq.) functie 1
#define functie_02_Periode    1250    // Periode (freq.) functie 2
#define functie_03_Periode     990    // Periode (freq.) functie 3
#define functie_04_Periode     790    // Periode (freq.) functie 4
#define functie_05_Periode     590    // Periode (freq.) functie 5
#define functie_06_Periode     490    // Periode (freq.) functie 6
#define pulsruis                40    // maximaal verschil in gemeten Periodes (ruis)
#define minhoog                200

// ---- VARIABELEN ----

int pulsbreedtePin[] {pulsbreedtePin1, pulsbreedtePin2};

double pulsbreedteHoog;
double pulsbreedteLaag;
double pulsbreedteHoog2;
double pulsbreedteLaag2;
double pulsPeriode;
double pulsPeriode2;

int lopendeFunctie = 0;               // > 0 : er wordt een speciale functie uitgevoerd

int snelheid = 0;
int vorigeSnelheid = 0;
int vooruit = 1;                      // richting: bepaalt welke pin wordt uitgelezen voor de rijstroom puls
int MP3klaar;                         // geeft aan of MP3 speelt, , 0 = aan, 1 = uit.
int x = 0;

int geluidsfunctie [] {geluidsfunctie1, geluidsfunctie2, geluidsfunctie3, geluidsfunctie4};

int  MP3count = 0;                    // teller om status op te vragen

// ---- libraries en objecten ----
#include <EEPROM.h>                   // EEPROM om licht aan/uit te onthouden
#include <SoftwareSerial.h>           // // softserial voor mp3

SoftwareSerial MP3Serial(MP3RX, MP3TX); // RX, TX

// ----- Initialiseren -----
void setup() {
  MP3Serial.begin(9600);
 // Serial.begin(9600);
 // Serial.println("Opstarten...");
  pinMode     (pulsbreedtePin[0],INPUT);
  digitalWrite(pulsbreedtePin[0],pullup);
  pinMode     (pulsbreedtePin[1],INPUT);
  digitalWrite(pulsbreedtePin[1],pullup);
 
  pinMode     (lichtPin,OUTPUT);
  digitalWrite(lichtPin,EEPROM.read(0));             // licht aan of uit: waarde uit EEPROM
 
  // gluidsmodule starten
  execute_CMD(0x3F, 0, 0);            // initialiseer MP3 speler
 // Serial.println("MP3 speler initialisatie");
  delay (80); 
  while (MP3status() == 0) {     // wacht op antwoord
   // Serial.println("Wacht op initialisatie");
    delay (50);
  }
  execute_CMD(0x06, 0, volume);       // zet het geluidsvolumevolume
  delay (80);
  execute_CMD(0x07, 0, equalizer);    // equalizer
  delay (80);
  speelGeluid (startgeluid);          // speel startgeluid af
 
  // terwijl de MP3 speler start, wordt de richting alvast gemeten
  delay(elcoLaadtijd);       // wacht op stabiele puls (na opladen Elco)

  do {
    vooruit = (vooruit ==0 );
    pulsbreedteHoog = pulseIn(pulsbreedtePin[vooruit], HIGH);
    pulsbreedteLaag = pulseIn(pulsbreedtePin[vooruit], LOW );
    pulsbreedteHoog2 = pulseIn(pulsbreedtePin[vooruit], HIGH);
    pulsbreedteLaag2 = pulseIn(pulsbreedtePin[vooruit], LOW );
    pulsPeriode = pulsbreedteHoog + pulsbreedteLaag;
    pulsPeriode2 =  pulsbreedteHoog2+ pulsbreedteLaag2;
   // Serial.print("rijpin: ");
   // Serial.print(vooruit + 1);
   // Serial.print(" ");
   // Serial.println(pulsbreedteHoog);

  } while (pulsbreedteHoog < minhoog  || pulsbreedteHoog2 < minhoog );  // "hoog" signaal is pin actief


}

void loop() {
 
  do {
 
    pulsbreedteHoog = pulseIn(pulsbreedtePin[vooruit], HIGH);
    pulsbreedteLaag = pulseIn(pulsbreedtePin[vooruit], LOW );
    pulsbreedteHoog2 = pulseIn(pulsbreedtePin[vooruit], HIGH);
    pulsbreedteLaag2 = pulseIn(pulsbreedtePin[vooruit], LOW );
    pulsPeriode = pulsbreedteHoog + pulsbreedteLaag;
    pulsPeriode2 =  pulsbreedteHoog2+ pulsbreedteLaag2;
 
   // Serial.print("rijpin: ");
   // Serial.print(vooruit + 1);
   // Serial.print(" ");
   // Serial.print(pulsPeriode);
   // Serial.print(" / ");
   // Serial.print(pulsbreedteHoog);
   // Serial.print(" / ");
   // Serial.print(pulsbreedteLaag);
   // Serial.print(" || ");
   // Serial.print(pulsPeriode2);
   // Serial.print(" / ");
   // Serial.print(pulsbreedteHoog2);
   // Serial.print(" / ");
   // Serial.println(pulsbreedteLaag2);
   
  } while (pulsPeriode > rijPeriode + pulsruis || pulsbreedteHoog < minhoog || pulsbreedteLaag < pulsruis  );

// bepaal welk signaal (frequentie) is ontvangen en voer bijbehorende functie uit
  if (abs (pulsPeriode - rijPeriode) < pulsruis) {
    // normale rijstroom
    snelheid = getSnelheid(pulsbreedteHoog);
  } 
  MP3klaar = (MP3status() == 1);

   
  if (lopendeFunctie > 0) {      // er loopt nog een speciale geluidsfunctie
    if (MP3klaar) {              // geluid voor een functie is afgespeeld
      lopendeFunctie = 0;        // gewoon geluid afspelen
    }
  }
   
  //snelheid afhankelijk geluid
  if (lopendeFunctie == 0) {     // Er wordt geen speciaal geluid (meer) afgespeeld
    lopendeFunctie = getFunctie();   
    // geluidsfunctie (1 - 6)
    if (lopendeFunctie > 0) {    // (geluids)functie gestart
      lopendeFunctie = startFunctie(lopendeFunctie);
    }
    else {
    // geen speciale functie nu, dus gewoon geluid spelen
      if (snelheid != vorigeSnelheid || MP3klaar ) {
        // er is een snelheidswissel of MP3 speelt niet meer
       
        speelGeluid(snelheid+2);   // geluidsbestand 002-008
        vorigeSnelheid = snelheid;
      }
    }
  }
}

//



//functie bepalen snelheid op basis van pulsbreedte
int getSnelheid(double pbr){
  int s;

  s = (pbr - nulPWM)/stapPWM;
  s = constrain (s, 0, aantalSnelheden);              // beperk de snelheidswaarde tussen 0 en het maximum
  return s;
}


// functie voor het checken van functie-frequenties op de puls (functietoets)
int getFunctie () {
  int f = 0;
 
  if (abs (pulsPeriode - functie_01_Periode) < pulsruis && abs (pulsPeriode2 - functie_01_Periode) < pulsruis ) { f = 1;}
  if (abs (pulsPeriode - functie_02_Periode) < pulsruis && abs (pulsPeriode2 - functie_02_Periode) < pulsruis ) { f = 2;}
  if (abs (pulsPeriode - functie_03_Periode) < pulsruis && abs (pulsPeriode2 - functie_03_Periode) < pulsruis ) { f = 3;}
  if (abs (pulsPeriode - functie_04_Periode) < pulsruis && abs (pulsPeriode2 - functie_04_Periode) < pulsruis ) { f = 4;}
  if (abs (pulsPeriode - functie_05_Periode) < pulsruis && abs (pulsPeriode2 - functie_05_Periode) < pulsruis ) { f = 5;}
  if (abs (pulsPeriode - functie_06_Periode) < pulsruis && abs (pulsPeriode2 - functie_06_Periode) < pulsruis ) { f = 6;}

  return f;
}

// speciale functie starten
// geeft terug of de functie moet blijven lopen
int startFunctie(int f) {
  int lopen = 0;
  int gn;
  if (f < 5 ){                     // geluidsfunctie (1-4)
    gn = geluidsfunctie [f-1];     // geluidsbestand nummer
    //geluid afspelen
    if (gn > 0) {                  // geluid is gedefinieerd (0 = geen geluid)
      speelGeluid(gn);
      lopen = f;                   // volgende functie wacht op aflopen MP3 geluid
    }
  }
  else if (f == lichtfunctie) {
    digitalWrite(lichtPin, (digitalRead (lichtPin) == LOW) );    // wissel hoog/laag (= aan/uit)
    EEPROM.write(0,digitalRead (lichtPin));                      // onthou licht aan of uit tot volgende opstart.

    delay (100);
  }
  return lopen;                    // 0 = niet wachten, > 0 is wachten op einde geluid 
}

// controleer of geluid is afgespeeld
// met I/O pin is "hoog" klaar
// zonder IO pin is het info ontvangen op soft serial

// Speel geluid af
// stuurt commando naar de MP3 speler
void speelGeluid(int bestandnummer) {
  execute_CMD(0x03, 0, bestandnummer);
 // Serial.print("Geluidsbestand gestart: ");
 // Serial.println(bestandnummer);
  MP3klaar = 0;                         // geluid speelt
  delay (100);
}

// status MP3 speler lezen
// output: 0 = geen info
//         1 = mp3 klaar (speelt niet)
//         2 = mp3 speelt
//         3 = fout / onbekend
int MP3status () {
  int m = 0;
  int t = 0;
  byte b;
  int bstat;                       // status byte
  int btrack;                      // bestand nummer
  if ( !MP3Serial.available()) {   // er is niets aangekomen op de seriele
    MP3count ++;
    if (MP3count > 30000 ) {
       execute_CMD (0x4B,0,0);      // query huidig bestand dat wordt afgespeeld
       //delay (100);
       MP3count = 0;
      // Serial.println("status verzoek");
    }
   }
   else {                           // er is iets op de seriele bus
    delay(80);
    while(MP3Serial.available()) {  // serieel uitlezen
      t++;
      b = MP3Serial.read();
      if (t == 4) {                 // dit is de status byte
        bstat = b;
      }
      if (t == 7) {                 // dit is het bestandsnummer
        btrack = b;
      }
      if (t == 10){                 // meer dan 1 bericht
        t=0;
      }
     // Serial.print(b,HEX);
     // Serial.print(".");
    }
    switch (bstat) {
      case 0x3F:                    // initialisatie parameters ontvangen
        m = 2;                      // speler is bezig
      break;
      case 0x3D:                    // eind van een bestand
        m = 1;                      // speler is klaar
      break;
      case 0x4B:                    // antwoord op bestand dat wordt afgespeeld
        if (btrack > 0) {
          m = 2;                    // bestand speelt
        } else {
          m = 1;                    // er speelt geen bestand, speler is kaar
        }   
      break;
      case 0x40:                    // fout in transmissie
        delay(150);                 // even wachten
        m = 1;                      // speler is klaar
      default:
        m = 3;                      // onbekend = fout
    }
   // Serial.print("||");
   // Serial.print(bstat,HEX);
   // Serial.print(" - ");
   // Serial.print(btrack);
   // Serial.print(" m: ");
   // Serial.println(m);
    return m;
  }
}

/*
// Reset MP3 speler
void resetMP3() {
 // Serial.print("MP3 module reset... ");
  delay (100);                          // even wachten na de foutmelding, MP3 pseler is mogelijk aan het initialiseren.
  execute_CMD(0x0C, 0, 0);              // stuur reset commando
  delay (50);
  execute_CMD(0x3F, 0, 0);            // initialiseer MP3 speler
 // Serial.println("MP3 speler initialisatie");
  delay (800);
  execute_CMD(0x06, 0, volume);       // zet het geluidsvolumevolume
  delay (80);
  execute_CMD(0x07, 0, equalizer);    // equalizer
  delay (80);
  MP3klaar = 1;                       // er wordt geen bestand meer afgespeeld
}
*/
//===
// DF Seriële commando's versturen
void execute_CMD(byte CMD, byte Par1, byte Par2) // Excecute the command and parameters
{
  // Bereken checksum (2 bytes)
  int16_t checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);

  // Bouw het commando op
  byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge, Par1, Par2, checksum >> 8, checksum & 0xFF, End_Byte};

  // Verstuur commando naar MP3 speler
  for (byte k=0; k<10; k++)
  {
    MP3Serial.write( Command_line[k]);
  }
}
--- EINDE ---

Stuklijst

Als laatste nog een lijst van onderdelen met prijsindicatie als je spullen in Nederland koopt.

* kleine speakers kon ik alleen bij Ali express vinden. Kosten minder dan $4 per 10 stuks.

Totaal ben je zo'n 15 euro kwijt. Maar dat kan een stuk (per stuk) goedkoper door te bestellen inChina en eventueel meteen onderdelen voor meerdere exemplaren te bestellen.

Ondertussen ben ik alweer aan het nadenken over de geluid/licht wagen voor kleinere locs die zelf geen geluidsmodule kunnen opnemen. Met meerdere geluiden, afhankelijk van het type loc dat er voor zit, en wellicht ook richtingsafhankelijk.
En ik ben al aan het kijken naar verdere verkleining door de Arduino te vervangen door iets kleiners....
Kortom: wordt vervolgd.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 18 mei 2018, 22:25:57
Een universele geluidswagon

Ik ben aardig op dreef met het inbouwen van geluid in verschillende treinen, maar zo gaandeweg vroeg ik mij af of ik mijn doel niet aan het voorbij schieten ben... Nu er enkele treinen met geluid rond rijden, is het zonder geluid meteen wat kaal en daarmee werd de aandrang wel groot om overal geluid in te bouwen.
Maar wat nu als:
De oplossing: een wagon die geluiden van verschillende locs kan maken, bijvoorbeeld een bagagewagon.

(http://www.xs4all.nl/~robvd/Forum/Geluidswagon01.jpg)


Met de 4 functie toetsen van de rijstroom bediening kunnen 4 verschillende locs worden gekozen of het geluid helemaal worden uitgezet. Zet de wagon vlak achter de loc, kies het geluid dat er bij hoort, en rijden maar.
Met zo'n wagon aan de voorkant van een trein is het eenvoudig om een loc te wisselen, en toch het juiste geluid te maken. Handig als je meer locs hebt dan je gelijktijdig kunt laten rijden.
En met zo'n wagon aan elke kant van de trein, kun je zelfs de loc omrijden en het geluid steeds van dicht bij de loc laten komen.
Het geluid uitschakelen is ook handig als de trein in een schaduwstation staat: de loc staat dan stroomloos, maar de wagon niet. Met een druk op de functietoets 4 (blauw) gaat het geluid dan uit. Als de trein weer uit het schaduwstation komt rijden, gaat het geluid met een druk op een functietoets weer aan.

Voor deze bagagewagon heb ik een batterij van Elco's gemaakt, die straks dienst doen als lading in de wagon (vaten). Ik was wel benieuwd hoe het geluid zou werken met stroomopname over slechts 2 wielen (een wiel voor elke pool), zoals deze standaard in de wagon was ingebouwd, vandaar een wat ruimere capaciteit aan Elco's

(http://www.xs4all.nl/~robvd/Forum/Geluidswagon02.jpg)


Dat viel nog niet eens tegen. Met enige snelheid konden zelfs vaak zonder storingen worden over wissels worden gereden. Maar voor een betrouwbaar geluid tijdens het rijden, toch nog maar 2 stroomafnemers toegevoegd. Om de extra stoomafname wat eenvoudig te houden, heb ik een van de assen omgedraaid, zodat nu een pool over de beide assen stroom opneemt, en de andere over de wielen aan een zijde.

(http://www.xs4all.nl/~robvd/Forum/Geluidswagon03.jpg)


Ondertussen is de wagon voorzien voor geluiden voor de BR70 en de V60. 2 andere sets van geluiden ga ik nog maken, nog een voor een (middel)zware stoomloc en een voor een v160.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 20 mei 2018, 21:58:59
Met zo gaandeweg 4 geluidsmodules in verschillende hardware en software configuraties heb ik wat tijd besteed aan standaardisatie.De railbus had nog een prototype aan boord met een afwijkende aansturing van de MP3 speler. Bovendien vond ik het storend dat de module bijna tot aan het dak zat. Met name met licht aan was deze duidelijk te zien. Nu begon de elektronica ook wat te haperen, nadat deze -tig keer was bewogen om nieuwe software te laden. Allemaal redenen om de railbus van een nieuw opgebouwde geluid- en lichtmodule te voorzien.

Dit was de  opbouw van het prototype:

(http://www.xs4all.nl/~robvd/Forum/Railbus08.jpg)


Van de nieuw opgebouwde module zijn bijna alle componenten ter plekke gesoldeerd, zodat alles precies pas is op de plek waar het moet komen. Dit mede om de module deze keer onder de onderste  raamstijlen te houden (of in ieder geval zo veel mogelijk). Ook is de gehele opbouw wat overzichtelijker geworden.

(http://www.xs4all.nl/~robvd/Forum/Railbus09.jpg)


Met een paar lichtgekleurde kartonnetjes net onder de ramen, ook in de motorwagen, ziet dit railbusje met verlichting er nu zo uit:

(http://www.xs4all.nl/~robvd/Forum/Railbus10.jpg)


Nu is ook de software en indeling van de MP3 bestanden op de SD kaartjes dezelfde geworden. Ondertussen ben ik er achter hoe de bestanden op "naam" (001.mp3, 002.mp3, etc.) kunnen worden afgespeeld, in plaats van de volgorde waarmee de bestanden op het kaartje zijn gezet. Alle 4 geluidmodules hebben nu dezelfde software en geheugenkaart indeling gekregen.

Deze standaard is ook nodig, omdat vanaf nu er 2 types microcontrollers gebruikt gaan worden: de Arduino Nano en een Digispark met ATtiny. Die laatste is kleiner, heeft net genoeg pinnen en programma opslag geheugen. Hoewel er veel inspanning is gedaan om deze digispark op een Arduino te laten lijken, zijn er op details toch wat verschillen. Dat betekent  software ontwikkeling in 2 parallelle sporen. Dus vanaf dit gezamenlijke startpunt 2 standaarden.
(ik heb wel eens gehoord: "standaarden zijn goed, daar moeten we er zoveel mogelijk van hebben!" Ik doe mijn best...)

Met deze Digispark hoop ik geluidsmodules te kunnen inbouwen in de BR38, de BR78 en misschien zelfs de BR64....
Meer hierover in een volgend bericht.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 28 mei 2018, 20:06:54
DigiSpark i.p.v. Arduino

Met de lengte van de Arduino kwam ik niet meer uit in kleinere locs dan de railbus, BR50 of V100. Na enig onderzoek kwam ik uit op een kleinere variant: de DigiSpark. Met de de informatie die ik had:

"De DigiSpark is geen Arduino, maar we hebben ons best gedaan deze er zoveel mogelijk op te laten lijken", en
"Alle 6 pinnen zijn te gebruiken als input/output voor je project".

Dacht ik: dat moet lukken. Ik ben de afgelopen avonden bezig geweest om het ook te laten lukken. Er waren toch voldoende afwijkingen ten opzichte van de Arduino om verschillende hoofdbrekens te geven  :)

Even een vergelijk: boven de Arduino Nano, onder de DigiSpark (en 50 eurocent ter referentie)

(http://www.xs4all.nl/~robvd/Forum/BR78-00.jpg)


Nu is de Digispark echt kleiner, niet alleen in maatvoering, maar ook in programma opslag ruimte: er staat maar liefst 6012 byte tot je beschikking (dus een kleine 6 kB!). Dat is een fractie van de opslagruimte op je telefoon en evengoed een stuk minder dan de opslagruimte van de Arduino. Omdat de kleine versie van de geluidsmodule gebruikt wordt als de ruimte beperkt is, heb ik de lichtfunctie laten vervallen. Zo is het programma na compileren net klein genoeg om op de DigiSpark te kunnen laden.

Er is in ieder geval (net) voldoende ruimte in de cabine van de BR78 voor voeding, DigiSpark en 'getrimde' MP3 speler.

(http://www.xs4all.nl/~robvd/Forum/BR78-01.jpg)

(http://www.xs4all.nl/~robvd/Forum/BR78-02.jpg)


Dus eerst maar eens de voeding: gelijkrichter met Elco's en weerstanden voor de rijstroom meting.

(http://www.xs4all.nl/~robvd/Forum/BR78-04.jpg)


En dan kan de DigiSpark met daarop de MP3 speler gesoldeerd worden. Deze komt bovenop de voeding.

(http://www.xs4all.nl/~robvd/Forum/BR78-05.jpg)


Dus maar eens testen. Maar dat werkte niet zo maar. Zo gaandeweg ben ik nogal wat uitdagingen tegengekomen, zoals:
Dus vele aanpassingen (solderen, desolderen, nieuw programma, solderen, etc...) later ziet het er zo uit.

(http://www.xs4all.nl/~robvd/Forum/BR78-06.jpg)


Het werkt (redelijk) en het past ook nog: de speaker komt net naast de koolborstels in een van de watertanks.

Pfff... missie geslaagd. Gelukkig is voldoening is het product van moeite en resultaat  8)

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 2 juni 2018, 08:12:26
Wauw Rob,

Is de volgende uitdaging de glaskast of köff?
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 6 juni 2018, 11:40:55
Dank je, Mark

Is de volgende uitdaging de glaskast of köff?
Oepfff… Gelukkig heb ik geen van beide in mijn verzameling  :D
Voorlopig is de BR64 de kleinste die ik wil proberen.... De rest gaat met geluidswagons die geluiden van verschillende locs kunnen produceren.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 6 juni 2018, 20:00:42
Heb inmiddels een stuk of vijf glaskasten en dan is een geluidswagon idd een verstandig idee.  :D
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 2 juli 2018, 11:46:01
Ik heb afgelopen week mijn baan weer eens afgestoft om met geluid eens 'echt' te gaan rijden. En meteen een rijschema opgesteld waarin ik alleen de treinen met geluid (en één met geluidswagon) in bedrijf heb. Het werkt erg aardig, maar hier en daar ben ik de software nog verder aan het verbeteren.

Ondertussen heeft het me ook aan het denken gezet of het allemaal niet kleiner en eenvoudiger kan. Dit is tenslotte allemaal begonnen met deze opmerking van @Pierre :
Ik heb even een vraagje. Kan je hier ook een "tjoek-tjoek" geluidje mee maken die zich aanpast aan de snelheid van een (analoge) trein? Ik ben al een tijdje op zoek naar een betaalbare oplossing hier voor.

Als het om stoomtreinen gaat, is het tenslotte vooral ruis, dat met "puffen" te horen is. Internet gaf wel wat schema's voor ruisgeneratoren, maar die hebben zoveel onderdelen nodig, dat een MP3 speler kleiner is.
Uitendelijk kwam ik uit op ruis genereren met de Arduino (of Digispark) zelf. Gisteravond een beetje zitten pielen met een testopstelling en testprogramma. Daar is dit uit gekomen.



Wat mij betreft goed genoeg om verder uit te gaan werken.

Het schema is in ieder geval eenvoudig:

(http://www.xs4all.nl/~robvd/Forum/SchemaModuleRuis1.jpg)


En ook de testcode voor de Arduino om ruis te puffen valt mee

/*
 * RUISGENERATOR
 * Stoomtrein geluiden met "puffen" van ruis.
 * Testprogramma: langzaam versnellen van het puffen.
 */

#define Ruispin      10
#define Startfreq  2000                           // laagste frequentie ruis
#define Eindfreq   4000                           // hoogste frequentie ruis
#define pauze         0.33                        // factor puf/pauze

unsigned int  puf = 1000;                         // lengte puf-slag (ms)

void maakPuf(unsigned int lengte, unsigned int laag, unsigned int hoog) {
  unsigned int  freq;
  unsigned long mils;
  mils = millis() + (1-pauze) * lengte;
  while (millis() < mils) {
    freq = random (laag, hoog);
    tone (Ruispin,freq);
  }
  noTone(Ruispin);
  delay (lengte * pauze);
}

void setup() {
  pinMode (Ruispin,OUTPUT);
}

void loop() {
  // viercylinder = 4 puf slagen met verschil in eerste en laatste slag
  maakPuf(puf, Startfreq + 100, Eindfreq + 250);
  maakPuf(puf, Startfreq, Eindfreq);
  maakPuf(puf, Startfreq, Eindfreq);
  maakPuf(puf, Startfreq - 50 , Eindfreq - 100);

  if (puf > 120) {
    puf = puf * 0.90;
  }
}


Voor (kleine) stoomlocs gaat het project hier over een andere boeg verder... Ben benieuwd waar we uit komen. Heel misschien is de Glaskasten toch nog haalbaar, @mark mms .
Voor diesels en grotere stomers hou ik het op de MP3 versie.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 6 juli 2018, 00:14:48
Ruisgenerator in BR91

OK, het is nog geen Glaskasten, maar heel veel ruimte heeft deze BR91 ook niet om geluid on te bouwen.

(http://www.xs4all.nl/~robvd/Forum/BR91_01.jpg)


Maar ruimte voor een DigiSpark (bijna een Arduino), een gelijkrichter, een kleine Elco, wat weerstanden, een transistor en een mini luidsprekertje is er wel. En dat betekent dat een geluidsmodule op basis van de ruisgenerator in deze lok mogelijk moet zijn.


Het was even wat pielen. Zo is na het laden van het programma de USB stekker van de Digispark goeddeels afgezaagd. Dan past-ie tegen het dak van de kabine van de BR91. De luidspreker had ik eerst aan de onderkant van de lok tussen de cylinders geplakt, maar daarmee was er geen klankkast werking. Dus uiteindelijk is de luidspreker ook in de kabine gekomen.

Aan de kant van de stoker is naast de motor de gelijkrichter en elco geplaatst.

(http://www.xs4all.nl/~robvd/Forum/BR91_03.jpg)


Aan de kant van de machinist was nog ruimte voor de weerstanden van de spanningsdeler om de rijstroom te meten. De digispark met transistor en speaker komt boven de motor in de kabine.

(http://www.xs4all.nl/~robvd/Forum/BR91_02.jpg)


Ondertussen is de lok weer gemonteerd en de eerste proefritten zijn gedaan. Geluid is op zich heel accceptabel (al zeg ik 't zelf).
Deze opstelling is wel wat gevoelig voor stroomonderbrekingen. De DigiSpark wacht na elke onderbreking 5 seconden met het programma opstarten. In deze tijd 'kijkt'-ie of er een computer is aangesloten om een programma te uploaden.
Nu is dat uploaden niet meer nodig; ik ben nog aan het uitzoeken hoe dat is uit te zetten.... Als de DigiSpark meteen weer opstart, dan is een korte stroomonderbreking geen probleem meer voor de "geluidsbeleving" denk ik  8)

Filmpje, aansluitschema en sketch volgen binnenkort.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 6 juli 2018, 21:03:36
Kijk ... lekker simpel lijkt me. Hier hou ik van. ;D
Mooi werk Rob. Ben benieuwd naar het filmpje (en schema).
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 6 juli 2018, 23:42:51
Hoi Pierre,

Het is inderdaad een eenvoudiger opzet. Hier is het dan.

Een compacte geluidsmodule voor stoomlocs

Eerst maar even het resultaat: de BR91 puffend onderweg met een gemengde en een lokale goederentrein.



Het voordeel van deze compacte geluidsmodule ten opzichte van de MP3 versie:
Daarentegen zijn de geluidseffecten wel beperkt. Er kan alleen met een blokgolf geluid worden gemaakt. Geen volume instellingen. De ruis wordt gemaakt door de frequentie van de blokgolf snel willekeurig te veranderen.
Ook is het geluid minder 'rijk'.

Het aansluitschema:

(http://www.xs4all.nl/~robvd/Forum/SchemaModuleRuis2.jpg)


De voeding en rijstroommeting is hetzelfde opgebouwd als bij de andere geluidsmodules. Alleen hebben de weerstanden van de spanningsdeler een lagere waarde (220 ohm) en heeft de condensator een aanmerkelijk lagere capaciteit (en is dus ook kleiner).
De aansturing van de transistor gaat over een lage weerstand, om ervoor te zorgen dat de transistor helemaal open gaat. De luidspreker is aangesloten op de ingangsspanning. Die is hoger dan de 5V op de DigiSpark en zo is de geluidssterkte wat groter.


Als laatste de code. Het programma'tje is nog niet perfect. Zo zijn de geluidseffecten nog niet goed te starten bij langzaam rijden (wel bij stilstand en snel rijden). Maar het is de versie die in het filmpje is te horen.


  /*
 * RUISGENERATOR STOOMTREIN
 * Stoomtrein geluiden met rijstroom afhankelijk "puffen" van ruis.
 *
 * Eenvoudige extra geluidsfuncties:
 * 1: fluitje (lijkt meer op een telefoon)
 * 2: sissen
 * 3: remmen
 * 4: 4 seconde stilte (vrijloop)
 * Functies werken redlijk bij langzaam rijden en goed bij stilstand en snel rijden
 *
 * versie 0.9.1 - 7 jul 2018
 * toegevoegd:
 *             begrenzing puf tijd (voorkomen negatieve tijdsduur)
 *             rijstroommeting en functie bepalen in de puf-pauze
 */


// --- DEFINITIES ----

// pin definities
#define Ruispin       0                           // pin voor aansturen van speaker
#define rijpin1       1
#define rijpin2       2

//geluidsdefinities
#define Startfreq  1800                           // laagste frequentie ruis
#define Eindfreq   4000                           // hoogste frequentie ruis
#define pauze         0.25                        // factor puf/pauze
#define RemLaag    3200                           // frequentiebereik voor remgeluid
#define RemHoog    3800
#define SisLaag    4000                           // frequentiebereik voor sisgeluid
#define SisHoog    5500

// definities voor de meting van de rijstroom
#define pullup               false     // geeft aan of de interne pullup weerstand gebruikt moet worden
#define maxpulsbreedte       5000      // hoe lang wachten (minimaal 2x periode)
#define pulsbreedtestil        22      // pulsbreedte in % waaronder loc stil staat   

// Frequenties (Periodes) op de rijstroom
#define rijPeriode            2020    // rijstroom puls in us
#define functie_01_Periode    1500    // Periode (freq.) functie 1
#define functie_02_Periode    1250    // Periode (freq.) functie 2
#define functie_03_Periode     990    // Periode (freq.) functie 3
#define functie_04_Periode     790    // Periode (freq.) functie 4
#define functie_05_Periode     590    // Periode (freq.) functie 5 - niet gebruikt
#define functie_06_Periode     490    // Periode (freq.) functie 6 - niet gebruikt
#define pulsruis               100    // maximaal verschil in gemeten Periodes (ruis)
#define minhoog                200    // minimaal "hoog" signaal

// ---- VARIABLEN ----

// puf-geluid variabelen: 4 slagen (is tweezijdige tweecylinder loc)
unsigned int ruisStartFreq[] {Startfreq + 120, Startfreq, Startfreq, Startfreq + 300 };  // hoogste frequentie puf-ruis per slag
unsigned int ruisEindFreq[]  {Eindfreq - 50,   Eindfreq,  Eindfreq,  Eindfreq  - 120 };  // laagste frequentie puf-ruis per slag
int slag = 0;

// rijstroom variabelen
int rijpin[] {rijpin1, rijpin2};
int vooruit = 1;                      // richting: bepaalt welke pin wordt uitgelezen voor de rijstroom puls
double pulsbreedteHoog;
double pulsbreedteLaag;
double pulsPeriode;
int pulsbreedte = 0;                  // pulsbreedte in %
int functie = 0;                      // speciale functie frequentie gemeten

unsigned int  puf;                    // lengte puf-slag (ms)
unsigned long pze;                    // pauze tot aan klok stand(ms)

// --- FUNCTIES ---

// Functie: maak puf geluid (één slag)
// Geeft ruis voor een deel van de opgegeven lengte en stil voor de resterende tijd (factor definitie)
// De ruisfrequentie neemt langzaam af om enigszins de volume afname te simuleren.
// input: lengte van de slag (in ms)
//        laagste frequentie van de ruis
//        hoogste frequentie van de ruis
// output: tijd tot einde pauze van de puf
unsigned long maakPuf(int lengte, unsigned int laag, unsigned int hoog) {
  unsigned int  freq;
  unsigned long mils;
  constrain (lengte,10,1000);                           // beperk de slag tussen 10ms en 1s.
  float factor = 1 - (0.09/lengte);
  mils = millis() + (1-pauze) * lengte;
  while (millis() < mils) {
    freq = random (laag, hoog);
    tone (Ruispin,freq);
    laag = laag*factor;
    hoog = hoog*factor;
  }
  noTone(Ruispin);
  return millis() + (lengte * pauze);                         // pauze tijd tussen de puffen
}

// Functie: Afspelen van ruis.
// Gebruikt voor sissen en remgeluid. Constant ruis-geluid gedurende de opgegeven lengte (in ms).
// input: lengte van de slag (in ms)
//        laagste frequentie van de ruis
//        hoogste frequentie van de ruis
void speelRuis(unsigned int lengte, unsigned int laag, unsigned int hoog) {
  unsigned int  freq;
  unsigned long mils;
  mils = millis() + lengte;
  while (millis() < mils) {
    freq = random (laag, hoog);   
    tone (Ruispin,freq);
  }
  noTone(Ruispin);
}

// Functie: Afspelen van een 'fluitje'
// Afwisselend een hoge en lage frequentie met een kleine frequentie variatie.
// input: lengte (in ms)
void speelFluitje(unsigned int lengte) {
  unsigned int  freq;
  unsigned long mils;

  mils = millis() + lengte;
  while (millis() < mils) {
    tone (Ruispin,random (2100,2120));
    delay (20);
    tone (Ruispin,random (2400,2430));
    delay (18);
  }
  noTone(Ruispin);
}

void meetPuls() {
  // puls meting variabelen: lengte 'hoog', 'laag' en trillingstijd (periode). Alle tijden in us.
  pulsbreedteHoog = pulseIn(rijpin[vooruit], HIGH, maxpulsbreedte);
  pulsbreedteLaag = pulseIn(rijpin[vooruit], LOW, maxpulsbreedte );
  pulsPeriode = pulsbreedteHoog + pulsbreedteLaag;
}

// HERKEN FUNCTIE-FREQUENTIE
// functie voor het checken van functie-frequenties
// op de puls (functietoets).
int getFunctie () {
  int f = 0;
 
  if (abs (pulsPeriode - functie_01_Periode) < pulsruis) { f = 1;}
  if (abs (pulsPeriode - functie_02_Periode) < pulsruis) { f = 2;}
  if (abs (pulsPeriode - functie_03_Periode) < pulsruis) { f = 3;}
  if (abs (pulsPeriode - functie_04_Periode) < pulsruis) { f = 4;}

  return f;
}

void setup() {
  pinMode     (Ruispin,OUTPUT);
 
  pinMode     (rijpin[0],INPUT);
  digitalWrite(rijpin[0],pullup);
  pinMode     (rijpin[1],INPUT);
  digitalWrite(rijpin[1],pullup);
  meetPuls();
  speelRuis (950, SisLaag,SisHoog);               // sissen
}

void loop() {

  vooruit = !vooruit;
  // Pulsbreedte bepalen
  meetPuls();
  pulsbreedte = 100 * pulsbreedteHoog / pulsPeriode;
  functie = getFunctie();
  if (functie) {
    switch (functie) {
      case 1:
        speelFluitje(1800);                          // fluitje afspelen, 1,8 sec.
      break;
 
      case 2:
        speelRuis (3000, SisLaag,SisHoog);           // sissen, 3 sec.
      break;
 
      case 3:
        speelRuis (2600, RemLaag,RemHoog);           // remgeluid 2,6 sec.
      break;

      case 4:
        pze = millis()+ 4000;                         // 4 sec. stilte
      break;
    }

  }
  else {
    // rijgeluid
    // tweecylinder = 4 puf slagen met verschil in eerste en laatste slag
    if (pulsbreedte > pulsbreedtestil && millis() > pze) {            // lok rijdt en niet in puf-pauze of stilte
      puf = map(100 * sqrt (pulsbreedte), 550, 990, 700, 10);
      pze = maakPuf(puf, ruisStartFreq [slag], ruisEindFreq [slag]);
      if (slag < 3) {
        slag++;
      }
      else {
        slag = 0;
      }
    }
  }
}
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 8 juli 2018, 23:08:15
Vandaag wilde ik nog "even" wat verbeterde ruisgenerator software laden en meteen proberen de 5 seconde pauze van de DigiSpark te verwijderen.

Voor beide was het nodig om een en ander op de USB poort van de computer aan te sluiten, maar de USB stekker had ik (bijna helemaal) van de print afgezaagd. Ik had (expres) nog wel een paar stukjes koperbaan laten zitten, en daar kan dan tijdelijk een afgedankte USB kabel aan gesoldeerd worden.

(http://www.xs4all.nl/~robvd/Forum/BR91_04.jpg)


Het programmatje moest ik nog wel een paar keer aanpassen, maar nu werken de extra geluidsfuncties ook vrij goed bij langzaam rijden. Daarnaast nog een 'vrijloop' (4 seconden stilte) als 'geluid'functie 4 toegevoegd. Ook een fout verwijderd: bij snel rijden kon de rekensom voor de puf ook een negatieve tijd opleveren, en dan werd het stil... Nu niet meer.

Voor het verwijderen van die 5 seconden opstartvertraging ben ik verdwaald in oude links, onbegrijpelijke instructies, bestanden die niet meer bestaan en andere waarvan het onduidelijk is hoe je ze moet gebruiken. Ik heb stukjes en beetjes, maar wil dat eerst nog alle brokken bij elkaar zoeken en dat dan eerst maar eens in een proef opstelling proberen.
Want je kunt de boel stuk maken ("brick it", er een dode baksteen van maken)

Ondertussen gaat de BR91 met nieuwe software, en zonder de USB stekker, wederom in dienst gesteld worden...

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 10 juli 2018, 08:26:18
Bij het rijden met de (2e hands) BR91 kwam ik er achter dat deze vooral haperde in de linker bocht... en dan viel het geluid steeds stil...
Het bleek dat stroomafname op de voorste loop-as wegviel als deze opzij moest schuiven om de bocht te maken. Dus asje er af, olieprut verwijdert (deze loc had ik met veel te veel olie overal ontvangen, maar dit deel was nog niet als 'besmeurd' herkent en niet schoongemaakt) en een van de stroomafnemers een tikje verbogen. Nu is het geluid veel stabieler tijdens het rijden.

Soms zit de oplossing in de eenvoudige en voor de hand liggende dingen.

Die 5 seconden opstart-vertraging van de DigiSpark wil ik ook nog steeds oplossen, maar dat is alweer minder nijpend geworden  :D

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 11 juli 2018, 22:58:58
Weer even een update over de geluidsmodule in de BR91 en verdere verkleining van de geluidsmodule,

Ik heb ondertussen een zogenaamd bootloader bestand voor de DigiSpark gevonden, waarmee deze alleen 5 seconden wacht als  pin 0 met de massa is verbonden. Nu werkt dat prima; ik had daar alleen mijn transistor en speaker op gezet en dat is voldoende verbinding met de massa, waardoor deze nog steeds 5 seconden wacht. Dus wat aan de pin-indeling gedaan: rijstroom staat nu op pin 2 en 4, en de speaker op pin 1.

Maar werkt nu prima: geluid start meteen, en wat stroomonderbrekingen leveren alleen wat gesis op. Makkelijk rangeren ook.
Verder nog wat aan de software gesleuteld en wat geluiden voor andere stomers voorbereid.


Om de software te verbeteren in de testoppstelling, had ik wat weerstanden nodig. Dus even bij de lokale electronicawinkel annex legerdump langs geweest (kon meteen even wat spullen voor de vakantie inslaan). Op de fiets er heen bedacht ik me dat ik misschien nog verder kan miniaturiseren door alleen de microprocessor te gebruiken met een kleine spanningsregelaar. dus daar ook maar wat spulletjes voor gekocht.

(http://www.xs4all.nl/~robvd/Forum/DigisSparkATtiny.jpg)


De ATtiny behuizing is wat groter dan die op de DigiSpark, maar zonder de print kom ik toch kleiner uit. Als het goed is, dan is er alleen nog een spanningsregelaar, 1k weerstand en 0,1 uF condensator nodig om de processor te laten draaien.
Ik wil proberen de ATtiny chip van de DigiSpark af te halen en daar dan een IChoudertje op te solderen. De DigiSpark wordt dan gebruikt om de ATtiny's te programmeren.
Tenminste, dat is het plan. De praktijk wil nog wel eens wat weerbarstig zijn  8)

Rob

Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 12 juli 2018, 22:16:52
Goed bezig Rob, ik blijf het volgen.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 12 juli 2018, 22:56:41
Rob jongen ... ik vind het fenomenaal wat je daar allemaal uit je hoge hoed loopt te toveren. :o Ik denk dat ik een beetje aangestoken ben door je laatste projectje met de digispark. Dit is precies wat ik voor ogen had. Als ik er mee aan de gang ga mag ik je dan op het forum om hulp vragen zodat er misschien nog meer mensen baat bij hebben? 
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 12 juli 2018, 23:48:53
Dank Mark, Pierre...

Ik blijf lekker door prutsen, hoor.

... Ik denk dat ik een beetje aangestoken ben door je laatste projectje met de digispark. Dit is precies wat ik voor ogen had. 
Ik wordt gaandeweg ook meegesleept in DigiSpark MP3loze versie, Pierre. Met name voor de boemels is dit de beste oplossing.

Als ik er mee aan de gang ga mag ik je dan op het forum om hulp vragen zodat er misschien nog meer mensen baat bij hebben?

...Tuurlijk, Pierre.
Overigens, als je in een loc de ruimte ervoor hebt, zou ik beginnen met een Arduino Nano i.p.v. een DigiSpark. De tsjoek-tsjoek software werkt op allebei, maar de Arduino is eenvoudiger aan te sluiten en simpeler in de upload van de software.
(Voor de DigiSpark moet je extra drivers op de computer installeren, aanvullende onderdelen voor in het Arduino programmeerprogramma downloaden en installeren, en de upload werkt meestal niet meer als er iets aan pin 3 of 4 is gesoldeerd. Niet onoverkomenlijk, maar wel lastig als je nog bezig bent met de basis in de vingers te krijgen. Arduino is, en blijft, meer plug-and-play)

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 13 juli 2018, 09:10:36
Dank je Rob. Ik zal eens een nieuw draadje opstarten over mijn Arduino ervaringen. Eens kijken waar dat op uit draaid  8);D

Maar eerst moet ik nog een rijtje huisjes afmaken.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: SuperSylvester op 13 juli 2018, 14:13:02
Heel acceptabel Rob dat geluid en dat voor die paar euro  8)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 14 juli 2018, 21:55:31
Dank je, Jack.

Geluid vanuit een lok is toch beter dan een wagon er achter. Mijn favoriete boemel-lokje is de BR70 uit Rijswijk begin dit jaar. Rijdt betrouwbaar en soepel, ook bij lage snelheid. Dus daar wil ik toch ook graag geluid in maken.

Ondertussen heb ik de ATtiny processor van de DigiSpark afgesoldeerd, nadat ik eerst het programma'tje voor de BR70 er op had geladen. Met zo'n kleine ATtiny, past het misschien wel in de BR70.
Ik denk dat (v.l.n.r. op de foto hieronder) de Elco, transistor, gelijkrichter, ATtiny, ontkoppelcondensator (ik weet niet wat dat is, maar blijkbaar hoort die er bij) en spanningsregelaar in de rechter watertank past als ik iets van het lood weg haal.

(http://www.xs4all.nl/~robvd/Forum/BR70_01.jpg)


Na wat puzzelen alle onderdelen op een stukje karton gelijmd dat net zo breed en lang is als de watertank. Alle pootjes zo gebogen dat een en ander gesoldeerd kan worden. Nadat lijm droog was alles gesoldeerd en even spanning erop gezet: zowaar kwam het gesis van het starten van de geluidsmodule uit het speakertje.

Dus dit is de kleinste geluidsmodule tot nu toe:

(http://www.xs4all.nl/~robvd/Forum/BR70_02.jpg)


Alleen de 4 weerstanden (spanningsdelers) van de rijstroom moet ik nog maken (en ruimte voor vinden).
Eerst even meten hoeveel er van het blok lood af moet.

(http://www.xs4all.nl/~robvd/Forum/BR70_03.jpg)


Dus de haakse slijper er weer eens bij gepakt om een stuk van het balastblok weg te halen.

(http://www.xs4all.nl/~robvd/Forum/BR70_04.jpg)


Geluidsmodule even passen...

(http://www.xs4all.nl/~robvd/Forum/BR70_05.jpg)


Op zich is er nog wat ruimte in de watertanks van de kap om wat bladlood bij te plakken, maar eerst kijken wat het effect is van het lagere gewicht. Een proefritje helling op.

(http://www.xs4all.nl/~robvd/Forum/BR70_06.jpg)


Er is geen merkbaar verlies van trekkracht en ook de stroomopname is nog prima. Dus dat kan verder zo blijven.

Nu verder het loden blok en de module goed isoleren en dan verder met de inbouw. Het kale lood van het balastblok zet ik dik in de verf (in een weinig gebruikte oranje kleur, je ziet er tenslotte niets meer van straks).
Als dat allemaal een beetje droog is, kan de module worden ingebouwd. De speaker, daar moet ik nog een plekje voor verzinnen...

Tot zover weer even.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 14 juli 2018, 22:33:47
Je blijft me verbazen met je bouwwerken Rob. Ik ben woest aan het schilderen en popel om de soldeerbout te pakken. Ik moet me beheersen. ;D
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 15 juli 2018, 21:38:34
Dank je Pierre.
Ik moet zeggen: ik had zelf ook nooit gedacht dat die BR70 nog geluid zou krijgen.

...Ik ben woest aan het schilderen en popel om de soldeerbout te pakken. Ik moet me beheersen. ;D
...En dan moet je straks van de meester eerst met breadboard en jumper kabeltjes aan de slag voor je mag solderen  ;)

Ondertussen had ik vanmorgen voor de koffie de spanningsdelers voor de rijstroom sensoren naast de motor gesoldeerd en ook de geluidsmodule al op de rijstroom aangesloten. Spannend moment....

(http://www.xs4all.nl/~robvd/Forum/BR70_07.jpg)


Even proberen: achteruit een sis en daarna mooi puf-puf. Vooruit gaf de lok geen sjoege (of eigenlijk: geen tsjoeke).

Dus later vandaag 'eventjes' aan probleemzoeken gedaan, en daarvoor moest uiteindelijk de zorgvuldig in elkaar gepuzzelde module wat uit elkaar getrokken worden. Ik had de draadjes voor de rijstroomsensoren netjes weggewerkt maar kon zo niet volgen welke van de twee het niet deed.

(http://www.xs4all.nl/~robvd/Forum/BR70_08.jpg)


En de kleine ATtinyvan de DigiSpark is wel erg klein. Ik kon vooral niet zien of de draden goed verbonden waren of niet. (een tafel-loep staat nu op het verlanglijstje!). En zo gaandeweg viel steeds meer uit: de motor, de rest van het geluid...
Dus ik was hier vooral zelf aan het puffen en stoom afblazen.

Uiteindelijk bleek het meest bereikbare draadje niet goed vast te zitten (ik was ervan uit gegaan dat het probleem waarschijnlijk op een van de moeilijst te bereiken/solderen plekken zou zitten).

Daarna alles weer getest en toen de boel weer netjes in elkaar gepuzzeld en ingepakt.

(http://www.xs4all.nl/~robvd/Forum/BR70_09.jpg)


En dan het speakertje. Die komt aan de kant van de stoker. Hier ligt-ie nog los.

(http://www.xs4all.nl/~robvd/Forum/BR70_10.jpg)


De speaker komt nog hoger en verder naar voren. De achterkant van de motor steekt in de kolenvoorraad en die is smaller dan de kabine.

(http://www.xs4all.nl/~robvd/Forum/BR70_11.jpg)


Voorlopig even zo. Er is geluid te horen, maar het mag nog wel wat luider. Ik denk dat ik het raampje van de deur nog verder open moet doen.

Maar al met al: de BR70 met geluid: het werkt! En daar ben ik aardig mee in mijn sis, eh sas.

Rob


Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 15 juli 2018, 22:00:08
Wauuw Rob ... dat heb je knap in elkaar gepuzzeld. Pfff wat een gefriemel zeg. Ik hoop ook ooit eens zo ver te komen. ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 16 juli 2018, 11:35:01
Kleine stapjes, Pierre. Kleine stapjes... En ja: het is inderdaad een gefriemel.

Ondertussen is in de BR70 het raam bij de stoker open gezet en met een tandenstoker op de rand van de het luidsprekertje wordt het geluid enigszins naar het raam geleid. Misschien dat ik er ooit nog eens een echte boombox van maak, maar voorlopig vind ik 'm zo wel luid genoeg.

Dan hierbij nog de technische details: de code en de aansluitschema's.

In de loks maak ik iets verschillende geluiden, door wat te variëren in de 4-slags puf geluiden. Door elke slag een iets andere ruis-frequente te geven, ontstaat er een 4-kwarts ritme. Ik heb er nu drie gedefinieerd. Elk ritme kan afzonderlijk "aan" worden gezet, afhankelijk voor welke lok er gecompileerd wordt.
Daarnaast heeft elke lok zijn eigen rij-eigenschappen: spanning of pulsbreedte waarop de lok wegrijdt of stopt, de spanning voor een acceptabele topsnelheid, en de langst en kortste slagen die daarbij horen. Deze zijn ook te definiëren bovenin het programma'tje.

Goed, hier is de code zoals gebruikt voor de BR70 en BR91 (De BR57 definitie is al gemaakt, maar ik ben nog op zoek naar ruimte in de loc).


  /*
 * RUISGENERATOR STOOMTREIN
 * Stoomtrein geluiden met rijstroom afhankelijk "puffen" van ruis. Voor analoog rijden met geluid.
 * Rijstroom met pulsbreedtebesturing is nodig: de pulsbreedte wordt omgerekend naar puf-snelheid.
 *
 * Eenvoudige extra geluidsfuncties:
 * 1: fluitje (lijkt meer op een telefoon)
 * 2: sissen
 * 3: remmen
 * 4: stilte (vrijloop)
 * Functies werken redelijk bij langzaam rijden en goed bij stilstand en snel rijden
 *
 * versie 1.0 - 16 jul 2018
 */


// --- DEFINITIES ----

// kies de loc om te compileren: zet precies één definitie op 'true'
#define BR57 false
#define BR70 true
#define BR91 false

// pin definities
#define Ruispin       1                // pin voor aansturen van speaker: pin 1 of 0 (0 = 5 sec. vertraging)
#define rijpin1       2                // rijstroom meting
#define rijpin2       4                // rijstroom meting

//geluidsdefinities per type loc

#if BR57
  // definities voor slagen BR57. ("paa tsjie paa tsjoe...")
  #define Startfreq1  1400             // laagste frequentie ruis slag 1
  #define Eindfreq1   3400             // hoogste frequentie ruis slag 1
  #define Startfreq2  2100             // laagste frequentie ruis slag 2
  #define Eindfreq2   4800             // hoogste frequentie ruis slag 2
  #define Startfreq3  1400             // laagste frequentie ruis slag 3
  #define Eindfreq3   3400             // hoogste frequentie ruis slag 3 
  #define Startfreq4  1200             // laagste frequentie ruis slag 4
  #define Eindfreq4   3000             // hoogste frequentie ruis slag 4
  // berekening snelheid
  #define pulsbreedtestil   26         // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax    80         // pulsbreedte waar de maximum snelheid (pufritme) wordt bereikt 
  #define langstePuf       440         // langste puf (in ms) - langzaam rijden
  #define kortstePuf        60         // kortste puf (in ms) - topsnelheid (minimum ligt rond 50ms)
  // opstart geluid
  #define BeginSis        1150         // lengte van het sisgeluid bij starten (en korte stroomonderbrekingen)
#endif

#if BR70
  // definities voor slagen BR70 ("tsjoe, tsjie, tsjoe, tsjie")
  #define Startfreq1  1700             // laagste frequentie ruis slag 1
  #define Eindfreq1   3900             // hoogste frequentie ruis slag 1
  #define Startfreq2  2000             // laagste frequentie ruis slag 2
  #define Eindfreq2   4100             // hoogste frequentie ruis slag 2
  #define Startfreq3  1720             // laagste frequentie ruis slag 3
  #define Eindfreq3   3930             // hoogste frequentie ruis slag 3 
  #define Startfreq4  1980             // laagste frequentie ruis slag 4
  #define Eindfreq4   4050             // hoogste frequentie ruis slag 4
  // berekening snelheid
  #define pulsbreedtestil   28         // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax    65         // pulsbreedte waar de maximum snelheid (pufritme) wordt bereikt 
  #define langstePuf       375         // langste puf (in ms) - langzaam rijden
  #define kortstePuf        50         // kortste puf (in ms) - topsnelheid (minimum ligt rond 50ms)
  // opstart geluid
  #define BeginSis        1150         // lengte van het sisgeluid bij starten (en korte stroomonderbrekingen)
#endif

#if BR91
  // definities voor slagen BR91: 1e wat hoger, laatste wat lager dan de 2 middelste slagen ("tsjie, tsja, tsja, tsjoe")
  #define Startfreq1  1950             // laagste frequentie ruis slag 1
  #define Eindfreq1   4350             // hoogste frequentie ruis slag 1
  #define Startfreq2  1800             // laagste frequentie ruis slag 2
  #define Eindfreq2   4000             // hoogste frequentie ruis slag 2
  #define Startfreq3  1800             // laagste frequentie ruis slag 3
  #define Eindfreq3   4000             // hoogste frequentie ruis slag 3 
  #define Startfreq4  1750             // laagste frequentie ruis slag 4
  #define Eindfreq4   3900             // hoogste frequentie ruis slag 4
  // berekening snelheid
  #define pulsbreedtestil   26         // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax    84         // pulsbreedte waar de maximum snelheid (pufritme) wordt bereikt 
  #define langstePuf       800         // langste puf (in ms) - langzaam rijden
  #define kortstePuf        71         // kortste puf (in ms) - topsnelheid (minimum ligt rond 50ms)
  // opstart geluid
  #define BeginSis        1750         // lengte van het sisgeluid bij starten (en korte stroomonderbrekingen)
#endif

// algemene geluidsdefinities
#define pauze         0.25             // factor puf/pauze (elke slag heeft voor een deel stilte)
#define RemLaag    3200                // frequentiebereik voor remgeluid
#define RemHoog    3800
#define SisLaag    4000                // frequentiebereik voor sisgeluid
#define SisHoog    5500

// definities voor de meting van de rijstroom
#define pullup               false     // geeft aan of de interne pullup weerstand gebruikt moet worden
#define maxpulsperiode       5000      // hoe lang wachten (minimaal 2x periode rijstroom PWM)

// Frequenties (Periodes) op de rijstroom
#define rijPeriode            2020     // rijstroom puls in us
#define functie_01_Periode    1500     // Periode (freq.) functie 1
#define functie_02_Periode    1250     // Periode (freq.) functie 2
#define functie_03_Periode     990     // Periode (freq.) functie 3
#define functie_04_Periode     790     // Periode (freq.) functie 4
#define functie_05_Periode     590     // Periode (freq.) functie 5 - niet gebruikt
#define functie_06_Periode     490     // Periode (freq.) functie 6 - niet gebruikt
#define pulsruis               100     // maximaal verschil in gemeten Periodes (ruis)
#define minhoog                200     // minimaal "hoog" signaal

// --- CONSTANTES ---

const float sqrtpbstil = 100*sqrt(pulsbreedtestil);
const float sqrtpbmax  = 100*sqrt(pulsbreedtemax);


// ---- VARIABLEN ----

// puf-geluid variabelen: 4 slagen (is tweezijdige tweecylinder loc)
unsigned int ruisStartFreq[] {Startfreq1, Startfreq2, Startfreq3, Startfreq4};  // hoogste frequentie puf-ruis per slag
unsigned int ruisEindFreq[]  {Eindfreq1,  Eindfreq2,  Eindfreq3,  Eindfreq4 };  // laagste frequentie puf-ruis per slag
int slag = 0;

// rijstroom variabelen
int rijpin[] {rijpin1, rijpin2};
int vooruit = 1;                      // richting: bepaalt welke pin wordt uitgelezen voor de rijstroom puls
double pulsbreedteHoog;
double pulsbreedteLaag;
double pulsPeriode;
float pulsbreedte = 0;                // pulsbreedte in %
int functie = 0;                      // speciale functie frequentie gemeten

unsigned int  puf;                    // lengte puf-slag (ms)
unsigned long pze;                    // pauze tot aan klok stand(ms)


// --- FUNCTIES ---

// Functie: maak puf geluid (één slag)
// Geeft ruis voor een deel van de opgegeven lengte en stil voor de resterende tijd (factor definitie)
// De ruisfrequentie neemt langzaam af om enigszins de volume afname te simuleren.
// input: lengte van de slag (in ms)
//        laagste frequentie van de ruis
//        hoogste frequentie van de ruis
// output: tijd tot einde pauze van de puf
unsigned long maakPuf(int lengte, unsigned int laag, unsigned int hoog) {
  unsigned int  freq;
  unsigned long mils;
  float factor = 1 - (0.09/lengte);
  mils = millis() + (1-pauze) * lengte;
  while (millis() < mils) {
    freq = random (laag, hoog);
    tone (Ruispin,freq);
    laag = laag*factor;
    hoog = hoog*factor;
  }
  noTone(Ruispin);
  return millis() + (lengte * pauze);                         // pauze tijd tussen de puffen
}

// Functie: Afspelen van ruis.
// Gebruikt voor sissen en remgeluid. Constant ruis-geluid gedurende de opgegeven lengte (in ms).
// input: lengte van de slag (in ms)
//        laagste frequentie van de ruis
//        hoogste frequentie van de ruis
void speelRuis(unsigned int lengte, unsigned int laag, unsigned int hoog) {
  unsigned int  freq;
  unsigned long mils;
  mils = millis() + lengte;
  while (millis() < mils) {
    freq = random (laag, hoog);   
    tone (Ruispin,freq);
  }
  noTone(Ruispin);
}

// Functie: Afspelen van een 'fluitje'
// Afwisselend een hoge en lage frequentie met een kleine frequentie variatie.
// input: lengte (in ms)
void speelFluitje(unsigned int lengte) {
  unsigned int  freq;
  unsigned long mils;

  mils = millis() + lengte;
  while (millis() < mils) {
    tone (Ruispin,random (2100,2120));
    delay (20);
    tone (Ruispin,random (2400,2430));
    delay (18);
  }
  noTone(Ruispin);
}

void meetPuls() {
  // puls meting variabelen: lengte 'hoog', 'laag' en trillingstijd (periode). Alle tijden in us.
  pulsbreedteHoog = pulseIn(rijpin[vooruit], HIGH, maxpulsperiode);
  pulsbreedteLaag = pulseIn(rijpin[vooruit], LOW, maxpulsperiode );
  pulsPeriode = pulsbreedteHoog + pulsbreedteLaag;
}

// HERKEN FUNCTIE-FREQUENTIE
// functie voor het checken van functie-frequenties
// op de puls (functietoets).
int getFunctie () {
  int f = 0;
 
  if (abs (pulsPeriode - functie_01_Periode) < pulsruis) { f = 1;}
  if (abs (pulsPeriode - functie_02_Periode) < pulsruis) { f = 2;}
  if (abs (pulsPeriode - functie_03_Periode) < pulsruis) { f = 3;}
  if (abs (pulsPeriode - functie_04_Periode) < pulsruis) { f = 4;}

  return f;
}

void setup() {
  pinMode     (Ruispin,OUTPUT);
 
  pinMode     (rijpin[0],INPUT);
  digitalWrite(rijpin[0],pullup);
  pinMode     (rijpin[1],INPUT);
  digitalWrite(rijpin[1],pullup);
  speelRuis (BeginSis, SisLaag,SisHoog);               // sissen bij opstarten
}

void loop() {
  // Pulsbreedte bepalen
  vooruit = !vooruit;                             // wissel de pin waarop de rijstroom wordt gemeten
  meetPuls(); 
  pulsbreedte = 100 * pulsbreedteHoog / pulsPeriode;
  functie = getFunctie();
 
  // speciale geluidsfunctie gevonden
  if (functie) {
    // als speciale functie is gevonden, controleer de functie frequentie nogmaals.
    // Hiermee wordt onterecht meten voorkomen (door bijvoorbeeld storing op de stroomopname).
    meetPuls();
    if (functie == getFunctie()) {                     // nog steeds dezelfde funtie op de rijstrrom
      switch (functie) {                               // speel functie 1, 2, 3 of 4.
        case 1:
          speelFluitje(1800);                          // fluitje afspelen, 1,8 sec.
        break;
        case 2:
          speelRuis (3000, SisLaag,SisHoog);           // sissen, 3 sec.
        break;
         case 3:
          speelRuis (3600, RemLaag,RemHoog);           // remgeluid 3,6 sec.
        break;
         case 4:
          pze = millis()+ 4500;                        // 4,5 sec. stilte = vrijloop
        break;
      }
    }
  }
  else {                                               // geen speciale functie, dan rij-geluid
    // rijgeluid
    // tweecylinder = 4 puf slagen met verschil in de slagen (volgens definities van de loc)
    if (pulsbreedte > pulsbreedtestil && millis() > pze) {                   // lok rijdt en er is nu geen puf-pauze of vrijloop
      // puf slag berekenen
      if (pulsbreedte > pulsbreedtemax) {
        pulsbreedte = pulsbreedtemax;
      }
      puf = map(100 * sqrt (pulsbreedte), sqrtpbstil, sqrtpbmax, langstePuf, kortstePuf);  // reken pulssbreedte % om naar puf-tijd
      pze = maakPuf(puf, ruisStartFreq [slag], ruisEindFreq [slag]);         // maak puf-ruis. Functie geeft resterende pauze-tijd terug
      // volgende puf-slag (volgnummer 0-3)
      if (slag < 3) {
        slag++;
      }
      else {
        slag = 0;
      }
    }
  }                                                     // einde functie spelen / rijgeluid
}                                                       // einde hoofd-lus


En dan de aansluitschema's voor de DigiSpark en ATtiny.

Van de DigiSpark zijn alleen andere pinnen in gebruik genomen dan eerder, zodat er niet meer 5 seconden gewacht wordt tijden het opstarten.

(http://www.xs4all.nl/~robvd/Forum/SchemaModuleRuis3.jpg)


En dan de versie waar alleen de ATtiny wordt gebruikt. Hier is alleen een spanningsregelaar en ontkoppelcondensator nodig om de ATtiny van een stabiele 5V te voorzien. De gebruikte regelaar, 78L05 kan 100 mA leveren, en dat is ruim voldoende omdat de speaker de stroom krijgt van de gelijkgerichte rijstroom en niet van de 5V.

(http://www.xs4all.nl/~robvd/Forum/SchemaModuleRuis4.jpg)


In de ATtiny versie is de DigiSpark geprogrammeerd en daarna is de chip van de DigiSpark losgesoldeerd. Volgende stap is een ICvoetje op de DigiSpark maken, zodat ik eenvoudig andere ATtiny's kan programmeren.

Maar daarover later meer...

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 16 juli 2018, 15:50:45
Rob ik vind het geweldig om te zien.

Wel even een vraag, dit kan alleen met pulsbreedte besturing?
Dus niet met een regel trafo van 1,2 t/m 16 volt?

Kom ik in de problemen met een constante treinverlichting m.b.v. iets in de trend van hoogfrequente wisselstroom (of zoiets)?
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 16 juli 2018, 19:50:16
Hoi Mark,

Dank je. Het geheel hier is opgebouwd rondom pulsbreedte besturing. Om 2 redenen:
1. Met pulsbreedtebesturing kun je vanaf lage rijsnelheden (en bij stilstand, als de aanloopweerstand de trein nog stil houdt) al meteen voldoende spanning opwekken voor de elektronica. Dat gaat niet met de gewone trafo. Dan moet je op 6V of meer zitten en dan rijden de meeste treinen al flink door.
2. De breedte van de puls bepaalt de rijsnelheid voor de geluidsmodule. Er is vast ook wel iets te verzinnen met de het meten van de spanning, maar dat was niet mijn uitgangspunt. Bovendien werkt dat dan pas bij hogere snelheid (zie punt 1).

Ik weet niet wat de hoogfrequente treinverlichting doet. Ik stel me voor dat die wel kan interfereren met het meten van de pulsbreedte. Maar dat is dan wel weer op te lossen met een hoogfrequent filter, denk ik. Maar dat gaat een beetje buiten mijn kennis en ervaringsgebied. Ik heb wat basiskennis elektronica, maar ik kan er niets aan rekenen. Ik ben, zeg maar, empirisch autodidact (= gewoon zelf wat aanklooien tot het werkt).

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Dirk T op 17 juli 2018, 08:46:42

Je bent leuk bezig vind ik!

... (een tafel-loep staat nu op het verlanglijstje!).

Dat kan. Nadeel van een dergelijke loep (ik heb er een) vind ik dat je met beide ogen door dezelfde lens kijkt, en dat maakt het voor mij moeilijk om diepte te zien. Inmiddels gebruik ik een andere oplossing: een leesbril van de Action, van wel 90 eurocent.

Wat betreft rekenen aan elektronica: het is niet zo belangrijk maar die 220 ohm weerstanden in de spanningsdeler om de PWM aan te passen voor de ATTiny, dat zal wel goed gaan, maar als ik zo kijk kun je in plaats van 220 ohm minstens net zo goed 1k gebruiken. Scheelt weer wat mA in het gebruik.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 17 juli 2018, 09:44:01
Dank je Dirk.

Ik gebruik ook al een leesbril, die van mij is van de Big Bazar, maar dat is niet meer voldoende. En terwijl ik dit schrijf bedenk ik me dat ik natuurlijk van +1 ook naar +2 of meer kan gaan voor dit gepriegel! Dank, ga ik eens proberen.

Wat betreft rekenen aan elektronica: het is niet zo belangrijk maar die 220 ohm weerstanden in de spanningsdeler om de PWM aan te passen voor de ATTiny, dat zal wel goed gaan, maar als ik zo kijk kun je in plaats van 220 ohm minstens net zo goed 1k gebruiken. Scheelt weer wat mA in het gebruik.

Goed punt, Dirk.

Die mA's hebben wel even door mijn hoofd gespeeld. Die 220 ohm is vooral bedacht om de extra diodes en weerstanden op de DigiSpark pinnen te kunnen overrulen. En 220 ohm heb ik gebruikt omdat ik deze in de eerste opzet had liggen (de eerst volgende in de voorraad was 10k). Misschien wat overdadig, maar het werkt. Ik heb inderdaad overwogen om grotere weerstanden te gebruiken bij de ATtiny, maar ik wilde uitsluiten dat door deze verandering e.e.a. niet zou werken (teveel gelijktijdig veranderen maakt het fout zoeken moeilijker). Maar nu het draait, zou ik dat inderdaad nog anders kunnen maken. De weerstanden zitten immers gewoon langs de motor en zijn vrij eenvoudig te vervangen. En ondertussen is de voorraad weerstanden weer aangevuld met 470 en 1k.
(maar mezelf kennende, zal het in de BR70 wel zo blijven zitten... Maar ik ben nog niet klaar met de ontwikkeling in andere locs)

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Dirk T op 17 juli 2018, 10:16:26
Misschien wat overdadig, maar het werkt.

En uiteindelijk is dat waar het om gaat, toch?
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 29 juli 2018, 21:58:11
Ondertussen tuffen de BR70 en BR91 lekker rond op de baan. Met name voor rangeren en boemelen is deze ruisgenerator geluidsmodule ideaal. Bij langere en constante ritten wordt het geluid wat eentonig, tenzij er wat met de snelheidsregelaar wordt gedaan (iets gas terug nemen de helling op bijvoorbeeld)….

Verder heb ik gebprobeerd een IC voetje te solderen op de DigiSpark waar de ATtiny vanaf was gehaald, maar dat is niet gelukt. Ondertussen zijn de print banen kaduuk. Niet getreurd. Misschien dat ik nog eens een DigiSpark in elkaar zet op een experimenteer bordje, zodat ik daarmee de losse ATtiny's kan programmeren (als dat lukt).
Maar er zijn weer wat DigiSparks uit China gearriveerd, dus ik kan weer verder.

Nu dacht ik dat er in de BR57, toch een vrij grote loc, wel wat ruimte zou zijn om een geluidsmodule in te bouwen.

(http://www.xs4all.nl/~robvd/Forum/BR57_01.jpg)


Maar dat viel tegen. Het was even puzzelen hoe de kabine van de ketel af ging, maar het blok lood krijg ik er niet uit zonder echt iets stuk te maken....

Dus dan maar naar de BR64. Die heeft wel wat ruimte onder het blok lood.

(http://www.xs4all.nl/~robvd/Forum/BR64_01.jpg)


Bij de bestelling van tante Ali heb ik 2 soorten DigiSparks besteld. De "dikke" met USB op de print en een "dunne" met micro USB aansluiting. De eerste kan 500 mA leveren, de 2e slechts 100 mA. Nu is 100 mA onvoldoende om de MP3 speler van stroom te voorzien, maar het is ruim genoeg voor de ruisgenerator versie van de geluidsgenerator. Eens kijken of ik die in de BR64 kan proppen...

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 30 juli 2018, 17:49:08
Vandaag de geluidsmodule voor de BR64 in elkaar geprutst.

Allereerst de hoekjes van de bevestigings-gaten weggehaald en een papiertje voor de elektrische isolatie op de digiSpark geplakt. Daarop de gelijkrichter, Elco en spanningsdelers voor de rijstroommeting gemaakt. Ook de rijstroom draden zitten al aan de gelijkrichter

(http://www.xs4all.nl/~robvd/Forum/BR64_02.jpg)


Vervolgens de transistor er op en dan kan een en ander op zijn plek worden gezet en de aansluitingen worden gemaakt. De speaker zit  rechtsonder naast de motor op de luchtdruktank geplakt. Tussen het frame en de luchtdruktank is ruimte waar het geluid weg kan.

(http://www.xs4all.nl/~robvd/Forum/BR64_03.jpg)


Van het loden blok hoeft aleen een randje bovenop weg te worden gehaald, zodat de bovenkant naast de DigiSpark past. Verder een klein hoekje rechtsachter weggevijld om de draden wat ruimte te geven.

(http://www.xs4all.nl/~robvd/Forum/BR64_04.jpg)


Kap er op en rijden maar...

Tijd voor een filmpje van de 3 locs met ruisgenerator. Komt binnenkort.


Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 31 juli 2018, 21:41:06
Tijd voor een filmpje... Een officieel project bericht met ritten achter de BR91, BR64 en BR70.



Dit zijn allemaal locs met ruisgenerator...

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 31 juli 2018, 21:55:08
Wauw Rob .... goed man! ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 31 juli 2018, 22:07:59
Dank!
en... Nog even, Pierre. Jij bent ook al aardig op weg.
Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 31 juli 2018, 22:40:12
Rob, geweldig gedaan!

Volgens mij kun je dit zo in de markt zetten.
Leuke bijverdienste.
Zeker weten dat er veel mensen in geïnteresseerd zijn.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: GéJé op 1 augustus 2018, 20:16:08
@Rob,

Allereerst een groot compliment voor dit project. Ik bewonder het echt dat mensen dit kunnen bedenken en er vervolgens veel tijd in steken om het te realiseren.
Aanvankelijk was ik, als analoog rijder met een voorliefde voor stoomtreinen, bijzonder geïnteresseerd.  Gaandeweg ben ik echter een beetje afgehaakt. Pulsbreedte, Arduino, programmeertaal,  :-\  Het gaat mij een beetje boven mijn pet. Ik geef toe, dat ligt volledig aan mij en zeker niet aan jou uitvoerige uitleg. Ik bewonder het dan ook dat @Pierre zich inmiddels ook in de zaak aan het verdiepen is. Ik vind het echter allemaal te veel gedoe om geluid uit mijn treinen te krijgen.
Na dit filmpje komt daar nog een punt bij. Ik vind het ruisgeluid uit de DigiSpark veel minder mooi dan de opgenomen tsjoek-tsjoek geluiden uit de mp3 speler waar dit project aanvankelijk mee begon.


Met vriendelijke groet,

Gert-Jan
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 1 augustus 2018, 22:18:21
Mark, Gert-Jan,

Dank voor de complimenten. Het is iderdaad, zoals Gert-Jan aangeeft nogal een gedoe, en daarom niet voor iedereen geschikt.
Ik vind het leuk om te experimenteren en uit te vinden, en dan is het 'gedoe' juist een prima invulling van de hobby. Het is zeker leuk als het voorbeeld gevolgd wordt (zoals Pierre doet), maar het is niet mijn passie om steeds weer hetzelfde te maken. Dus 'in de markt zetten' ga ik zeker niet doen.

Overigens vind ik de MP3 geluiden ook mooier dan die van de ruisgenerator. Maar de MP3 versie is aanmerkelijk groter, wat prijziger en wat bewerkelijker om de goede geluiden te vinden en maken. Ook in bedrijf (rijden) is deze iets lastiger vanwege een opstarttijd van de MP3 speler van een seconde en enige gevoeligheid voor haperingen in de stroomopname (valt soms stil). De kleine ruisgenerator start meteen, herpakt eigenlijk altijd na een stroomonderbreking, maar geeft wat meer kunstmatig geluid. Dus wat mij betreft vullen de beide oplossingen elkaar aan: de MP3 voor grote stomers en diesels en de ruisgenerator voor stomende boemels en rangeerlocs...

Andersom is het ook zo: als er eenmaal geluid in een van de locs zit, is het niet meer zo leuk om met een geluidloze loc te rijden  ::)  Geluid in de loc went snel: je mist het niet todat je het hebt...
Dus toen ik eenmaal was begonnen, moest ik wel door  ;D
U zijt gewaarschuwd...

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: GéJé op 1 augustus 2018, 22:34:28
Andersom is het ook zo: als er eenmaal geluid in een van de locs zit, is het niet meer zo leuk om met een geluidloze loc te rijden  ::)  Geluid in de loc went snel: je mist het niet todat je het hebt...
Dus toen ik eenmaal was begonnen, moest ik wel door  ;D
U zijt gewaarschuwd...

Dat kan ik me heel goed voorstellen.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 2 augustus 2018, 19:21:45
Opnieuw de BR78

De BR78 is een vreemde eend in de bijt van geluidsmodules. Ik heb nu zo'n 4 Arduino's met MP3 speler en 3 DigiSpark ruisgeneratoren ingebouwd. De BR78 is de enige DigiSpark met MP3 speler.

Die configuratie heeft me eerder al de nodige hoofdbrekens gekost om aan de praat te krijgen. Na enkele test leek alles goed te werken, maar in het dagelijks gebruik doet deze iets speciaals: na een half minuutje rijden gaat het geluid nog wel mee als de loc sneller gaat, maar het geluid wordt niet langzamer als de snelheidsregelaar wordt teruggedraaid. Alleen weer als de snelheid iets toeneemt, schakelt het geluid meestal weer terug.

Nu waren de spanningsdelers voor de rijstroommeting nog niet standaard, dus ik hoopte dat met nieuwe weerstanden te kunnen oplossen. Helaas, het werkt nu zelfs iets minder goed dan voorheen  :'(
En, eerlijk gezegd, geen geluid is beter dan het verkeerde geluid. Ik vind het nogal een domper als de loc langzaam het station in rijdt met het geluid van een op volle snelheid voorbij denderende stoomloc.

Dus terug naar de ontwerptafel....

(http://www.xs4all.nl/~robvd/Forum/BR78-07.jpg)


Nu heb ik twee mogelijkheden:
(en een derde: geen geluid is geen optie)

Onder het motto
Doe het één, zonder het andere te laten
denk ik dat ik de ruisgenerator ga inbouwen, en dan op mijn gemak 's kijken of ik die DigiSpark met MP3 betrouwbaar aan de praat kan krijgen.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 2 augustus 2018, 21:26:49
Even een dompertje Rob. Ik denk dat ik ook voor jou optie zou gaan. :)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 16 augustus 2018, 23:11:58
Nog wat zitten prutsen en veel gedaan, maar weinig in het zicht (of eigenlijk gehoor) gebracht.
Het blijven 'hangen' van de snelheid in de BR78 heb ik uiteindelijk in de software kunnen oplossen. Dat was een forse reorganisatie van het programma'tje. Ook de andere geluidsmodules et MP3 speler zijn nu van de nieuwe software voorzien.
Ook heb ik wat tijd besteed om de extra functies in alle locs hetzelfde te maken: het was gewoonweg onhandig om bij het rijden steeds weer te moeten bedenken wat de knoppen deden.
Nu is functie 1 fluit of hoorn, toets 2 de bel of korte hoorn, toets 3 de rem en toets 4 stoom afblazen of motor uit.
Alleen toets 5 en 6 hebben per loc een eigen geluids- of lichtfunctie.

Bij het opnieuw inbouwen van de geluidsmodule in de BR78 ging van alles mis: te vaak los- en vastgesoldeerd, waardoor de verbindingen niet meer betrouwbaar waren en uiteindelijk printbanen los gingen. Nieuwe DigiSpark er op, maar daardoor paste een en ander niet meer (kap ging niet meer dicht). Zoveel met die kap zitten rommelen dat op enig moment een sutkje van de besturing (waterpomp) afbrak.
Toen vond ik het (voorlopig) even genoeg en heb ik de ruisgenerator versie weer ingebouwd.

Nou ja, misschien zet ik die DigiSpark/MP3 speler er nog eens in.

Dus toen maar eens verder met de BR38. Deze heeft geen ruimte voor een MP3 speler, maar wel ruimte voor een DigiSpark met ruisgenerator. Deze moest als het ware om de bevestigingsschroef van de kap heen worden gesoldeerd. Voorin is onderaan in de ketel een gat gemaakt voor het speakertje.

(http://www.xs4all.nl/~robvd/Forum/BR38_01.jpg)


In deze opstelling is het geluid (veel te) luid - dat is overigens een luxe probleem. Dat kan ik nog wel oplossen door de de weerstand op de basis van de transistor wat te vergroten, waardoor de ruis minder versterkt wordt.
Dan moet de kap er nog even af. Kan ik meteen de machinist en stoker er weer in zetten: die zijn er uit gevallen bij het boren en frezen van het gat voor de speaker.

De hele oefening om de DigiSpark met MP3 speler aan de praat te krijgen is overigens niet voor niets. Het plan is deze combinatie te gebruiken in de volgende loc. Een Diesel dit keer: de V160.

Rob

Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 19 augustus 2018, 12:31:21
V160 met geluid

Dit wordt zo'n beetje de laatste loc waar geluid in komt: de V160. Een verslag van de inbouw van de DigiSpark met MP3 speler.
Nu was deze Roco loc af-fabriek digitaal, met de decoder in de 'bak' onder de loc. Die decoder is er al een tijdje uit, maar die bak biedt mooi ruimte voor een luidsprekertje en de MP3 speler.

(http://www.xs4all.nl/~robvd/Forum/V160_01.jpg)

(http://www.xs4all.nl/~robvd/Forum/V160_03.jpg)


Langs de zijkant zaten de draden van de decoder. Daar komt nu de voeding en aansturing van de MP3 speler. Met de MP3 speler in de bak, even kijken of het werkt met de proefopstelling van de DigiSpark op een breadboard.

(http://www.xs4all.nl/~robvd/Forum/V160_04.jpg)


Vervolgens komt de gelijkrichter bovenop de print in de loc, bij een van de aansluitpunten van de stroomafname. De DigiSpark komt in de ene kabine, de elco in de andere.

(http://www.xs4all.nl/~robvd/Forum/V160_05.jpg)


En als laatste de spanningsdelers (weerstanden) voor de rijstroommeting. En dan ziet het geheel er zo uit.

(http://www.xs4all.nl/~robvd/Forum/V160_06.jpg)


Het stukje roze schuim heb ik er zelf in gezet: de kap heeft anders de neiging te ver over het onderstel van de loc te zakken en dan rijdt de loc niet goed (draaistellen lopen dan vast).

Kap er op, en de loc kan na deze Ausbesserung weer in dienst worden genomen. Een klein verbeterpunt nog: de kap resoneert met de frequentie van de pulsbreedtebesturing (490 Hz). Dat is met name bij stilstand goed te horen. Eens kijken of/hoe ik dat kan dempen....

(http://www.xs4all.nl/~robvd/Forum/V160_07.jpg)


Nu alle regelmatig gebruikte locs geluid hebben, is de geluidswagon in de huidige vorm niet meer nodig. Ik heb het idee om deze een andere functie te geven, namelijk extra geluiden (fluit, bel) voor de stomers met ruisgenerator. Dan komt het puffen uit de loc, en de stoomfluit uit de wagon er achter....
Daarnaast wil ik nog verder de schakelbare rijtuigverlichting uitwerken (al dan niet in combinatie met de extra geluiden voor de stomers).
Kortom, het project loopt op het eind, maar nog niet helemaal klaar.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 19 augustus 2018, 22:05:55
Dag Rob,

Jammer dat dit alweer ten einde loopt.
Ik ben er zelf nog niet geheel aan toe, maar volg het met belangstelling.
Gelukkig blijft het op het forum bewaard.
B.v.d. ik zal het zeker in de toekomst nodig hebben.

Ben wel benieuwd naar het geluid van de V160. Filmpje?
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 19 augustus 2018, 22:20:28
Hee Mark,

Ik ben nog van plan, voor het project echt afloopt, een overzicht te maken van alle loc's, aansluit-schema's, de nieuwste versies van de sketches en een download van alle geluiden... En een film van alle locs met geluiden. Dan staat t.z.t. alles weer even overzichtelijk bij elkaar. En verder volgt eerst nog een bericht over het afstellen van de verschillende geluiden (snelheid, volume) met een ruisgenerator.
Maar eerst zal ik inderdaad die V160 nog wel even op film zetten. Zal nog wel een weekje duren. Ik ga morgen met m'n dochter de rivier Lahn afvaren in een kano.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 19 augustus 2018, 23:13:59
Jij hebt het goed voor elkaar.
Ik ben helaas weer druk aan het werk.

Veel plezier en vaar voorzichtig!
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 20 augustus 2018, 10:26:07
Ik vind het weer geweldig Rob wat je allemaal presteert! Vol verwachting wacht ik op je plan om daar het nodige te stelen wat ik ook wil uitproberen. Mijn 2e loc loopt (mede door jouw tips ) ook met geluid rond. Nou ja... op de testbank dan.  ;D

Veel plezier met kanoën ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 27 augustus 2018, 22:56:05
Mark en Pierre,

Bedankt. Ondertussen zijn we weer veilig terug na een mooie en afwisselende 5 daagse kanotocht van Wetzlar naar Runkel.

En vandaag nog niet aan het werk, dus de V160 maar eens op film gezet.



Deze V160 van Roco is aardig gelukt. Nu heb ik er nog één, een beige/zeegroene, al is die technisch onder de kap wel ietsjes anders. Ook de rij-eigenschappen zijn anders dan de rode.

(http://www.xs4all.nl/~robvd/Forum/V160_08.jpg)


Zolang ik niet met allebei tegelijk rij, kan ik domweg de kap wisselen: daar heeft Roco in jaren niets aan veranderd, zo (b)lijkt. Maar mischien...???

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 28 augustus 2018, 08:43:19
Geweldig mooi werk Rob. ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Cor op 28 augustus 2018, 10:07:23
Bijzonder knap gedaan Rob.

 Gr.Cor
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 28 augustus 2018, 18:32:46
Bedankt voor de veren, heren.
@Pierre , overweeg je nog om tzt ook diesels van geluid te voorzien, of hou je het bij de tsjoekende stomers?
Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 28 augustus 2018, 21:39:07
@Pierre , overweeg je nog om tzt ook diesels van geluid te voorzien, of hou je het bij de tsjoekende stomers?
 

Ik heb wel een paar verdwaalde diesels Rob. ;D Misschien dat ik me daar ook wel eens aan waag. Ik ben nou lekker op weg. Kan ik dan gewoon een soort diesel geluid met een DigiSpark genereren zonder MP3 speler?
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 28 augustus 2018, 22:23:05
Pierre,

Dit
Kan ik dan gewoon een soort diesel geluid met een DigiSpark genereren zonder MP3 speler?
gaat  niet lukken. Voor diesels zit je toch echt aan een MP3 speler vast (en ik ook). Kun je alvast aan het idee wennen.

Maar voorlopig kun je nog lekker uit de voeten met de verzameling stomers, toch?


Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 29 augustus 2018, 00:14:03
Helemaal waar Rob. ;D
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 30 augustus 2018, 20:29:45
Ruisgenerator geluid afstellen

Verschillende stoomlocs rijden nu met dezelfde ruisgenerator op basis van de DigiSpark. Elke loc is anders, en dat betekent dat zowel de snelheid als het volume per loc moet worden afgesteld.

Snelheid
De snelheid van de tsjoek-tsjoek geluiden worden afgestemd op de rij-eigenschappen van de loc. In de software gebeurt dit met 4 definities:
  #define pulsbreedtestil   34         // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax    72         // pulsbreedte waar de maximum snelheid (pufritme) wordt bereikt 
  #define langstePuf       280         // langste puf (in ms) - langzaam rijden
  #define kortstePuf        56         // kortste puf (in ms) - topsnelheid (minimum ligt rond 50ms)
De eerste instelling is de pulsbreedte waarbij de loc gaat rijden. Met "pulsbreedtemax" wordt de pulsbreedte bij de maximale (schaal)snelheid gedefinieerd.
Daarnaast wordt gedefinieerd hoe snel de wielen draaien (of zuigers bewegen): met "langstePuf" de tijdsduur van één 'tsjoek' (dus een kwart omwenteling van een drijfwiel) bij de laagste snelheid en "kortstepuf" de tijdsduur op topsnelheid.

Geluidsvolume
Het geluidsvolume hangt van 3 factoren af:

In het schema stel je het volume zo in:

(http://www.xs4all.nl/~robvd/Forum/SchemaModuleRuis5.jpg)


In de BR70 heb ik na de eerste inbouw het raam bij de speaker helemaal open gezet, zodat het geluid goed weg kan (rode pijl). Later is ook de speaker vervangen door een iets groter exemplaar (blauwe pijl).

(http://www.xs4all.nl/~robvd/Forum/BR70_12.jpg)


Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 15 september 2018, 16:50:39
Een universele geluidswagon: de film

Ik heb al in een eerder bericht de geluidwagon beschreven. Nu is er een filmpje over hoe deze geluidswagon gebruikt wordt.



In het filmpje wordt het niet genoemd, maar er zit ook een schakelaar in de wagon om de MP3 speler uit te kunnen zetten. De Arduino werkt dan alleen nog om het licht te schakelen.

Rob


Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 17 september 2018, 22:14:38
Lichtmodule voor rijtuigen

Ik had nog wat losse ATtiny85 microprocessoren liggen. Dit zijn dezelfde processoren als die op de DigiSpark zitten, alleen is de behuizing wat groter. Deze heb ik ooit eens aangeschaft om te kijken of ze ook los te programmeren zijn. En dit bleek eigenlijk vrij eenvoudig te kunnen met een Arduino.
De Arduino is dan het doorgeefluik: de software hiervoor zit al standaard in de IDE. Vervolgens heb je maar 6 draadjes nodig en een 10uF elco en de "programmer" is klaar.
Net als bij de DigiSpark moet alleen nog het board "ATtiny" te worden toegevoegd met deze verwijzing
http://drazzy.com/package_drazzy.com_index.json
En vervolgens maar eens het programma'tje "blink" geladen, ledje aangesloten en voilá.


(http://www.xs4all.nl/~robvd/Forum/Lichtmodule01.jpg)

(op de foto gebruik ik de bovenste 4 rijen van het breadboard om de ATtiny te programmeren, op de onderste rijen zijn de aansluitingen voor het programma'tje)
Een latere test met de ruisgenerator is ook succesvol verlopen.

De voordelen van een losse ATtiny t.o.v. de DigiSpark:

Eerste projectje hiermee: een lichtmodule, zonder geluid, voor het schakelen van de binnenverlichting en sluitverlichting in een paar donderbussen.

(http://www.xs4all.nl/~robvd/Forum/Lichtmodule03.jpg)


Ik koppel 2 donderbussen aan elkaar, zodat er voor deze 2 rijtuigen maar 1 lichtmodule nodig is. En zo zijn er ook, zonder grote aanpassingen in de stroomafnemers, meteen 4 wielen beschikbaar om de stroom van de rails op te pikken.

De lichtmodule past in de toiletten van een van de donderbussen.

(http://www.xs4all.nl/~robvd/Forum/Lichtmodule02.jpg)


Even een test LED aangesloten en het lijkt allemaal te werken. Dus nu nog de verlichting installeren en aansluiten. LEDs voor de sluitverlichting heeft de vorige eigenaar van de rechter donderbus al ingebouwd, dus die hoeven alleen nog te worden bedraad.

Wordt vervolgd....

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 18 september 2018, 08:36:34
Leuk projectje weer Rob ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 18 september 2018, 14:01:02
Dank je, Pierre.
Misschien is die losse ATtiny ook voor jou nog eens te gebruiken voor geluid in een van de locs  ;)
Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 18 september 2018, 15:38:58
Wie weet Rob. Misschien wel in de toekomst maar voorlopig niet. Ik ben nu heel veel aan het bedraden en de regelaars inbouwen in mijn bedieningspaneel dus even werk genoeg. :(
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 18 september 2018, 17:26:17
Ach, dan zit het maar vast in het vat, Pierre. Daar kan het nog wel even in bewaard worden.
Succes met draden trekken!
Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 18 september 2018, 17:58:42
 ;D
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 19 september 2018, 21:50:07
De lichtmodule is klaar.
Tijdens de test bleek er nog een wiel geen stroom op te nemen en ook de software moest nog een beetje worden aangepast. Dat gaat vrij makkelijk door de ATtiny even uit het IC voetje te lichten en dan met de Arduino nieuwe software te laden.

De eerste rijtuigen met schakelbare binnenverlichting en sluitlichten. Zie de video.



Schema en software volgen binnenkort.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Wim Corduwener op 20 september 2018, 08:56:12
Knap werk!
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 20 september 2018, 10:15:52
Erg goed gelukt Rob. Klasse. ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 20 september 2018, 20:21:10
Ja hoor, weer een project to do in the future...

Ik blijf het mooi vinden wat je allemaal kan doen met geluid en licht bij analoog rijden.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 20 september 2018, 21:15:25
Dank, Heren.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 23 september 2018, 21:20:08
De BR91 - nog een keer.

De BR91 was de eerste loc met DigiSpark en ruisgenerator.De USB 'stekker' moest goeddeels van de print worden afgezaagd om een en ander te laten passen. Software bijwerken kon nog wel een paar keer met het tijdelijk solderen van een USB aansluiting...

(http://www.xs4all.nl/~robvd/Forum/BR91_04.jpg)


Dat solderen is een paar keer gelukt, maar op enig moment gingen de printbanen er toch aan   >:(  De DigiSpark deed het nog prima, maar ik was nog niet helemaal tevreden met het aanpassen van de tsjoek-tsjoek aan de snelheid: de tsjoek-tsjoek was te langzaam ten opzichte van de draaiing van de wielen. Het programma'tje hierop aanpassen ging niet meer.
 
Maar met de nieuwe mogelijkheden van het programmeren van de losse ATtiny was het tijd om die eens te proberen.
Dus DigiSpark er uit, ATtiny met ICvoetje er in. De voeding en rijstroommeting rond de motor kon blijven zitten.

(http://www.xs4all.nl/~robvd/Forum/BR91_06.jpg)


Nu is het herprogrammeren vrij eenvoudig: ATtiny even uit het voetje en aan de Arduino, en dan weer terug plaatsen.

(http://www.xs4all.nl/~robvd/Forum/BR91_05.jpg)


Het aansluitschema is nagenoeg gelijk aan die van de BR70. De BR70 aansluiting is als volgt:

(http://www.xs4all.nl/~robvd/Forum/SchemaModuleRuis4.jpg)


Voor de BR91 is alleen digitale pin 2 (nummer 7 van de behuizing) nu verhuisd naar digitale pin 3 (dat is nummer 2 van de behuizing): dan zitten de aansluitingen voor de rijstroommeting aan dezelfde kant. Dat is hier wat handiger.
(Ja, die pin-nummering van de ATtiny is een wetenschap op zich. Dat komt omdat de chip meer pinnen heeft dan de 8 fysieke van de behuizing)

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 30 september 2018, 20:54:17
Vrijdagavond heb ik het vaste baantje naar voren gehaald om wat onderhoud in het schaduwstation te doen. Met ATF blijft de rails redelijk schoon, maar er zaten toch wat plekken waar de treinen haperden. Een deel doordat de uitschuifrails over de naad van de twee delen van de onderbouw wat los waren gaan zitten en een deel met nog onbekende oorzaak (waarschijnlijk vuil).
Dat haperen is met name lastig voor de geluidsmodules: afhankelijk van het model gaat het geluid soms op stil. Bij veel gestotter kan zelfs het programma op de Arduino worden gewist. Dan is er geen geluid meer, totdat het programma wederom van de computer wordt ge-upload.
Kortom, dat haperen, daar moest maar eens iets aan gedaan worden.

Nu is dit naar voren halen van de baan wel even een klusje: de vitrine voor de baan moet leeg en alle meuk onder de baan moet ook even weg. Maar dan is er net wat ruimte om achter de baan te komen.

(http://www.xs4all.nl/~robvd/Forum/Bedrading01.jpg)


Onder de baan door kruipend, is het schaduwstation nu redelijk te bereiken voor onderhoud.

(http://www.xs4all.nl/~robvd/Forum/Bedrading04.jpg)


Dus met een doekje alle prut van de rails afgeveegd (dat gaat heel makkelijk met dat ATF er nog op) en de uitschuifrails weer goed vast gezet.
Meteen even met de stofzuiger door het schaduwstation gegaan en meteen ook het stof van de bergen afgehaald nu ik daar goed bij kan.

Nu de boel goed bereikbaar is, ook maar eens de bedrading van de rails onder de loep genomen.
De geluidsmodules vragen enig vermogen om duidelijk geluid te produceren. Dit betekent dat de stroomopname over de rails en wielen aanmerkelijk groter is met geluid dan zonder. Nu heb ik op deze baan plekken waar sommige geluidsmodules niet goed werken voor speciale geluiden, met name bij stilstand. Tot mijn schrik heb ik de stroomvoering naar de rails toe nooit serieus bedraad: alleen het minimale is gedaan.
Dat verklaart wel waarom het altijd wat lastig was om bij het haltepunt te toeteren, zeker bij stilstand: dit is het punt dat het verste weg is van daar waar de stroom de rails op komt.

Daar is dus ruimte voor verbetering.

Op naar de bouwmarkt voor 2,5mm2 installatiedraad om een paar 'slagaders' voor de rijstroom te maken.

(http://www.xs4all.nl/~robvd/Forum/Bedrading03.jpg)


Het was een weekendje kruipen en boven het hoofd solderen. Ik heb ook gemerkt dat met name de Fleischmann wissels, met dat dunne draadeindje tussen de rails, een spanningsval kunnen veroorzaken, zeker bij meerdere wissels achter elkaar.

(http://www.xs4all.nl/~robvd/Forum/Bedrading02.jpg)


Nu is na elke wissel of na maximaal 2,5 meter een nieuw aansluitpunt op de rails gemaakt. De eerste proefritten met de nieuwe rijstroomaansluitingen zijn veelbelovend. Bijkomend voordeel: bij helling op valt de snelheid nu ook aanmerkelijk minder terug dan voorheen.
Meteen alles maar even stofvrij maken en een fractie ATF op de rails. Daarna kan de boel weer teruggezet worden.

De moraal van dit verhaal: voor geluidsmodules is een betrouwbare en degelijke stroomvoorziening noodzakelijk, dus:

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 6 oktober 2018, 20:45:20
De BR57: Losse ATtiny met MP3 speler

Dankzij een tip van @Pierre bij zijn draad over een Roco stomer reparatie heb ik de BR57 van Roco open gekregen.

(http://www.xs4all.nl/~robvd/Forum/BR57_02.jpg)


Nu zit deze loc aardig vol, maar gelukkig is de ballast in de loc van een vrij lichte metaallegering gemaakt. Dus die gaat er uit en wordt vervangen door wat kleinere blokken lood. Dan komt er een klein beetje ruimte in de ketel.

(http://www.xs4all.nl/~robvd/Forum/BR57_04.jpg)


Eerst maar even proefrijden, want zonder ballast staan de wielen van de loc in een krappe boog stil, terwijl de tender moedig de loc door de bocht duwt.

(http://www.xs4all.nl/~robvd/Forum/BR57_05.jpg)


Dit lood is net genoeg. Er komt dan nog een beetje gewicht bij van de elektronica en de rest van de bovenbouw, en dat geeft dan een beetje marge.
Over de electronica gesproken: deze geluidsmodule wordt weer een andere combinatie van componenten. Dit keer een losse ATtiny met MP3 speler. Een eerste test is ondertussen gedaan: de Arduino bibliotheek voor de seriele communicatie met de MP3 speler werkt ook op de losse ATtiny. En met 8 kiloByte aan beschikbaar programmageheugen past de MP3 software ook.

(http://www.xs4all.nl/~robvd/Forum/BR57_03.jpg)


Met de andere ATtiny in de ruisgenerator en de lichtmodule heb ik nog wat ervaring opgedaan met de zogenaaamde "Brown Out Detectie" (BOD). Deze zorgt er voor dat de ATtiny zichzelf uitschakelt als de bedrijfsspanning te laag wordt, en weer inschakelt als er voldoende spanning is. Zonder deze BOD raakte de ATtiny regelmatig compleet in de war en deed onvoorspelbare (onvoorstelbare) dingen. Een grotere betrouwbaarheid van de ATtiny is een voorwaarde om nog enige kans te hebben om de MP3 speler goed te kunnen aansturen.
Die BOD is heel eenvoudig in te stellen in de Arduino IDE, ik wist tot nu toe alleen niet wat het was  8)

Kortom, dit project loopt dus nog even door....
Vanavond eerst maar weer wat MP3'tjes voor een BR57 in elkaar klussen.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 7 oktober 2018, 18:36:57
Top Rob. Je gaat maar door hè. ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 7 oktober 2018, 20:57:36
Tsja, Pierre,
Vandaag ligt het even stil. Ik heb de laatste twee MP3 spelers vandaag gemold. Die pinnetjes (headers) er af solderen ging niet goed en nu is van elk een essentieel aansluitpunt kaduuk. Achteraf bleek de rand van de print waar deze pinnetjes zaten ook wel erg gammel te zijn. Nou ja, dat heb je dan soms met die Chinese namaak  :'(

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 7 oktober 2018, 21:06:26
Rob ... is het niet mogelijk ergens op de print een baantje kaal te krabben/slijpen om een draadje aan te solderen? Dat moet toch te doen zijn met een beetje pielen.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 9 oktober 2018, 22:01:03
Nou Pierre,

Rob ... is het niet mogelijk ergens op de print een baantje kaal te krabben/slijpen om een draadje aan te solderen? Dat moet toch te doen zijn met een beetje pielen.
Dat was ook mijn gedachte, maar die MP3 speler is zo compact dat ik geen aanknooppunten kan vinden. Zoals bijvoorbeeld bij deze, waar rechtsonder de aansluiting kapot is. Dit is de enige plek waar ik de 5V kan terugvinden  (nu dus niet meer).

(http://www.xs4all.nl/~robvd/Forum/BR57_06.jpg)


Ik laat op de volgende die headers wel zitten. Dat heb ik bij andere ook gedaan; ik weet eigenlijk niet goed waarom ik ze er nu af wilde hebben. Als ik ze ombuig moet het ook passen.
Misschien ga ik nog wel eens wat prutsen met de kapotte MP3 spelers...

Eerst maar eens de speaker ingebouwd. Onderin de ketel een is gat gemaakt, waar de speaker boven komt.

(http://www.xs4all.nl/~robvd/Forum/BR57_07a.jpg)



In afwachting van de MP3 spelertjes, had ik wel tijd om nog eens naar de ballast te kijken. Zo zonder ketel was te zien dat in een scherpe boog de drijfstang van het voorste linker wiel soms achter de geleiding van de zuigerstang bleef haken. Dus geleiding iestsje naar buiten gebogen en nu kan er met aanmerkelijk minder lood worden gereden.

(http://www.xs4all.nl/~robvd/Forum/BR57_07.jpg)


Dat geeft ruimte voor de componenten. Niet alleen de MP3 speler vraagt ruimte, ook de voeding moet wat steviger worden uitgevoerd dan bij de ruisgenerator: een zwaardere spanningsregelaar (minstens 500 mA) en een veel grotere Elco. Ik wil de  voeding, rijstroomweerstanden en microcontroller (ATTiny) in de (smalle) ketel zien te proppen. De MP3 speler komt dan in de vuurkist.

(http://www.xs4all.nl/~robvd/Forum/BR57_08.jpg)

(http://www.xs4all.nl/~robvd/Forum/BR57_09.jpg)


De voeding en microcontroller is gesoldeerd: de gele draden zijn voor de rijstroom, de andere voor de MP3 speler.

Tot zover weer even.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 9 oktober 2018, 22:17:58
Dat gaat helemaal goed komen Rob. Past precies :)
Speakertje zit er netjes in. Is een elco van 10 V niet wat krap?

Als je om dat gat wat weggebrand is heen krabbelt met een scherp mesje moet het restant van de koperbaan toch ergens  te voorschijn komen?
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 9 oktober 2018, 23:29:31
Pierre,

Het past inderdaad precies. Heb zojuist even geprobeerd met de bovenkant van de ketel. De Elco van 2200uF/10V is net wat kleiner dan die van 16V. En het is voldoende: mijn pulsbreedte rijstroom is ingesteld op 11 Volt. Met 1,4V verlies op de gelijkrichter zit het precies goed. Ik meet een spanning van maximaal 9V op de Elco bij 95% (maximale) pulsbreedte.
Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 10 oktober 2018, 08:23:04
Dan moet het goed gaan Rob. Mooi gedaan. :)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 14 oktober 2018, 18:16:20
Gisteren had ik tijd om de MP3 speler aan de rest te solderen. De boel op de loc gesoldeerd en daarna de avond besteed aan de juiste instellingen. Zonder de bovenkant van de ketel is alles open en kan de ATtiny en het geheugenkaartjemet MP3 bestanden makkelijk van de loc afgehaald worden.

(http://www.xs4all.nl/~robvd/Forum/BR57_10.jpg)


Met de geluidsmodule in de ketel, wordt nieuwe software laden erg omslachtig: dan moet de loc weer helemaal gedemonteerd worden. Dus probeer ik dit in een keer goed te krijgen:
- Goede afstelling van het rijgeluid op de snelheid. Uiteindelijk is één van de 8 stappen komen te vervallen en is er nu 7-traps rijgeluid.
- Instelling van het volume: te hard en er wordt meer vermogen gevraagd dan er is. Dan reset de ATtiny, of de MP3 speler, maar vaak niet gelijktijdig. Dat geeft allerlei nare geluidseffecten. Te zacht en er is niets te horen.
- BOD terug gezet naar 2.7v. Met de MP3 speler fluctueert de spanning meer. En ook hier reset de ATtiny anders eerder dan de MP3 speler en dan lopen ze niet meer synchroon.
- De juiste geluiden (mp3 bestanden): Ik was nog niet tevreden over de stoomfluit en van andere geluiden moest de geluidssterkte nog worden bijgesteld.

Dat was gisteravond allemaal naar wens, dus vandaag de boel maar eens gemonteerd. Eerst de beide delen van de ketel samengevoegd. Er moest in de vuurkist nog wel wat worden weggevijld om de MP3 speler te laten passen.

(http://www.xs4all.nl/~robvd/Forum/BR57_11b.jpg)

(http://www.xs4all.nl/~robvd/Forum/BR57_11.jpg)


Nu kon ik voor het eerst het geluid horen zoals het in de loc klinkt: de bovenkant van de ketel zorgt voor een goede klankkast. Het is zelfs aan de luide kant. Niet erg, want de BR57 / Pruisische G10 was vast niet niet de meest geruisloze stoomloc.
Dan de omloop weer om de ketel monteren. Met nog de nodige stangen voor de stoomregeling enzo.Machinistenhuis er weer op en dan hebben we weer een loc in 2 delen (3 met tender).

(http://www.xs4all.nl/~robvd/Forum/BR57_12.jpg)


Ondertussen zit de loc weer helemaal in elkaar. Het was nog wel even frunniken met de aansluitingen en de stroomafnemers bij de wielen, maar het zit.

Filmpje volgt.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 15 oktober 2018, 12:12:40
Ik vond het rijgeluid en de bel toch iets te luid, dus daarvan heb ik de MP3 bestanden aangepast. Om het geheugenkaartje te bereiken, moest het machinistenhuis weer even van de loc afgehaald worden.
 
(http://www.xs4all.nl/~robvd/Forum/BR57_13.jpg)


Maar daarna was ik tevreden. De film:



Niet gek voor zo'n 12 euro aan onderdelen (en omgerekend minstens 1200 euro aan arbeidsloon  8) , maar zo ben je lekker bezig...)
Nu nog een machinist en stoker er in, en dan is de loc klaar voor gebruik.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 15 oktober 2018, 12:35:30
Prachtig Rob ... petje af man! ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 15 oktober 2018, 19:47:41
Bedankt, Pierre.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 15 oktober 2018, 21:12:51
Eigenlijk weet ik niet wat ik moet zeggen, kom niet verder dan fantastisch geweldig gedaan!
Het geluid met die mp3 geluiden is prima gelukt.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 15 oktober 2018, 22:52:17
Dank je, Mark.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 22 oktober 2018, 21:49:48
Geluid en lichtmodules: het overzicht

Het project loopt op zijn eind: tijd voor een overzicht. Ik heb nog wel een paar locs waar t.z.t. geluid in komt, maar die vallen dan onder de 'gewone' verbeteringen...
In dit bericht (en 2 volgende: het past niet in één) alle informatie bij elkaar: sketches, aansluitschema's en MP3 bestanden om te downloaden.

Ik ben nu 6 maanden na de eerste experimenten met geluid aan boord. Er zijn nu 11 geluidsmodules ingebouwd (waarvan 3 ook met schakelbare verlichting) en één lichtmodule (zonder geluid).

(http://www.xs4all.nl/~robvd/Forum/Overzicht01.jpg)


Op spoor 1 alle locs met ruisgenerator op basis van DigiSpark of ATtiny: BR91, BR70, BR64, BR78 en BR38.
Op spoor 2 alle locs en treinstel met MP3 speler (en Arduino, DigiSpark of ATtiny): BR57, V160, V100, BR50 en VT98
Achter het station de bagagewagon met meerdere geluiden (Arduino met MP3 speler) en de donderbussen met lichtmodule (ATtiny)


De pulsbreedte besturing

Een beschrijving, video en sketch staat in dit bericht:
http://www.h0modelspoor.nl/index.php?topic=3183.msg53480#msg53480 (http://www.h0modelspoor.nl/index.php?topic=3183.msg53480#msg53480)


Ruisgenerator

De ruisgenerator sketch is nog wat aangepast. De nieuwste sketch is deze:

/*
 * RUISGENERATOR STOOMTREIN
 * Stoomtrein geluiden met rijstroom afhankelijk "puffen" van ruis. Voor analoog rijden met geluid.
 * Rijstroom met pulsbreedtebesturing is nodig: de pulsbreedte wordt omgerekend naar puf-snelheid.
 *
 * Eenvoudige extra geluidsfuncties:
 * 1: fluitje (lijkt meer op een telefoon) - uit voor sommige modellen
 * 2: sissen
 * 3: remmen
 * 4: stilte (vrijloop)
 * Functies werken redelijk bij langzaam rijden en goed bij stilstand en snel rijden
 *
 * versie 1.3 - 19 sep 2018
 */


// --- DEFINITIES ----

// kies de loc om te compileren: zet precies één definitie op 'true'
#define BR38 false
#define BR64 false                     // nieuwste versie nog niet geladen
#define BR70 false                     // @ ATtiny (van DigiSpark)
#define BR78 false                     
#define BR91 true                      // @ ATtiny (los). Bootloader branden met BOD op 4.3V en clock op 16 MHz                     

#define ruisPin       1                // pin voor aansturen van speaker: pin 1 of 0 (0 = 5 sec. vertraging)
#define rijPin1       2                // rijstroom meting
#define rijPin2       4                // rijstroom meting

//geluidsdefinities per type loc

#if BR38
  // definities voor slagen BR38. ("paa tsjie poe tsjoe...")
  #define Startfreq1  1000             // laagste frequentie ruis slag 1
  #define Eindfreq1   3000             // hoogste frequentie ruis slag 1
  #define Startfreq2  1240             // laagste frequentie ruis slag 2
  #define Eindfreq2   5400             // hoogste frequentie ruis slag 2
  #define Startfreq3   800             // laagste frequentie ruis slag 3
  #define Eindfreq3   2200             // hoogste frequentie ruis slag 3 
  #define Startfreq4   900             // laagste frequentie ruis slag 4
  #define Eindfreq4   4500             // hoogste frequentie ruis slag 4
  // berekening snelheid
  #define pulsbreedtestil   34         // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax    72         // pulsbreedte waar de maximum snelheid (pufritme) wordt bereikt 
  #define langstePuf       280         // langste puf (in ms) - langzaam rijden
  #define kortstePuf        56         // kortste puf (in ms) - topsnelheid (minimum ligt rond 50ms)
  // opstart geluid
  #define BeginSis        2150         // lengte van het sisgeluid bij starten (en korte stroomonderbrekingen)
#endif

#if BR64
  // definities voor slagen BR64. ("paa tsjie paa tsjoe...")
  #define Startfreq1  1000             // laagste frequentie ruis slag 1
  #define Eindfreq1   3000             // hoogste frequentie ruis slag 1
  #define Startfreq2  1300             // laagste frequentie ruis slag 2
  #define Eindfreq2   5500             // hoogste frequentie ruis slag 2
  #define Startfreq3  1000             // laagste frequentie ruis slag 3
  #define Eindfreq3   3000             // hoogste frequentie ruis slag 3 
  #define Startfreq4   940             // laagste frequentie ruis slag 4
  #define Eindfreq4   2500             // hoogste frequentie ruis slag 4
  // berekening snelheid
  #define pulsbreedtestil   32         // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax    56         // pulsbreedte waar de maximum snelheid (pufritme) wordt bereikt 
  #define langstePuf       190         // langste puf (in ms) - langzaam rijden
  #define kortstePuf        60         // kortste puf (in ms) - topsnelheid (minimum ligt rond 50ms)
  // opstart geluid
  #define BeginSis        3530         // lengte van het sisgeluid bij starten (en korte stroomonderbrekingen)
#endif

#if BR70
  // definities voor slagen BR70 ("tsjoe, tsjie, tsjoe, tsjie")
  #define Startfreq1  1700             // laagste frequentie ruis slag 1
  #define Eindfreq1   3900             // hoogste frequentie ruis slag 1
  #define Startfreq2  2000             // laagste frequentie ruis slag 2
  #define Eindfreq2   4100             // hoogste frequentie ruis slag 2
  #define Startfreq3  1720             // laagste frequentie ruis slag 3
  #define Eindfreq3   3930             // hoogste frequentie ruis slag 3 
  #define Startfreq4  1980             // laagste frequentie ruis slag 4
  #define Eindfreq4   4050             // hoogste frequentie ruis slag 4
  // berekening snelheid
  #define pulsbreedtestil   28         // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax    65         // pulsbreedte waar de maximum snelheid (pufritme) wordt bereikt 
  #define langstePuf       375         // langste puf (in ms) - langzaam rijden
  #define kortstePuf        50         // kortste puf (in ms) - topsnelheid (minimum ligt rond 50ms)
  // opstart geluid
  #define BeginSis        1150         // lengte van het sisgeluid bij starten (en korte stroomonderbrekingen)
#endif

#if BR78
  // definities voor slagen BR78. ("paa tsjoe paa tsjie...")
  #define Startfreq1  1000             // laagste frequentie ruis slag 1
  #define Eindfreq1   3000             // hoogste frequentie ruis slag 1
  #define Startfreq2   900             // laagste frequentie ruis slag 2 900
  #define Eindfreq2   4500             // hoogste frequentie ruis slag 2 2500
  #define Startfreq3  1000             // laagste frequentie ruis slag 3
  #define Eindfreq3   3000             // hoogste frequentie ruis slag 3 
  #define Startfreq4  1240             // laagste frequentie ruis slag 4
  #define Eindfreq4   5400             // hoogste frequentie ruis slag 4
  // berekening snelheid
  #define pulsbreedtestil   34         // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax    64         // pulsbreedte waar de maximum snelheid (pufritme) wordt bereikt 
  #define langstePuf       290         // langste puf (in ms) - langzaam rijden
  #define kortstePuf        58         // kortste puf (in ms) - topsnelheid (minimum ligt rond 50ms)
  // opstart geluid
  #define BeginSis        1800         // lengte van het sisgeluid bij starten (en korte stroomonderbrekingen)
#endif

#if BR91
  #define rijPin1        3             // rijstroom meting, afwijkende pin
  // definities voor slagen BR91: 1e hoog, laatste wat lager dan de 2 middelste slagen ("tsjie, tsja, tsja, tsjoe")
  #define Startfreq1  1500             // laagste frequentie ruis slag 1
  #define Eindfreq1   4850             // hoogste frequentie ruis slag 1
  #define Startfreq2  1800             // laagste frequentie ruis slag 2
  #define Eindfreq2   4000             // hoogste frequentie ruis slag 2
  #define Startfreq3  1800             // laagste frequentie ruis slag 3
  #define Eindfreq3   4000             // hoogste frequentie ruis slag 3 
  #define Startfreq4  1750             // laagste frequentie ruis slag 4
  #define Eindfreq4   3900             // hoogste frequentie ruis slag 4
  // berekening snelheid
  #define pulsbreedtestil   34         // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax    82         // pulsbreedte waar de maximum snelheid (pufritme) wordt bereikt 
  #define langstePuf       260         // langste puf (in ms) - langzaam rijden
  #define kortstePuf        60         // kortste puf (in ms) - topsnelheid (minimum ligt rond 50ms)
  // opstart geluid
  #define BeginSis        1750         // lengte van het sisgeluid bij starten (en korte stroomonderbrekingen)
#endif

// algemene geluidsdefinities
#define pauze                0.33      // factor puf/pauze (elke slag heeft voor een deel stilte)
//#define RemLaag           3200         // frequentiebereik voor remgeluid
//#define RemHoog           3800
#define RemLaag           3000         // frequentiebereik voor remgeluid
#define RemHoog           3600
#define SisLaag           3000         // frequentiebereik voor sisgeluid
#define SisHoog           5500

// definities voor de meting van de rijstroom
#define pullup               false     // geeft aan of de interne pullup weerstand gebruikt moet worden
#define maxpulsperiode       5000      // hoe lang wachten (minimaal 2x periode rijstroom PWM)

// Frequenties (Periodes) op de rijstroom
#define rijPeriode            2020     // rijstroom puls in us
#define functie_01_Periode    1500     // Periode (freq.) functie 1
#define functie_02_Periode    1250     // Periode (freq.) functie 2
#define functie_03_Periode     990     // Periode (freq.) functie 3
#define functie_04_Periode     790     // Periode (freq.) functie 4
#define functie_05_Periode     590     // Periode (freq.) functie 5 - niet gebruikt
#define functie_06_Periode     450     // Periode (freq.) functie 6 - niet gebruikt
#define pulsruis                80     // maximaal verschil in gemeten Periodes (ruis)
#define minhoog                100     // minimaal "hoog" signaal

// --- CONSTANTES ---

const float sqrtpbstil = 100*sqrt(10);
const float sqrtpbmax  = 100*sqrt(10+pulsbreedtemax-pulsbreedtestil);


// ---- VARIABLEN ----

// puf-geluid variabelen: 4 slagen (is tweezijdige tweecylinder loc)
unsigned int ruisStartFreq[] {Startfreq1, Startfreq2, Startfreq3, Startfreq4};  // hoogste frequentie puf-ruis per slag
unsigned int ruisEindFreq[]  {Eindfreq1,  Eindfreq2,  Eindfreq3,  Eindfreq4 };  // laagste frequentie puf-ruis per slag
int slag = 0;

// rijstroom variabelen
int rijpin[] {rijPin1, rijPin2};
int vooruit = 1;                      // richting: bepaalt welke pin wordt uitgelezen voor de rijstroom puls
double pulsbreedteHoog;
double pulsbreedteLaag;
double pulsPeriode;
float pulsbreedte = 0;                // pulsbreedte in %
int functie = 0;                      // speciale functie frequentie gemeten

unsigned int  puf;                    // lengte puf-slag (ms)
unsigned long pze;                    // pauze tot aan klok stand(ms)


// --- FUNCTIES ---

// Functie: maak puf geluid (één slag)
// Geeft ruis voor een deel van de opgegeven lengte en stil voor de resterende tijd (factor definitie)
// De ruisfrequentie neemt langzaam af om enigszins de volume afname te simuleren.
// input: lengte van de slag (in ms)
//        laagste frequentie van de ruis
//        hoogste frequentie van de ruis
// output: tijd tot einde pauze van de puf
unsigned long maakPuf(int lengte, unsigned int laag, unsigned int hoog) {
  unsigned int  freq;
  unsigned long mils;
  float factor = 1 - (0.09/lengte);
  mils = millis() + (1-pauze) * lengte;
  while (millis() < mils) {
    freq = random (laag, hoog);
    tone (ruisPin,freq);
    laag = laag*factor;
    hoog = hoog*factor;
  }
  noTone(ruisPin);
  return millis() + (lengte * pauze);                         // pauze tijd tussen de puffen
}

// Functie: Afspelen van ruis.
// Gebruikt voor sissen en remgeluid. Constant ruis-geluid gedurende de opgegeven lengte (in ms).
// input: lengte van de slag (in ms)
//        laagste frequentie van de ruis
//        hoogste frequentie van de ruis
void speelRuis(unsigned int lengte, unsigned int laag, unsigned int hoog) {
  unsigned int  freq;
  unsigned long mils;
  mils = millis() + lengte;
  while (millis() < mils) {
    freq = random (laag, hoog);   
    tone (ruisPin,freq);
  }
  noTone(ruisPin);
}

// Functie: Afspelen van een 'fluitje'
// Afwisselend een hoge en lage frequentie met een kleine frequentie variatie.
// input: lengte (in ms)
void speelFluitje(unsigned int lengte) {
  unsigned int  freq;
  unsigned long mils;

  mils = millis() + lengte;
  while (millis() < mils) {
    tone (ruisPin,random (2100,2120));
    delay (20);
    tone (ruisPin,random (2400,2430));
    delay (18);
  }
  noTone(ruisPin);
}

// MEET DE PULS OP DE RiJSTROOM
void meetPuls() {
  // puls meting variabelen: lengte 'hoog', 'laag' en trillingstijd (periode). Alle tijden in us.
  pulsbreedteHoog = pulseIn(rijpin[vooruit], HIGH, maxpulsperiode);
  pulsbreedteLaag = pulseIn(rijpin[vooruit], LOW, maxpulsperiode );
  pulsPeriode = pulsbreedteHoog + pulsbreedteLaag;
}

// HERKEN FUNCTIE-FREQUENTIE
// functie voor het checken van functie-frequenties
// op de puls (functietoets).
int getFunctie () {
  int f = 0;
 
  if (abs (pulsPeriode - functie_01_Periode) < pulsruis) { f = 1;}
  if (abs (pulsPeriode - functie_02_Periode) < pulsruis) { f = 2;}
  if (abs (pulsPeriode - functie_03_Periode) < pulsruis) { f = 3;}
  if (abs (pulsPeriode - functie_04_Periode) < pulsruis) { f = 4;}

  return f;
}

void setup() {
  pinMode     (ruisPin,OUTPUT);
 
  pinMode     (rijpin[0],INPUT);
  digitalWrite(rijpin[0],pullup);
  pinMode     (rijpin[1],INPUT);
  digitalWrite(rijpin[1],pullup);
  delay(100);                               // even wachten op opladen elco (stabiele voeding)

  speelRuis (BeginSis, SisLaag,SisHoog);    // sissen bij opstarten
}

void loop() {
  // Pulsbreedte bepalen
  vooruit = !vooruit;                       // wissel de pin waarop de rijstroom wordt gemeten
  do {
    vooruit = !vooruit;                     // wissel de pin waarop de rijstroom wordt gemeten
    meetPuls(); 
  } while (pulsbreedteHoog < minhoog || pulsbreedteLaag < pulsruis); // 'hoog' signaal alleen op actieve rijpin 
  pulsbreedte = 100 * pulsbreedteHoog / pulsPeriode;
  functie = getFunctie();
 
  // speciale geluidsfunctie gevonden
  if (functie) {
    // als speciale functie is gevonden, controleer de functie frequentie nogmaals.
    // Hiermee wordt onterecht meten voorkomen (door bijvoorbeeld storing op de stroomopname).
    delay (5);                                         // korte pauze tussen de metingen
    meetPuls();
    if (functie == getFunctie()) {                     // nog steeds dezelfde funtie op de rijstrrom
      switch (functie) {                               // speel functie 1, 2, 3 of 4.
#if BR70
        case 1:
          speelFluitje(1800);                          // fluitje afspelen, 1,8 sec.
        break;
#endif
        case 2:
          speelRuis (3000, SisLaag,SisHoog);           // sissen, 3 sec.
        break;
         case 3:
          speelRuis (3600, RemLaag,RemHoog);           // remgeluid 3,6 sec.
        break;
         case 4:
          pze = millis()+ 4500;                        // 4,5 sec. stilte = vrijloop
        break;
      }
    }
  }
  else {                                               // geen speciale functie, dan rij-geluid
    // rijgeluid
    // tweecylinder = 4 puf slagen met verschil in de slagen (volgens definities van de loc)
    if (pulsbreedte > pulsbreedtestil && millis() > pze) {                   // lok rijdt en er is nu geen puf-pauze of vrijloop
      // puf slag berekenen
      if (pulsbreedte > pulsbreedtemax) {
        pulsbreedte = pulsbreedtemax;
      }
      puf = map(100 * sqrt (10+pulsbreedte-pulsbreedtestil), sqrtpbstil, sqrtpbmax, langstePuf, kortstePuf);  // reken pulssbreedte % om naar puf-tijd
      pze = maakPuf(puf, ruisStartFreq [slag], ruisEindFreq [slag]);         // maak puf-ruis. Functie geeft resterende pauze-tijd terug
      // volgende puf-slag (volgnummer 0-3)
      if (slag < 3) {
        slag++;
      }
      else {
        slag = 0;
      }
    }
  }                                                     // einde functie spelen / rijgeluid
}                                                       // einde hoofd-lus

Deze sketch werkt zowel voor de DigiSpark en als voor de ATtiny. Per loc definitie wordt aangegeven of er ee DigiSpark of ATtiny is ingebouwd: bij het compileren van de sketch worden dan de juiste instellingen gebruikt.


Dit is zijn de algemene aansluitschema's, al kunnen de gebruikte pinnen per loc anders zijn.

(http://www.xs4all.nl/~robvd/Forum/SchemaModuleRuis3.jpg)

(http://www.xs4all.nl/~robvd/Forum/SchemaModuleRuis4.jpg)

(de rest in volgend bericht)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 22 oktober 2018, 22:06:49
Geluidsmodules met MP3 speler

De sketch. Deze is bruikbaar voor Arduino, DigiSpark en ATtiny. Ook hier wordt per loc met de juiste instellingen gecompileerd. Dat maakt de sketch ingewikkelder, maar het is (was) eenvoudiger om één programma te hebben zodat wijzigingen in de software maar één keer hoeven te worden gedaan.

/* GELUIDSMODULE
 * Rijstroom afhankelijk geluid voor analoge modeltreinen.
 * Module vereist rijstroom met pulsbreedte modulatie en heeft dan de volgende functies:
 *    - Startgeluid (starten van een motor, bijvoorbeeld
 *    - Stationair geluid
 *    - Rijstroom afhankelijke geluiden tijdens het rijden
 *    - Tot 6 geluidsfuncties, te bedienen met frequentie-veranderingen op de rijstroom
 *    - 1 lichtschakel functie (op één van de 6 functies)
 * Per loc of treinstel worden de pinnen, snelheid en geluiden gedefinieerd.
 * De geluiden staan per set (loc) in in map op de de geheugenkaart, d.w.z.
 *    - voor één loc is alleen map "01" op de geheugenkaart van de MP3 speler beschikbaar.
 *    - voor een geluidswagon worden mappen "01" t/m "06" gebruikt: één set per loc.
*/
#define versie "2.0, 7 Oktober 2018 - Rob van Deursen"
// ----- ALGEMENE DEFINITIES -----

// ----- definities voor het compileren -----
// definieer voor welke geluidsmodule wordt gecompileerd (zet deze op "true"), selecteer 1 module.
// voor DigiSpark: zet in IDE "board" op "Digispark (default 16.5 MHz)" by compileren / uploaden.
#define BR24                false        // BR24 @ Digispark
#define BR50                false        // BR50 @ Arduino
#define BR57                false        // BR57 @ ATtiny (gebruikt bibliotheken voor Arduino) - BOD op 2.7v
#define BR78                false        // BR78 @ Digispark
#define V100                false        // V100 @ Arduino
#define V160                false        // V160 @ DigiSpark
#define VT98                true         // VT98 @ Arduino (railbus)
#define geluidswagon        false        // Tot 6 locs. Nu 5 locs: BR70, BR38, BR24, V60 en V160 @ Arduino

// probleemoplosser zet informatie op de seriele bus (seriele monitor). Zet deze aan bij het oplossen van problemen
#define probleemoplosser    false      // diverse status info naar seriele monitor j/n (werkt niet voor DigiSpark)

// ----- algemene MP3 en functietoets indeling ------
// geluidsbestanden 001.mp3 t/m 006.mp3: speciale geluidsfuncties
//                  009.mp3:             startgeluid
//                  010.mp3:             stationair
//                  011.mp3 en hoger:    rijgeluiden (opvolgende snelheden)
#define startgeluid              9       // 009.mp3
#define stationair              10       // 010.mp3
                                         // rijden vanaf bestand 011.mp3 en hoger (opvolgend na stationair)
#define geluidsfunctie1          1       // 001.mp3 fluit of hoorn
#define geluidsfunctie2          2       // 002.mp3 bel (of korte fluit/hoorn)
#define geluidsfunctie3          3       // 003.mp3 rem of vrijloop (afhankelijk van loc of treinstel)
#define geluidsfunctie4          4       // 004.mp3 stoom afblazen of motor uitzetten
//      geluidsfuncties 5 en 6:             gedefinieerd per geluidsmodule

// EEPROM geheugenlocaties
#define licht1adr                0
#define licht2adr                1
#define geluidadr                2                   

// ----- DEFINITIES PER GELUIDSMODULE -----

// === BR24 @ DigiSpark ===
#if BR24
  #define DigiSpark           true
// ----- pin definities ------
                                         // pin 3 op DigiSpark niet gebruiken: heeft 1k5 pullup naar 5V en USB
  #define rijPin1                1       // digitale pin voor PWM rijspanning richting 1 met LED
  #define rijPin2                4       // digitale pin voor PWM rijspanning richting 2

  #define MP3RX                  2       // serieel receive (van MP3 speler)
  #define MP3TX                  0       // serieel transmit (naar MP3 speler)
  //#define lichtPin               -        geen lichtfunctie DigiSpark

// ----- rijstroom en geluid/licht instellingen -----
  #define aantalSnelheden        5       // aantal snelheidsstappen loc
  #define pulsbreedtestil       26       // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax        56       // pulsbreedte waarbij de maximum snelheid wordt bereikt 

  #define geluidsfunctie5        5       // 005.mp3, waterpomp
  #define geluidsfunctie6        6       // 006.mp3, kolen scheppen
  #define lichtfunctie           0       // geen lichtfunctie
  #define lichtsterkte           0       // lichtsterkte (0-255)

  //MP3 speler (DFplayer)
  #define volume                28       // geluidsvolume (0-47)
  #define equalizer              0       // equaliser 0-5: normal, pop, rock, jazz, classic, base
  #define MP3monster             0       // bemonster intervaltijd MP3 speler (ms) (0 = geen)
  #define geluid                 1       // geluid altijd aan in map "01"
#endif

// === BR50 @ Arduino ===
#if BR50
  #define Arduino             true
// ----- pin definities ------
  #define rijPin1                3       // digitale pin voor PWM rijspanning richting 1
  #define rijPin2                5       // digitale pin voor PWM rijspanning richting 2

  #define MP3RX                  7       // serieel receive (van MP3 speler)
  #define MP3TX                  6       // serieel transmit (naar MP3 speler)
  #define lichtPin              11       //

// ----- rijstroom en geluid/licht instellingen -----
  #define aantalSnelheden        8       // aantal snelheidsstappen loc
  #define pulsbreedtestil       26       // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax        66       // pulsbreedte waarbij de maximum snelheid wordt bereikt 

  #define geluidsfunctie5        5       // 005.mp3, korte fluit
  #define geluidsfunctie6        6       // 006.mp3, kolen scheppen
  #define lichtfunctie           0       // geen lichtfunctie
  #define lichtsterkte           0       // lichtsterkte (0-255)

  //MP3 speler (DFplayer)
  #define volume                28       // geluidsvolume (0-47)
  #define equalizer              5       // equaliser 0-5: normal, pop, rock, jazz, classic, base
  #define MP3monster          3000       // bemonster intervaltijd MP3 speler (ms) (0 = geen)
  #define geluid                 1       // geluid altijd aan in map "01" van MP3 speler.
  #define MP3inittijd         1500       // initialisatietijd MP3 speler (ms)
#endif

// === BR57 @ ATtiny ===
#if BR57
  #define ATtiny             true
// ----- pin definities ------
  #define rijPin1                1       // digitale pin voor PWM rijspanning richting 1
  #define rijPin2                2       // digitale pin voor PWM rijspanning richting 2

  #define MP3RX                  4       // serieel receive (van MP3 speler)
  #define MP3TX                  3       // serieel transmit (naar MP3 speler)
  #define lichtPin               0       //

// ----- rijstroom en geluid/licht instellingen -----
  #define aantalSnelheden        7       // aantal snelheidsstappen loc
  #define pulsbreedtestil       22       // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax        76       // pulsbreedte waarbij de maximum snelheid wordt bereikt 

  #define geluidsfunctie5        5       // 005.mp3, korte fluit
  #define geluidsfunctie6        6       // 006.mp3, Veiligheidsventiel
  #define lichtfunctie           0       // geen lichtfunctie
  #define lichtsterkte           0       // lichtsterkte (0-255)

  //MP3 speler (DFplayer)
  #define volume                23       // geluidsvolume (0-47)
  #define equalizer              5       // equaliser 0-5: normal, pop, rock, jazz, classic, base
  #define MP3monster          3000       // bemonster intervaltijd MP3 speler (ms) (0 = geen)
  #define geluid                 1       // geluid altijd aan in map "01" van MP3 speler.
#endif

// === BR78 @ DigiSpark ===
#if BR78
  #define DigiSpark           true
// ----- pin definities ------
                                         // pin 3 op DigiSpark niet gebruiken: heeft 1k5 pullup naar 5V en USB
  #define rijPin1                1       // digitale pin voor PWM rijspanning richting 1 met LED
  #define rijPin2                4       // digitale pin voor PWM rijspanning richting 2

  #define MP3RX                  2       // serieel receive (van MP3 speler)
  #define MP3TX                  0       // serieel transmit (naar MP3 speler)
  //#define lichtPin               -        geen lichtfunctie DigiSpark

// ----- rijstroom en geluid/licht instellingen -----
  #define aantalSnelheden        8       // aantal snelheidsstappen loc
  #define pulsbreedtestil       30       // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax        70       // pulsbreedte waarbij de maximum snelheid wordt bereikt 

  #define geluidsfunctie5        5       // 005.mp3, korte fluit
  #define geluidsfunctie6        6       // 006.mp3, kolen scheppen
  #define lichtfunctie           0       // geen lichtfunctie
  #define lichtsterkte           0       // lichtsterkte (0-255)

  //MP3 speler (DFplayer)
  #define volume                25       // geluidsvolume (0-47)
  #define equalizer              0       // equaliser 0-5: normal, pop, rock, jazz, classic, base
  #define MP3monster             0       // bemonster intervaltijd MP3 speler (ms) (0 = geen)
  #define geluid                 1       // geluid altijd aan in map "01"
#endif

// === V100 @ Arduino ===
#if V100
  #define Arduino             true
// ----- pin definities ------
  #define rijPin1                6       // digitale pin voor PWM rijspanning richting 1
  #define rijPin2                7       // digitale pin voor PWM rijspanning richting 2

  #define MP3RX                  9       // serieel receive (van MP3 speler)
  #define MP3TX                  8       // serieel transmit (naar MP3 speler)
  #define lichtPin              11       // licht

// ----- rijstroom en geluid/licht instellingen -----
  #define aantalSnelheden        1       // aantal snelheidsstappen loc
  #define pulsbreedtestil       33       // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax        40       // pulsbreedte waarbij de maximum snelheid wordt bereikt 

  #define geluidsfunctie5        0       // 0 = geen geluidsfunctie
  #define geluidsfunctie6        6       // 006.wav
  #define lichtfunctie           5       // lichtfunctie op 5 (kabineverlichting aan/uit)
  #define lichtsterkte         200       // lichtsterkte (0-255)

  //MP3 speler (DFplayer)
  #define volume                22       // geluidsvolume (0-47)
  #define equalizer              0       // equaliser 0-5: normal, pop, rock, jazz, classic, base
  #define MP3monster             0       // bemonster intervaltijd MP3 speler (ms) (0 = geen)
  #define geluid                 1       // geluid altijd aan in map "01"
#endif
// === V160 @ DigiSpark ===
#if V160
  #define DigiSpark           true
// ----- pin definities ------
  #define rijPin1                1       // digitale pin voor PWM rijspanning richting 1 met LED
  #define rijPin2                4       // digitale pin voor PWM rijspanning richting 2

  #define MP3RX                  2       // serieel receive (van MP3 speler)
  #define MP3TX                  0       // serieel transmit (naar MP3 speler)
  //#define lichtPin               -        geen lichtfunctie DigiSpark

// ----- rijstroom en geluid/licht instellingen -----
  #define aantalSnelheden        3       // aantal snelheidsstappen loc
  #define pulsbreedtestil       19       // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax        61       // pulsbreedte waarbij de maximum snelheid wordt bereikt 

  #define geluidsfunctie5        5       // 005.mp3
  #define geluidsfunctie6        6       // 006.mp3
  #define lichtfunctie           0       // geen lichtfunctie
  #define lichtsterkte           0       // lichtsterkte (0-255)

  //MP3 speler (DFplayer)
  #define volume                32       // geluidsvolume (0-47)
  #define equalizer              1       // equaliser 0-5: normal, pop, rock, jazz, classic, base
  #define MP3monster             0       // bemonster intervaltijd MP3 speler (ms) (0 = geen)
  #define geluid                 1       // geluid altijd aan in map "01"
#endif

// === VT98 (RAILBUS) @ Arduino ===
#if VT98
  #define Arduino             true
// ----- pin definities ------
  #define rijPin1                6       // digitale pin voor PWM rijspanning richting 1 met LED
  #define rijPin2                7       // digitale pin voor PWM rijspanning richting 2

  #define MP3RX                  9       // serieel receive (van MP3 speler)
  #define MP3TX                  8       // serieel transmit (naar MP3 speler)
  #define lichtPin              11       // licht

// ----- rijstroom en geluid/licht instellingen -----
  #define aantalSnelheden        3       // aantal snelheidsstappen loc
  #define pulsbreedtestil       26       // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax        72       // pulsbreedte waarbij de maximum snelheid wordt bereikt 

  #define geluidsfunctie5        5       //
  #define geluidsfunctie6        0       // geen geluid (alleen lichtfunctie)
  #define lichtfunctie           6       // lichtfunctie op 6
  #define lichtsterkte         255       // lichtsterkte (0-255)

  //MP3 speler (DFplayer)
  #define volume                24       // geluidsvolume (0-47)
  #define equalizer              5       // equaliser 0-5: normal, pop, rock, jazz, classic, base
  #define MP3monster             0       // bemonster intervaltijd MP3 speler (ms) (0 = geen)
  #define geluid                 1       // geluid altijd aan in map "01"
#endif

// === GELUIDSWAGON (tot maximaal 6 geluiden sets) @ Arduino  ===
// geluidswagon werkt als volgt:
// Met functie 1 t/m 6 wordt de geluids-set aan gezet. Voor elke loc of treinstel is er een set (map) op de MP3 speler.
// Geluid kan worden uitgezet met functie nummer gedefinieerd met selecteerGeluidUit (standaard is dit functie 4),
// Om een andere loc te kiezen: zet het geluid uit, en druk vervolgens 1 seconde op de functietoets van de nieuwe loc.
// Zodra deze aan is, begint het startgeluid van de loc. Daarna werkt het rijgeluid en de geluidsfuncties.
// Let op: serieel TX/RX anders dan bij andere Arduino modules

#if geluidswagon   
  #define uitgebreidLicht        true    // meerdere lichtfuncties
  #define Arduino                true
// ----- pin definities ------
  #define rijPin1                6       // digitale pin voor PWM rijspanning richting 1
  #define rijPin2                7       // digitale pin voor PWM rijspanning richting 2

  #define MP3RX                  8       // serieel receive (van MP3 speler)
  #define MP3TX                  9       // serieel transmit (naar MP3 speler)
  #define lichtPin              10       // (PWM) pin voor licht (sluitlichten)
  #define lichtPin2             11       // (PWM) pin voor licht (binnenverlichting)


// ----- rijstroom en geluid/licht instellingen -----
  // loc 01: BR70
  #define aantalSnelhedenLoc01   8       // aantal snelheidsstappen loc
  #define pulsbreedtestil01     26       // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax01      64       // pulsbreedte waarbij de maximum snelheid wordt bereikt 
  // loc 02: BR38
  #define aantalSnelhedenLoc02   8       // aantal snelheidsstappen loc
  #define pulsbreedtestil02     30       // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax02      72       // pulsbreedte waarbij de maximum snelheid wordt bereikt 
  // loc 03: BR24
  #define aantalSnelhedenLoc03   5       // aantal snelheidsstappen loc
  #define pulsbreedtestil03     26       // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax03      56       // pulsbreedte waarbij de maximum snelheid wordt bereikt 
  // loc 04: V60
  #define aantalSnelhedenLoc04   2       // aantal snelheidsstappen loc
  #define pulsbreedtestil04     25       // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax04      45       // pulsbreedte waarbij de maximum snelheid wordt bereikt 
  // loc 05: V160
  #define aantalSnelhedenLoc05   3       // aantal snelheidsstappen loc
  #define pulsbreedtestil05     26       // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax05      56       // pulsbreedte waarbij de maximum snelheid wordt bereikt 
  // loc 06
  #define aantalSnelhedenLoc06   0       // aantal snelheidsstappen loc
  #define pulsbreedtestil06     22       // pulsbreedte in % waaronder loc stil staat
  #define pulsbreedtemax06      72       // pulsbreedte waarbij de maximum snelheid wordt bereikt 
  // gezamenlijke definities
  #define geluidsfunctie5        0       // (0 = geen functie)
  #define geluidsfunctie6        0       // (0 = geen functie)
  #define selecteerGeluidUit     4       // selecteer geluid uit met deze functie (geluid gaat weer aan met toets 1 t/m 6 per loc)
  #define lichtfunctie           5       // functie 5 is sluitlicht aan/uit
  #define lichtsterkte          20       // lichtsterkte (0-255)
  #define lichtfunctie2          6       // functie 6 is binnenverlichting aan/uit
  #define lichtsterkte2         50       // lichtsterkte (0-255)
  // MP3 speler (DFplayer)
  #define volume                18       // geluidsvolume (0-47)
  #define equalizer              1       // equaliser 0-5: normal, pop, rock, jazz, classic, base
  #define MP3monster             0       // bemonster intervaltijd MP3 speler (ms) (0 = geen)
#endif

// Frequenties (Periodes) op de rijstroom
#define rijPeriode            2020       // rijstroom puls in us
#if ATtiny
  #define functie_01_Periode  1350       // Periode (freq.) functie 1
  #define functie_02_Periode  1190       // Periode (freq.) functie 2
#else
  #define functie_01_Periode  1500       // Periode (freq.) functie 1
  #define functie_02_Periode  1250       // Periode (freq.) functie 2
#endif
#define functie_03_Periode     990       // Periode (freq.) functie 3
#define functie_04_Periode     790       // Periode (freq.) functie 4
#define functie_05_Periode     590       // Periode (freq.) functie 5
#define functie_06_Periode     450       // Periode (freq.) functie 6

// ----- ALGEMENE DEFINITIES -----

// technische definities MP3 speler
#define Start_Byte            0x7E
#define Version_Byte          0xFF
#define Command_Length        0x06
#define End_Byte              0xEF
#define Acknowledge           0x00

// Definities voor de elektronica
#define pullup               false       // geeft aan of de interne pullup weerstand gebruikt moet worden
#define maxpulsperiode        5000       // hoe lang wachten (minimaal 2x periode rijstroom PWM)
#if !MP3inittijd
  #define MP3inittijd         1000       // initialisatietijd MP3 speler (ms)
#endif
#if DigiSpark
  #define pulsruis              80       // maximaal verschil in gemeten Periodes (ruis)
  #define minhoog               90       // minimaal "hoog" signaal
#else
  #define pulsruis              70
  #define minhoog              100       // minimaal "hoog" signaal
#endif

// ---- libraries en objecten ----
  // kies juist serial bibliotheek voor Arduino c.q. Digispark
#if (DigiSpark)                          // DigiSpark definities
  #include <SoftSerial.h>                // SoftSerial en TinyPinChange voor DigiSpark               
  #include <TinyPinChange.h>
  SoftSerial MP3Serial(MP3RX, MP3TX);    // RX, TX
#else                                    // Arduino definities (ook voor ATTiny)
  #include <EEPROM.h>                    // EEPROM om licht aan/uit en geluid aan/uit te onthouden
  #include <SoftwareSerial.h>            // SoftwareSerial voor mp3 op Arduino
  SoftwareSerial MP3Serial(MP3RX, MP3TX);      // RX, TX
#endif


// --- CONSTANTES EN VARIABELEN---

// ----- voor alle configuraties -----
// rijstroom variabelen
int rijpin[] {rijPin1, rijPin2};
int vooruit = 1;                          // richting: bepaalt welke pin wordt uitgelezen voor de rijstroom puls
double pulsbreedteHoog;
double pulsbreedteLaag;
double pulsPeriode;
float pulsbreedte = 0;                    // pulsbreedte in %
int snelheid = 0;
int vorigeSnelheid = 0;
const float sqrtpbstil = 100*sqrt(10);    // basiswaarde omrekenen pulsbreedte naar snelheid

// variabelen voor speciale functies op de rijstroom
int functie = 0;                          // speciale functie frequentie gemeten
int lopendeFunctie = 0;                   // > 0 : er wordt een speciale functie uitgevoerd
int licht;                                // licht sterkte of uit (0);
int licht2;                               // licht sterkte of uit (0);
 
// variabelen voor de MP3 speler
int MP3speler;                            // geeft MP3 status aan (van MP3Status functie) 0=geen info, 1=klaar, 2=speelt, 4=fout
long unsigned int MP3count = 0;           // millis waarde om status MP3 speler op te vragen
int geluidsfunctie []  {geluidsfunctie1, geluidsfunctie2, geluidsfunctie3, geluidsfunctie4, geluidsfunctie5, geluidsfunctie6}; 


// ----- configuratie afhankelijk -----

// voor de geluidswagon zijn definities als array variabelen opgenomen, omdat deze per geluid set (loc) verschillend zijn.
// geluidsmodules voor een enkele loc of treinstel hebben deze waarden als een enkele, vaste definitie.
#if geluidswagon                          // geluidswagon tot 6 verschillende geluiden, andere slechts 1
  int aantalSnelheden[] {aantalSnelhedenLoc01, aantalSnelhedenLoc02, aantalSnelhedenLoc03, aantalSnelhedenLoc04,aantalSnelhedenLoc05, aantalSnelhedenLoc06};
  int pulsbreedtestil[] {pulsbreedtestil01, pulsbreedtestil02, pulsbreedtestil03, pulsbreedtestil04, pulsbreedtestil05, pulsbreedtestil06};
  int pulsbreedtemax[]  {pulsbreedtemax01,  pulsbreedtemax02,  pulsbreedtemax03,  pulsbreedtemax04,  pulsbreedtemax05,  pulsbreedtemax06 };
  int geluidAanteller = 0;                // teller om geluid aan te zetten (tijd tussen2x dezelfde functietoets indrukken)
  int geluid = 0;                         // geluid volgnummer (0 = uit)
  float sqrtpbmax[] {                     // maximale pulsbreedte omgerekend
    100*sqrt(10+pulsbreedtemax01 - pulsbreedtestil01),
    100*sqrt(10+pulsbreedtemax02 - pulsbreedtestil02),
    100*sqrt(10+pulsbreedtemax03 - pulsbreedtestil03),
    100*sqrt(10+pulsbreedtemax04 - pulsbreedtestil04),
    100*sqrt(10+pulsbreedtemax05 - pulsbreedtestil05),
    100*sqrt(10+pulsbreedtemax06 - pulsbreedtestil06),
  };
#else
  const float sqrtpbmax  = 100*sqrt(10+pulsbreedtemax - pulsbreedtestil);    // maximale pulsbreedte omgerekend
#endif


// --- FUNCTIES ---

// RIJSTROOM PULSMETING
// Meet de rijstroom op een van de pinnen en geeft vult de gemeten pulswaarden in.
void meetPuls() {
  // puls meting variabelen: lengte 'hoog', 'laag' en trillingstijd (periode). Alle tijden in us.
  pulsbreedteHoog = pulseIn(rijpin[vooruit], HIGH, maxpulsperiode);
  pulsbreedteLaag = pulseIn(rijpin[vooruit], LOW, maxpulsperiode );
  pulsPeriode = pulsbreedteHoog + pulsbreedteLaag;
}
// ===

// HERKEN FUNCTIE-FREQUENTIE
// functie voor het checken van functie-frequenties
// op de puls (functietoets).
int getFunctie () {
  int f = 0;
  if (abs (pulsPeriode - functie_01_Periode) < pulsruis) { f = 1;}
  if (abs (pulsPeriode - functie_02_Periode) < pulsruis) { f = 2;}
  if (abs (pulsPeriode - functie_03_Periode) < pulsruis) { f = 3;}
  if (abs (pulsPeriode - functie_04_Periode) < pulsruis) { f = 4;}
  if (abs (pulsPeriode - functie_05_Periode) < pulsruis) { f = 5;}
  if (abs (pulsPeriode - functie_06_Periode) < pulsruis) { f = 6;}
  return f;
}
//===

// START SPECIALE FUNCTIE
// Bekijkt of er een geluidsdefinitie is voor de opgegeven functie en start deze.
// Geeft terug of de geluidsfunctie gestart is (en moet blijven lopen).
// input:  functie nummer (1-6)
// output: functie nummer (als gestart), anders 0
int startFunctie(int f) {
  int lopen = 0;                   // volgende functie wacht op aflopen MP3 geluid
  //geluid afspelen?
  if (geluidsfunctie [f-1] > 0){   // geluid is gedefinieerd (0 = geen geluid)
    speelGeluid(geluid, geluidsfunctie [f-1]);
    lopen = f;                     // als er geluid is zet lopende functie
    delay (100);
   }
  return lopen;                    // 0 = niet wachten, > 0 is wachten op einde geluid 
}
//===


#if geluidswagon
// GELUID AAN of UIT ZETTEN
// alleen voor geluidswagon
// zet geluids volgnummer variable en slaat deze op.
// geluid 0 = geen geluid, 1-6 is volgnummer van map op MP3 speler
// input:  functie nummer.

bool geluidAanUit(int fun) {
  bool aanUit = false;
  if (geluid) {                                   // geluid staat al aan
    if (fun == selecteerGeluidUit) {              // functie: geluid uit
      speelGeluid (geluid, selecteerGeluidUit);   // speel afzet-geluid af
      geluid = 0;                                 // geluid gaat straks uit
      EEPROM.write(geluidadr,geluid);                     // onthou dat geluid uit is op EEPROM geheugen
      delay (2000);                               // geluid laten afspelen
      aanUit=true;                       
    } 
  }
  else {                                          // geluid is uit
    geluid = fun;
    if (geluid && aantalSnelheden[geluid-1] > 0) {    // er is een definitie voor deze loc (volgnummer)
      if (lopendeFunctie == geluid ) {            // starten als 2x dezelfde functie is gedetecteerd
        EEPROM.write(geluidadr,geluid);                   // zet gewenste loc aan
        speelGeluid (geluid, startgeluid);        // speel startgeluid af
        delay (1000);                             // even wachten
        aanUit=true;                             
      }
      else {                                      // deze functie 1e keer
        lopendeFunctie = geluid;                  // onthou deze functie
        geluid = 0;
        geluidAanteller = 50;
        delay (1000);                             // functietoets 1 seconde indrukken om geluid te starten
      }
    } else {
      geluid = 0;                                 // geen geluid of definitie
      if (geluidAanteller > 0) {
        geluidAanteller--;
      }
    }
  }
  return aanUit;
}
#endif


// GELUID AFSPELEN
// stuurt commando 'afspelen geluidsbestand' naar de MP3 speler
// input: - nummer van de map op SD kaart (0 = geen geluid)
//        - nummer van MP3 bestand
void speelGeluid(int mapnummer, int bestandnummer) {
  if (mapnummer) {                        // geluid staat aan (map > 0 )
    execute_CMD(0x0F, mapnummer, bestandnummer);
    delay(200);
#if probleemoplosser
    Serial.print("Geluidsbestand gestart: ");
    Serial.println(bestandnummer);
#endif
  }
}
//===

// START MP3 SPELER
// functie start de MP3 speler. Geeft eventueel eerst een reset.
// input:  reset y/n
void startMP3(boolean rst) {
#if probleemoplosser
  Serial.println("MP3 speler initialisatie");
#endif
  if (rst) {
    execute_CMD(0x0C, 0, 0);          // stuur reset commando
    delay (200);
  }
  execute_CMD(0x3F, 0, 0);            // initialiseer MP3 speler
  delay (MP3inittijd);                // wacht tot initialisatie klaar is
  execute_CMD(0x06, 0, volume);       // zet het geluidsvolumevolume
  delay (80);
  execute_CMD(0x07, 0, equalizer);    // equalizer
  delay (80);
}
//===


// STATUS VAN MP3 SPELER LEZEN
// output: 0 = geen info
//         1 = mp3 klaar (speelt niet)
//         2 = mp3 speelt
//         3 = fout
//         4 = onbekend
int MP3status () {
  int m = 4;                       // standaard: onbekend
  int t = 0;
  byte b;
  int bstat;                       // status byte
  int btrack;                      // bestand nummer
#if MP3monster
  if (  !MP3Serial.available() ) {        // nog niets ontvangen 
    if (MP3count < millis() ) {
       execute_CMD (0x42,0,0);            // query huidig bestand dat wordt afgespeeld
       MP3count = millis() + MP3monster;  // volgende MP3 'monster' tijdstip zetten
       delay (20);
     }
   }
#endif

  if (MP3Serial.available() > 9) {        // er is een bericht op de seriele bus
    while(MP3Serial.available()) {        // serieel uitlezen
      t++;
      b = MP3Serial.read();
      if (t == 4) {                       // dit is de status byte
        bstat = b;
      }
      if (t == 7) {                       // dit is het bestandsnummer
        btrack = b;
      }
      if (t == 10){                       // meer dan 1 bericht
        t=0;
      }
#if probleemoplosser
      Serial.print(b,HEX);
      Serial.print(".");
#endif
    }
#if MP3monster
    MP3count = millis() + MP3monster;     //  volgende MP3 'monster'
#endif
    switch (bstat) {
      case 0x3F:                    // initialisatie parameters ontvangen
        m = 1;                      // speler is klaar
      break;
      case 0x3D:                    // eind van een bestand
        m = 1;                      // speler is klaar
      break;
     
#if MP3monster
      case 0x42:                    // antwoord op status (monster)
        if (btrack > 0) {
          m = 2;                    // bestand speelt
        } else {
          m = 1;                    // er speelt geen bestand, speler is kaar
        }   
      break;
 #endif
 
      case 0x40:                    // fout in transmissie
        m = 3;                      // fout
      break;
    }
#if probleemoplosser
    Serial.print("|| MP3 antwoordbyte: ");
    Serial.print(bstat,HEX);
    Serial.print(" - Bestand#: ");
    Serial.print(btrack);
    Serial.print(", status: ");
    Serial.println(m);
#endif
  }
  return m;
}
//===

// SERIËLE COMMANDOS VERSTUREN
// Commando's naar MP3 speler versturen
void execute_CMD(byte CMD, byte Par1, byte Par2) // Excecute the command and parameters
{
  // Bereken checksum (2 bytes)
  int16_t checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);

  // Bouw het commando op
  byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge, Par1, Par2, checksum >> 8, checksum & 0xFF, End_Byte};

  // Verstuur commando naar MP3 speler
  for (byte k=0; k<10; k++)
  {
    MP3Serial.write( Command_line[k]);
  }
}
//===

// ----- HOOFDPROGRAMMA -----

// ----- initialisatie -----
void setup() {
  // versie en configuratie op seriele poort (monitor), alleen voor Arduino
#if Arduino
  Serial.begin(9600);
  Serial.print("GELUIDSMODULE versie "); Serial.println(versie);
  Serial.print("Pin configuratie: rijstroom op digitale pin ");
  Serial.print(rijpin[0]); Serial.print(" en "); Serial.print(rijpin[1]);
  Serial.print(", serieel tx/rx op pin ");
  Serial.print(MP3TX); Serial.print(" en "); Serial.println(MP3RX);
  Serial.print("MP3 instellingen: volume = ");
  Serial.print(volume); Serial.print(", equalizer = "); Serial.println(equalizer);
  Serial.print("MP3 inittijd (ms): "); Serial.print(MP3inittijd); Serial.print(", ");
  Serial.print("MP3 bemonstering (ms): "); Serial.println(MP3monster);
  Serial.println("-- einde configuratie info --");
  // lichtfunctie alleen voor Arduino, niet voor DigiSpark
  licht  = EEPROM.read(licht1adr);           // laatste licht waarde uit EEPROM
  pinMode     (lichtPin,OUTPUT);
  analogWrite (lichtPin,licht);              // licht aan of uit: waarde uit EEPROM
#endif

#if uitgebreidLicht                          // 2e lichtfunctie geïnstalleerd
  licht2 = EEPROM.read(licht2adr);           // laatste licht waarde uit EEPROM
  pinMode     (lichtPin2,OUTPUT);
  analogWrite (lichtPin2,licht2);            // licht aan of uit: waarde uit EEPROM
#endif

  // Alleen voor geluidswagon kan geluid worden aan en uitgezet.
#if geluidswagon
  geluid = constrain (EEPROM.read(geluidadr), 0, 6);          // laatste geluid waarde uit EEPROM (0 = geen geluid)
  if (geluid && aantalSnelheden [geluid - 1] == 0) {  // geen juiste waarde (bijvoorbeeld eerste opstart)
    geluid = 1;                             // zet bij ongeldige waarde het geluid volgnummer op "1".
    EEPROM.write (geluidadr,1);
  }
#endif


  // intialiseren pinnen en MP3speler
  pinMode     (rijpin[0],INPUT);
  digitalWrite(rijpin[0],pullup);
  pinMode     (rijpin[1],INPUT);
  digitalWrite(rijpin[1],pullup);
  delay (200);
 
  // geluidsmodule starten
  MP3Serial.begin(9600);                    // start seriele communicatie met MP3 speler           
  startMP3(false);                          // intialiseren volume en equaliser
#if (!geluidswagon)
  while (MP3status() != 1)  {               // wacht op bericht dat initialisatie klaar is
  }
#endif
  speelGeluid (geluid, startgeluid);        // speel startgeluid af
}

// ----- hoofdlus ------
void loop() {
  // Pulsbreedte bepalen
  do {
    vooruit = !vooruit;                     // wissel de pin waarop de rijstroom wordt gemeten
    meetPuls(); 
#if Arduino
  } while (pulsPeriode > rijPeriode + pulsruis || pulsbreedteHoog < minhoog  || pulsbreedteLaag < pulsruis);    // Arduino meet soms enig "laag" op passieve pin
#else
  } while (pulsbreedteHoog < minhoog);      // 'hoog' signaal alleen op actieve rijpin
#endif
//----
  MP3speler = MP3status();
  switch (MP3speler) { 
     
    case 1:                                        // bestand klaar (MP3 speelt niet)
      lopendeFunctie = 0;                          // er loopt dan geen speciale functie meer
      speelGeluid(geluid, snelheid + stationair);  // geluidsbestand vanaf stationair / stilstand
      vorigeSnelheid = snelheid;
      break;
           
    case 3:                                        // fout
      startMP3(true);                              // reset MP3 speler
      lopendeFunctie = 0;
      while (MP3status() != 1)  {                  // wacht op bericht dat initialisatie klaar is
      }
      break;

    default:                                       
      // MP3 speler speelt of er is geen info.
      // alleen een geluid starten bij:
      //    - starten van een speciale functie
      //    - snelheidswissel als er geen speciale functie loopt
      //    - en het geluid aan stat (kan bij geluidswagon worden uitgezet)
      functie = getFunctie();
      // speciale geluidsfunctie gevonden
      if (functie) {                               // functie toets ingedrukt
        // als speciale functie is gevonden, controleer de functie frequentie nogmaals.
        // Hiermee wordt onterecht starten van functie voorkomen (door bijvoorbeeld storing op de stroomopname).
        delay (5); 
        meetPuls();
        if (functie == getFunctie()) {

          // * Lichtfunctie
#if (!DigiSpark)                   // DigiSpark geen lichtfunctie
          if (functie == lichtfunctie) {
            if (licht == 0) {licht = lichtsterkte;} else { licht = 0;}  // wissel licht aan/uit op juiste sterkte
            analogWrite(lichtPin, licht); // zet licht aan (op dimwaarde) of uit
            EEPROM.write(licht1adr,licht);         // onthou licht aan of uit tot volgende opstart.
            delay (100);
          }
#endif
#if (uitgebreidLicht)               // 2e lichtfunctie
          if (functie == lichtfunctie2) {
            if (licht2 == 0) {licht2 = lichtsterkte2;} else { licht2 = 0;}  // wissel 2e licht aan/uit op juiste sterkte
            analogWrite(lichtPin2, licht2); // zet licht aan (op dimwaarde) of uit
            EEPROM.write(licht2adr,licht2);         // onthou licht aan of uit tot volgende opstart.
            delay (100);
          }
#endif
         // * Geluidsfuncties
#if !geluidswagon
          lopendeFunctie = startFunctie(functie);  // start het geluid
#else

          if (geluidAanUit(functie)){                  // geluidswagon kan geluid aan- en uitzetten
            lopendeFunctie = 0;
          }
          else {                                      // gewoon geluid alleen starten als geluid al aan was en blijft
            if (geluid){                             
              lopendeFunctie = startFunctie(functie);   // start het gewone geluid
            }
          }
#endif                                                 
        }
      }
      // rijgeluid (of stationair)
      pulsbreedte = 100 * pulsbreedteHoog / pulsPeriode;

#if geluidswagon
      if (geluid && pulsbreedte > pulsbreedtestil[geluid-1]) {   
        if (pulsbreedte > pulsbreedtemax[geluid-1]) {
          pulsbreedte = pulsbreedtemax[geluid-1];
        }
        // geluidsbestand berekenen: reken pulssbreedte % om naar geluidsbestand volgnummer
        snelheid = map(100 * sqrt (10+pulsbreedte-pulsbreedtestil[geluid-1]), sqrtpbstil, sqrtpbmax[geluid-1], 0, aantalSnelheden[geluid-1]); 
#else
      if (pulsbreedte > pulsbreedtestil) { 
        if (pulsbreedte > pulsbreedtemax) {
          pulsbreedte = pulsbreedtemax;
        }
        // geluidsbestand berekenen: reken pulssbreedte % om naar geluidsbestand volgnummer
       snelheid = map(100 * sqrt (10+pulsbreedte-pulsbreedtestil), sqrtpbstil, sqrtpbmax, 0, aantalSnelheden);  // reken pulssbreedte % om naar geluidsbestand
#endif
        if (vorigeSnelheid != snelheid && !lopendeFunctie) {      // snelheidswissel bij lopend geluid en geen speciale functie bezig
          speelGeluid(geluid, snelheid + stationair);             // rijgeluid: geluidsbestand vanaf stationair / stilstand
          vorigeSnelheid = snelheid;
        }
      }
  }                                                // einde case switch
}


De aansluitschema's voor geluid en licht met de Arduino.

(http://www.xs4all.nl/~robvd/Forum/SchemaModule1.jpg)


Hier het schema met ATtiny, zonder licht. De Digispark wordt op eenzelfde manier aangelsoten.

(http://www.xs4all.nl/~robvd/Forum/SchemaModule4.jpg)


En natuurlijk maakt deze module pas geluid met MP3 bestanden. Een zip bestand met geluiden voor de BR24 (of BR64), BR38, BR50, BR57, BR70, BR78, V60, V100, V160 en VT98. Het bestand kun je hier downloden
http://www.xs4all.nl/~robvd/Forum/DB_Geluidsets.zip (http://www.xs4all.nl/~robvd/Forum/DB_Geluidsets.zip)

(lichtmodule in volgend bericht)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 22 oktober 2018, 22:16:12
De lichtmodule

De lichtmodule gebruikt 2 pinnen met PWM (pulsbreedte) om het licht te schakelen. Zo kan de lichtsterkte in de software worden gedimd als het te fel is. De sketch:

/*
 * MODELTREIN LICHTMODULE
 * Schakelbaar licht voor de modeltrein, voor binneverlichting, sluitverlichting en meer.
 *
 * Rijstroom met pulsbreedtebesturing is nodig: met veranderingen van de pulsfrequentie worden
 * de lichtfuncties bestuurd.
 *
 * versie 0.2 - 19 sep 2018
 *
 * Notities:
 * voor Digispark EEPROM gebruik moet de library worden gekopieerd van
 * C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\EEPROM\
 * naar
 * C:\Users\{user.name}\AppData\Local\Arduino15\packages\digistump\hardware\avr\1.6.5\libraries\EEPROM\
 *
 * Voor gebruik losse ATtiny: Bootloader branden met BOD op 4.3V en clock op 16 MHz 
 */


// --- DEFINITIES ----

// Pinnen
#define lichtPin      0                // pin1 voor aansturen van licht: PWM pin (dimbaar licht)
#define lichtPin2     1                // 2e lichtpin
#define rijPin1       3                // rijstroom meting
#define rijPin2       4                // rijstroom meting

// definities voor licht
#define lichtfunctie           5       // functie 5 is sluitlicht aan/uit
#define lichtsterkte          20       // lichtsterkte (0-255)
#define lichtfunctie2          6       // functie 6 is binnenverlichting aan/uit
#define lichtsterkte2         50       // lichtsterkte (0-255)

// EEPROM geheugenlocaties
#define licht1adr                0
#define licht2adr                1

// definities voor de meting van de rijstroom
#define pullup               false     // geeft aan of de interne pullup weerstand gebruikt moet worden
#define maxpulsperiode       5000      // hoe lang wachten (minimaal 2x periode rijstroom PWM)

// Frequenties (Periodes) op de rijstroom
#define rijPeriode            2020     // rijstroom puls in us
#define functie_01_Periode    1500     // Periode (freq.) functie 1 - niet gebruikt (geluid)
#define functie_02_Periode    1250     // Periode (freq.) functie 2 - niet gebruikt (geluid)
#define functie_03_Periode     990     // Periode (freq.) functie 3 - niet gebruikt (geluid)
#define functie_04_Periode     790     // Periode (freq.) functie 4 - niet gebruikt (geluid)
#define functie_05_Periode     590     // Periode (freq.) functie 5 - licht 1
#define functie_06_Periode     450     // Periode (freq.) functie 6 - licht 2
#define pulsruis                70     // maximaal verschil in gemeten Periodes (ruis)
#define minhoog                100     // minimaal "hoog" signaal


// ---- libraries en objecten ----
#include <EEPROM.h>                    // EEPROM om licht aan/uit en geluid aan/uit te onthouden

// --- CONSTANTES EN VARIABELEN---

// rijstroom variabelen
int rijpin[] {rijPin1, rijPin2};
int vooruit = 1;                          // richting: bepaalt welke pin wordt uitgelezen voor de rijstroom puls
double pulsbreedteHoog;
double pulsbreedteLaag;
double pulsPeriode;

// variabelen voor speciale functies op de rijstroom
int functie = 0;                          // speciale functie frequentie gemeten
int licht;                                // licht sterkte of uit (0);
int licht2;                               // licht sterkte of uit (0);


// --- FUNCTIES ---

// MEET DE PULS OP DE RiJSTROOM
void meetPuls() {
  // puls meting variabelen: lengte 'hoog', 'laag' en trillingstijd (periode). Alle tijden in us.
  pulsbreedteHoog = pulseIn(rijpin[vooruit], HIGH, maxpulsperiode);
  pulsbreedteLaag = pulseIn(rijpin[vooruit], LOW, maxpulsperiode );
  pulsPeriode = pulsbreedteHoog + pulsbreedteLaag;
}

// HERKEN FUNCTIE-FREQUENTIE
// functie voor het checken van functie-frequenties
// op de puls (functietoets).
int getFunctie () {
  int f = 0;
 
  if (abs (pulsPeriode - functie_01_Periode) < pulsruis) { f = 1;}
  if (abs (pulsPeriode - functie_02_Periode) < pulsruis) { f = 2;}
  if (abs (pulsPeriode - functie_03_Periode) < pulsruis) { f = 3;}
  if (abs (pulsPeriode - functie_04_Periode) < pulsruis) { f = 4;}
  if (abs (pulsPeriode - functie_05_Periode) < pulsruis) { f = 5;}
  if (abs (pulsPeriode - functie_06_Periode) < pulsruis) { f = 6;}

  return f;
}


// ----- HOOFDPROGRAMMA -----

// ----- initialisatie -----
void setup() {

  // intialiseren rij pinnen
  pinMode     (rijpin[0],INPUT);
  digitalWrite(rijpin[0],pullup);
  pinMode     (rijpin[1],INPUT);
  digitalWrite(rijpin[1],pullup);

  delay(100);                                // even wachten op opladen elco (stabiele voeding)

  // bij opstarten de opgeslagen licht status gebruiken
  licht  = EEPROM.read(licht1adr);           // laatste licht waarde uit EEPROM
  pinMode     (lichtPin,OUTPUT);
  analogWrite (lichtPin,licht);              // licht aan of uit: waarde uit EEPROM

  licht2 = EEPROM.read(licht2adr);           // laatste licht waarde uit EEPROM
  pinMode     (lichtPin2,OUTPUT);
  analogWrite (lichtPin2,licht2);            // licht aan of uit: waarde uit EEPROM
}

// ----- hoofdlus ------
void loop() {
  // Pulsbreedte bepalen
  do {
    vooruit = !vooruit;                     // wissel de pin waarop de rijstroom wordt gemeten
    meetPuls(); 
  } while (pulsbreedteHoog < minhoog || pulsbreedteLaag < pulsruis); // 'hoog' signaal alleen op actieve rijpin
 
  functie = getFunctie();
 
  // speciale geluidsfunctie gevonden
  if (functie) {
    // als speciale functie is gevonden, controleer de functie frequentie nogmaals.
    // Hiermee wordt onterecht meten voorkomen (door bijvoorbeeld storing op de stroomopname).
    delay (5);                                   // korte pauze tussen de metingen
    meetPuls();
    if (functie == getFunctie()) {               // nog steeds dezelfde funtie op de rijstroom
      switch (functie) {   

        case lichtfunctie:
          if (licht == 0) {licht = lichtsterkte;} else { licht = 0;}  // wissel licht aan/uit op juiste sterkte
          analogWrite(lichtPin, licht); // zet licht aan (op dimwaarde) of uit
          EEPROM.write(licht1adr,licht);         // onthou licht aan of uit tot volgende opstart.
          delay (500);
        break;
        case lichtfunctie2:
          if (licht2 == 0) {licht2 = lichtsterkte2;} else { licht2 = 0;}  // wissel 2e licht aan/uit op juiste sterkte
          analogWrite(lichtPin2, licht2);         // zet licht aan (op dimwaarde) of uit
          EEPROM.write(licht2adr,licht2);         // onthou licht aan of uit tot volgende opstart.
          delay (500);
        break;
      }
    }
  }
}

Tot zover het overzicht.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 23 oktober 2018, 18:53:21
Hallo Rob,

Ik heb nog eens even zitten terug kijken en vind die geluiden echt geweldig, zeker die met Arduino licht en mp3 geluid.
Zodra de kolenmijn klaar is ga ik eerst over op pulsbreedte besturing en dan in de grote locs geluid inbouwen.

Groeten mark
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 28 oktober 2018, 00:26:21
OK Mark, Ik ben benieuwd.

Ondertussen was ik voor mijn werk een paar dagen in Rödermark (bij Frankfurt) deze week. In de avonduurtjes op de hotelkamer nog wat op youtube zitten kijken. Daar kwam ik een oud MIBA anlagenreport tegen van een spoor 0 baan met geluid van voordat er MP3 spelers waren. De diesels ratelden hun rondjes met een soort van takke-takke-takke geluiden.

Dat bracht mij op een idee. Zou dit kunnen?

Dieselgeluid zonder MP3 speler

Vanavond eens wat zitten prutten met een tot diesel aangepaste stoom ruisgenerator sketch.



Met name die hoge toon wil ik er nog uit halen, maar het geluid lijkt in de verte al wat op een verbrandingsmotor...

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 28 oktober 2018, 13:20:42
Wauw Rob ... ik schiet ineens ook weer wakker. :o Misschien is dat ook wel wat voor mij. Ik laat je eerst de moeilijkheden oplossen en dan maak ik daar misschien graag weer gebruik van. ;D
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 28 oktober 2018, 17:08:13
Natuurlijk, Pierre

Wauw Rob ... ik schiet ineens ook weer wakker. :o Misschien is dat ook wel wat voor mij. Ik laat je eerst de moeilijkheden oplossen en dan maak ik daar misschien graag weer gebruik van. ;D
Je had inderdaad ook nog wat dieseltjes. Verstandig, hoor, om gewoon even af te wachten  :-X

Ondertussen zijn de eerste hobbels al genomen: Het geluid is wat doffer gemaakt met een extra Elco'tje tussen de basis van de transistor en de massa.  verder is de frequentie-verandering van elke slag omgedraaid: bij de stomers neemt die af, bij de diesel juist toe. Dat klinkt al weer wat beter.
En er is al een programma'tje dat de motor start als er stroom op de geluidsmodule komt en met de rijstroom het geluid van stationair naar rijden kan schakelen, en weer terug.
Met de functietoetsen (maar daar heb jij niets aan  :( ), is de motor ook weer af te schakelen.

Nu eerst maar eens serieus op zoek naar wat ruimte in die V60.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 28 oktober 2018, 22:02:03
Nou, de kogel is door de kerk: geluid in de V60, ik ga er voor.

Eerst de loc maar eens ontleden: onderstel met aandrijving, omloop, ballast, inrichting cabine en kap.

(http://www.xs4all.nl/~robvd/Forum/V60_01.jpg)


De loc is al flink dichtgebouwd door de Oostenrijkers. De kap klikt op het ballast blok en het geheel wordt vastgeschroefd met schroeven die in dat blok vast zitten. Dat wordt nog zoeken om, zonder de constructie geweld aan te doen, delen weg halen om ruimte te maken voor de geluidsmodule.

(http://www.xs4all.nl/~robvd/Forum/V60_02.jpg)


Dus maar stukje voor stukje: eerst de speaker. Aan de onderzijde is er geen plek voor. Ik heb overwogen het rooster vooraan de loc open te maken, maar die is erg fijn weergegeven en dat gaat niet meevallen om onopvallend spleetjes te maken voor het geluid. En het zit wel erg in het zicht... Hoe de loc er ut ziet vind ik toch ook wel belangrijk.
Dan maar ergens in de cabine. Als er een paar ramen open worden gezet moet het geluid weg kunnen. Ik maak een gat in het bedieningspaneel van de machinist, daar komt de speaker onder.

(http://www.xs4all.nl/~robvd/Forum/V60_03.jpg)

(http://www.xs4all.nl/~robvd/Forum/V60_04.jpg)


Nu nog even puzzelen welk ramen open gaan, en hoe dat netjes te doen.
En dan verder zoeken waar de rest van de geluidsmodule onderdelen kunnen worden ondergebracht. Eerst maar eens een nachtje over slapen.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 14 november 2018, 21:59:55
Het is druk met werk en andere zaken, maar tussendoor wat tijd gevonden om verder te werken aan een goed dieselgeluid.
Op enig moment had ik een V60 die stond te knetteren als een Dragracer aan de start...  :o
Dat moest dus anders. Flink zitten experimenteren met manieren om goed geluid uit de ATtiny te krijgen. Ondertussen kan ik in de software de vorm van de geluidsgolf definiëren: het is geen HiFi geluid, maar goed genoeg voor een soort van diesel en zelfs het geluid van een hoorn. En dat gaat zonder extra componenten. Er is wel een grotere speaker nodig om het geluid goed te kunnen horen.

Dus vandaag begonnen om de puzzel van de geluidsmodule in de V60 te maken.

De treeplanken er op, en de balast er af...

(http://www.xs4all.nl/~robvd/Forum/V60_05.jpg)


En dan kan langzamerhand de geluidsmodule om de aandrijving heen gesoldeerd worden....

(http://www.xs4all.nl/~robvd/Forum/V60_06.jpg)


Wordt vervolgd...

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 15 november 2018, 10:00:59
Lekker prutsen en puzzelen Rob. Grandioos! ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 19 november 2018, 21:55:02
Dank, Pierre.

Afgelopen dagen had ik wat tijd om de V60 af te maken. De geluidsmodule hardware is hetzelfde gebleven als die voor stoomlocs wordt gebruikt (met ruisgenerator). Alleen de software is dus anders geworden.

Het programma is klein genoeg, zodat deze ook op een DigiSpark kan draaien. Hier wordt echter een losse ATtiny gebruikt.

V60 dieselgeluid zonder MP3 speler: De Flim.



Zoals in de video al vermeld: het geluid is een compromis tussen diesel geluid, iets dat je kunt horen en acceptabel stroomverbruik. Daarmee is het geluid vrij 'scherp'. Maar al met al niet ontevreden... ik ben vooral ook blij met de hoorn. Lekker toeteruh.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 26 november 2018, 12:36:32
De V60 krijgt een 2e versnelling

Nou ja, het is een natuurlijk een diesel-hydraulische loc, maar ook die kan wat extra gas geven,
Ik was nog niet helemaal tevreden met het rij-geluid van de V60: de motor draaide bij het rijden voor mijn gevoel te traag. De sketch is nu nog wat aangepast, zodat de 'motor' een hoger toerental krijgt bij het verhogen van de rijstroom, en weer een lager toerental wanneer de rijstroom wat wordt teruggedraaid.

Dat levert dan versie 1.0 van de software voor de diesel zonder MP3 speler op.

/*
 * DIESEL GELUIDSMODULE
 * Werkt met eigen PWM (rond 10 kHz) voor 7 staps speaker volume.
 * Golfvorm wordt gedefinieeerd in array, met stappen van 4: waardes van 0 t/m 24
 *
 * Versie 1.0, 25 november 2018 - Rob van Deursen
 */
// --- DEFINITIES ----

// kies de loc om te compileren: zet precies één definitie op 'true'
 
#define V60  true                      // @ ATtiny (los). Bootloader branden met BOD op 2.7V en clock op 16 MHz                     

#if V60
  #define ATtiny          true         // V60 @ ATtiny
  #define ruisPin            0         // pin voor aansturen van speaker
  #define rijPin1            1         // rijstroom meting
  #define rijPin2            4         // rijstroom meting
  #define statGolf          83         // aantal stappen in stationaire golf (-1)
  #define statStap        5500         // us per golf stap (stationair)
  #define rijdGolf72        71         // aantal stappen bij rijden golf (-1)
  #define rijdGolf60        59         // aantal stappen bij rijden golf (-1)
  #define rijdGolf54        53         // aantal stappen bij rijden golf (-1)
  #define rijdGolf48        47         // aantal stappen bij rijden golf (-1)
  #define rijdStap        5500         // us per golf stap (rijden)
  // berekening snelheid
  #define pulsbreedtestil   30         // pulsbreedte in % waaronder loc stil staat / stationair geluid

#endif

// definities voor de meting van de rijstroom
#define pullup               false     // geeft aan of de interne pullup weerstand gebruikt moet worden
#define maxpulsperiode       2750      // hoe lang wachten (minimaal 2x periode rijstroom PWM)

// Frequenties (Periodes) op de rijstroom
#define rijPeriode            2020     // rijstroom puls in us
#if ATtiny
//  #define functie_01_Periode  1350     // Periode (freq.) functie 1
  #define functie_01_Periode  1400     // Periode (freq.) functie 1
  #define functie_02_Periode  1190     // Periode (freq.) functie 2
#else
  #define functie_01_Periode  1500     // Periode (freq.) functie 1
  #define functie_02_Periode  1250     // Periode (freq.) functie 2
#endif
#define functie_03_Periode     990     // Periode (freq.) functie 3
#define functie_04_Periode     790     // Periode (freq.) functie 4
#define functie_05_Periode     590     // Periode (freq.) functie 5 - niet gebruikt
#define functie_06_Periode     450     // Periode (freq.) functie 6 - niet gebruikt
#define pulsruis                80     // maximaal verschil in gemeten Periodes (ruis)
#define minhoog                100     // minimaal "hoog" signaal
#define pulsbreedteStap          3.0   // verschil in pulsbreedte om op- of terug te schakelen met rijgeluid

// --- VARIABELEN ---

// rijstroom variabelen
int rijpin[] {rijPin1, rijPin2};
int vooruit = 1;                       // richting: bepaalt welke pin wordt uitgelezen voor de rijstroom puls
double pulsbreedteHoog;
double pulsbreedteLaag;
double pulsPeriode;
float pulsbreedte = 0;                 // pulsbreedte in %
int functie = 0;                       // speciale functie frequentie gemeten
float vorigePulsbreedte = 30;          // laatste pulsbreedte - wordt gebruikt om motorgeluid te regelen.
int   pbv = 0;                         // pulsbreedteverschil       

// reeksen voor geluidsgolven
// Starten:
byte dieselStrt84 [] { 0,  0, 16, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 20, 24,  0,  0,  0,  0,  0,  0, 12,  8,  4,  0,  0,  0,  8,  12, 16, 20,  0,  0,  0, 24, 12, 16,  4,  0,  4,  0,  0,  8, 24,  0,  0,  0,  8,  0,  24, 12,  4,  0,  0,  4,  8, 20, 24,  0,  0,  0,  0,  0, 20, 12,  4,  0,  0,  8,  0, 12, 20, 24, 12,  0,  0, 20, 12,  0,  0 };
//   golf#            1                          2                           3                           4                           5                           6                            7                           8                            9                           10                          11                          12                       
// Stationair:
byte dieselStat84 [] { 0,  0, 12, 24, 12, 24,  0,  0,  0, 24, 24,  8,  4,  0,  0,  4, 12,  0, 16, 24,  0,  0, 16, 24, 12,  8,  4,  0,  0,  0,  8,  4,  8, 12,  0,  0,  0,  16,  8, 12,  4,  0,  4,  0,  0,  8, 16,  0,  0,  0,  4,  0,  16, 12,  4,  0,  0,  4,  8,  4, 16,  0,  0,  0,  0,  0, 12,  8,  4,  0,  0,  4,  0,  8, 12, 16, 12,  0,  0, 16,  8,  0,  0 };
//   golf#            1                          2                           3                           4                           5                           6                            7                           8                            9                           10                          11                          12                       
// Rijden:
byte dieselRijd72 [] { 0,  4,  8, 12, 24,  0,  0, 24, 16,  8,  4,  0,  0,  4, 12, 16, 24,  0,  0, 24, 20, 12,  8,  0,  0,  8, 12, 20, 24,  0,  0,  24, 16, 12,  4,  0,  0,  8, 16, 20, 24,  0,  0, 24, 16, 12,  4,  0,  0,  8, 12, 16,  24,  0,  0, 24, 20, 12,  4,  0,  0,  4,  12, 20, 24,  0,  0,  24, 20,  12,  8,  0 };
byte dieselRijd54 [] {     0,  0, 12, 24,      0, 24, 16,  0,  0,          0,  0, 16, 24,      0, 24, 20,  0,  0,          0,  8, 20, 24,      0,  24, 16,  0,  0,          0,  4, 20, 24,      0, 24, 16,  0,  0,          0,  0, 16,  24,      0, 24, 20,  0,  0,          0,   4, 20, 24,      0,  24, 20,   0,  0     };
//   golf#            1                      2                       3                       4                       5                       6                        7                       8                        9                       10                      11                      12                       
// Niet gebruikte golfvormen voor rijden:
//byte dieselRijd60 [] { 0,  0,  0, 12, 24,      0, 24, 16,  0,  0,      0,  0,  0, 16, 24,      0, 24, 20,  0,  0,      0,  0,  8, 20, 24,      0,  24, 16,  0,  0,      0,  0,  4, 20, 24,      0, 24, 16,  0,  0,      0,  0,  0, 16,  24,      0, 24, 20,  0,  0,      0,  0,   4, 20, 24,      0,  24, 20,   0,  0     };
//byte dieselRijd48 [] {     0,  0, 12, 24,      0, 24, 16,  0,              0,  0, 16, 24,      0, 24, 20,  0,              0,  8, 20, 24,      0,  24, 16,  0,              0,  0, 16, 24,      0, 24, 16,  0,              0,  0, 12,  24,      0, 24, 20,  0,              0,   0, 16, 24,      0,  24, 12,   0         };

// Hoorn (vol volume, half volume):
byte hoorn [] { 12,  4, 12, 24, 16, 12, 24,  0};
byte hoorn2[] {  8,  0,  8, 16, 12,  8, 16,  0};

// overige variablen
int t = 0;                            // index geluidsreeks (array)
int gs;                               // waarde geluidsstap
int d = statStap;                     // vertraging afspelen geluidswaarden (us)
bool stationair = true;
bool gas        = false;
unsigned long u;                      // microseconden
unsigned long m;                      // milliseconden

// --- FUNCTIES ---

// PULSBREEDTE 0-24, ROND 10 kHz
// in stappen van 4. Voor afspelen van geluidsgolven.
// na het verloop van de gewensde tijdsfuur staat de PWM uit.
// input: pin waarop PWM wordt gezet
//        waarde van PWM , 7 stappen van 0-24 (0 = uit, 24 = maximaal)
//        tijdsduur van PWM waarde (in us)
void microPWM (int pin,int  pwm, int tim) {
  unsigned long mics = micros() + tim;
  do  {
    digitalWrite (pin,HIGH);
    delayMicroseconds (pwm);
    digitalWrite (pin,LOW);
    delayMicroseconds (24-pwm);
  } while (micros() <= mics);
}

// SPEEL GELUIDSGOLF AF
// input: reeks voor golfvorm
//        aantal stappen in de golfvorm reeks
//        tijdsduur van elke stap in us
//        aantal herhalingen
void speelGolf (byte golf[], int stappen, int usec, int herhaal){
  int           g;
  unsigned long w;
  //int           us = usec;
  for (int y = 0; y < herhaal ; y++){
    for (int x = 0; x < stappen ; x++) {
      g = golf[x];
      microPWM(ruisPin, g , usec);
    }
  }
}
// MEET DE PULS OP DE RIJSTROOM
void meetPuls() {
  // puls meting variabelen: lengte 'hoog', 'laag' en trillingstijd (periode). Alle tijden in us.
  pulsbreedteHoog = pulseIn(rijpin[vooruit], HIGH, maxpulsperiode);
  pulsbreedteLaag = pulseIn(rijpin[vooruit], LOW, maxpulsperiode );
  pulsPeriode = pulsbreedteHoog + pulsbreedteLaag;
}

// HERKEN FUNCTIE-FREQUENTIE OP DE RIJSTROOM
// functie voor het checken van functie-frequenties
// op de puls (functietoets).
int getFunctie () {
  int f = 0;
 
  if (abs (pulsPeriode - functie_01_Periode) < pulsruis) { f = 1;}
  if (abs (pulsPeriode - functie_02_Periode) < pulsruis) { f = 2;}
  if (abs (pulsPeriode - functie_03_Periode) < pulsruis) { f = 3;}
  if (abs (pulsPeriode - functie_04_Periode) < pulsruis) { f = 4;}

  return f;
}

// FUNCTIE: WACHTEN EN TERWIJL RIJSTROOM METEN
int wachtEnMeet() {
  int fu = 0;
  u = micros() + d;
  d = random (rijdStap, rijdStap+300);

  vooruit = !vooruit;                     // wissel de pin waarop de rijstroom wordt gemeten
  meetPuls(); 
  if (pulsbreedteHoog > minhoog && pulsbreedteLaag > pulsruis) {
    pulsbreedte = 100 * pulsbreedteHoog / pulsPeriode;
    stationair = (pulsbreedte <= pulsbreedtestil);         // stationair / rijden
    fu = getFunctie();
  }
  while (micros() < u) {
    ; 
  }
  return fu;
}

// SPEEL GELUIDSFUCTIE
// input: nummer van de geluidsfunctie
void speelFunctie(int gf) {
  switch (gf) {
    case 1:
      // lange hoorn
      speelGolf (hoorn2, 8, 300, 20 );
      speelGolf (hoorn , 8, 300, 540);
      speelGolf (hoorn2, 8, 308, 50 );
    break;

    case 2:
      // korte hoorn
      speelGolf (hoorn2, 8, 300, 20 );
      speelGolf (hoorn , 8, 300, 150);
      speelGolf (hoorn2, 8, 308, 50 );
    break;
   
    case 3:
      // remgeluid: 2,4 seconde
      m = millis() +2400;
      while (millis() < m) {
        microPWM (ruisPin, 12*random (0,2), random (4, 33));
        delayMicroseconds (190 + random (65));
      }
    break;

    case 4:
      // motor afzetten
      speelGolf (dieselStrt84, 83, 5200, 1);
      speelGolf (dieselStrt84, 83, 6900, 1);
      speelGolf (dieselStrt84, 27, 8300, 3);
      speelGolf (dieselStrt84, 27, 9500, 1);
      delay (5000);
    break;
  }
}

// --- INITIALISATIE ---
// Achtereenvolgens wordt het volgende uitgevoerd:
// Alle pinnen goed zetten (input, output)
// motor starten als de  loc nog niet rijdt.
void setup() {
  // Pinnen initialiseren
  pinMode (    ruisPin, OUTPUT);
  digitalWrite (ruisPin, LOW);
  pinMode      (rijpin[0],INPUT);
  digitalWrite (rijpin[0],pullup);
  pinMode      (rijpin[1],INPUT);
  digitalWrite (rijpin[1],pullup);
  delay(150);
   
  //meet de rijstroom op beide pinnen om te kijken of er gereden wordt
  for (t=0; t < 4; t++) {
    meetPuls(); 
    if (pulsbreedteHoog > minhoog && pulsbreedteLaag > pulsruis) {
      pulsbreedte = 100 * pulsbreedteHoog / pulsPeriode;
      stationair = (pulsbreedte <= pulsbreedtestil);         // stationair / rijden
    }
    vooruit = !vooruit;                     // wissel de pin waarop de rijstroom wordt gemeten
  }
  if (stationair) {
    //Loc staat stil: start de motor
    speelGolf (dieselStrt84, 27, 8300, 5);
    speelGolf (dieselStrt84, 83, 6700, 1);
    speelGolf (dieselStrt84, 83, 5200, 1);
  }
}

// --- HOOFPROGRAMMA ---
// Het hoofdprogramma speelt het motor geluid af, stationair of rijden.
// Tussendoor wordt de rijstroom gemeten voor snelheidswisseling en
// speciale geluidsfuncties.
// Het geluid wisselt tussen stationair en rijden, afhankelijk van de rijstroom
// als een geluidsfunctie wordt geregistreerd, wordt die ook afgespeeld.

void loop() {
  if (stationair) {
    // stationar geluid
    gas = false;
    vorigePulsbreedte = pulsbreedtestil;
    for (t = 0; t < statGolf ; t++) {
      gs = dieselStat84[t];
      if (gs) {
        microPWM(ruisPin, gs , d);
      }
      else {
        functie = wachtEnMeet(); 
        // bij stilstand 1x functie meten. Minder contact storingen
        if (functie) {
          speelFunctie(functie) ;
        }
      }
    }
  }
  if (!stationair) {
  // geluid bij rijden: in 2 trappen
    pbv = pulsbreedte - vorigePulsbreedte;
   if (pbv > pulsbreedteStap) {
      gas = true;
      vorigePulsbreedte = pulsbreedte;
    }
    if (pbv < -pulsbreedteStap) {
      gas = false;
      vorigePulsbreedte = pulsbreedte;
    }
    if (!gas) {
      for (t = 0; t < rijdGolf72 ; t++) {
        gs = dieselRijd72[t];
        if (gs) {
          microPWM(ruisPin, gs , d);
        }
        else {
          if (wachtEnMeet() ) {   
            // bij rijden 2x functie meten om contactstoringen te vermijden
            meetPuls(); 
            if (pulsbreedteHoog > minhoog && pulsbreedteLaag > pulsruis) {
              functie = getFunctie();
            }
            if (functie) {
              speelFunctie(functie) ;
            }
          }
        }
      }
    }
    else {
     for (t = 0; t < rijdGolf54 ; t++) {
        gs = dieselRijd54[t];
        if (gs) {
          microPWM(ruisPin, gs , d);
        }
        else {
          if (wachtEnMeet() ) {   
            // bij rijden 2x functie meten om contactstoringen te vermijden
            meetPuls(); 
            if (pulsbreedteHoog > minhoog && pulsbreedteLaag > pulsruis) {
              functie = getFunctie();
            }
            if (functie) {
              speelFunctie(functie) ;
            }
          }
        }
      }   
    }
  }             
}

Ik heb nog een filmpje gemaakt van de V60 op station "Klütz".



Deze loc werkt best fijn zo op dit eindstation. Ik denk dat ik tegenover de kolenbunker nog een klein dieseltankstation ga maken. Maar daarover volgt dan verder bericht in een ander draadje...

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 26 november 2018, 15:04:49
Weer een klus geklaard Rob. Prachtig werk. ;)  Is het schema hetzelfde als voor de stomers?
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 26 november 2018, 15:28:42
Zo is het, Pierre. Bedankt.

Is het schema hetzelfde als voor de stomers?
Yep, dezelfde hardware als voor de stomers. Let alleen even op de gebruikte pinnen: ik wissel ze nog wel eens afhankelijk van wat het beste past. Maar die definieer je hier:
  #define ruisPin            0         // pin voor aansturen van speaker
  #define rijPin1            1         // rijstroom meting
  #define rijPin2            4         // rijstroom meting
Mocht je ooit een dieseltje doen, dan moeten nog wel de extra geluidsfuncties uit deze sketch worden weggehaald. Anders loop je de kans dat bij jouw rijstroomregeling het gewone rijden niet werkt. Maar dat is simpel te doen, hoor: heb ik bij de sketch voor je stomers ook gedaan ;D

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Wim Corduwener op 26 november 2018, 15:42:13
Naast het fraaie geluid van díe diesel vind ik het geluid van die ongeïsoleerde rails ook wel wat hebben. Bij elkaar klinkt het heel levensecht.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 26 november 2018, 16:12:07
Dank je, Wim.
Ik heb inderdaad geen geluidisolatie onder de rails liggen op deze module voor het eindstation. Er wordt hier altijd langzaam gereden.
En nu je me daar op wijst: de diesel klinkt hier ook wat luider dan op mijn andere station (op de vaste baan), waar de rails op piepschuim ligt...

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Wim Corduwener op 26 november 2018, 19:17:46
Is ook wel een beetje logisch: doordat je rails niet geïsoleerd is wordt via de rails het geluid overdragen naar je ondergrond en wordt je ondergrond een soort van geluidsdrager.
Daarbij vind ik dat het kedengedeng, kedengedeng-geluid ook bij een (model)spoorbaan hoort.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 26 november 2018, 21:42:51
Ik vind het zeker niet storend, zelfs nog wat extra’s toevoegen aan de levendigheid van de baan.
Een heel geslaagd project naar mijn mening.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 26 november 2018, 23:55:32
Hoi Mark,
Bedankt.
Het project is nu, met deze V60 nabrander, inderdaad afgelopen.
Dat neemt niet weg dat er links of rechts nog wel eens een geluidsmodule ingebouwd gaat worden, hoor. Maar dat is dan 'regulier' modelbaanwerk....

Nog even een overzichtsplaat van dit compleet uit de klauwen gelopen projectje.

(http://www.xs4all.nl/~robvd/Forum/Geluidsmodulesoverzicht.jpg)


Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 27 november 2018, 22:26:11
Rob ik heb toch nog eens zitten denken.
In de kleine locs zoals de Anna en glaskasten wordt dit een hele grote uitdaging.
Nou heb ik een stationair geluidsbron die rijspanning afhankelijk het stoomlokgeluid afspeelt.
Dit moet toch ook mogelijk zijn m.b.v. een Arduino met mp3?
En dan wellicht verschillende mp3 stoomlok geluiden zodat je het “juiste” geluid kunt afspelen bij de loc.

Hoor graag jouw mening.
En natuurlijk is het geluid in de loc het mooiste.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 27 november 2018, 23:53:46
Hoi Mark,

Heel kleine locs is inderdaad een uitdaging, dan is dit
Nou heb ik een stationair geluidsbron die rijspanning afhankelijk het stoomlokgeluid afspeelt.
Dit moet toch ook mogelijk zijn m.b.v. een Arduino met mp3?
En dan wellicht verschillende mp3 stoomlok geluiden zodat je het “juiste” geluid kunt afspelen bij de loc.
wel een idee.
Ik heb iets dergelijks al in de geluidswagon: die kan geluiden maken voor tot 6 verschillende locs. Die beperking van 6 is dat ik 6 functie knoppen heb, maar bij een stationaire opstelling kun je tot 255 verschillende locs gaan (het maximum aantal mapjes op de SD kaart van de MP3 speler.
Dus gewoon doen, zou ik zeggen.

Overigens zit bij de geluidssets ook een BR70. Misschien is dat geluid ook aardig bruikbaar voor de Anna.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Michel Bikkel op 12 december 2018, 15:50:46
Zou er ook iets van dit systeem werken voor DCC?
Gezien de prijs is dat namelijk wel intressant :-)

Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 12 december 2018, 20:47:40
hoi Michel.

Goede vraag.
Zou er ook iets van dit systeem werken voor DCC?
Gezien de prijs is dat namelijk wel intressant :-)

Bij digitaal rijden heb je een constante spanning op de baan en daarop een of ander digitaal signaal. Met die constante rijspanning heb je in ieder geval voldoende vermogen beschikbaar om een Arduino en speaker (met of zonder MP3 speler) te voeden. Voor het aansturen van de Arduino (of een van de andere microcontrollers), kan ik me in grote lijnen 3 manieren voorstellen hoe dit zou kunnen werken bij digitaal rijden:
Over digitale communicatie gesproken: daar zijn aardig wat mogelijkheden voor met de Arduino. Zo gebruik ik een software bibliotheek om de seriele communicatie met de MP3 speler te kunnen doen. Dit kon echter alleen omdat de structuur en inhoud van de seriële commando's van die MP3 speler duidelijk waren beschreven in de handleiding....

Maar lijkt me een mooi draadje: Digitaal rijden met geluid uit een Arduino.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Michel Bikkel op 12 december 2018, 21:28:21
Hoi Rob,

mijn loc's gebruiken het DCC protocol.verder is het voor mij allemaal hocus pokus...
Misschien zijn er hier wel leden die daar wat meer van weten...

Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Dirk T op 13 december 2018, 09:04:44
Er zijn DCC libraries voor Arduino sketches. Dat hoef je dus niet uit te plussen.

Voorbeelden en veel Arduino gebeuren voor DCC (diverse decoders en bezetmelders) vind je bij ArcoMora (https://www.arcomora.com/) van Nico Teering.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 22 december 2018, 18:00:35
Projekt Zugabe…

De "nieuwe" VT62 is zo tussen de bedrijven door ook van geluid voorzien.
De eerste aanpassing was de rijstroom op de motor wat te verlagen: dit treinstel bleef bij de 'stilstand' pulsbreedte rijden en de snelheid was ook niet goed terug te regelen: de trein komt met een ruk tot stilstand.
De pulsbreedte van de "rij"stroom kleiner maken bij stilstand was geen optie: dan is er niet voldoende vermogen voor de geluidsmodule, en dan werken andere modules ook niet meer goed.

Maar met een paar diodes tussen motor en rijstroom kan de spanning naar de motor wat worden verlaagd. Deze diodes zijn tegengesteld en parallel geschakeld, zodat nog steeds voor- en achteruit gereden kan worden.

(http://www.xs4all.nl/~robvd/Forum/VT62_02.jpg)


Met de diodes langs de motor kan het interieur van de VT62 nog netjes over de motor heen. Er moest alleen een randje an de onderzijde worden weggevijld.

De binnenverlichting dient als basis voor de geluidsmodule. Hier komt de gelijkgerichte en afgevlakte spanning op. Met 8-9V brandt die verlichting goed. Op deze manier kan ook makkelijk een extra Elco in het toilet worden ingebouwd.

(http://www.xs4all.nl/~robvd/Forum/VT62_03.jpg)


Aan beide zijden was een compartiment voor extra ballast. De balast gaat er uit (het treinstel is zwaar genoeg), en dan zijn er 2 compartimenten voor de elektronica. Boven het draaistel met drijfassen komt de speaker en MP3 module. Aan de andere kant zit de gelijkrichter, rijstroommeting, 5V spanningsregelaar en de ATtiny.

Dan het geluid. Dit treinstel had oorspronkelijk een dieselmotor die met perslucht werd gestart, nadat de trein wegreed. Dat was bijzonder: eerst rijden, dan starten. In deze configuratie reedt dit treinstel als VT 65 903. Echter, later is een andere dieselmotor ingebouwd, dezelfde als voor de VT 137. Deze wordt gestart voor het rijden. Na deze ombouw is het treinstel omgenummerd naar VT 62 904.
Geluiden voor de VT62 heb ik (nog) niet kunnen vinden. Daarom is het geluid dat ik nu gebruik afgeleid van de VT 137.

Hoe dan ook: de VT62 is klaar om ingezet te worden.

(http://www.xs4all.nl/~robvd/Forum/VT62_01.jpg)


Rob

Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 22 december 2018, 19:34:29
Stug blijven doorgaan. Top!
Ik vind het trouwens een enig model.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 22 december 2018, 20:13:34
Bedankt, Mark.
Die VT62 is inderdaad een grappig model. Er staat er nog een op marktplaats, zag ik....

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 23 december 2018, 08:36:05
Idd rob, ik heb hem ook gezien op MP.
Maar dat is echt een ander tijdperk.
Wellicht in de toekomst uitbreiden van tijdperk I-II naar ook III.
Maar dat zal nog lang op zich laten wachten.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 23 december 2018, 19:48:29
Hoi Mark,

In een tijdperk blijven, dat snap ik wel. Dit model van de VT 62 van Trix is uit 1985. In dezelfde tijd is door Trix ook een DRG tijdperk II versie uitgebracht onder nummer 52 2469 00. Als je zoekt op "Trix h0 52 2469 00" zijn 2e hands exemplaren te vinden, onder andere bij gebruiktetreinen.nl. Ik kijk ook nog wel eens op de duitse eBays: ebay.de of ebay-kleinanzeigen.de.
Als je wilt hè  :D
In 1998 heeft Trix dit model opnieuw uitgebracht, maar dan voorbereid voor digitaal. Die zijn ook nog wel te vinden, maar dan is de prijsklasse wel anders...
En natuurlijk zijn er nog andere leveranciers, maar met Trix heb je in ieder geval een degelijke uitvoering.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 28 december 2018, 20:48:31
Ik ga nog even stug door: de "nieuwe" aanwinst Akku Triebwagen ETA180.

Dit treinstel krijgt een geluidsmodule die alleen 'speciale' geluiden kan maken. Rijgeluid hoef ik niet na te bootsen: er zit immers al een elektriche aandrijving in dit treinstel  8) .En het geluid daarvan is plausibel genoeg.

Nu er geluid in gebouwd wordt, komt er meteen ook verlichting in. Ik maak deze niet schakelbaar, dan hoeven er geen extra draden tussen de delen van het treinstel. Het deel met motor krijgt een eigen gelijkrichter en elco voor de verlichting. Dit motorloze deel krijgt ook verlichting, maar met 2 elco's (en groter) om ook de geluidsmodue te voeden.

(http://www.xs4all.nl/~robvd/Forum/ETA180_01.jpg)


Nu het treinstel uit elkaar ligt, meteen maar even wat passagiers en een conducteur in de trein zetten.

(http://www.xs4all.nl/~robvd/Forum/ETA180_02.jpg)


Dan plaats maken voor de geluidsmodule: de ongebruikte motorsteunen gaan weg en wat ruimte frezen voor een ronde luidspreker.

(http://www.xs4all.nl/~robvd/Forum/ETA180_03.jpg)

Ik was eerst van plan een MP3 speler in te bouwen, maar daar was weinig plek voor. Bovendien kon ik geen geluidsbestanden vinden voor dit treinstel. Dus wordt deze geluidsmodule een doorontwikkeling van de software van de V60, dit keer met een DigiSpark.

(http://www.xs4all.nl/~robvd/Forum/ETA180_04.jpg)


Dan de boel in elkaar solderen.

(http://www.xs4all.nl/~robvd/Forum/ETA180_05.jpg)


Geluidsfuncties nu: een hoorn, rem en een compressor. Het geluid is al heel aardig, maar ik ben nog niet helemaal tevreden. Dus dat wordt nog wat verder pielen.
Toch kan de ETA 180 alvast in de dienstregeling worden opgenomen.

(http://www.xs4all.nl/~robvd/Forum/ETA180_06.jpg)


Als ik uitgepield ben, zal ik weer eens een filmpje maken van de beide nieuwe treinstellen.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 28 december 2018, 20:56:45
Ben weer benieuwd naar het filmpje.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 3 januari 2019, 21:48:26
Tussen de oliebolllen en champagne door nog wat zitten pielen aan de ETA 180.

Allereerst wat gewicht toegevoegd in de motorloze wagen: de metalen plaat onder de stoelen moest wijken voor de geluidsmodule, maar nu was deze wagen iets te licht aan de zijde waar deze koppelt. Als remedie is een stukje lood aan de onderzijde gelijmd.

(http://www.xs4all.nl/~robvd/Forum/ETA180_07.jpg)


En verder nog wat aan het geluid zitten pielen. Dit geluid komt direct uit de DigiSpark (dus zonder MP3 speler). Geluiden zijn:

De andere treinstellen, de VT62 en railbus hebben overeenkomstige geluidsfuncties. Een indruk van de treinstellen bij normaal gebruik in dit filmpje.



Ook ben ik begonnen de andere ETA 180 verder op te kalefateren en in dienst te nemen. Maar eerst moest deze nog wat beter rijden. Ondertussen rijdt deze goed en zit er al licht in het de motor wagen....

(http://www.xs4all.nl/~robvd/Forum/ETA180_08.jpg)


Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Stoomlokkie op 25 januari 2019, 10:09:49
Er is een Engelse fabrikant die een geluidsmodule bouwt die op de bewegingen van de loc reageert. Het werkt verbluffend goed. Alleen weet ik niet meer de naam van de fabrikant.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 28 mei 2019, 18:33:24
Met de aanwas van 'nieuwe' aanwinsten, wordt ook af en toe weer geluid ingebouwd. Dit keer is de Rivarossi BR98 aan de beurt.

(http://www.xs4all.nl/~robvd/Forum/9_BR98Rivarossi1.jpg)


Met de 2 draaistellen en de cardanas dwars door de loc is er niet heel veel ruimte in deze loc. Achterin zit echter een klein lampje en flinke lichtgeleider. De lampen worden LEDjes, en dan kan de lichtgeleider er uit. Zo is er in de kolenvoorraad een klein beetje ruimte voor een gelijkrichter en ATTiny. Een speakertje kan halverwege de ketel. Die komt dan net boven de schuin lopende cardan as. De rest van componenten (elco, spanningsregelaar, transistor en weerstanden) wordt hier en daar in de ruimte rond de motor gefriemeld.

(http://www.xs4all.nl/~robvd/Forum/BR98_01.jpg)


Er is zo weinig ruimte, dat ik de ATtiny niet in een IC-voetje kan zetten. Alles wordt direct aan het IC gesoldeerd. Achteraf het programma veranderen kan dan niet meer.
Dus wordt alles getest en de software afgesteld voordat de geluidsmodule definitief in elkaar wordt gesoldeerd. Ik heb in eerdere gevallen gemerkt dat het gedrag van de module op de loc net iets anders kan zijn dan dat deze los op de voeding is aangesloten. Blijkbaar heeft de stroomopname van de wielen en de nabijheid van de motor invloed. Dus gaat er een klein breadboardje mee waar alle componenten van de geluidsmodule zijn samengebouwd.

(http://www.xs4all.nl/~robvd/Forum/BR98_02.jpg)


Zo kan de ATtiny nog makkelijk los en opnieuw geprogrammeerd worden met de Arduino. Met name het redelijk synchroon krijgen van de tsjoek-tsjoek met de beweging van de drijfstanngen is even tweaken.

(http://www.xs4all.nl/~robvd/Forum/BR98_03.jpg)


Het lijkt redelijk goed te zijn nu. Nog even kijken in koude en warme toestand en bij verschillende belasting en snelheden of het naar de zin is. Dan solderen....

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 30 mei 2019, 12:22:41
Het is weer een mooi projectje Rob. Top! ;)

Volgens mij ben jij de enige die het forum op dit moment leven in blijft blazen. Je gaat maar door man. Verder laten we het allemaal afweten. Ik moet hierbij natuurlijk ook met een dikke vinger naar mijzelf wijzen.   ::) Ik ben ook met veel andere dingen/hobby's bezig die ik ook leuk vind.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 30 mei 2019, 15:39:59
Ach Pierre,

Volgens mij ben jij de enige die het forum op dit moment leven in blijft blazen. Je gaat maar door man. Verder laten we het allemaal afweten.

Dat valt nog wel mee. De nieuwe aanwas aan leden gaat ook gewoon door :)
Het is ook niet echt modelbaan seizoen, nu. Bij mij staat de modelbaan ook op een laag pitje, maar zo tussen de bedrijven door is er nog wel eens iets in elkaar te friemelen.

Zoals deze druilerige Hemelvaartsochtend: een mooi moment om 3D te puzzelen en te solderen. Ik kon bijna alle componenten naast en achter de motor kwijt. Alleen de transistor voor de speaker komt voor de motor. Daar zit aan een kant ook net een 'kuiltje' in het witmetalen onderstel, waar de transistor precies in past.

(http://www.xs4all.nl/~robvd/Forum/BR98_04.jpg)


Nu nog de opgeofferde verlichting aan de achterkant herstellen. Ik denk dat ik er 2-kleuren rood/wit LEDs in ga zetten. Meestal zijn sluitlichten op een loc niet zo zinvol, maar ik vind dit wel een geinige loc voor een trek-duw trein. Dan heeft de loc sluitverlichting bij het duwen van de trein.
Die LEDs zijn besteld, maar nog onderweg.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Anne W op 30 mei 2019, 23:03:51
Inderdaad het is "geen" seizoen meer, dus rustig, komt vanzelf weer goed.

Groet, Anne W
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 3 juni 2019, 16:38:57
Ondertussen in het laagseizoen....

De 'nieuwe' Liliput BR52 is na de nodige repareer- en onderhoudswerkzaamheden een van mijn best rijdende locs geworden.

(http://www.xs4all.nl/~robvd/Forum/10_BR52.jpg)


Tsja, dan 'moet' er ook geluid in.

Het geluid van de aandrijving wordt hetzelfde als voor de BR50, waar de BR52 op gebaseerd is. De stoomfluit van de BR52 is hoger dan die van de BR50; alleen voor de stoomfluit hoef ik nieuwe MP3's te maken.
Bij mijn Fleischmann 50-ers heb ik de geluidsmodule in de ketel van de loc ingebouwd, dus was ik in eerste instantie ook op zoek naar ruimte in de loc. De vuurkist en het machinistenhuis leken de beste ruimte te bieden. Maar in mijn internet zoektocht hoe de behuizing open te maken kwam ik plaatje tegen van een decoder in de tender. En zowaar: daar is wel wat ruimte.

(http://www.xs4all.nl/~robvd/Forum/BR52_01.jpg)

(http://www.xs4all.nl/~robvd/Forum/BR52_02.jpg)


Even wat passen en meten met MP3 speler en DigiSpark en het lijkt net te passen. Dus solderen maar...

(http://www.xs4all.nl/~robvd/Forum/BR52_03.jpg)


De speaker past niet in de tender. Deze had ik eerst tussen het drijfwerk gedacht (net als bij de 50ers), maar bij nader inzien komt de speaker in het machinistenhuis. Dan kunnen de draden van de speaker zó uit de tender het (gesloten) machinstenhuis in. Dus in die opstelling even een test (de speaker draden zijn nog te lang op de foto)

(http://www.xs4all.nl/~robvd/Forum/BR52_04.jpg)


Dan de hele boel in elkaar gefrommeld. Zo'n eerste keer alles in elkaar zetten is nog wel even werk voordat alle draden en componenten zodanig zitten dat de tender behuizing ook weer op het onderstel past. Maar na een halfuurtje is alles in het gareel. Het past wel erg precies.

(http://www.xs4all.nl/~robvd/Forum/BR52_05.jpg)


Dan even wat proefritten zonder kolenvoorraad. Dan kan ik ook zien wat er gebeurt met de (LEDs op) DigiSpark en MP3 speler.

(http://www.xs4all.nl/~robvd/Forum/BR52_06.jpg)


Ik was even bang dat de plastic kolenvooraad niet zou passen en dat ik zelf een nieuw kapje zou moeten maken. Maar het gaat. (Al is het sowieso nog wel een idee om zelf een kolenvoorraad te maken, met echte steenkool. Maar dat heb ik nog niet, dus dan is dat plastic kapje voorlopig goed).

(http://www.xs4all.nl/~robvd/Forum/BR52_07.jpg)


Nu alleen de vermalijde koppelingen nog vervangen. Aan de achterkant is de koppelhaak één geheel met de sneeuwschuivers voor de tenderwielen.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Vleesman op 3 juni 2019, 18:47:37
Mooi om te zien, als leek, wat er tegenwoordig in een loc gepropt moet en kan worden om de realiteit te verhogen. Is het einde zoek?
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 3 juni 2019, 22:09:39
Ach Peter,
Het is een eindeloze hobby, toch? Maar het houdt op waar je zelf de grens legt  8)
Ik ben nog analoog rijder en doe daar wat digitaal gepriegel bij. Helemaal digitaal gaat 't nog veel verder (al zit daar dan ook wel weer een prijskaartje aan).
Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 3 juni 2019, 23:22:39
Hallo Rob,

Zoals zovelen ben ik nu druk met andere zaken dan de modelbaan, maar ik blijf zeker mee lezen.
En telkens geniet ik van je vastberadenheid om analoog geluid in te bouwen.

Die rivarossi br98 is ook laatst een van mijn aanwinsten geweest, leuk ding.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Ben op 4 juni 2019, 11:13:23
Rob
De loudspeaker die jij gebruik welke type en waar verkrijgbaar
Gr Ben
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 4 juni 2019, 20:03:31
Hoi Mark,

Dank, die kruisspin is inderdaad een geinig locje.

Hoi @Ben,

Ik heb de luidsprekertjes bij AliExpress gekocht. Ik gebruik 3 verschillende maten: als het kan gaat de grootste speaker in de loc, het treinstel of wat dan ook. Zo niet, dan komt er een kleinere in.

De meest gebruikte is de speaker van 20x10 mm. Deze geeft een redelijk goed geluid (het is natuurlijk geen subwoofer) en is vanwege de maten in vrij veel locs in te passen. Zeker als er een goede klankast te maken is het geluid heel redelijk, maar ook zonder dat gaat het nog.
https://nl.aliexpress.com/item/32845623744.html?spm=a2g0s.9042311.0.0.2d8c4c4dq7Mcrd

Verder gebruik in een 20mm doorsnee ronde speaker. Die past niet overal in, maar geeft wel iets beter geluid. In de link staan meerdere maten, 20mm is de kleinste.
https://nl.aliexpress.com/item/32824718546.html?spm=a2g0s.9042311.0.0.2d8c4c4dq7Mcrd

En ik gebruik ook wel eens een 15x10 mm speaker. De geluidssterkte is wat minder, maar ik heb zo ook voor kleine locs een speakertje.
https://nl.aliexpress.com/item/32791059723.html?spm=a2g0s.9042311.0.0.27424c4d58dnWp

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Ben op 5 juni 2019, 14:46:47
Rob dank
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 8 juni 2019, 19:47:14
In de BR98 moest het licht wijken voor de geluidsmodule, maar een paar compacte LEDs moet nog wel gaan om de verlichting te herstellen. Met deze tip van @PJV kan er zelfs wisselend rood/wit licht in de loc komen.

Verkrijgbaar!:
2 LED's in één behuizing, ZONDER een gezamenlijke anode. 

(https://myalbum.com/photo/8iaCF3VNMAi8/1k0.jpg)

Op Ebay te vinden onder:
https://www.ebay.nl/itm/Bicolor-LED-2mm-3mm-or-5mm-color-red-white-red-warm-white-or-red-yellow/190894964341?hash=item2c7239fe75:g:wuYAAOxytL9SI4ha:rk:1:pf:0 (https://www.ebay.nl/itm/Bicolor-LED-2mm-3mm-or-5mm-color-red-white-red-warm-white-or-red-yellow/190894964341?hash=item2c7239fe75:g:wuYAAOxytL9SI4ha:rk:1:pf:0)

Gr.Piet

Dus dat maar eens in elkaar zitten pielen. Aan de achterkant de rood/witte LEDs.

(http://www.xs4all.nl/~robvd/Forum/BR98_05.jpg)


En aan de voorkant wordt het in beide richtingen brandende gloeilampje vervangen door een witte LED. Dan brand de verlichting alleen nog bij vooruit rijden.

(http://www.xs4all.nl/~robvd/Forum/BR98_06.jpg)


Deze heeft toch maar een anti-parallel geschakelde diode gekregen: hier loopt de stroom door bij het achteruit rijden. De diode beschermt de LED tegen een te grote spanning als deze spert. Ik dacht eerst dat het wel zou los lopen maar de eerste LED was al doorgefikt voor ik klaar was met testen :(

En toen moest de loc weer in elkaar.... Dat heeft me nog wel ruim een uur gekost. De geluidsmodule past klem en de LEDjes floepten scheef, of er zat een weerstandje tegen de as van de motor, dan brak het draadje van de speaker, en zo nog een paar keer. Maar het zit: het licht werkt, het geluid klinkt luid en duidelijk en er loopt niets aan!

(http://www.xs4all.nl/~robvd/Forum/BR98_07a.jpg)


En de reden voor kop/sluit verlichting aan de achterkant: de loc wordt ook ingezet in trek-duw (Wendezug) treinen. Zo wordt de trein geduwd...

(http://www.xs4all.nl/~robvd/Forum/BR98_07b.jpg)


Ook de BR52 wordt nog wel eens voor een Wendezug ingezet. Hier is het gloeilampje in de tender vervangen door een rood/witte LED.

(http://www.xs4all.nl/~robvd/Forum/BR52_08.jpg)


Tot zover weer.

Rob

Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Stoomlokkie op 5 juli 2019, 10:20:03
Er is een Engelse fabrikant die dit alles in superminiatuur chip vervaardigt. Alles werkt op een 3 volt batterij. In de volgende video kun je hierover informatie verkrijgen:https://www.youtube.com/watch?v=vcazhUoRaMA Maar zelf iets fabriceren met een Arduino is natuurlijk ook leuk!

In ieder geval is mijn opmerking bedoeld als "Tip van de week". Het ding werkt zowel analoog als digitaal. Want het werkt op de beweging van de loc of wagen waar je de soundchip inbouwt. Ik wil er zelf binnenkort ook één aanschaffen! En gezien het filmpje klinkt alles behoorlijk realistisch.
vr gr Andre
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 5 juli 2019, 16:24:56


Tip van de week. Want het werkt op de beweging van de loc of wagen waar je de soundchip inbouwt. Ik wil er zelf binnenkort ook één aanschaffen!

Dit is best een leuke tip André maar ik kan uit het filmpje niet opmaken wie de fabrikant is of hoe deze soundchip heet. Met andere woorden waar kan je eventueel zo'n soundchip bestellen? Ik wil er best wel eens een beetje mee experimenteren. Heb jij evt. meer info?
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 5 juli 2019, 18:41:55
Da's best een geinige chip/tip, Andre! En super simpel in te bouwen.

Pierre, in het filmpje gaat het om de Train Tech SFX10. als je die googled, dan vind je ook waar je ze kunt kopen (o.a. bij hattons.co.uk). Zit een prijskaartje aan van 37 pond, wat ik zo snel kon vinden.
Persoonlijk zou ik het batterijtje (na de eerste experimenten) vervangen door een gelijkrichter en 3.3V spanningsregelaar als het geheel in een loc gaat.

Gezien de prijs en beperkte (maar mooie) geluidseffecten, hou ik het zelf nog even bij de arduino/DigiSpark/ATtiny :D, maar ik ben benieuwd naar de ervaringen!

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 6 juli 2019, 14:09:59
Dank je Rob. Ben ook eens gaan kijken maar de prijzen zijn inderdaad rond de 40 pond of hoger. Daar komt dan nog eens de verzendkosten bij. :o Dure grap dus om zomaar eens te proberen. Het ziet er leuk uit maar ik hou het ook maar bij Arduino. ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 27 juli 2019, 20:02:07
Geluid in gelede stoomlocomotieven

Ik ben wat in de greep geraakt van gelede locomotieven met twee drijfwerken. Indrukwekkende locs. De BR96 van Rivarossi heeft wel in west Duitsland gereden, maar was al weg voordat de DB was opgericht. Maar ik vond 'm gewoon té mooi.

(http://www.xs4all.nl/~robvd/Forum/BR96_0.jpg)


Daarna nog een loc aangeschaft die nooit (af) is gebouwd: het ontwerp voor een Kriegslokomotieve door Borsig, uitgebracht als BR53 door Märklin. Dit is de Hamo versie gekocht via Ebay.

(http://www.xs4all.nl/~robvd/Forum/BR53Borsig01.jpg)


De BR53 heeft als eerste geluid gekregen: er was veel ruimte in de 5-assige kuiptender. Het blok witmetaal (met uitsparing voor het omschakelrelais) gaat er uit, en wordt vervangen door bladlood waar de speaker in wordt verwerkt.

(http://www.xs4all.nl/~robvd/Forum/BR53Borsig02.jpg)


Daarboven de MP3 speler, Arduino en andere componenten.

(http://www.xs4all.nl/~robvd/Forum/Br53Borsig03.jpg)


De BR53 is klaar en rijdt druk stomend rond....

Ook voor de BR96 is de inbouw begonnen. De MP3 speler komt in de rookkast en de luidspreker kan het geluid kwijt door de schoorsteen.

(http://www.xs4all.nl/~robvd/Forum/BR96_1.jpg)


In het frame van de BR96 zit aan de onderkant een uitsparing voor een omschakelrelais voor de wisselstroom versie. Dit biedt ruimte aan de voeding en ATtiny. Maar die moet er nog ingepuzzled worden. De draden van de MP3 speler (2 x voeding en 2x seriële communicatie) zitten er al...

(http://www.xs4all.nl/~robvd/Forum/BR96_2.jpg)


Het geluid van de BR53 en BR96 is heel anders. Bij de BR53 zitten aan elk drijfwerk 2 hogedrukcilinders. Ook heeft deze loc een dubbele schoorsteen. Dat betekent 8x een puf per omwenteling.
De BR96 heeft twee hogedruk cilinders achter en twee lagedruk cilinders voor. Hoge-en lage druk cilinders zijn gekoppeld in een Verbunds of Compound opstelling. Die laat slechts 4x per omwenteling van de drijfwielen stoom ontsnappen.
Hoe dat precies zit volgt in een latere post...

Nu eerst verder met die BR96....

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Vleesman op 27 juli 2019, 21:23:21
Voor het eerst van mijn leven een gelede locomotief gezien...en dat was door de foto's in de post hierboven. :-)
Indrukwekkend en interessant dat je het ombouwen laat zien. Elke ruimte wordt benut.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Anne W op 27 juli 2019, 23:12:42
Beste Rob,

Ik denk dat de BR53 "gewone" cilinders heeft, gewoon betekent dat de druk van de ketel in één keer naar de schoorsteen gaat, dit in tegenstelling tot een "expansie" systeem waar de druk in meer dan één fase naar de schoorsteen gaat.

Bij loks met expansie systeem  is het altijd tweevoudige expansie, het bekende schip de Titanic, had 3 machines met elk 3-voudige expansie (triple-expansie)

Dat de BR 96 achter hoge druk had en voor lage druk, moet ik eens bestuderen, het geeft wat problemen als de cilinders voor net geen stoom nodig hebben en de cilinders achter juist stoom kwijt moeten.

Groet, Anne W
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 27 juli 2019, 23:32:30
Hoi Anne,

Ik denk dat de BR53 "gewone" cilinders heeft, gewoon betekent dat de druk van de ketel in één keer naar de schoorsteen gaat, dit in tegenstelling tot een "expansie" systeem waar de druk in meer dan één fase naar de schoorsteen gaat.
Zo is het. Je hebt eigenlijk 2 locomotieven met 1 gezamenlijke ketel :)

Dat de BR 96 achter hoge druk had en voor lage druk, moet ik eens bestuderen, het geeft wat problemen als de cilinders voor net geen stoom nodig hebben en de cilinders achter juist stoom kwijt moeten.
Volgens Wikipedia is de stoomtoevoer naar beide cilindergroepen ook direct vanuit de ketel te doen als dat nodig is. Dat maakte de bediening van deze locomotieven een stuk ingewikkelder, maar wegens dubbel gebruik van de stoom tijdens de 'normale' loop wel merkbaar efficiënter.
In het vooroorlogse Duitsland waren ze in Beieren helemaal weg van de dubbele expansie, in Pruisen vonden ze het maar niks.


Voor het eerst van mijn leven een gelede locomotief gezien...en dat was door de foto's in de post hierboven. :-)
Tsja, Peter. In Europa waren gelede locs niet zo populair. De Amerikanen bouwden enorme gelede locs. Zelfs een versie met 3 drijfwerken....

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Anne W op 28 juli 2019, 22:56:33
Beste Rob,

Ik ben ook even aan het spitten geweest, maar ik kan niets vinden wat het stoomsysteem beschrijft tussen de ketel en de uitlaat, wel heb ik wat gelezen over dat het rijden wat ingewikkeld was omdat de stoomdruk o.a. naar de cilinders slecht te regelen was en er is een ombouw geweest om het "doorslaan" van één van de twee delen te verminderen.

Wat ik mij als technicus afvraag (ik heb nog wat over stoommachines geleerd op de hts voor scheepswerktuigkundigen) is de regeling tussen de HD cilinders achter en de LD cilinders voor, de toevoer voor de LD cilinders is afhankelijk van de "slip" van beide drijfgroepen want ze zijn niet mechanisch aan elkaar gekoppeld.

Ik denk dat er momenten zijn dat een HD cilinder "uitademt" terwijl er geen LD cilinder op dat moment inademt, wat rare effecten geeft op de prestatie van de HD cilinder op dat moment en de LD cilinder wat later.

Groet, Anne W
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 28 juli 2019, 23:18:26
Hoi Anne,

Volgens mij zit er tussen de HD en LD cilinders een opslagtank/buffer voor de lagedruk stoom. Die vangt enige ongelijkheid tussen de HD en LD cilinders op. Ik kan me voorstellen dat als het HD drijfwerk doorslipt (en er dan veel stoom in de LD opslagtank komt), de 'tegendruk' toeneemt en vanzelf de kracht van de HD cilinders afneemt. Omgekeerd: als de wielen aangedreven door de LD cilinders doorslaan, neemt de druk in de LD opslagtank af, en zal het slippen ook stoppen....
Dan zou er dus vanzelf steeds naar een soort van evenwicht tussen de drijfwerken worden gestreefd.

Rob

Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Anne W op 28 juli 2019, 23:40:47
Beste Rob,

Daarom zocht ik ook naar een tekening of beschrijving van het stoomsysteem......, wij hebben hetzelfde idee....

Groet, Anne W

Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 29 juli 2019, 00:03:07
Beste Rob,

Daarom zocht ik ook naar een tekening of beschrijving van het stoomsysteem......, wij hebben hetzelfde idee....

Groet, Anne W
… die zoek ik ook, maar lastig te vinden inderdaad.

Ondertussen is de rest van de geluidsmodule voor de BR96 in elkaar geprutst. Voeding (Gelijkrichter, Elco en 5V spanningsregelaar), rijstroomsensoren (weerstanden) en de microcontroller (ATtiny85 in een IC voetje).

(http://www.xs4all.nl/~robvd/Forum/BR96_3.jpg)


En dat past (net) in de uitsparing voor het omschakelrelais. Dat is redelijk toegankelijk als het achterste drijfwerk van de loc is afgehaald.

(http://www.xs4all.nl/~robvd/Forum/BR96_4.jpg)



Binnenkort maak ik een filmpje van de gelede locs in actie....

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: mark mms op 29 juli 2019, 20:38:47
En die Rob blijft maar ombouwen met geluid, geweldig.

Ook het verdiepen in de techniek, zoals velen doen op dit forum, een woord fantastisch.
Zelf vind ik dit type locs prachtig om te zien, maar heb mij nooit verder afgevraagd hoe het werkt.
Hier kan ik dus alleen maar van leren, bedankt.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 31 juli 2019, 22:30:42
Dank je Mark,

Ondertussen heb ik een filmpje in elkaar geklust waarin wordt uitgelegd hoe stoomlocs werken en waar dat kenmerkende geluid vandaan komt. Over de gelede locomotieven is ook een stukje over de ontwikkeling van deze locs en wat zo de voor- en nadelen zijn van de verschillende typen.

Het is nogal een lange film (bijna 20 minuten), dus als je al weet hoe de aandrijving van een ongelede stoomloc werkt kun je na de introductie meteen doorspoelen naar de bouwwijzen of verder naar de geluiden (zie tijden hier onder)

Video bestaat uit de volgende onderwerpen:
00:00 Introductie
03:45 Uitleg van de aandrijving van een stoomloc en het geluid
06:55 Bouwwijzen: type Meyer, type Mallet
13:20 Geluid per type loc, inclusief rijden
17:55 Toegift: rijden met BR53 Borsig




Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 1 augustus 2019, 12:17:55
Mooi werk en alles prachtig uitgelegd Rob. Kortom vakwerk! ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Wim Corduwener op 1 augustus 2019, 15:48:30
Dat ik op dit draadje niet altijd reageer komt omdat het onderwerp voorlopig wat té ver van mijn bed ligt. Maar ik volg het met verbazing.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 3 september 2019, 11:25:31
Ik kwam dit filmpje tegen van een mallet loc in bedrijf in schaal 1:1, net wat kleiner dan de BR 96.
Het is wel een spoorweg aan de andere kant van de plas, maar ik vond deze loc mooi zwoegend op een bergtraject in beeld gebracht. Ook leuk: geen opgepoetste museumloc, maar een exemplaar met roest en aanslag op alle plekken waar dat thuishoort :) , waarvan mooie (detail) opnames in deze film.



Gewoon ter illustratie.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 7 januari 2020, 23:23:44
Deze Akku Triebwagen (de ETA 176) lag al een tijdje te wachten op binnenverlichting en geluid. Dat zit er ondertussen in.

(http://www.xs4all.nl/~robvd/Forum/ETA176_05.jpg)


Een klein beeldverslag van de inbouw

(http://www.xs4all.nl/~robvd/Forum/ETA176_02.jpg)
^ Ruimte in de 'buik' van het treinstel voor de voeding: gelijkrichter, elco en weerstanden in het groene pakketje

(http://www.xs4all.nl/~robvd/Forum/ETA176_01.jpg)
^ Boven het aangedreven treinstel zit een ruimte waar precies een speaker in past.

(http://www.xs4all.nl/~robvd/Forum/ETA176_04.jpg)
^ De DigiSpark past op de vloer tussen de deuren en een Action LED strip aan de binnenkant van het dak.


Rob


Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 8 januari 2020, 09:41:50
Da's weer een mooi stukje werk Rob. ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 8 januari 2020, 18:16:21
Dank je, Pierre.
Hoe staat het eigenlijk met jouw railbus ombouw?
Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Michel Bikkel op 8 januari 2020, 18:26:20
Zou toch mooi zijn al dit ook werkt op een digitaal systeem. Geluiddecoders bij naar mijn mening duur en dit is volgens mij een redelijk betaalbare oplossing.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 8 januari 2020, 19:20:56
Hoe staat het eigenlijk met jouw railbus ombouw?

Projectje ligt stil. Ik krijg er totaal geen geluid uit ... helaas.  :(   Maar ik pak het wel weer een keer op als ik zin heb. Er zijn nog zoveel dingen waar ik mee bezig ben. Ennuh ... misschien na zaterdag in Rijswijk komen er zelfs nog wel weer nieuwe projecten bij. Je weet het maar nooit. ;)

Ga jij nog naar Rijswijk?
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 8 januari 2020, 20:15:49
Hoi Pierre,
Raar dat er geen geluid uit komt. Ik kan er wel even naar kijken als je zaterdag ook naar Rijswijk gaat en een van de DigiSparkjes en/of het railbusje meeneemt.
Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 8 januari 2020, 20:26:23
Ach ... ik denk dat ik zelf gewoon ergens een soldeerfoutje gemaakt heb Rob. Komt wel goed. Ik moet er gewoon weer eens even rustig voor gaan zitten. Anders begin ik gewoon weer bij het begin. De anderen heb ik ook aan de praat gekregen. ;) Bedankt voor je aanbod.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 8 januari 2020, 20:43:41
Prima, Pierre. Ga jij ook op zaterdag naar Rijswijk?
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 8 januari 2020, 21:49:00
Klopt Rob ... ik ben er zaterdag de hele dag.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 24 februari 2020, 21:03:56
Ruim een jaar geleden kwam deze Röwa BR89 in een pakket "knutselwaren" in mijn verzameling, toen nog voor 3 rail omgebouwd.

(http://www.xs4all.nl/~robvd/Forum/BR89_01.jpg)


Dit lokje is teruggebouwd naar 2 rail en opgeknapt. Heeft vervolgens een tijdje in de wacht gelegen en tenslotte is geluid ingebouwd en is met wat verf het aanzicht wat verbeterd. Een verslag.

De eerste taak: terugbouwen naar 2 rail. Daarvoor moest een van de stroomafnemers in de tender worden hersteld.

(http://www.xs4all.nl/~robvd/Forum/BR89_02.jpg)


Verder zijn er op de middelste wielen van de loc extra stroomafnemers gemaakt.

(http://www.xs4all.nl/~robvd/Forum/BR89_03.jpg)


Nu is de stoomafname betrouwbaar en rijdt de loc goed. Vooruit wat soepeler dan achteruit, maar niet slecht voor een locje uit de 60-er jaren.

Afgelopen dagen heb ik geluid ingebouwd. De speaker gaat in de tender.

(http://www.xs4all.nl/~robvd/Forum/BR89_04.jpg)


Daarover een stukje dun karton en dan kan de rest van de module worden ingebouwd

(http://www.xs4all.nl/~robvd/Forum/BR89_05.jpg)


Dan de ATtiny85 nog even programmeren. Dat gaat via een Arduino als 'programmer' voor de ATttiny.

(http://www.xs4all.nl/~robvd/Forum/BR89_06.jpg)


De plastic glans van dit locje (en andere locs) vond ik niet zo mooi. Dus dit wordt het eerste locje dat ik wat ga verweren. Geen matte blanke lak in huis, wel matzwarte verf. Met een nagenoeg droge borstel zwart op de het rode frame en de wielen wordt het wel wat. Dan nog wat 'gun metal' op het drijfwerk, een beetje bruin hier en daar en de bel voorop de loc koperkleurig. En een machinist er in.

(http://www.xs4all.nl/~robvd/Forum/BR89_07.jpg)


Klaar! Rijden maar.

(http://www.xs4all.nl/~robvd/Forum/BR89_08.jpg)


Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 24 februari 2020, 21:57:56
Jij weet ook van geen ophouden hè Rob. De ene loc na de anderen krijgt een geluidje. Mooi locje geworden man! ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob 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.

(http://www.xs4all.nl/~robvd/Forum/v188_00b..jpg)


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.

(http://www.xs4all.nl/~robvd/Forum/v188_00a.JPG)


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.

(http://www.xs4all.nl/~robvd/Forum/V188_01.jpg)
^ Het motor deel van de dubbelloc krijgt alleen een speaker

(http://www.xs4all.nl/~robvd/Forum/V188_02.jpg)
^ 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.

(http://www.xs4all.nl/~robvd/Forum/V188_03.jpg)
^ 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
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: SuperSylvester 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?

Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre 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.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob 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
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre 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. ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob 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
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 19 april 2020, 18:35:31
Goh. Sneller dan verwacht is de stereo versterker gearriveerd.
Even een proefopstelling,

(http://www.xs4all.nl/~robvd/Forum/V188_04.jpg)


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

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Wim Corduwener op 19 april 2020, 22:15:58
Misschien geef ik m’n bek ook maar een douw:
(https://upload.wikimedia.org/wikipedia/commons/9/90/Dopplerfrequenz.gif)
▲ Is in dat rijdende stereootje geen dopplereffect in te bouwen?
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob 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.

(http://www.xs4all.nl/~robvd/Forum/V188_05.jpg)


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
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rein 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 (https://en.wikipedia.org/wiki/Texas_Instruments_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 (http://www.members.optusnet.com.au/satr/sound.htm#PAdiesel) (met een PicAxe) en dit (http://www.train35.fr/bruitage_loco.php) (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.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob 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
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob 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
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 28 juni 2020, 22:45:26
Grandioos Rob. ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: ron.kraaijkamp 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.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob 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 (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
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: ron.kraaijkamp 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 (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
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob 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
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob 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
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: ron.kraaijkamp 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.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: ron.kraaijkamp 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
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob 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
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rein 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.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob 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 ----------------



Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob 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
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob 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
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: ron.kraaijkamp op 18 juli 2020, 12:13:03
Hallo Rob,

De brom viel nog aardig mee.
Verschillende frequenties gebruikt.
Hoe hoger de frequentie, hoe minder het gebrom.

Ik zou de code wat kunnen strippen.
Wil het alleen gebruiken om te rijden en de verlichting te laten branden.
En die verlichting (in loc met LED's en in personenwagon met LED strip van 5v via een gelijkrichter, regulator en condensator) doet het al wanneer de regelaar net open staat.

Nu moet ik voor mezelf gaan bepalen of ik hier mee door ga of digitaal ga rijden.
Ik heb zo veel trekkend materiaal dat het voordeliger is om deze regeling te gebruiken ipv overal decoders in te bouwen.
Het is met deze regeling lastiger om trienen automatisch langzaam te laten optrekken en stoppen.
Je hoor het al. Ik ben er nog niet uit.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 18 juli 2020, 12:36:47
Hoi Ron,

mooi dat het allemaal aan het lukken is. Maar dat maakt de beslissing nauurlijk alleen maar lastiger :)

Ik zou de code wat kunnen strippen.
Wil het alleen gebruiken om te rijden en de verlichting te laten branden.
En die verlichting (in loc met LED's en in personenwagon met LED strip van 5v via een gelijkrichter, regulator en condensator) doet het al wanneer de regelaar net open staat.
De code strippen is een goed idee. Deze sketch werkt zowel voor een IR afstandsbediening als potmeter. als je alleen de potmeter gebruikt en niet de fnctietoetsen is er inderdaad nogal wat ongebruikte code.

Het is met deze regeling lastiger om trienen automatisch langzaam te laten optrekken en stoppen.
Lastiger, maar niet heel erg lastig. Voor de IR besturing zet er al een optrek- en afrem functie in deze sketch. Het idee is dat je dan bijvoorbeeld op de "5" druk voor snelheid 5 en de loc dan langzaam versnelt of vertraagt naar deze snelheid. Misschien kun je ook iets dergelijks gebruiken.

Maar ik zou het rustig laten inwerken.
Ik heb overigens om dezelfde redenen voor analoog gekozen. Ook vak wat minder prijzig bij eventuele uitbreidingen van het locomotievenpark.

groet,
Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rein op 18 juli 2020, 17:04:29
Goedemiddag,
Bedankt Rob voor de nieuwe sketch. Die heb ik hier en daar wat aangepast, want ik gebruik andere pinnen. Ik heb ook de brugcel verwijderd uit de voeding en vervangen door een enkele diode. Ik gebruik als trafo zo'n stekkervoeding (12 V, 1 A) en die levert net iets meer dan die 12 V (12,3 - 12, 4 V). Met de diode zit ik dan precies op 11,5 V op de rijregelaar.
De geluidsmodule met de testsketch herkent nu inderdaad beter de functietoetsen. Het is nog niet perfect: af en toe wordt een andere toets herkend, maar de dubbele komen nu niet meer voor.
Vanavond (of morgen) maar verder kijken. Uiteindelijk komt het goed.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 18 juli 2020, 17:48:53
Hoi Rein,

Ziet er allemall goed uit
De geluidsmodule met de testsketch herkent nu inderdaad beter de functietoetsen. Het is nog niet perfect: af en toe wordt een andere toets herkend, maar de dubbele komen nu niet meer voor.
Vanavond (of morgen) maar verder kijken. Uiteindelijk komt het goed.
Ik heb de test sketch niet meer bijgewerkt, dus die is misschien wat minder nauwkeurig in het herkennen van de functies dan de nieuwste versie van de geluidsmodule. Belangrijk is dát  een en ander herkend wordt: dan is de hardware in ieder geval goed.
Ik denk dat je met dit resultaat de "echte" geluidsmodule (software) wel eens kunt proberen. Belangrijk is wel dat voor alle geluiden ook een mp3 of wav op de geheugenkaart hebt staan, anders raakt de boel in de war.... Dus voor het opstarten (bestand 009), snelheid (010 en hoger) en functietoetsen (001 t/m 006), en dat allemaal in een mapje (folder) met de naam "01".

succes!
Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rein op 18 juli 2020, 19:52:32
Dag Rob,
ik heb er zelf ook wel vertrouwen in dat het goed komt. Gewoon stap voor stap en stug doorgaan :D
Ik ben nu bezig de geluiden samen te stellen voor mijn railbus, een VT70. Die klinken net wat anders dan de VT98. Is nog best wat gepuzzel, vooral om de brongeluiden te vinden.

Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rein op 20 juli 2020, 22:09:20
Goedenavond,
De geluidsmodule werkt inmiddels heel behoorlijk. De rijstroom wordt goed gedetecteerd en (bijna) altijd ook de juiste functietoetsen. Tijd dus om de MP3 weer op de Nano aan te sluiten. Precies volgens het schema van Rob (https://robvd.home.xs4all.nl/Forum/SchemaModule1.jpg). Het typenummer van mijn speler is: mp3-tf-16p en volgens de datasheet zou dat een exacte kloon van de DFplayer moeten zijn.
Helaas: uit het speakertje komt alleen een soort van zacht tikkend geluid, ongeveer een keer per seconde. Bij het opdraaien van de rijregelaar neemt de "tikfrequentie" soms toe. Voor mij lijkt het net alsof er telkens even een gelijkspanning op de speaker wordt gezet. De speler reageert ook niet op de functietoetsen en wordt na enige tijd ook behoorlijk ware. Dat is dus niet goed.
Ik heb via verschillende andere libraries geprobeerd uit te zoeken wat er mis zou kunnen zijn, maar ik het het nog niet uitgevogeld. Wat wel duidelijk is, is dat de Nano via pin 8 en 9 serieel contact maakt met de speler. De speler wordt herkend; je mag dus veronderstellen dat er ook een retoursignaal van de speler is.
Voor de zekerheid heb ik, naast de mp3's in de map 01 (zoals Rob hierboven al schreef), ook dezelfde bestanden in de root en in de map mp3 gezet, maar dan met een extra 0 in de bestandsnaam. Geen resultaat, behalve dan het tikken uit de speaker.
Morgen of zo maar weer eens verder kijken
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 26 juli 2020, 19:58:56
Hoi Rein,

Enkele tips bij het fout zoeken...

Wat je kunt proberen is de MP3 tester sketch. Die staat op de 1e pagina van dit draadje bij http://www.h0modelspoor.nl/index.php?topic=3183.msg53541#msg53541 (http://www.h0modelspoor.nl/index.php?topic=3183.msg53541#msg53541)
Deze sketch werkt ook met de Arduino aan de USB, en speelt bestanden af beginnend bij 001, dan na 8 seconden 002 enzovoorts. Dit werkt ook met de geheel in elkaar gesoldeerde module.

Kijk ook ook of de goede pinnen zijn gedefinieerd voor het aansturen van de MP3 speler. Die definieer je hier mee:
  #define MP3RX                  9       // serieel receive (van MP3 speler)
  #define MP3TX                  8       // serieel transmit (naar MP3 speler)
Bij twijfel kun je de definities eventueel omdraaien en kijken of dat werkt. Ik heb bij mijn locs verschillende pinnen gebruikt, afhankelijk van hoe dat het beste uit kwam om in de loc in te bouwen.

Zorg er ook voor dat de bestandsnamen precies 3 cijfers hebben, dus bijvoorbeeld "009.mp3" of "012.wav". Bestand 009 heb je in ieder geval nodig: dit is het opstart geluid. Staat dat niet op de geheugenkaart, dan wordt het af te spelen bestand niet gevonden en reset de MP3 speler steeds weer.

En verder: begin met een lage volume instelling. Als het geluid te luid is, dan wordt er meer vermogen gevraagd dan de PWM stroom kan leveren. Het geluidsvolume definieer je hier.
  #define volume                24       // geluidsvolume (0-47)
En als laatste: check de instelling die het map nummer aangeeft waar de geluidsbestanden staan.
  #define geluid                 1       // geluid altijd aan in map "01" van MP3 speler.
Succes,
Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rein op 27 juli 2020, 15:58:26
Dag Rob,
hartelijk dank voor de nuttige tips.
De seriële transmit en receive zijn goed aangesloten tussen de Nano en de speler. Net als in je schema op pin 8 en 9. Er is ook communicatie tussen de twee: ik kan bijvoorbeeld het aantal bestanden op het kaartje uitlezen.
De geluidsbestanden staan inderdaad in map 01 en zijn genummerd van 001 t/m 005 en 009 t/m 013. Extensie is MP3.
Aan het knipperen van de led op de speler is te zien dat er ook iets afgespeeld wordt met de dfplayer-tester sketch.
Toch is uit het speakertje alleen dat zachte tikken te horen; het klinkt ongeveer hetzelfde als een elektrische klok met een verspringende secondewijzer. Ik krijg zo langzamerhand het vermoeden dat het eindversterkertje van de speler ter ziele is. Op de digitale audio-uitvoer staat nl. wel geluid, hoewel heel erg vervormd.
Naar mijn idee is het de moeite waard om bij meneer Ali een paar nieuwe spelertjes te halen en dan te kijken wat er gebeurd.
Dat betekent helaas wel dat mijn projectje even stil ligt.
Vriendelijke groet,
Rein.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 27 juli 2020, 22:33:06
Hoi Rein,

Dat ziet er inderdaad naar uit dat de versterker van de MP3 speler kaduuk is.
Je kunt nog even proberen om de speaker op SPK1 en GND of SPK2 en GND aan te sluiten. Dan heb je het halve volume, maar misschien is één van de uitgangen van de versterker nog OK.

Als het geluid erg vervormd klinkt op de oortelefoon aansluiting, zijn de geluidsbestanden misschien te luid? Misschien helpt het nog om die geluiden in een editor wat af te zwakken (originele bestanden bewaren).

En verder even wachten.... Balen dat die MP3 speler naar de gallemiezen is.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rein op 29 juli 2020, 15:57:39
Dag Rob,
Dat was een goed idee! Helaas, het resultaat was hetzelfde: tik-tik-tik. Beide helften van de versterker zijn blijkbaar stuk. Het blijft merkwaardig: ik weet (bijna) zeker dat er geen kortsluiting op de uitgangen van de versterker is geweest (die zouden trouwens kortsluitvast moet zijn). De speakertjes die ik geprobeerd heb doen het ook gewoon en zijn 8 ohm/1 W.
En ach, balen, ja, maar elk nadeel hep ze voordeel. Ik ga nu eerst wat andere leuke dingen doen tijdens het wachten op meneer Ali.

Dat idee van te veel volume had ik ook bedacht en ik heb het even gecheckt met jouw bestanden van de VT98. Op de scoop zag ik weinig verschil en ook op het gehoor was er nauwelijks een verschil. Niet waarschijnlijk dus.
Niettemin: bedankt alvast voor alle hulp en suggesties. Het wordt zeer gewaardeerd.

Groeten, Rein.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 29 juli 2020, 18:25:46
Hoi Rein,

Graag gedaan, hoor.

Ik heb nog een paar laatste ingevingen: de MP3 speler moet even opstarten en het kaartje indexeren. Dat duurt langer naarmate er meer op het geheugenkaartje staat. Je kunt proberen de opstart tijd wat langer te maken. Dat doe je met deze instelling in de code:

  #define MP3inittijd         1500       // initialisatietijd MP3 speler (ms)

Je kunt deze bijvoorbeeld op 1,5 sec (1500 ms) seconden zetten, zoals hierboven in het voorbeeld, of desnoods nog wat langer.
Als je dat onverhoopt werkt, kun je proberen een wat lagere waarde in te stellen....

(ik geef het geen grote kans, omdat er wel een signaal komt op de oortelefoon aansluitingen, toch?)

En ja, open deur, is het speakertje wel goed?

Overigens: bij sommige van mijn locs hoor ik 2 zachte tikken voor het geluid start: dat zijn de seriële commando's bij het opstarten van de module. Misschien zijn dat de tikken die jij ook hoort.
Ik heb ook wel eens gehad dat het geheugenkaartje stuk was en de module bleef 'hangen'. Het betreffende geluidsbestand op het kaartje speelde ook op de computer niet af. Dus Je kunt ook nog proberen alle geluiden van het kaartje af op je computer af te spelen....

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rein op 3 augustus 2020, 21:19:58
Dag Rob,
Het tikken is inderdaad erg zacht, maar wel hoorbaar. Het zijn er niet twee, maar het blijft doorgaan zolang er voldoende spanning is. Vermoedelijk is er dus iets anders aan de hand.
Die deur had ik ook al open gedaan ;D. De speakertjes die ik geprobeerd heb zijn allemaal prima.

Je eerste suggestie heb ik nog even geprobeerd. Ik begreep uit de datasheet dat het zelfs wel 5 seconden kan duren voor de boel opgestart is, dus heb ik meteen maar 6000 van de MP3inittijd gemaakt. Dat zou meer dan voldoende moeten zijn.
Je raadt het al: het duurt alleen wat langer voor de sketch het eerste bestand probeert af te spelen en het tikken gaat gewoon door.

Ik wacht nu gewoon tot meneer Ali onze brievenbus weer kan vinden en dan pak ik het wel weer op.
Groeten,
Rein.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 8 september 2020, 22:21:45
Geluid in de Br52Kon....

(http://www.xs4all.nl/~robvd/Forum/BR52K-30.jpg)


In deze loc zit geen nabootsing van de vuurkist in de cabine. En dat is in dit geval handig, want daar kunnen de onderdelen van de geluidsmodule mooi in...

(http://www.xs4all.nl/~robvd/Forum/BR52KGeluid_01.jpg)


De Arduino past grotendeels in de  ketel en de MP3 speler komt op de vloer van de cabine. Die is gesloten, dus zo zie je er nauwelijks iets van. Wel hou ik de doorkijk bij de ramen vrij.

(http://www.xs4all.nl/~robvd/Forum/BR52KGeluid_02.jpg)


De module deed het niet meteen. Maar met de testsoftware kwam ik er achter dat ik per ongeluk de seriële ontvangst en de lichtpin op dezelfde pin van de Arduino had staan, waardoor er alleen maar gekraak op de speaker kwam.
Ondertussen is dat gecorrigeerd. Maar nu moet ik nog betere geluidsbestanden maken. Ik had wel iets van kokende stoom in de ketel gecombineerd met het geluid van een turbine (voor de trek in de schoorsteen), maar dat klinkt nog niet goed.

Dus nog even terug naar de tekentafel mengtafel
Wordt vervolgd.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 28 december 2020, 14:37:07
Met een nieuwe speaker in de BR 52K is het geluid een stuk beter geworden.

(http://www.xs4all.nl/~robvd/Forum/BR52K-36.jpg)


De geluidsfragmenten zijn nu een mix van een ruisende ketel en het geluid van een turbine/compressor.
Tijd voor een filmpje van deze loc met turbo.




Overigens kwam ik nog een film van Zuid Afrikaanse locs tegen, die ook met condenserende tenders door de droge gebieden heen reden. Vanaf 9:40 is in dit filmpje zo'n loc te zien en te horen, waarbij de oorspronkelijke tender is behouden.




Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 23 januari 2021, 23:05:14
Kleine locs, tóch geluid? Misschien kan het....

Een aanvullende oplossing: Geluid op de rails, in plaats van in de loc.
Tenminste, dat is het idee...

Ik loop al een tijdje met het idee om voor kleine locs een andere oplossing te maken om geluid te produceren. Zo heb ik per ongeluk wel eens de toon van de pulsbreedte besturing op de speaker gehad. Dat kun je natuurlijk ook expres doen. Mijn idee: als de rijstroom dan ook het geluidssignaal is, dan kan de elektronica aan boord veel eenvoudiger en kleiner.
Vandaag heb ik dat idee in een concept opstelling uitgeprobeerd en op film gezet.



Nu zie ik deze oplossing als aanvullend op de bestaande modules en pulsbreedte rijstroom. En dan eigenlijk alleen voor de Köff rangeerloc en de Glaskasten stoomlocomotief.

Voor de geïnteresseerden, wat meer in detail hoe dit werkt
Met de Arduino rijstroom voorziening wordt in deze oplossing een hoog frequent signaal met pulsbreedte gebruikt. De frequentie is zo hoog, dat de resulterende pulsbreedte wordt 'gezien' als een voltage (een digitaal- naar analoog omzetter is niet nodig). Met het programma'tje zijn 7 pulsbreedte stappen mogelijk, ofwel 7 voltages. Door deze voltages te wisselen is een (grof) digitaal geluid te maken.
(Het omzetten van digitaal geluid van een CD/MP3 speler werkt ook zo: alleen zijn er daar 65536 voltages in plaats van 7)

Nu wordt de truuk om geluidsgolven (definities) te maken, waarbij
- de wisseling van het voltage het gewenste geluid produceert, en gelijktijdig
- het gemiddelde voltage past bij de rijsnelheid van de locomotief.

In het filmpje heb ik er twee van deze definities gemaakt. Gelukkig kon ik hierbij terugvallen op mijn eerdere werk voor het dieselgeluid in de V60. Daarin waren de pulsbreedte 'voltages' en geluidsgolf definities al gebruikt voor het maken van dieselgeluid.

Eens kijken of dit concept ook goed genoeg werkt in rijdend materieel. En ik kan eens stoomtrein geluiden gaan proberen.

Zo, ik kom de avonden met avondklok wel weer door :)

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 24 januari 2021, 00:01:54
Dit is leuk Rob. Ik ga dit heeeel aandachtig volgen. Deze componenten kan ik misschien ook wel in sommige N locjes kwijt. Het luidsprekertje is het grootste onderdeel en misschien een probleem. En ik heb dit alles wel in huis. Da's ook leuk.
Knutsel lekker verder en ik volg je op de voet. Je bent een kunstenaar. ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 24 januari 2021, 14:46:41
Bedankt, Pierre.
Oh ja, goed idee van de N locjes. En ik heb zelf ook nog wat H0m, daar breng je mij weer op een idee :)

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 30 januari 2021, 12:39:53
Ik ben nog wat aan het experimenteren door de gelijkrichter, transistor en dergelijke ook weg te laten en de speaker direct op de rijstroom aan te sluiten. Dat gaat met de 8 ohm / 0,5 Watt speakers die ik nu heb alleen maar als ik er ook een weerstand tussen zet. En die weerstand neemt dan het meeste van het vermogen op. Dat is niet alleen zonde van de stroom, maar levert vooral veel hitte op, die ik juist in kleine, plastic(!) locjes moeilijk kwijt kan.
Ik heb nu 50 ohm / 1 Watt speakertjes besteld. Daar moet waarschijnlijk nog steeds een weerstand op, of misschien 2 van deze speakers in serie. Als ik even zo op een bierviltje reken, is de 50 ohm bij 10 Volt nog steeds 0,2 Ampere en dus 2 Watt (Ik weet het, geen zuiver rekenwerk met de impedantie van een luispreker, maar de grootte orde geeft in ieder geval een idee of het moet kunnen). Idealiter zou je dus een grotere impedantie (rond de 100 ohm) willen hebben, maar dan kom je in de koptelefoon speakers uit, en die hebben weer een veel lager vermogen (0,1 Watt).

Kortom, dit ligt even in de wacht tot de speakertjes geleverd worden.

Wat ook maaaaanden in de wacht heeft gelegen, is de ("klassieke") geluidsmodule in de tender van de BR24. Het oorspronkelijke lood is er uit gehaald en vervangen door een plak lood rond de motor op de bodem, en wat extra stukjes lood waar de elektronische componenten omheen gebouwd konden worden.
Echter, het gewicht was te laag en de trekkracht van de loc was te krap: ik kon alleen met korte en licht lopende treinen de helling op. Dus ik had geen zin om die geluidsmodule in elkaar te puzzelen bij zo'n slecht presterende loc en de boel gelaten.

Totdat ik me bedacht dat het lood niet alleen ín de tender hoeft te zitten, maar ook voor een deel ónder de tender kan.

(http://www.xs4all.nl/~robvd/Forum/BR24Geluid_02.jpg)


Die 7 á 8 gram tussen de wielen maakt het verschil...
En daarmee was de motivatie terug om de geluidsmodule in elkaar te puzzelen.

(http://www.xs4all.nl/~robvd/Forum/BR24Geluid_01.jpg)


Met de module op zijn plek was ook in de tender nog ruimte voor een extra 5 gram lood bovenop het lood wat er al in zat.

Met al het gefriemel klaar en een goed rijdende, tuffende loc, was het nog een kwestie van wat verf er tegenaan en personeel aan boord om de loc regelmatig in te kunnen zetten...

(http://www.xs4all.nl/~robvd/Forum/BR24Geluid_03.jpg)


Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 4 februari 2021, 21:07:01
Rijstoom!
(geen spelfout)

Gisteren had ik een regenachtige deeltijdmiddag. Een mooi moment om de rijstroom als geluidsgolf uit te werken voor de Glaskasten. En in de loop van de middag werden ook de nieuwe 50 ohm speakertjes afgeleverd. Dus ik kon meteen testen met alleen een speaker en weerstand in serie op de rijstroom. Na een beetje experimenteren kwam ik uit op een weerstandje van 47 ohm in serie met de speaker. Zo was er flink geluid en weinig warmteontwikkeling.

Vanmiddag in de lunchpauze e.e.a. op bewegend beeld en geluid gezet en vanavond even een filmpje van gemaakt. Naast de demonstratie ook een korte voor- en nadelen afweging van deze oplossing.




Belangrijk is de noodzaak voor een goed vliegwiel in stoomlocs, om de onderbrekingen in de rijstroom (tussen de uitlaatslagen in) te overbruggen. Bij diesels speelt dit minder, zoals eerde in de test van het concept al is gebleken.
Gelukkig heeft mijn Glaskasten een goed vliegwiel, de Köf niet. Dus dat komt mooi uit....

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 3 april 2021, 12:03:12
Diesels: De grootste en de kleinste
Althans in mijn huidige collectie

De V320 is uitgerust met Arduino, MP3 speler en stereo versterker met 2 speakers. Ruimte zat.

(https://www.xs4all.nl/~robvd/Forum/V320_01.jpg)

(https://www.xs4all.nl/~robvd/Forum/V320_02.jpg)


Er zit echter af en toe een piep/kraak in het geluid bij het rijden.... Wat blijkt: de kleine, maar sterke motor vaan dit Rivarossi model trekt zo veel stroom, dat de spanning op de rails met ruim een volt daalt. En daarmee zakt de spanning op ingang van de Arduino ook af en toe onder de 7 volt (en de gereguleerde uitgang van 5 Volt zakt dan ook iets). De Arduino en de MP3 speler hebben daar geen last van, maar de versterker wel, vermoed ik.
Eens kijken hoe ik dat kan oplossen. Ik weet het: bedrading... Maar die is redelijk stevig uitgevoerd, behalve in mijn analoge schakelkast voor de stroomkringen. Er moet een makkelijkere manier zijn. Misschien de motorspanning wat reduceren met een paar diodes...

De kleine Köf III heeft daarentegen alleen een weerstand en speaker gekregen. Uitdaging hier was om het locje open te krijgen: eerst cabine voorzichtig verwijderen door deze omhoog te trekken, dan de voorste bufferbalk er met beleid af trekken, achterste boutje aan de onderzijde los en dan kan de motorkap naar voren en naar boven er af...

(https://www.xs4all.nl/~robvd/Forum/Kof_01.jpg)


Het weerstandje kan nog net onder de motorkap. Een gat geboord in het bedieningspaneel, zodat daar de draden door heen kunnen.

(https://www.xs4all.nl/~robvd/Forum/Kof_03.jpg)


Het speakertje heeft een kokertje van plakband nodig, om het geluid wat beter weer te geven. Plakband is makkelijk en snel, maar vooral ook doorzichtig. Zo zie je er niet heel veel van als het speakertje tegen het dak zit en het plakband in de cabine.

(https://www.xs4all.nl/~robvd/Forum/Kof_04.jpg)


De raampjes zijn uit de deuren gehaald, zodat het geluid naar buiten kan.

Ook de software voor de stroomvoorziening is ondertussen van Diesel-geluid voorzien en daarmee kan dit locje over de baan tuffen. Binnenkort maar even een filmpje van deze Köf maken.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Pierre op 3 april 2021, 17:31:14
Jij blijft maar gaan Rob. Ondertussen heb je veel meer locs dan je kan laten rijden lijkt me maar wel onwijs knap dat je in alle locs geluid weet te knutselen. Geweldig man ... lekker doorgaan zo. ;)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 3 april 2021, 22:22:25
Ha, bedankt Pierre,

Ondertussen heb je veel meer locs dan je kan laten rijden lijkt me...
Dan ik tegelijk kan laten rijden inderdaad...  :D Maar meestal rij ik met een kleine selectie, vaak een beetje op thema, zoals 'Kleinbahn', 'De magistralen' , eenheidslocomotieven of iets dergelijks. Of ik stel gewoon een setje samen waar ik zin in heb op dat moment...

En ja, dat rommelen met locjes is gewoon leuk; de groeiende verzameling is een niet onprettige bijwerking, zal ik maar zeggen.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 4 april 2021, 11:26:59
De köf met geluid....




Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 20 januari 2023, 21:08:27
Van @Carrilet komt deze vraag.

Citaat
Als ik het goed begrijp gebruik je het lage deel van de PWM duty cycle (het lage % deel waarop de locmotor nog niet draait) om functies in/uit te schakelen en het hoge % deel om de snelheid te regelen.
Bij een loc op snelheid werken de functietoetsen dus net?
De functietoetsen werken bij stilstand én op snelheid. De snelheid wordt geregeld met de pulsbreedte, de functietoetsen veranderen voor een korte tijd de frequentie (bij dezelfde pulsbreedte). Normaliter is de frequentie 490Hz, bij de functietoetsen is deze voor elke toets hoger

Citaat
ik zal je programma nog eens goed bekijken, de laatste versie is 2.0 van mei 2018?
We hebben het hier over de rijstroomregeling software. Ik heb een nieuwere versie 2.7. De belangrijkste wijziging is dat stroom niet helemaal wordt uitgezet bij de wisseling van de rijrichting. Geluid blijft dan ook aan bij rangeren, bijvoorbeeld. Maar deze versie is nog niet gepubliceerd.
Dat vind ik handig, maar dat is niet in alle gevallen zo.
Ik ben ook nog bezig met een versie 3 voor (ook) het rijstroomgeluid direct op de speaker. Maar dat is weer een heel andere insteek.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Carrilet op 5 februari 2023, 12:56:59
De laatste dagen heb ik nagedacht over hoe ik het beschreven PWM geluid op mijn baan zou kunnen toepassen. Ik rij op het hoofdspoor maar één kant op, met 3 snelheden (snel, langzaam, stop). De baan is opgedeeld in 24 blokken met ieder een stopsectie aan het eind. De stopsecties worden met een computer aan- en uitgeschakeld via een USB I/O module.

Ik zou het met een Arduino zo kunnen doen;
(https://thumbs-eu-west-1.myalbum.io/photo/1k0/d43669b5-e3dc-439a-ac38-824483ce6d7b.jpg) (https://thumbs-eu-west-1.myalbum.io/photo/1k0/d43669b5-e3dc-439a-ac38-824483ce6d7b.jpg)

Arduino met 3 potmeters voor de 3 snelheden schakelt 3 uitgangen via een schakeltransistor de linker rail naar massa. De rechter rail is verbonden met +12 V. Omdat ik niet achteruit rij, is er geen noodzaak voor een H-brug motorregelaar.
De 6 functietoetsen werken alleen bij de 'stop' snelheid.

relaiskaart;
(https://thumbs-eu-west-1.myalbum.io/photo/1k0/e196c4fe-cbbf-4c31-90c9-aab0d755f770.jpg) (https://thumbs-eu-west-1.myalbum.io/photo/1k0/e196c4fe-cbbf-4c31-90c9-aab0d755f770.jpg)

De relais schakelen de 'langzaam' of 'stop' snelheid naar de stopsecties (niet alle relais zijn getekend). Er is (nog) geen langzaam afremmen en optrekken.

Ik heb het programma aangepast; geen IR besturing, geen vooruit/achteruit, maar het principe is hetzelfde. Een variabele PWM duty cycle bij een vaste frequentie van 490 Hz (met analogWrite) voor de snelheid en dezelfde duty cycle maar gedurende korte tijd een hogere frequentie bij indrukken functietoets.

(als ik alle code hier plak, krijg ik een 403 foutmelding)
Om te testen het spul op een breadboardje geprikt;

(https://thumbs-eu-west-1.myalbum.io/photo/1k0/f91ffd19-234c-4fea-8ffc-7f6b2a549226.jpg) (https://thumbs-eu-west-1.myalbum.io/photo/1k0/f91ffd19-234c-4fea-8ffc-7f6b2a549226.jpg)

Bij testen blijkt dat de nulwaarde van de potmeters boven de stopwaarde ligt...  :(  Misschien andere potmeters gebruiken?
In het programma zit een aantal Serial.print regels om te zien wat de waarden zijn, maar tijdens het testen stopte de serial monitor er opeens mee, gaf alleen wat onleesbare karakters. Nu eerst andere Arduino's bestellen.

Als het bruikbaar is, moet ik nog wel meer ombouwen. Op dit moment is de ononderbroken linker rail verbonden met de massa en relais schakelen 12 V, 10 V of 0 V naar de onderbroken rechter rail.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Bert op 5 februari 2023, 14:01:26
Wat gebruik je daar als oscilloscoop?

Edit: al gevonden, DS211
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Rob op 5 februari 2023, 15:08:46
Nou @Carrilet,

Dat is een rijstroom voorziening op een ander niveau.

(als ik alle code hier plak, krijg ik een 403 foutmelding)
Ik denk dat onze nieuwe hosting partij wat strenger is. Eventueel kun je de sketch hier als .ino file aan het bericht plakken als alternatief.

Bij testen blijkt dat de nulwaarde van de potmeters boven de stopwaarde ligt...  :(  Misschien andere potmeters gebruiken?
Ik zie dat je 1k potmeters gebruikt. Ik gebruik 10k versies. Dat is ook wat ze in de Arduino wereld aangeven. Het zou niet zoveel uit moeten maken, want ze staan als spanningsdelers geschakeld, maar toch.
Ik zo ook checken of alle analoge pinnen ook op input staan. Verder heb ik gelezen dat meerdere analoge direct na elkaar uitlezen ruis kan geven. Een kleine vertraging tussen het uitlezen van de verschillende pinnen zou moeten werken.

En waarom gebruik je eigenlijk potmeters? Je weet toch al dat je 3 snelheden nodig hebt? Dan kun je ook drie vooraf ingestelde pulsbreedtes daarvoor gebruiken.

Rob
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Carrilet op 5 februari 2023, 19:23:01
Ik denk dat onze nieuwe hosting partij wat strenger is.

Ik heb het programma verder uitgekleed, nu met 3 vaste waarden voor de snelheden. Het nog ongeteste programma is nu a.v.;

/* Arduino Nano/ATmega328P (old)
 * Arduino Nano/ATmega168
 * Arduino Nano/Atnmega328p
 *
 * PULSBREEDTEBESTURING MET GELUID VOOR MODELTREIN
 * versie 1.0 - januari 2023  -  MH
 *
 * Motor snelheidsregeling met 3 snelheden en 6 functietoetsen
 * Geschikt voor analoge geluidsmodules.
 *
 * De motorbesturing gaat met 3 open collector schakeltransistors, hier wordt
 * met PWM de (effectieve) uitgangsspanning ingesteld waarmee de pulsbreedte
 * tussen 0 (uit) en 255 (maximaal) wordt geregeld.
 * Vaste pulsbreedte voor stop, langzaam en snel.
 *
 * Functietoetsen:
 * Er zijn tot 6 functietoetsen aan te sluiten. Elke toets verandert kort de frequentie van de PWM rijspanning op 'stop' uitgang.
 * Deze frequentieveranderingen worden door een geluidsmodule herkend en die start daarmee speciale functies.
 *
 */
// ------------ Instellingen per invoerapparaat ----------
const byte aantalfunctietoetsen = 6; // 0..5
byte functietoetspin[] {2,3,4,5,6,7};

// ------------ Instellingen motorregelaar ----------
// uitvoerpinnen schakeltransistor, dit moeten PWM pinnen zijn; 3, 5, 6, 9, 10 of 11, 
// analogWrite = 490 Hz op pin 3, 9, 10, 11.  980 Hz op pin 5, 6
//
// motorpinnen   0, 1, 2
byte motorpin[] {9,10,11};   
//
const byte dutygeluid    = 10;   // ondergrens dutycycle, start geluid, maar niet voldoende om te rijden
const byte dutylangzaam  = 100;  // dutycycle voor langzame snelheid
const byte dutysnel      = 200;  // dutycycle voor hogere snelheid
//
//                    0          1           2
byte dutycycle[]{dutygeluid,dutylangzaam,dutysnel}; // 0..255
//
// ------------- Definities en variabelen voor geluidsmodule pulsen -----
// rijspanning     ~ 490.0 Hz; //  gemeten periode bij 490 Hz = 1/490 = 2040 us voor standaard PWM rijspanning
                               //  analogWrite 490 Hz op 3, 9, 10, 11
                               //  analogwrite 980 Hz op 5, 6
const byte aantalfunctiefreqs =  6;
float functiefreq[] {667.0, 800.0, 1000.0, 1250.0, 1667.0, 2000.0};

const byte pulsduurfunctie    = 50; // tijdsduur van de hogere frequentie functiepuls in ms
int long stopmillis;                // teller duur functiepuls
//
// -------------- Overige variabelen ------------------
int t;                                // algemene teller
//
// ============================== subroutines =======================
void Leesfunctietoets (byte toetsnr) {
  float periode, hoogpuls, laagpuls;
  //   
  if ( digitalRead(functietoetspin[toetsnr]) == LOW ) {      // toets ingedrukt
    while (digitalRead(functietoetspin[toetsnr] == LOW)) { } // niets doen, wacht tot toets is losgelaten
    // toets losgelaten (analogWrite gaat door op 490 Hz)
    //
    periode = 1000000/functiefreq[toetsnr];  // periode (hoog + laag) in usec
    hoogpuls = dutycycle[0]/255 * periode;   // usec, dutycycle alleen voor toetsen bij snelheid 0
    laagpuls = periode - hoogpuls;           // usec
    //
    stopmillis = millis() + pulsduurfunctie; // gedurende pulsduurfunctie in msec 
    while (millis() <= stopmillis) {     //    |                 pulsduur   ....     | alleen op 'stop' uitgang
      digitalWrite(motorpin[0],HIGH);    //    |____  periode  |____
      delayMicroseconds(hoogpuls);       //    |    |          |    |
      digitalWrite(motorpin[0],LOW);     //    |    |          |    |
      delayMicroseconds(laagpuls);    }  //____|hoog|__laag____|    |__
    //
    analogWrite(motorpin[0],dutycycle[0]);   // terug naar standaard PWM met freq = 490 Hz
  }
  else { }; // niets, toets niet ingedrukt 
}
// ================================== Setup na starten Arduino ========================
void setup() {
  //Serial.begin(9600);
  //Serial.println("Setup");
  pinMode (functietoetspin[0],INPUT_PULLUP); // functietoetsen 1..6
  pinMode (functietoetspin[1],INPUT_PULLUP); // toets ingedrukt = 0 (LOW)
  pinMode (functietoetspin[2],INPUT_PULLUP);
  pinMode (functietoetspin[3],INPUT_PULLUP);
  pinMode (functietoetspin[4],INPUT_PULLUP); 
  pinMode (functietoetspin[5],INPUT_PULLUP);

  // in- en output pinnen initialiseren
  pinMode (motorpin[0], OUTPUT);  // schakeluitgangen 1..3 met NPN transistor
  pinMode (motorpin[1], OUTPUT); 
  pinMode (motorpin[2], OUTPUT); 
  // standaard PWM met freq = 490 Hz op motoruitgangen
  analogWrite(motorpin[0],dutycycle[0]);  // 'stop' uitgang
  analogWrite(motorpin[1],dutycycle[1]);  // 'langzaam' uitgang
  analogWrite(motorpin[2],dutycycle[2]);  // 'snel' uitgang
} // einde setup
// ================== Hoofdlus Arduino =================================
void loop() {
  //
  //Serial.println ("loop");
  // 
  // lees functietoetsen 0..5 (1..6)
  for (int t=0; t<aantalfunctietoetsen; t++ ) {
    Leesfunctietoets(t); }
}
//
// ===================================================================
// --------------- einde schets -----------------------------------------------------------
(Ik denk dat het aan de max berichtlengte ligt. De code past nu blijkbaar wel.)

Citaat
Ik zie dat je 1k potmeters gebruikt. Ik gebruik 10k versies.
...
En waarom gebruik je eigenlijk potmeters? Je weet toch al dat je 3 snelheden nodig hebt? Dan kun je ook drie vooraf ingestelde pulsbreedtes daarvoor gebruiken.
Ik heb gebruikt wat ik had liggen. Met potmeters kan de snelheid in real time aangepast worden zonder het programma steeds opnieuw te hoeven compileren en uploaden.

Ik heb de potmeters nu weggelaten en vaste waarden als constanten opgenomen. Later proefondervindelijk vaststellen welke waarden het beste werken.
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Carrilet op 5 februari 2023, 20:00:37
oscilloscoop?
... al gevonden, DS211
Een DSO201 om precies te zijn. Erg handig om snel even dingen zichtbaar te maken.
(https://thumbs-eu-west-1.myalbum.io/photo/360/178f9dbf-2d3f-43cd-9ed7-8c9d2cfdc771.jpg)

Hier de positieve en negatieve pulsen van een PWM motorregelaar;


Daarnaast nog een OWON SDS 1102, 2 kanaals, ook erg handig, maar wat minder mobiel...
(https://thumbs-eu-west-1.myalbum.io/photo/540/2aef847c-504c-4558-9aae-95a92c636f08.jpg)
Titel: Re: Analoog rijden met geluid - het project.
Bericht door: Bert op 5 februari 2023, 20:10:03
Erg leuk hebbedingetje voor relatief weinig €.

Heb zelf nog steeds een ruim 40 jaar oude 2 kanaals Philips geheugen scoop, doet het nog perfect.