Author Topic: Easy way to remove 5 sec delay after user program is loaded?  (Read 408 times)

robvd

  • Newbie
  • *
  • Posts: 3
Hello Forum,

I've been round in cirkels and been to dead-ends several times trying to find out ho to remove the 5 seconds delay when the DigiSpark starts up. I understand it is required for the bootloader to detect any USB communication to get the user program loaded. Now I'm at the project stage that the program is running  fine, but the 5 seconds delay is a problem.

I had a look at the tips and tricks in the Wiki
http://digistump.com/wiki/digispark/tricks
But I couldn't figure out how to get the appropriate (hex) files.
Furthermore, I don't want to use PB0 to start the upload: it is in use with a fairly small resistance to ground in my project (see schematic below).

So, is there an easy way to remove the 5 sec delay (preferably without affecting the user program and via USB)?


Some background on the project.:
De DigiSPark is used as sound module in a h0 scale steam loco. the loco get's its power, 10 Volts PWM, from the wheels. This power is rectified and used for the DigiSpark also. The DigiSpark reads the dutycylce of the PWM motor power and uses it to create steam loco sound that changes when speed (duty cylce) increases or decreases.

The hardware setup:




The loco gets the power from it's wheels, so some short power interuptions are inevitable. The elco will reduce the power interruptions, but not for long. A larger Elco can overcome slighty longer power interruptions, but there's no room for a higher capacity one in the loco.
The sound can be heard quite OK while the loco is in motion, but it would be far better if the program starts immediately after the DigiSpark gets power (again).

Just to be complete, here's the code (sorry, comments are in Dutch)

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


// --- 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, 980, 700, 10);
      pze = maakPuf(puf, ruisStartFreq [slag], ruisEindFreq [slag]);
      if (slag < 3) {
        slag++;
      }
      else {
        slag = 0;
      }
    }
  }
}


I hope someone can help me out. Thanks in advance.

Rob

robvd

  • Newbie
  • *
  • Posts: 3
Re: Easy way to remove 5 sec delay after user program is loaded?
« Reply #1 on: July 12, 2018, 12:30:47 pm »
OK, finaly found a working solution, with pin0 to ground to upload.
I re-soldered my project with speaker now on pin1 instead of pin0 and moved the PWM sensor on pin1 to pin4. It works fine.

I used the DigiDucky files and instruction video. See links below.

micronucleaus and hex bootloader file:
https://sites.google.com/site/csapractical/DigiDucky.zip

instruction video:
http://upschannel.eu/watch/DXMHB1GCGEE/Remove+5+Sec+delay+and+add+button+to+Digispark+RubberDucky.html

Just had to re-upload the program after the bootloader update.

Rob