INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
IR Laptimer
04.10.2013, 11:21
Beitrag #1
IR Laptimer
Hallo

Ich habe eine IR Laptimer mit 16x2 Display nachgebaut.
Die Software läuft auch soweit.

Nun möchte ich das nicht nur eine IR Quelle erkannt wir sondern anhand des Hex (Fernbedienung) ein unterschied in der Zeitmessung gemacht wird.

Beispiel Hex ffff ist Auto 1 --- Sobald das Auto den Sensor erreicht hat wird in Display Auto 1 Lap 15 34,54s
Best 12 33,44s
Sobald das Auto 2 den Sensor erreicht kommt die Anzeige von dem Auto mit der Hex fff1

Das ganze sollte im Modellbau Anwendung finden.
Gibt es da eine Möglichkeit ?
Können die Daten auch auf SD gespeichert oder auf Pc in Realtime ausgewertet werden ?

Mit freundlichen Grüßen

Rieders
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.10.2013, 09:40 (Dieser Beitrag wurde zuletzt bearbeitet: 05.10.2013 09:41 von rkuehle.)
Beitrag #2
RE: IR Laptimer
Moin rieders,
a bisserl konkreter wäre schon gut.
Du möchtest die SW erweitern. Wenn du dabei Hilfe brauchst wäre der aktuelle Code schon mal ganz nett. Auch eine Ansage welcher Sensor etc. benutzt wird bringt dich/uns weiter.
Um deine Fragen zu beantworten: Ja, Ja und Ja.
Grüße Ricardo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.10.2013, 10:40
Beitrag #3
RE: IR Laptimer
Hallo

Hier ist der Code

/*
IR LAPT TIMER V9 by
* PER EMIL SKJOLD 2012
* Created with Arduino 1.01
* libraries is found with google.


StopWatch by
* Paul Badger 2008

*/
#include <IRremote.h> // use the library for IR
int receiver = 13; // pin 1 of IR receiver to Arduino digital pin 11
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define rele A0
#define ledPin 10 // LED connected to digital pin 13
#define buttonPin 13 // button on pin 4
int timeout = 2; // SECONDS TO INHIBIT SENSOR TO AVOID UNWANTED TRIGG
int value = LOW; // previous value of the LED
int buttonState; // variable to store button state
int lastButtonState; // variable to store last button state
int blinking; // condition for blinking - timer is timing
long interval = 100; // blink interval - change to suit
long previousMillis = 0; // variable to store last time LED was updated
long startTime ; // start time for stop watch
long elapsedTime ; // elapsed time for stop watch
long lastTime = 0; // forrige tid
long endring = 0; //delta
long bestTime =99999;
String lapTimeText = "00";
String bestLapText = "Best 33 14.225s";

int fractional; // variable used to store fractional part of time
int runde = 1;
int started = 0;

void setup()
{
//IR
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
irrecv.blink13(true);
//pins
pinMode(ledPin, OUTPUT); // sets the digital pin as output
pinMode(rele, OUTPUT); // sets the digital pin as output
digitalWrite(rele, HIGH);
pinMode(buttonPin, INPUT); // not really necessary, pins default to INPUT anyway
digitalWrite(buttonPin, HIGH); // turn on pullup resistors. Wire button so that press shorts pin to ground.
Serial.println("Stoppeklokke klar");
//LCD
lcd.begin(16, 4);
lcd.clear();
lcd.print("IR Lap Timer by");
lcd.setCursor(0, 1); //linje2, (index0)
lcd.print("----Rieders----");

}

void loop()
{
//ebug
//delay(4000);
// trigg();
//IR
if (irrecv.decode(&results)) // have we received an IR signal?
{
translateIR();

for (int z=0; z<2; z++) // ignore 2nd and 3rd signal repeat
{
irrecv.resume(); // receive the next value
}
}


// check for button press
buttonState = digitalRead(buttonPin); // read the button state and store
if (buttonState == LOW && lastButtonState == HIGH){ // check for a high to low transition
// if true then found a new button press while clock is not running - start the clock
trigg();
delay(50); // short delay to debounce switch
lastButtonState = buttonState; // store buttonState in lastButtonState, to compare next time
}
else{
lastButtonState = buttonState; // store buttonState in lastButtonState, to compare next time
}


// blink routine - blink the LED while timing
// check to see if it's time to blink the LED; that is, the difference
// between the current time and last time we blinked the LED is larger than
// the interval at which we want to blink the LED.
if ( (millis() - previousMillis > interval) ) {
if (blinking == true){
previousMillis = millis(); // remember the last time we blinked the LED
// if the LED is off turn it on and vice-versa.
if (value == LOW)
value = HIGH;
else
value = LOW;
digitalWrite(ledPin, value);
}
else{
digitalWrite(ledPin, LOW); // turn off LED when not blinking
}
}
}

void trigg()
{
// if true then found a new button press while clock is running - stop the clock and report
elapsedTime = millis() - startTime; // store elapsed time
//skriv vist klokke er startet
if (blinking == true){
// routine to report elapsed time

//serial
Serial.print("Lap ");
Serial.print(runde);
Serial.print(" ");
lapTimeText=print_time(elapsedTime);
Serial.print(lapTimeText); //ms long til sekund
Serial.print(" ");
endring=elapsedTime - lastTime;
Serial.println(endring);

//runde tekst
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Lap ");
lcd.setCursor(5, 0);
lcd.print(runde);

//tid forbedring
// lcd.setCursor(0, 1);
// lcd.print(String(endring) + "ms");

//tid runde
lcd.setCursor(8, 0);
lcd.print(lapTimeText); //ms long til sekund
lcd.setCursor(14, 0);
lcd.print("s");

//ny beste tid?
if (elapsedTime <= bestTime){
bestTime=elapsedTime; //set ny bestetid
// bestLapText="Best=" + String(runde) + " " + lapTimeText;
lcd.setCursor(0, 1);
lcd.print("Best " + String(runde));
lcd.setCursor(8, 1);
lcd.print(lapTimeText);
lcd.setCursor(14, 1);
lcd.print("s");
//peepBesteRunde
digitalWrite(rele, LOW);
delay(100);
digitalWrite(rele, HIGH);
delay(100);
digitalWrite(rele, LOW);
delay(100);
digitalWrite(rele, HIGH);
delay(100);
// digitalWrite(rele, LOW);
// delay(100);
// digitalWrite(rele, HIGH);

}
else{
// lcd.print(bestLapText);
}
//neste runde
runde++;
lastTime=elapsedTime; //husk tid
}

//reset tid
startTime = millis(); // store the start time
blinking = true; // turn on blinking while timing

//kjør en gang
if (started == 0){
Serial.println("Lap 1 started");
lcd.clear();
lcd.print("Lap 1 started");
started=1; //timer is started
}


//peepRunde
digitalWrite(rele, LOW);
delay(200);
digitalWrite(rele, HIGH);


//force timeut
digitalWrite(ledPin, LOW);
lcd.setCursor(15, 0);
lcd.print("*");
delay(timeout*1000);
lcd.setCursor(15, 0);
lcd.print(" ");

}

//Here's a print routine that can convert a long int, corresponding to milliseconds,
//to days, hours, minutes, seconds and milliseconds and print to the LCD.
// argument is time in milliseconds
String print_time(unsigned long t_milli) //var Void før
{
char buffer[20];
int days, hours, mins, secs;
int fractime;
unsigned long inttime;

inttime = t_milli / 1000;
fractime = t_milli % 1000;
// inttime is the total number of number of seconds
// fractimeis the number of thousandths of a second

// number of days is total number of seconds divided by 24 divided by 3600
days = inttime / (24*3600);
inttime = inttime % (24*3600);

// Now, inttime is the remainder after subtracting the number of seconds
// in the number of days
hours = inttime / 3600;
inttime = inttime % 3600;

// Now, inttime is the remainder after subtracting the number of seconds
// in the number of days and hours
mins = inttime / 60;
inttime = inttime % 60;

// Now inttime is the number of seconds left after subtracting the number
// in the number of days, hours and minutes. In other words, it is the
// number of seconds.
secs = inttime;

// Don't bother to print days
// sprintf(buffer, "%02d:%02d:%02d.%03d", hours, mins, secs, fractime);
sprintf(buffer, "%02d.%03d", secs, fractime);

// lcd.print(buffer);
return buffer;

}

void translateIR()
// takes action based on IR code received
// describing Sony IR codes on LCD module
{
Serial.println(results.value, HEX);
switch(results.value)
{
case 0xF60: Serial.println("ned"); trigg(); break;
case 0x760: Serial.println("ned"); trigg(); break;
case 0xFFA05F: Serial.println("RGB lampe brighter"); trigg(); break;//magic lighting remote controll
case 0xA90: Serial.println("Power button"); break;
case 0x290: Serial.println("mute "); break;
case 0x10: Serial.println("Sony one"); trigg(); break;
case 0x810: Serial.println("two "); break;
case 0x410: Serial.println("three "); break;
case 0xC10: Serial.println("four "); break;
case 0x210: Serial.println("five "); break;
case 0xA10: Serial.println("six "); break;
case 0x610: Serial.println("seven "); break;
case 0xE10: Serial.println("eight "); break;
case 0x110: Serial.println("nine "); break;
case 0x910: Serial.println("zero "); break;
case 0x490: Serial.println("volume up "); break;
case 0xC90: Serial.println("volume down "); break;
case 0x90: Serial.println("channel up "); break;
case 0x890: Serial.println("channel down "); break;
default: Serial.println(" other button ");
}
//delay(2000);

}

Der Code war schon fertig.
Ich möchte das bei unterschiedlich gedrückter Taste der Fernbedienung erkannt wird was es für eine Taste ( Auto ) ist.
Gibt es eine Möglichkeit des " Lernen " ?
Kann ich ein Signal senden und dann definieren ?
Wenn das ginge würde ich mich freuen.
Leider habe ich nur ein UNO und damit sind die Eingänge begrenzt.
Könnte ich noch einen Drehdecoder zum Display anschließen und ein Menü erzeugen wo diverse Einstellungen gemacht werden können ?
Z.B. Anzahl der Runden , Anzahl der Autos, lernen der Autos usw.

MfG Rieders
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.10.2013, 14:48
Beitrag #4
RE: IR Laptimer
Hallo rieders,
folgendes in der Annahme/Hoffnung dass ich dich richtig verstanden habe Huh

Ich habe mir mal die Doku zur Library quer gelesen. In Verbindung mit deinen Vorstellungen stelle ich mal ein paar Fragen:
Du weißt, dass die Library , je nach Protokoll, bestimmte Signal-Abfolgen auswertet?
Du weißt, dass dabei keine "Kennung" oder "ID" des IR-Senders übertragen wird, sondern ausschließlich "Befehlscodes".
Wenn ich dich richtig verstehe möchtest du gedanklich anstatt einer Taste der FB ein Auto setzen!? Wenn ja, die Frage: wie bringst du das Auto dazu seinen Code (also eigentlich den Tastencode) zu senden?
Ich glaube, dass der bisherige Ansatz eher zu kompliziert ist. Ein Lichtschranken- System halte ich hier für sinnvoller.
Zitat:Gibt es eine Möglichkeit des " Lernen " ?
Kann ich ein Signal senden und dann definieren ?
Was meinst du damit genau?
Zitat:Könnte ich noch einen Drehdecoder zum Display anschließen und ein Menü erzeugen wo diverse Einstellungen gemacht werden können ?
Du kannst sicher über einen Encoder die auf dem Display anzuzeigenden Werte auswählen. Du kannst aber über das Display nicht irgendwas festlegen/setzen. Dazu brauchst du Input-Möglichkeiten. Es gibt zB. LCD-Shields mit Buttons drauf.

Grüße Ricardo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.10.2013, 09:34
Beitrag #5
RE: IR Laptimer
Hallo

Ich baue dann natürlich keine Fernbedienung in ein RC Auto.
Ich habe eine Schaltung mit HT12e gefunden.
Damit ist es möglich unterschiedliche Codes zu erzeugen.

Wie soll es mit einer Lichtschranke gehen ?
Ich möchte von mehere Autos gleichzeitig die Zeit nehmen.
Möglich ist es die Codes fest zu hinterlegen und dann auszuwerten.

Mit dem Encoder wollte ich eigentlich belegungen sparen.
Ich möchte dann noch eine Art Ampel einbinden -> wenn grün leuchtet startet die Zeit.

Vielen Dank nochmal für die Antwort

MfG Rieders
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.10.2013, 11:03
Beitrag #6
RE: IR Laptimer
Moin rieders,
Zitat:Ich baue dann natürlich keine Fernbedienung in ein RC Auto.
Das ist mir schon klar Big Grin
Zitat:Ich habe eine Schaltung mit HT12e gefunden.
Damit ist es möglich unterschiedliche Codes zu erzeugen.
Eine kleine, aber so ziemlich die wichtigste Info. Dann sieht alles anders aus, dann kann man den Code wirklich benutzen/anpassen.
Zitat:Wie soll es mit einer Lichtschranke gehen ?
Ich möchte von mehrere Autos gleichzeitig die Zeit nehmen.
Es sind ja wohl mehrere Bahnen, oder? Dann könnte man pro Bahn eine Schranke setzen, misst die Zeiten zwischen den Unterbrechungen und wertet diese dann aus.
Wie viele Bahnen sind es denn? Gleichzeitiges Zeitnehmen sollte kein Problem sein, es sei denn für dich sind Millisekunden entscheidend. Den HT12E in den Autos könntest du dir dann sparen.
Zitat:Encoder und Display
Wenn du Einstellungen machen möchtest brauchst du eher was zur Eingabe (Touchscreen oder Display mit Push-Buttons).
Ist das Display per I2C angeschlossen (4 Pins) oder mehr?
Zitat:Ich möchte dann noch eine Art Ampel einbinden -> wenn grün leuchtet startet die Zeit.
Mal sehen ob noch Pins am Uno bleiben, wenn ja sollte das kein Problem sein.

Überlege mal ob du bei der bisherigen Variante bleiben oder lieben auf die Lichtschranken umsteigen würdest. Dann sehen wir weiter.
Grüße Ricardo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.10.2013, 17:43
Beitrag #7
RE: IR Laptimer
Hallo Ricardo

Mit der Lichtschranke wird es nix da es keine feste Bahn für jedes Auto gibt.

Für den Encoder brauche ich 3 Pins (mit Pushbutton )
Für das Display 6 Pins
Für IR Sensor 1 Pin
Hätte ich noch 4 Pins für die Ampel frei.

Die Sache ist halt wie ich das umgesetzt bekomme.
Wichtig ist für mich halt das das Signal unterschieden wird und damit auch unterschiedliche Messungen möglich sind.
Ich würde auch ein 16X4 Display nehmen damit es übersichtlicher wird.

Zum Testen würde ich erst mal die Fernbedienung als Quelle nehmen bevor ich die Schaltung nachbaue.

MfG Rieders
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.10.2013, 06:04 (Dieser Beitrag wurde zuletzt bearbeitet: 09.10.2013 06:05 von rkuehle.)
Beitrag #8
RE: IR Laptimer
Moin Rieders,

ich war unterwegs, daher jetzt erst mein Response.
Ich bin jetzt mal fies: das ist ja jetzt schon ein recht langer Thread und in jedem Post steht ein bisschen was an Infos. Das ist mir aber zu mühsam. Vorschlag:
Du machst jetzt eine Sammelliste in der folgendes drin steht:
1. Welche Bauteile hast/willst du benutzen. Mit Typ bzw. Link zu einer Beschreibung
(Aussagen wie 16x4 Display mit 6 Pins reichen nicht!)
2. Was soll das Skript wirklich machen? (Aussage wie "eine Ampel" ist zu ungenau)
3. Was soll auf dem Display angezeigt werden?
4. Was soll der Encoder leisten? Wozu ist er da?
4. Welche Codes schicken die HT12e raus? (das muss dann im Skript stehen)
5. Was ist mit der "Möglichkeit des Lernen" gemeint?
(Willst du im laufenden Skript irgendwas als Parameter übergeben? Müssen diese Werte auch nach dem Abschalten des Aurduino erhalten bleiben? )

Meinetwegen kannst du mir die Angaben auch per PN schicken.
Wenn diese Infos vorhanden sind kann ich dir gerne beim Script helfen.
Man muss dann erst mal sehen was real machbar ist und das dann umsetzen.
Alles andere ist stochern im Nebel.

Grüße Ricardo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste