PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Odometrie Auslesen



XII
29.05.2007, 14:46
Hi Leute,
Ich würde gerne die Odometrie auslesen können.
Also er soll wenn sich das Zahnrad einmal Schwarz und weis angezeigt hat eine 1 per SerWrite ausgeben. Das heißt je schneller ich das Rad drehe umso schneller erscheinen die Einsen auf dem Bildschirm.

Ich kann aber auch nicht einfach sagen wenn Odometrie <500 oder >500 dann tuhe ____, weil ich gerne eine Allgemeine Funktion darüber schreiben möchte :-k

Achja und kann mir einer erkären wie ich ein Programmfeld im chat hinkriege? Damit ich nicht immer dieses Riesen Programm im Forum Posten muss. 8-[

Vielen Dank im Vorraus



//++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++
//-----------------------------------------------------------------------
//---- Odomietrie Auslesen ------- 23.05.07 ------ Jannik Mewes ---------
//---- Auslesen von Odomitrie Daten und Senden an eine Serielle ---------
//---- Schnittstelle ----------------------------------------------------
//-----------------------------------------------------------------------

#include "asuro.h"

//-----------------------------------------------------------------------
//--- BCDaus ------- 23.5.07 --- Jannik Mewes ---------------------------
//--- Ausgabe einer integer Zahl in Ascii über die serielle -------------
//--- Schnittstelle -----------------------------------------------------
//-----------------------------------------------------------------------
void BCDaus(unsigned int data) // Anfang der Funktion
{

unsigned int (Zahl1); // Definiere Variable Zahl1
unsigned int (Zahl2); // Definiere Variable Zahl2
unsigned int (Zahl3); // Definiere Variable Zahl3
unsigned int (Zahl4); // Definiere Variable Zahl4

Zahl1 = data ; // Zahl1 hat den gleichen Wert wie data
Zahl1 = Zahl1 / 1000; // Wert von Zahl1 geteilt durch 1000
data = data - Zahl1 * 1000; // Wert von data minus Wert on Zahl1 mal 1000
Zahl1 = Zahl1 + 48; // Wert von Zahl1 plus 48
SerWrite(&Zahl1,1); // Schreibe wert von Zahl1 an IR Sender

Zahl2 = data; // Zahl2 hat den gleichen Wert wie data
Zahl2 = Zahl2 / 100; // Wert von Zahl2 geteilt durch 100
data = data - Zahl2 * 100; // Wert von data minus Wert on Zahl2 mal 100
Zahl2 = Zahl2 + 48; // Wert von Zahl2 plus 48
SerWrite(&Zahl2,1); // Schreibe wert von Zahl2 an IR Sender

Zahl3 = data; // Zahl3 hat den gleichen Wert wie data
Zahl3 = Zahl3 / 10; // Wert von Zahl3 geteilt durch 10
data = data - Zahl3 * 10; // Wert von data minus Wert on Zahl3 mal 10
Zahl3 = Zahl3 + 48; // Wert von Zahl3 plus 48
SerWrite(&Zahl3,1); // Schreibe wert von Zahl3 an IR Sender

Zahl4 = data; // Zahl4 hat den gleichen Wert wie data
Zahl4 = Zahl4 / 1; // Wert von Zahl4 geteilt durch 1
Zahl4 = Zahl4 + 48; // Wert von Zahl4 plus 48
SerWrite(&Zahl4,1); // Schreibe wert von Zahl4 an IR Sender

}

//------------------------------------------------------------------------
// --------------- Hauptprogramm -----------------------------------------
//------------------------------------------------------------------------

int main(void)
{
Init(); // Initialisierung

unsigned int odo[2]; // Speicher bereitstellen
StatusLED(GREEN); // StatusLED auf Grün schalten
BackLED(ON,ON);

while(1) // Enslosschleife
{
OdometrieData(odo); // Lese Odometrie aus
BCDaus (odo[0]); // Lade Funktion BCDaus un übergebe den Wert i
SerWrite(" ",1); // Schreibe ein Leerzeichen
BCDaus (odo[1]); // Lade Funktion BCDaus un übergebe den Wert i
SerWrite(";",1); // Schreibe ein Leerzeichen
}
return 0; // Zurück zu 0

radbruch
29.05.2007, 16:33
Hallo

In den neueren Versionen der asuro.c gibt es die Funktion PrintInt() mit der man Integerwerte über die IR-Schnittstelle senden kann:


void PrintInt(int wert)
{ char text[6]=" ";
itoa(wert,text,10);
SerWrite(text,5);
}


Längeren Programmcode postet man in Code-Tags wegen der übersichtlichkeit.

Am Ende deiner Main-Funktion fehlt eine }

Mehrzeilige Kommentare bettet man besser zwischen /* */ ein, denn mit // kann es bei Zeilenumbrüchen zu Problemen kommen.

Die StatusLED wird schon bei Init() auf Grün gesetzt, zur Programmablaufskontrolle taugt grün deshalb nur bedingt.

Die BackLEDs beeinflussen die ODO-Werte, deshalb immer BackLED(OFF,OFF) vor dem Einlesen der ODO-Daten.

Gruß

mic

Phantomix
31.05.2007, 00:47
Wir haben die asuros im studium gehabt.

Um ein flexibles auslesen zu erreichen hab ich den Asuro selbst die Schwellwerte für dunkel/weiß berechnen lassen, indem ich gesagt hab:

dunkel ist < als 4/10 des Wertebereichs
hell ist > 6/10 des Wertebereichs
Werte dazwischen hab ich einfach als "kein Wechsel der aktuellen Situation" gewertet

bzw. invertiert, ich weiß grad nicht mehr ob das so oder genau anders rum war

Den Wertebereich hab ich beim Auslesen bestimmt und sozusagen jedes mal einen min. und max wert verglichen.

Das ganze hat dann selbst ohne zahnradfixierung und ohne "überdachung" des sensors gut funktioniert. Code gibts auf Anfrage, sollte aber nicht so schwer sein das selber zu machen.

XII
04.06.2007, 06:51
@ Phantomix,
Genau diese Lösung hatte ich zuerst auch allerdings gibt sich damit mein Chef nicht zufrieden :-)

Mein Chef will das ich von dem Auslesewert (Sinuskurve) den öchsten und den Niedriegsten wert auslese und Speichere.

Am ende will er an einen Tasta drücken und das Rad drehen. Wenn er dann den Tasta loslässt soll der Asuro Automatisch das Rad wieder zurückdrehen.

Da knausere ich grad dran ^^

PS:
Ich bin in der Fachoberschule Technik (Klasse 11) und mache hier nur ein Praktikum. Man benutzt den Asuro auch im Abitur???

XII
04.06.2007, 12:21
Mein jetzieges Programm sieht so aus: Allerdings Hört der Asuro danach nicht mehr aus das Rad zu drehen. Daran Knobele ich gerade.

PS: Ich habe den Asuro seid 6 Tagen und soll nächste Woche eine Präsentation vor 300 Leuten vortragen *aufgeregt*. vielleicht findet ja einem mal lust dran meine Präsentation durchzusehen 8-[ . Ich schicke sie dann wenn sich wer meldet per E-mail zu aber ist nicht umbedingt nötig. also keine umstände.

Dankööö



//++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++
//-----------------------------------------------------------------------
//---- Odomietrie Auslesen ------- 23.05.07 ------ ---------
//---- Auslesen von Odomitrie Daten und Senden an eine Serielle ---------
//---- Schnittstelle ----------------------------------------------------
//-----------------------------------------------------------------------

#include "asuro.h"

//-----------------------------------------------------------------------
//--- BCDaus ------- 23.5.07 --- Jannik Mewes ---------------------------
//--- Ausgabe einer integer Zahl in Ascii über die serielle -------------
//--- Schnittstelle -----------------------------------------------------
//-----------------------------------------------------------------------
void BCDaus(unsigned int data) // Anfang der Funktion
{

unsigned int (Zahl1); // Definiere Variable Zahl1
unsigned int (Zahl2); // Definiere Variable Zahl2
unsigned int (Zahl3); // Definiere Variable Zahl3
unsigned int (Zahl4); // Definiere Variable Zahl4

Zahl1 = data ; // Zahl1 hat den gleichen Wert wie data
Zahl1 = Zahl1 / 1000; // Wert von Zahl1 geteilt durch 1000
data = data - Zahl1 * 1000; // Wert von data minus Wert on Zahl1 mal 1000
Zahl1 = Zahl1 + 48; // Wert von Zahl1 plus 48
SerWrite(&Zahl1,1); // Schreibe wert von Zahl1 an IR Sender

Zahl2 = data; // Zahl2 hat den gleichen Wert wie data
Zahl2 = Zahl2 / 100; // Wert von Zahl2 geteilt durch 100
data = data - Zahl2 * 100; // Wert von data minus Wert on Zahl2 mal 100
Zahl2 = Zahl2 + 48; // Wert von Zahl2 plus 48
SerWrite(&Zahl2,1); // Schreibe wert von Zahl2 an IR Sender

Zahl3 = data; // Zahl3 hat den gleichen Wert wie data
Zahl3 = Zahl3 / 10; // Wert von Zahl3 geteilt durch 10
data = data - Zahl3 * 10; // Wert von data minus Wert on Zahl3 mal 10
Zahl3 = Zahl3 + 48; // Wert von Zahl3 plus 48
SerWrite(&Zahl3,1); // Schreibe wert von Zahl3 an IR Sender

Zahl4 = data; // Zahl4 hat den gleichen Wert wie data
Zahl4 = Zahl4 / 1; // Wert von Zahl4 geteilt durch 1
Zahl4 = Zahl4 + 48; // Wert von Zahl4 plus 48
SerWrite(&Zahl4,1); // Schreibe wert von Zahl4 an IR Sender

}


//-----------------------------------------------------------------------
//--- Pulserkennnung ------- 30.5.07 --- Jannik Mewes -------------------
//--- Ausgabe einer 1 bei odometriepuls über RS232 ---------------------
//-----------------------------------------------------------------------
unsigned int Flanke_odo (void) // Anfang der Funktion
{


unsigned int (ausgabe); // Definiere Variable Zahl1
unsigned int odo[2]; // Speicher bereitstellen
unsigned int (temp); // Speicher bereitstellen
unsigned int (i); // Speicher bereitstellen

ausgabe = 0; // ausgabe kriegt den Wert 0
i = 0; // ausgabe kriegt den Wert 0
temp = 0; // temp kriegt den Wert 0

while (i == 0) // Enslosschleife bis i != 0
{
OdometrieData(odo); // Lese Odometrie aus
if (odo[0]> temp) temp =odo[0]; // Wenn odo[0]> temp ist dann ist temp gleich genausogroß wie odo
if ( temp > (odo[0]+50)) i =1; // Wenn temp > als odo plus 50 ist dann ist i = 1
}

i = 0;
temp = 1024;

while (i == 0) // Enslosschleife bis i != 0
{
OdometrieData(odo); // Lese Odometrie aus
if (odo[0]< temp) temp =odo[0]; // Wenn odo[0]< temp ist dann ist temp gleich genausogroß wie odo
if ( temp < (odo[0]+50)) i =1; // Wenn temp < als odo plus 50 ist dann ist i = 1
}
ausgabe = 1; // ausgabe kriegt den Wert 0
return ausgabe; // gebe ausgabe zurück

}
//------------------------------------------------------------------------
// --------------- Hauptprogramm -----------------------------------------
//------------------------------------------------------------------------

int main(void)
{
Init(); // Initialisierung
unsigned int zeahler; // Speicher bereitstellen
unsigned int temp2;
unsigned int wert; // Speicher bereitstellen
unsigned int zuruek; // Speicher bereitstellen
unsigned int odo2[2]; // Speicher bereitstellen
int i; // Speicher bereitstellen

StatusLED(GREEN); // StatusLED auf Grün schalten
BackLED(OFF,OFF); // BackLED´s auf aus

zuruek = 0;
zeahler = 0;
i = 0;

while(i == 0) // Enslosschleife bis 1 != 1
{
wert = Flanke_odo(); // wert ist genau so groß wie Flanke_odo
zeahler = zeahler +1;
if(PollSwitch()>0) i = 1; // wenn Tasta gedrückt gehe weiter
}
zuruek = zeahler;
BCDaus (zeahler); // Lade Funktion BCDaus un übergebe den Wert i
SerWrite(";",1); // Schreibe ein Leerzeichen

while(zuruek > 0)
{
MotorDir(RWD,BREAK);
MotorSpeed(120,120);
BCDaus (zuruek);
i = 0; // ausgabe kriegt den Wert 0
temp2 = 0; // temp kriegt den Wert 0
while (i == 0) // Enslosschleife bis i != 0
{
OdometrieData(odo2); // Lese Odometrie aus
if (odo2[0]> temp2) temp2 =odo2[0]; // Wenn odo[0]> temp ist dann ist temp gleich genausogroß wie odo
if ( temp2 > (odo2[0]+50)) i =1; // Wenn temp > als odo plus 50 ist dann ist i = 1
}
zuruek = zuruek - 1;
i = 0;
temp2 = 1024;
while (i == 0) // Enslosschleife bis i != 0
{
OdometrieData(odo2); // Lese Odometrie aus
if (odo2[0]< temp2) temp2 =odo2[0]; // Wenn odo[0]< temp ist dann ist temp gleich genausogroß wie odo
if ( temp2 < (odo2[0]+50)) i =1; // Wenn temp < als odo plus 50 ist dann ist i = 1
}
zuruek = zuruek - 1;
}
MotorDir(BREAK,BREAK);
return 0; // Zurück zu 0
}

robbifan
04.06.2007, 13:04
....Ich kann aber auch nicht einfach sagen wenn Odometrie <500 oder >500 dann tuhe _.....

natürlich kannst du das sagen, der wert bestimmt ja die aufzeichnung.


....dunkel ist < als 4/10 des Wertebereichs
hell ist > 6/10 des Wertebereichs .....


ist doch nichts anderes, wenn du weisst ob der adc mit 8bit oder 10bit arbeitet .

also 4/10 von 256 oder 4/10 von 1024....oder....mathe???

XII
05.06.2007, 07:06
Ja das ist schon richtig nur das das sich ändert je nach Licheinwirkung von außen so kann es sein das wenn ich das Licht ausschalte das sich die werte verändern... Dazu gibt es noch die Störfrequenz die den Sinus nicht gleichmäßig steingen und sinken lässt (wenn der Asuro rollt). Aber diesen Teil habe ich ja schon so gelöst (unten im Code). Der Sensor misst ja die Hälligkeit wenn ich jetzt wärend er misst eine Lampe drüber halte und plötzlich ausschalte habe ich einen falschen Wert.... und damit gibt sich nun mein Chef nicht zufrieden O:) .


while (i == 0)
{
OdometrieData(odo);
if (odo[0]> temp) temp =odo[0];
if ( temp > (odo[0]+50)) i =1;
}

i = 0;
temp = 1024;

while (i == 0)
{
OdometrieData(odo);
if (odo[0]< temp) temp =odo[0];
if ( temp < (odo[0]+50)) i =1;
}

XII
06.06.2007, 11:47
Juhuu,
nach langem hin und her grübeln habe ich nun endlich das Programm völlig fertig! Danke allen die mir Denkanstöße gegeben habe =P~ . Für alle die Es interessiert wie man so etwas macht (was ich machen sollte s.o.) dann findet er den Code drei zeilen unrt dieser Zeile 8-[



//++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++
//-----------------------------------------------------------------------
//---- Odomietrie Auslesen ------- 05.06.07 ------ Jannik Mewes ---------
//---- Auslesen von Odomitrie Daten und Senden an eine Serielle ---------
//---- Schnittstelle. Korektur des Reifens. -----------------------------
//-----------------------------------------------------------------------

#include "asuro.h"

//-----------------------------------------------------------------------
//--- BCDaus ------- 23.5.07 --- Jannik Mewes ---------------------------
//--- Ausgabe einer integer Zahl in Ascii über die serielle -------------
//--- Schnittstelle -----------------------------------------------------
//-----------------------------------------------------------------------
void BCDaus(unsigned int data) // Anfang der Funktion
{

unsigned int (Zahl1); // Definiere Variable Zahl1
unsigned int (Zahl2); // Definiere Variable Zahl2
unsigned int (Zahl3); // Definiere Variable Zahl3
unsigned int (Zahl4); // Definiere Variable Zahl4

Zahl1 = data ; // Zahl1 hat den gleichen Wert wie data
Zahl1 = Zahl1 / 1000; // Wert von Zahl1 geteilt durch 1000
data = data - Zahl1 * 1000; // Wert von data minus Wert on Zahl1 mal 1000
Zahl1 = Zahl1 + 48; // Wert von Zahl1 plus 48
SerWrite(&Zahl1,1); // Schreibe wert von Zahl1 an IR Sender

Zahl2 = data; // Zahl2 hat den gleichen Wert wie data
Zahl2 = Zahl2 / 100; // Wert von Zahl2 geteilt durch 100
data = data - Zahl2 * 100; // Wert von data minus Wert on Zahl2 mal 100
Zahl2 = Zahl2 + 48; // Wert von Zahl2 plus 48
SerWrite(&Zahl2,1); // Schreibe wert von Zahl2 an IR Sender

Zahl3 = data; // Zahl3 hat den gleichen Wert wie data
Zahl3 = Zahl3 / 10; // Wert von Zahl3 geteilt durch 10
data = data - Zahl3 * 10; // Wert von data minus Wert on Zahl3 mal 10
Zahl3 = Zahl3 + 48; // Wert von Zahl3 plus 48
SerWrite(&Zahl3,1); // Schreibe wert von Zahl3 an IR Sender

Zahl4 = data; // Zahl4 hat den gleichen Wert wie data
Zahl4 = Zahl4 / 1; // Wert von Zahl4 geteilt durch 1
Zahl4 = Zahl4 + 48; // Wert von Zahl4 plus 48
SerWrite(&Zahl4,1); // Schreibe wert von Zahl4 an IR Sender

}


//-----------------------------------------------------------------------
//--- Pulserkennnung ------- 30.5.07 --- Jannik Mewes -------------------
//--- Ausgabe einer 1 bei odometriepuls über RS232 ---------------------
//-----------------------------------------------------------------------
unsigned int Flanke_odo (void) // Anfang der Funktion
{


unsigned int (ausgabe); // Definiere Variable Zahl1
unsigned int odo[2]; // Speicher bereitstellen
unsigned int (temp); // Speicher bereitstellen
unsigned int (i); // Speicher bereitstellen

ausgabe = 0; // ausgabe kriegt den Wert 0
i = 0; // ausgabe kriegt den Wert 0
temp = 0; // temp kriegt den Wert 0

while (i == 0) // Enslosschleife bis i != 0
{
OdometrieData(odo); // Lese Odometrie aus
if (odo[0]> temp) temp =odo[0]; // Wenn odo[0]> temp ist dann ist temp gleich genausogroß wie odo
if ( temp > (odo[0]+50)) i =1; // Wenn temp > als odo plus 50 ist dann ist i = 1
if(PollSwitch()>0) goto rollen; // wenn Tasta gedrückt gehe weiter zu rollen
}

i = 0; // i kriegt den Wert 0
temp = 1024; // temp kriegt den Wert 1024

while (i == 0) // Enslosschleife bis i != 0
{
OdometrieData(odo); // Lese Odometrie aus
if (odo[0]< temp) temp =odo[0]; // Wenn odo[0]< temp ist dann ist temp gleich genausogroß wie odo
if ( temp < (odo[0]+50)) i =1; // Wenn temp < als odo plus 50 ist dann ist i = 1
}
rollen:
ausgabe = 1; // ausgabe kriegt den Wert 0
return ausgabe; // gebe ausgabe zurück

}
//------------------------------------------------------------------------
// --------------- Hauptprogramm -----------------------------------------
//------------------------------------------------------------------------

int main(void)
{
Init(); // Initialisierung
int zeahler; // Speicher bereitstellen
unsigned int temp2;
unsigned int wert; // Speicher bereitstellen
int zuruek; // Speicher bereitstellen
unsigned int odo2[2]; // Speicher bereitstellen
int i; // Speicher bereitstellen

StatusLED(GREEN); // StatusLED auf Grün schalten
BackLED(OFF,OFF); // BackLED´s auf aus

zuruek = 0; // zuruek kriegt den Wert 0
zeahler = 0; // zeahler kriegt den Wert 0
i = 0;

while(i == 0) // Enslosschleife bis 1 != 1
{
wert = Flanke_odo(); // wert ist genau so groß wie Flanke_odo
zeahler = zeahler +1; // Rechne zeahler + 1
if(PollSwitch()>0) i = 1; // wenn Tasta gedrückt gehe weiter
}

zuruek = zeahler; // zuruek hat den gleichen Wert wie zeahler
BCDaus (zeahler); // Lade Funktion BCDaus un übergebe den Wert i
SerWrite(";",1); // Schreibe ein Kommer

while(zuruek > 0) // Enslosschleife bis i zuruek > 0
{
MotorDir(RWD,BREAK); // Motorrichtung linker Reifen Stopp rechter Reifen Rückwerts
MotorSpeed(120,120); // Motorspeed auf die Hälfte der maximalen Leistung
i = 0; // ausgabe kriegt den Wert 0
temp2 = 0; // temp2 kriegt den Wert 0
while (i == 0) // Enslosschleife bis i != 0
{
OdometrieData(odo2); // Lese Odometrie aus
if (odo2[0]> temp2) temp2 =odo2[0]; // Wenn odo2[0]> temp2 ist dann ist temp2 gleich genausogroß wie odo
if ( temp2 > (odo2[0]+50)) i =1; // Wenn temp2 > als odo2 plus 50 ist dann ist i = 1
}

i = 0; // i kriegt den Wert 0
temp2 = 1024; // temp2 kriegt den Wert 1024

while (i == 0) // Enslosschleife bis i != 0
{
OdometrieData(odo2); // Lese Odometrie aus
if (odo2[0]< temp2) temp2 =odo2[0]; // Wenn odo2[0]< temp2 ist dann ist temp2 gleich genausogroß wie odo
if ( temp2 < (odo2[0]+50)) i =1; // Wenn temp2 < als odo2 plus 50 ist dann ist i = 1
}
zuruek = zuruek - 1; // zuruek - 1
}
MotorDir(BREAK,BREAK);
return 0; // Zurück zu 0
}