From DefCon Projects
Revision as of 10:57, 1 October 2013 by Webmaster (talk | contribs) (→‎Zeiten)
Jump to: navigation, search

In diesen Artikel stelle ich vor, wie ein einfacher Laptimer realisiert werden kann. Ich habe ihn Primär eingesetzt um die Rundenzeit meines Karts zu erfassen. Für diesen Einsatzbereich gibt es schon einige fertige Lösungen (MyChron, Alfano, etc..), diese sind aber recht teuer. 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 die so anfallen. 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)         -
17     PB3(MOSI)       -
18     PB4(MISO)       -
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)

Software

Zeiten

Die Berechnung der Zeiten geschaltet sich im ganzen Programm nach dem selben Schema. Ausgehend von den "ticks" der ü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];
};

Diese funktioniert im groben. Allerdings gibt es noch einige Funktionen die ich umsetzen würde bevor ich die version 1.0 veröffentliche.

TODO:

  • Zwischenzeiten unterstützen
  • Bestzeit im EEPROM sichern
  • Nach gewisser Zeit Rundenzeitmessung beenden (Kontakt länger nicht belegt)
  • Taster unterstützung (Reset aktuelle Runde, Bestzeit löschen)
  • LCD Hintergrundbeleuchtung dimmen
  • LCD Menüsteuerung (Anzahl Magnetschleifen, Geschwindigkeit / Drehzahl erfaasen?, ...)

Funktionsweise

In den nachfolgenden Kapiteln wird ausführlich auf einzelnen Komponenten des Laptimers eingegangen.

Magnetstreifen

In die Kartbahn sind in der Regel an bestimmten stellen Magnetstreifen eingelassen. Dazu werden einfache Permanent-Magneten genutzt (siehe Quelle Patenschrift). Ein Magnetstreifen sollte sich auf jedenfall auf der Start-/Ziellinie befinden. Je nach Kartbahn gibt es aber auch mehrere Magnetstreifen auf der Strecke die es ermöglichen Zwischenzeiten zu erfassen. Die Magnetstreifen sind i.d.R. ca. 1,8cm breit und umfassen die ganze Länge der Kartbahn. Ein Reed-Kontakt schaltet in ca. 2cm abstand, wobei dieser Wert stark von der Empfindlichkeit des Reed-Kontaktes abhängt.

Rundenzeit erfassen

Um die Rundenzeit zu erfassen, muss zunächst einmal das Magnetfeld des Magnetstreifens beim überfahren erfasst werden. Dazu kann man einen Hallsensor oder Hallschalter einsetzen. Es sollte aber auch eine Reed-Kontakt reichen. Beim überfahren des Magnetstreifens wird der Reed-Kontakt für kurze Zeit geschlossen. Der dadurch entstehende Pegelwechsel kann über den Mikrocontroller einfach über den ICP-Pin (Input Capture) erfasst werden.

Drehzahl erfassen

Die Drehzahl wird Potentialfrei gemessen was kapazitiv über einen Draht geschieht der um das Zündkabel (Verbindung Zündkerze <> Zündspule) gewickelt wird.

Geschwindigkeit erfassen

Bei der Erfassung der Geschwindigkeit gibt es zwei möglichkeiten. Die Drehzahl der hinteren Achse kann direkt erfasst werden, was z.B. ebendfalls mittels eines Reed-Kontaktes und Magnet (wie beim Fahrrad) geschehen kann. Es besteht aber auch die Option die Geschwindigkeit aus der Drehzahl und dem Übersetzungsverhältnis (Ritzel <> Kettenrad) zu berechnen.

Berechnungen

Rundenzeit

Zunächst berechne ich wielange der Reed-Kontakt Zeit hat um im "Worst-Case" zu schließen. Dazu nehme ich eine Geschwindigkeit von an beim überfahren der Magnetschleife.

Der Reed-Kontakt hat also ca. 0.65 ms Zeit um zu schließen. Bei 50 km/h dementsprechend doppelt so viel (1,3 ms).

Drehzahl / Geschwindigkeit

Das ermitteln der Drehzahl bzw. der Geschwindigkeit gestaltet sich ähnlich. Es wird bei beiden zu messenden Größen die Zeitdifferenz die zwischen zwei Impulsen gemessen und daraus dann die entsprechende Geschwindkeit bzw. Drehzahl berechnet. Da sich Drehzahl und Geschwindigkeit grob nur in dem Übersetzungsverhältnis zwischen Ritzel und Kettenrad unterscheiden, kann mitunter von einer expliziten zusätzlichen Erfassung der Geschwindigkeit oder Drehzahl abgesehen werden.

Berechnungen die ich dazu angestellt habe befinden sich im nachfolgenden Bild oder in dem dazugehörigen PDF im Anhang.

Anmerkung: Nach jedem "Tick" sind 100µs vergangen.

Bilder

Schaltplan

Laptimer_Rev_E.pdf

Quelltext

Kommt sobald ich den Code noch ein wenig schön gemacht habe.

Quellen

Die Quellen aus denen ich abgekupfert habe. Folgende Quelle müsste nach der Optik aus einem AppNote von Linear Technology sein. Vllt. weiß jemand wie das heißt und lässt es mich wissen.

Schaltplan Drehzahlteil
Patentschrift Alfano E.P.0632350
File:Laptimer Drehzahl Geschwindigkeit.pdf

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