From DefCon Projects
Jump to: navigation, search

In diesen Artikel stelle ich vor, wie ein einfacher Laptimer realisiert werden kann. Ich habe ihn Primär dafür eingesetzt die Rundenzeit meines Rennkarts zu erfassen. Er kann aber auch individuell für diverse Einsatzzwecke adaptiert werden. Für den Einsatzbereich im Kart gibt es schon einige fertige Lösungen (MyChron, Alfano, etc..), diese sind aber recht teuer wesegen ich zu einem Selbstbau übergegangen bin. Außerdem ist bei einem Selbstbau der Lerneffekt um einiges größer.

Hardware

Die Grundlage bildet der 8-Bit Mikrocontroller ATmega8 der Firma ATMEL. Dieser übernimmt alle Aufgaben der Steuerung und Berechnung. Das sind im großen und ganzen die Erfassung von:

  • Drehzahl
  • Geschwindigkeit
  • Rundenzeit

sowie die Steuerung der

  • LCD-Anzeige
  • Hintergrundbeleuchtung
  • Bestzeit-LED

Zur Anzeige wird ein alphanummerisches 4x20 Zeilen LCD verwendet (HD44780 kompatibel). Die Stromversorgung wird noch über einen 9V-Block realisiert der über einen Schaltregler die 5V erzeugt. Im Schaltplan ist noch die Möglichkeit vorgesehen über eine Z-Diode die für den Mikroconroller notwendigen 5V zu erzeugen. Davon sollte aber in der Praxis abgesehen werden. In Zukunft gedenke ich den 9V Block durch einen alten Handy-Akku zu ersetzen. Mittels eines NPN-Transistors besteht die Möglichkeit die Hintergrundbeleuchtung des LCD's über den Mikrocontroller einzuschalten. Das sollte beim Batteriebetrieb aber nur für kurze Zeit, z.B. beim beenden einer Runde geschehen. Weiterhin wird über eine LED angezeigt ob eine neue Bestzeit gefahren wurde.

Pinbelegung

Pin    Description     Connected with
-----------------------------------------
1      PC6(RESET)      RC-Network
2      PD0(RXD)        Connector (Bootloader)
3      PD1(TXD)        Connector (Bootloader)
4      PD2(INT0)       Drehzahl
5      PD3(INT1)       Geschwindigkeit
6      PD4(XCK/T0)     -
7      VCC             +5V
8      GND             GND
9      PB6(XTAL1)      4Mhz Quarz
10     PB7(XTAL2)      4Mhz Quarz
11     PD5(T1)         -
12     PD6(AIN0)       -
13     PD7(AIN1)       Bestzeit-LED
14     PB0(ICP)        Rundenzeit (Reed-Kontakt)
15     PB1(OC1A)       Transistor(LCD_BACKGRND)				
16     PB2(SS)         Taster "Hoch"
17     PB3(MOSI)       Taster "Runter"
18     PB4(MISO)       Taster "OK/EXIT"
19     PB5(SCK)        -
20     AVCC            +5V
21     AREF            RC-Network
22     AGND            GND	
23     PC0(ADC0)       LCD(DB7)
24     PC1(ADC1)       LCD(DB6)
25     PC2(ADC2)       LCD(DB5)
26     PC3(ADC3)       LCD(DB4)
27     PC4(ADC4)       LCD(Enable)
28     PC5(ADC5)       LCD(RS)


Stromverbrauch

Aktuell betreibe ich den Laptimer mit einem Wald-und-Wiesen 9V-Block, der Kapazität von ungefähr 600 mAh haben müsste. Dabei ergeben sich für verschiedene Zustände in denen sich der Laptimer befindet auch verschiedene Laufzeiten die ich nachfolgend in einer Tabelle aufgeführt habe (für einen 9V-Block a 600mAh):

Zustand Stromaufnahme (mA) Laufzeit (std)
Standardanzeige (*) + LCD-Hintergrundbeleuchtung an 44 mA 13 std (**)
Standardanzeige (*) + LCD-Hintergrundbeleuchtung aus 16 mA 37 std (**)
Rundenzeitmessung läuft 44 mA 13 std (**)
Standby 16 mA 37 std (**)

(*) Anzeige der Messwerte nach dem Einschalten des Laptimers (keine Messung läuft)

(**) Die Berechnung gehen von einer vollständigen Entladung aus. Mitunter schafft es der Schaltregler aber nicht mehr die 5V-Versorgungsspannung aufrecht zu halten. Die Zeiten sind als Best-Case anzunehmen.

Den größten Anteil am Stromverbrauch hat sicherlich die LCD-Hintergrundbeleuchtung[1] mit aktuelle 80 mA. Dieser kann natürlich noch über den Vorwiderstand R17 gesenkt werden.

Bedenken sollte man allerdings das dann mitunter die Erkennbarkeit des Displays, bei starker Sonneneinstrahlung, darunter leidet.

Software

Parameter

Über Software defines können eine fülle von Einstellungen an dem Laptimer vorgenommen werden ohne Teile im Code ändern zu müssen. Zurzeit habe ich die folgenden Parameter implementiert

SEC_LOCK_ICP 1 // Zeit die der ICP nach auslösen gesperrt bleibt, in Sekunden.
STANDBY_AFTER_MIN 6 // Zurücksetzen der Rundenzeitmessung und Standby (Runde nach x Minuten noch nicht beendet)
MAX_INTERIM_TICKS 12000 // Schwelle für Differenz zu Best-Zwischenzeiten (ganze Minuten!!)
AVERAGE_VALUE 4 // Zeitkonstante für die Mittelwertberechnung
AMOUNT_MAGNETIC_LOOPS 3 // Anzahl der Magnetschleifen auf der Rennstrecke
KPH_TO_MPS 3.6 // Umrechnung km/h <-> m/s
PERIMETER_TYRE 0.86 // Reifenumfang in Meter
FRONT_SPROCKET 11 // Zähnezahl Ritzel
REAR_SPROCKET 86 // Zähnezahl Kettenrad
SEC_SHOW_LAPTIME 5 // Zeit in Sekunden, bei der die alte Rundenzeit angezeigt wird

Zeiten

Die Berechnung der Zeiten gestaltet sich im ganzen Programm nach dem selben Schema. Ausgehend von den "ticks" die über den internen Timer des Atmegas alle 10ms erhöht wird, werden die daraus folgenden Zeiten abgeleitet.

void splitTicks(uint16_t ticks, volatile struct myTime* result)
{
    uint16_t centiSec = 0;
    uint16_t seconds = 0;

    centiSec = ticks; // Zenti-Sekunden (10ms)
    seconds = centiSec / 100; // Sekunden berechnen

    result->ticks = ticks;
    result->csec = centiSec  % 100; // Rest bei der Berechnung der Sekunden --> Zenti-Sekunden
    result->min = seconds  / 60; // Minuten berechnen
    result->sec = seconds  % 60; // Rest bei der Berechnung der Minuten -- > Sekunden
}

Dabei wird eine eigens angelegte Struktur "myTime" genutzt, die wie folgt definiert ist:

// Struktur für die diversen Zeiten
struct myTime 
{
    uint8_t min;
    uint8_t sec;
    uint8_t csec;
    uint16_t ticks;
    uint16_t interim[AMOUNT_MAGNETIC_LOOPS];
};

Flashen

Um das Programm auf den Mikrocontroller zu bekommen gibt es mehrere möglichkeiten, aber für alle wird zunächst einmal ein ISP-Programmer benötigt. Da es diese recht günstig (~10€) in der Bucht gibt gehe ich im weiteren nicht mehr darauf ein.

Zum Flashen muss der entsprechende ISP-Programmer mit den Pins Reset, MISO, MOSI sowie SCK verbunden werden. Diese Möglichkeit habe ich in meinem Layout allerdings nicht vorgesehen, deswegen bietet es sich an den Mikrocontroller extern zu Programmieren. Im Layout gibt es die Möglichkeit den Mikrocontroller über einen Bootloader zu Flashen (nur Flash kein EEPROM) allerdings muss dafür auch zunächst der Bootloader über einen ISP-Programmer in den Chip geschrieben werden.

Im grunde kann dafür jeder Bootloader benutzt werden, ich benutze zurzeit den Bootloader FastBoot von Peter Dannegger.[2]

Das Flashen geschieht mittels eines Bootloader über die serielle Schnittstelle (UART) des Atmega8 (Pins PD0 und PD1). Nutzt man diese Möglichkeit sollte man darauf achten, dass der Mikrocontroller auch keinen Fall direkt mit der seriellen Schnittstelle des PCs verbunden werden darf. Beachtet man das nicht zerschießt man sich die entsprechenden Eingangspins des Atmega. Es muss also zwingend eine Pegelwandlung (± 12V PC <> 0-5V µC) z.B. mit einem MAX232 (es gibt in der Bucht auch schon fertige Schaltungen direkt mit USB/Seriell-Wandler für ~2€) durchgeführt werden.


EEPROM

Das EEPROM dient dazu diverse Werte im Mikrocontroller zu speichern die auch nach einem Spannungsverlust erhalten bleiben sollen. Aktuell werden die folgenden Daten im EEPROM des Mikrocontrollers gespeichert:

  • Einstellungen (Anzahl der Magnetschleifen, Reifenumfang, Ritzel- und Kettenradzahl)
  • Bestzeit + dazugehörige Zwischenzeiten

Möchte man die Daten die im EEPROM gespeichert sind zurücksetzen (um z.B. den Laptimer auf einer anderen Rennstrecke einzusetzen) muss man den Ok/Exit-Taster bei einschalten des Laptimers gedrückt halten. Die nun erfolgte Inititialisierung wird durch den Text "Init. EEPROM!" auf dem Display und dem Blinken des Bestzeit-LED signalisiert.

Nachfolgend sind die Standardwerte angegeben die nach der erfolgten Initialiserungen für die Einstellungen im EEPROM stehen:

  • Magnetschleifen = 3
  • Reifenumfang = 0.86
  • Ritzel = 11
  • Kattenrad = 86


Cookies help us deliver our services. By using our services, you agree to our use of cookies.