Nou Pierre,
Je hebt voortvarend ingeslagen.
Leuk, hoor, dat je ook met geluid aan de slag gaat.
Je schrijft dat je al pulsbreedte besturing hebt. Weet je ook op welke frequentie deze draait? En wat de maximale spanning is?
Mijn pulsbreedtebesturing is 490 Hz op zo'n 10 a 11 volt. Als jouw spanning aanmerkelijk hoger is moeten misschien de spanningsdelers iets anders worden. Kwa frequentie moet het aardig goed komen zolang je onder de 2000 Hz zit, denk ik.
Ondertussen ga ik gewoon alvast wat huiswerk opgeven

Ik zie dat je een Arduino Uno hebt. Daar kun je mooi mee beginnen om een programma'tje te uploaden en een speakertje aan te sluiten (als je die hebt).
Onderstaande code laat eindeloos een optrekkende en afremmende stoomtrein horen. Ik heb de ruis op de pin gezet, waar ook de ingebouwde LED van de Arduino is aangesloten (pin D13). Dan kun je het 'puffen' ook zien. Vooral handig als er om een of andere reden geen geluid is te horen.
/*
* RUISGENERATOR STOOMTREIN
* Stoomtrein geluiden: "puffen" van ruis in verschillend tempo
*/
// --- DEFINITIES ----
// pin definities
#define Ruispin 13 // pin voor aansturen van speaker: pin 1 of 0 (0 = 5 sec. vertraging)
//geluidsdefinities
//lok 1
// 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)
// algemene geluidsdefinities
#define pauze 0.25 // factor puf/pauze (elke slag heeft voor een deel stilte)
#define SisLaag 4000 // frequentiebereik voor sisgeluid
#define SisHoog 5500
// --- 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;
float pulsbreedte = pulsbreedtestil; // pulsbreedte in %
float pbtoename = 2;
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);
}
// --- HOOFDPROGRAMMA ---
// functies bij starten
void setup() {
Serial.begin(9600);
Serial.println("Ruisgenerator start.");
pinMode (Ruispin,OUTPUT);
speelRuis (3150, SisLaag,SisHoog); // sissen bij opstarten
}
// --- hoofdlus (loopt eindeloos door) ---
void loop() {
if (millis() > pze) { // lok rijdt en er is nu geen puf-pauze of vrijloop
// Pulsbreedte bepalen
pulsbreedte = pulsbreedte + pbtoename;
Serial.print("pulsbreedte: ");
Serial.println(pulsbreedte);
// rijgeluid
// tweecylinder = 4 puf slagen met verschil in de slagen (volgens definities van de loc)
// puf slag berekenen
if (pulsbreedte > pulsbreedtemax) {
pulsbreedte = pulsbreedtemax;
pbtoename = -2;
}
if (pulsbreedte < pulsbreedtestil) {
pulsbreedte = pulsbreedtestil;
pbtoename = 2;
}
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 hoofd-lus
Om de code op de Arduino te zetten:
- Aansluiten op de USB van de computer, even wachten tot de installatie is gedaan.
- Arduino IDE starten
- In "hulpmiddelen" board Arduino/Genuino Uno hiezen en daarna de Poort kiezen (als het goed is is er precies één).
- Nieuwe sketch openen
- Code knippen en plakken
- Upload starten
De Arduino op de computer aangesloten laten. Als het goed is kun je daarna de ingebouwde LED zien knipperen
Vervolgens kun je de speaker nog aansluiten:
De collector van de BC547B op de 5V, de basis met een weerstand van 220 ohm (iets meer mag ook) op pin D13 en de emitter op de speaker. De andere draad van de speaker op de ground.

Met de breadboards en de jumper kabeltjes kun je snel de aansluitingen maken. En dan zou er al iets te horen moeten zijn....
Je kunt in dit stadium de USB aansluiting als voeding gebruiken.
Succes!
Rob