Moppes Messwagen.


En historie om et godt spørgsmål, lidt elektronik og en hobby der er sjov.


Jo mere vi udvider på "min" modelbane jo flere spor bliver der og vi har længe gået og spurgt os selv, hvor lang er turen rundt på anlæggene? Det er så her man kan vælge at købe en målevogn der kan vise det. Men enten skal man købe en der er urimeligt dyr og kun fungerer ordentligt under digitaldrift (læs: ESU målevogn), eller en der består af en cykelcomputer og har svært ved at holde sig indenfor normalt fritrumsprofil (læs: Fleischmann målevogn).

Når man så samtidig er bidt af elektronik og har lidt erfaring med Arduino programmering, ja så er det oplagt at bygge en vogn selv.

Først var det frem med Arduino "fulmebrættet" for at prøve det af om det overhovedet kunne lade sig gøre. Dybest set er det jo bare en tæller og jeg fandt hurtigt en der havde lavet en "hvor mange gange har du trykket på denne her knap" - tæller, som kunne danne grundlag for min egen version af softwaren.

Efter lidt tests om jeg frem til følgende diagram.

Yderst til venstre er to batterier, sluttet til en DC/DC konverter gennem en kontakt. Konverteren genererer 5 volt ud fra batterispændingen og forsyner det resterende. Hjertet i det hele er en Arduino nano, der læser pulser fra optokobleren nederst og viser resultatet på displayet (16 karakterer x 2 linier LCD).
Den øverste modstand er til at begrænse baggrundsbelysningen i display, potentiometret er til kontrastjustering på display og den nederste er strømbegrænsning til sendedioden i OPB 804 optokobleren. Du kan finde diagrammet i pdf format her.

 

Det hele er at se her i lettere adskilt tilstand

I midten er "fjumreprintet" med batteriholder fra en gammel mus og en sokkel til Arduni nano. Display er monteret med bløde ledninger og kan monteres på ryggen af printet. Hele sandwich'en kan så monteres ovenpå vognen. På undersiden af vognen er optokobleren monteret. Jeg fandt en kafferørepind i træ og lavede den til det flag der skulle afbryde fotocellen. På et tidspunkt var jeg ved at opgive det hele, for jeg kunne ikke få fotocellen til at detektere flaget - indtil jeg malede den sort, så fungerede det.

Sidste del er så programmeringen. Som skrevet tidligere, så fandt jeg en gut der havde lavet et tæller program og stjal det meste derfra. Mit program er herunder.

 #include <LiquidCrystal.h>


 LiquidCrystal lcd(7,8,9,10,11,12); 

 const byte buttonPin = 5;               // set input pin
 unsigned long counter = 0;              // set your counter to zero to begin with
 unsigned long dispcounter = 0;          // set your dispcounter to zero to begin with
 
 int wheeld = 1100;                      // set wheel diameter in 0,01 mm
 int ppr = 2;                            // pulses per wheel revolution
 
 byte buttonState;                       // the current reading from the input pin
 byte lastButtonState = HIGH;            // the previous reading from the input pin

 unsigned long lastDebounceTime = 0;     // parameter for debounce filter
 unsigned long debounceDelay = 0;        // parameter for debounce filter


 void setup() 
 {
  pinMode(buttonPin, INPUT_PULLUP);      // enable pullup for input
     
      lcd.begin(16, 2);                  // setup to 16x2 lcd display
      lcd.setCursor(0, 0);               // display text at startup
      lcd.print("Moppes Messwagen");     // display text at startup
      lcd.setCursor(1, 1);               // display text at startup  
      lcd.print("L = ");                 // display text at startup
      lcd.print(dispcounter);            // display text at startup
      lcd.print(" mm");                  // display text at startup

 }
 void loop() {
                                                               // read the state of the input into a local variable:
 byte reading = digitalRead(buttonPin);
                                                               // check to see if input has changes
                                                               // (i.e. the input went from HIGH to LOW),  and you've waited
                                                               // long enough since the last input to ignore any noise:

                                                               // If the input changed, due to noise:
 if (reading != lastButtonState) {
                                                               // reset the debouncing timer
  lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) >= debounceDelay) {
                                                               // whatever the reading is at, it's been there for longer
                                                               // than the debounce delay, so take it as the actual current state:
                                                               // if the button state has changed:
    if (reading != buttonState) {
    buttonState = reading;


   if (buttonState == LOW) {   
    counter ++;                                                // count up
                                                               // "wheeld*3.1416/ppr" calculates wheel circumference between pulses
     dispcounter=counter*wheeld*3.1416/ppr;                    // multiply by wheel circumference between pulses
     dispcounter=dispcounter/100;                              // divide by 100 to get mm
      lcd.setCursor(1, 1);
      lcd.print("L = ");
      lcd.print(dispcounter);
      lcd.print(" mm");
      }
     }
    }
 lastButtonState = reading;
  }

Grundlæggende handler det om at tælle pulser, gange dem med hjulomkredsen og dividere med antal pulser per hjulomdrejning.

Øverst så i forsiden af vognen, her er at billede af bagsiden.

Og så lige det gyldne spørgsmål: Hvorfor hedder den "Moppes Meeswagen"?
Jooo, da jeg skrev programmet, stod der "Moppes målevogn", men når det kom frem på det lille display, så var Å erstattet med noget helt andet. Da min forkærlighed er tyske tog, så blev det til Messwagen.

 


Kommentarer tips og tricks,modtages gerne !!
E-Mail :
Klaus D. Mikkelsen - (moppe@post6.tele.dk)

Designet af Moppe