Modelbaanbesturing > Elektronische en digitale techniek

Arduino gepruts. Ook Pierre gaat (een soort van) digitaal.

(1/24) > >>

Pierre:
Zoals iedereen weet hier op het forum ben ik een behoorlijk analoge modelspoorder. En daardoor in de digitale wereld ook echt een holbewoner. Ik weet er echt 0 van maar wat is er gebeurd ….

Rob heeft mijn nieuwsgierigheid gewekt met zijn Arduino tsjoek-tsjoek geluiden in een analoge trein. En dat vind ik nou weer wel leuk. Ik heb begrepen dat je dan wel je treinen op puls breedte besturing moet hebben lopen en ... laat ik dat nu al hebben. Een bofje dus. Nou heb ik van de week een beetje rommel aangeschaft en een plek gereserveerd om een startje met Arduino te maken. 8)





In de eerste plaats een Arduino starterkit aangeschaft. Daar zitten een heleboel spullen in waarvan ik geen moer begrijp maar dat komt vast nog wel (hoop ik). Daar zou een beschrijving bij moeten zitten maar dat was dus niet zo. Kortom die heb ik opgezocht op internet en de Nederlandse manual kunnen downloaden. Gelukkig voor mij want deze holbewoner spreekt ook geen Engels.

Dan nog 4 Digisparks en wat BC547B transistoren. Andere componenten zoals weerstanden, Elco’s, potmeters en andere rommel daar heb ik wel aardig wat van in huis.

Verder heb ik begrepen dat je het programma Arduino IDE nodig hebt en dat heb ik dan ook gedownload en geïnstalleerd op mijn computer. Om niet helemaal onbeslagen ten ijs te komen liep ik ook nog tegen een Arduino voor dummies aan die ik maar gekocht heb. Ook heeft Rob mij toegezegd een helpende hand uit te steken in mijn Arduino uitspattingen. Kortom … laat de show maar beginnen en eens kijken wat ik er van ga bakken.... ;)


Wim Corduwener:
Nou @Pierre je hebt behoorlijk wat ingeslagen.
Qua kennis van moeilijke dingen is mijn bandbreedte (laat ik iets digitaals noemen) nauwelijks meetbaar, maar volgens mijn beperkte inschattingsvermogen op dit gebied heb je dit toch niet allemaal nodig om een tsjoeketsjoek-geluid te maken? Ik zie bijvoorbeeld een stappenmotor liggen en ik ben wel nieuwsgierig wat je daarmee gaat aanvangen; een H0e-draaischijf?

Pierre:
Ik heb een starterskit besteld Wim en daar zit het meeste van dit spul in. Ik heb het misschien niet allemaal nu nodig maar je weet bij mij nooit wat er in mijn hoofd opkomt. Ik weet niet eens wat het allemaal is. Misschien als ik het een beetje onder de knie heb ontspruit er een speciaal project uit.  ;D Eerst maar eens even knoeien met de basis zodat ik het een beetje ga begrijpen. Dat wordt denk ik al heftig genoeg voor mij. :-\

SuperSylvester:
Nou Pierre, dan gaat er een (nieuwe) wereld voor je open. Als je de basis eenmaal een beetje onder de knie hebt
dan werkt dat spul als een tierelier... (of tjoeketjoek zo je wilt) en ga je vanalles verzinnen wat je ermee zou
kunnen doen. Met jouw fantasie kan daar iets heel moois uitkomen...


Rob:
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  ;D

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.


--- Code: --- /*
 * 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


--- Einde van code ---

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

Navigatie

[0] Berichtenindex

[#] Volgende pagina

Naar de volledige versie