Modelbaanbesturing > Elektronische en digitale techniek

Analoog rijden met geluid - het project.

<< < (46/46)

Bert:
Wat gebruik je daar als oscilloscoop?

Edit: al gevonden, DS211

Rob:
Nou @Carrilet,

Dat is een rijstroom voorziening op een ander niveau.


--- Citaat van: Carrilet op  5 februari 2023, 12:56:59 ---
--- Code: ---(als ik alle code hier plak, krijg ik een 403 foutmelding)
--- Einde van code ---

--- Einde van citaat ---
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.


--- Citaat van: Carrilet op  5 februari 2023, 12:56:59 ---Bij testen blijkt dat de nulwaarde van de potmeters boven de stopwaarde ligt...  :(  Misschien andere potmeters gebruiken?

--- Einde van citaat ---
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

Carrilet:

--- Citaat van: Rob op  5 februari 2023, 15:08:46 ---Ik denk dat onze nieuwe hosting partij wat strenger is.
--- Einde van citaat ---

Ik heb het programma verder uitgekleed, nu met 3 vaste waarden voor de snelheden. Het nog ongeteste programma is nu a.v.;


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

--- Einde van code ---
(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.
--- Einde van citaat ---
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.

Carrilet:

--- Citaat van: Bert op  5 februari 2023, 14:01:26 ---oscilloscoop?
... al gevonden, DS211

--- Einde van citaat ---
Een DSO201 om precies te zijn. Erg handig om snel even dingen zichtbaar te maken.


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

Bert:
Erg leuk hebbedingetje voor relatief weinig €.

Heb zelf nog steeds een ruim 40 jaar oude 2 kanaals Philips geheugen scoop, doet het nog perfect.

Navigatie

[0] Berichtenindex

[*] Vorige pagina

Naar de volledige versie