PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Test der Ultraschallerweiterungsplatine



Azubi007
22.11.2006, 14:39
Hallo!

Wir sind 2 Azubis und haben im Moment den Asuro als kleines Projekt in der Firma. Er ist komplett zusammengebaut und funktioniert auch. Haben uns mit der gesamten Sensorik, Ein- und Auslesen, beschäftigt und das klappte auch alles wie gewünscht. Dann haben wir den Asuro umgebaut, sodass man durch Aufstecken sowohl die Linienverfolgung, als auch die Ultraschallerweiterung aufstecken kann. Die Linienerweiterung funktioniert einwandfrei. aber wir verzweifeln an der US-Erweiterung. Das Programm aus dem Buch "Mehr Spaß mit Asuro Band1" läuft nicht. Es leuchtet lediglich die Status LED grün. Wir wissen nicht ob es vll. ein Fehler beim Löten der Hardware oder einer in der Software ist.

Hat jemand vll. einen Tipp oder kann uns mit einen kleinen Programm helfen, das überprüft, ob überhaupt was gesendet und empfangen wird? Sitzen schon mehrere Tage an der Sache und kommen irgendwie nicht weiter.

Sind für jede Hilfe und Anregung dankbar!

Osser
22.11.2006, 14:43
Hi Ihr Azubis, :)

postet mal den Source-Code, sonst können wir hier garnicht sehen was falsch sein könnte...

O.

Azubi007
22.11.2006, 14:55
Hallo Osser!

Da hast du natürlich Recht, aber is ja auch gleich Feierabend, da is man mit den Gedanken schon mal wo anders... \:D/

Hier unser Quelltext:



#include "asuro.h"
void LocalInit(void)
{
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64;
ADCSRA = 0x00;
ACSR = 0x02;
ADMUX=0x03;

SFIOR|=(1<<ACME);
DDRD&=~(1<<6);
}

void Ping(unsigned char length)
{
int count72kHz=0;
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
while (count72kHz<length)
{
OCR2=0x64+length/2-count72kHz;
}
TCCR2 = (1 <<WGM21) | (1 << CS20);
OCR2=0x64;
}

int main(void)
{
int pos,i ;
int posmarker;
Init();
LocalInit();
while(1)
{
posmarker=0;
Ping(20);
for (pos=0; pos<100; pos++)
{
Sleep(10);
if ((ACSR& (1<<ACI))!=0)
{
if (posmarker==0)
{
posmarker=pos;
}
}
ACSR|=(1<<ACI);
}
if(posmarker>10)
{
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(200,200);
}
else
{
StatusLED(RED);
MotorDir(FWD,RWD);
MotorSpeed(0,200);
for (i=0; i<100; i++)
{
Sleep(200);
}
}
}
return 0;
}

EDH
22.11.2006, 15:17
der quelltext aus dem buchfunktioniert im allgemeinen (war zumoindest bei mir so)

testet doch mal, ob der asuro überhaupt ultraschall aussendet (mit ner katze oder einem anderen haustier ;) )

dann wisst iht zumindest, ob es am senden oder am empfangen von ultraschall liegt

mfg EDH

Azubi007
24.11.2006, 07:53
Es gibt nur das Problem, dass wir hier leider keine Tiere zur Verfügung haben.

damaltor
24.11.2006, 08:33
Dann könntet ihr mit einem Mikrofon und einem oszilloskop glück haben...

Azubi007
24.11.2006, 08:48
Hallo zusammen!

Haben die ganze US-Platine nochmal mit einem Durchgangsprüfer durchgetestet. Scheint alles in Ordnung zu sein. Dann haben wir uns noch einmal den Source-Code vorgenommen. Genau aus dem Buch abgeschrieben:


#include "asuro.h"
void LocalInit(void)
{
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64;
ADCSRA = 0x00;
ACSR = 0x02;
ADMUX=0x03;

SFIOR|=(1<<ACME);
DDRD&=~(1<<6);
}

void Ping(unsigned char length)
{
count72kHz=0;
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
while (count72kHz<length)
{
OCR2=0x64+length/2-count72kHz;
}
TCCR2 = (1 <<WGM21) | (1 << CS20);
OCR2=0x64;
}

int main(void)
{
int pos,i ;
int posmarker;
Init();
LocalInit();
while(1)
{
posmarker=0;
Ping(20);
for (pos=0; pos<100; pos++)
{
Sleep(10);
if ((ACSR& (1<<ACI))!=0)
{
if (posmarker==0)
{
posmarker=pos;
}
}
ACSR|=(1<<ACI);
}
if(posmarker>10)
{
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(200,200);
}
else
{
StatusLED(RED);
MotorDir(FWD,RWD);
MotorSpeed(0,200);
for (i=0; i<100; i++)
{
Sleep(200);
}
}
}
return 0;
}




Jedoch gibt er uns beim maken 1 Error. (Siehe Attachment)

Ist doch komisch. Uns ist schon klar, dass die Variable nicht deklariert ist, aber als was soll sie deklariert werden? Int? Float? Char? Und die andern Sachen auch.
Haben keine Ahnung...

Sind für jede weitere Anregung dankbar!

mfg

m.a.r.v.i.n
24.11.2006, 09:26
Hi,

Der Programm Code für die US Erweiterung aus dem Asuro Buch funktioniert nicht mit der neuen Asuro Lib von Sourceforge, nur mit der Original Asuro Lib von der CD. Die Variable count72kHz gibt es nicht mehr bzw. heißt jetzt count36kHz. Es wird auch ein anderer Interrupt verwendet.

Es gibt aber hier im Forum auch ein Code Beispiel für die neue Asuro Lib von RN-User dopez.
Dieser geänderte Quellcode ist im gna.org Repository erhältlich, allerdings ungetestet.
download (http://svn.gna.org/viewcvs/*checkout*/asuro-tools/trunk/lib/ultrasonic.c?rev=10)
view (http://svn.gna.org/viewcvs/asuro-tools/trunk/lib/ultrasonic.c?rev=10&view=markup)
Probiert es deshalb erst mal mit der Original Lib.

Gruß m.a.r.v.i.n

Azubi007
29.11.2006, 11:10
Hallo zusammen!

Erst mal danke an Marvin wegen der Hilfe! leider kamen wir damit auch nicht weit. Dann haben wir uns noch mal im Forum umgesehen und nach ähnlichen Problemen gesucht und sind dabie auf den Post von Luma gestoßen:



Hio. Ich hab jetzt ein bisschen weiter experimentiert. Der Beispielscode aus dem Buch war mir dann irgendwann zu langweilig. Ich meine, warum ein teures Ultraschallgerät verwenden, wenn einem die Software nicht einmal sagen kann, wie weit das Objekt welches die Strahlen reflektiert in [cm] von der Empfängerkapsel entfernt ist?
Deswegen habe ich eine kleine Bibliothek geschrieben. Sie basiert auf dem Beispielcode wurde aber stark bearbeitet und die Verwendung ist jetzt ganz anders. Es gibt die drei Methoden InitUlrasonics, ReinitAsuro sowie natürlich Chirp. Zuerst zu InitUlrasonics. Wie der Name schon sagt initialisiert diese Funktion die Chirp-Funktionalität von Asuro. Wenn diese Methode aufgerufen wurde, ist das Empfangen/Senden von Daten über USART sowie das Messen der Odometer nicht mehr möglich, da u.a. der AD-Wandler deaktiviert werden muss. Sonst macht diese Funktion nichts. Um nun den Asuro wieder wie gewohnt verwenden zu können gibt es die Funktion ReinitAsuro. Sie reinitialisiert den Asuro, soll heißen sie stellt alles wieder so ein, dass man Daten über USART schicken kann und die Odometer wieder auswerten kann. Allerdings sind diese beiden Funktionen eher unwichtig. Wichtiger ist Chirp. Mit dieser Funktion kann "gechirpt" werden. Mann muss ihr einen Parameter übergeben. Dieser Parameter sollte 0 (für false) oder 1 (für true) sein. Ist der Wert true so wird Asuro automatisch so umkonfiguriert, dass man vor dem chirpen nicht mehr erst InitUlrasonics aufrufen muss. D. h. Chirp ruft diese Funktion dann automatisch selber auf. Wenn die Funktion dann fertig "gechirpt" hat und wir immer noch von true (oder =1) als Parameterwert ausgehen, so ruft Chirp dann auch noch automatisch am Ende ReinitAsuro auf. So wird Asuro wieder automatisch zurückgestellt. D. h. auch in diesem Fall ruft Chirp dann automatisch eine Funktion auf, natürlicherweise ReinitAsuro. Und genau deswegen habe ich am Anfang geschrieben, dass die beiden Funktionen InitUlrasonics und ReinitAsuro eher unwichtig sind. Mit true (= 1) als Parameterwert übernimmt Chirp die Arbeit für uns.
Am Ende liefert uns Chirp dann die gemessene Entfernung in [cm]. Diese ist bei näheren Distanzen (+/- 1 Meter) schon noch einigermaßen genau. Ich habe im Anhang ein kleines Diagramm, da kann man die Abweichungen gut sehen. Wie man in dem Diagramm sieht werden die Wert erst ab ca. 1,00 Meter wirklich sehr ungenau. Aber ich glaube für diese Entfernung sind diese Ultraschall-Kapsel einfach zu billig.... Mann kann also sagen: Wer genaue Entfernungen messen will greift lieber zu IR-Sensoren, oder zu teureren Ultraschallkapseln. Die gelieferten sind für genaue Messungen eher ungeeignet.
Jetzt wünsche ich noch viel Spass beim chirpen!

Grüße
Lutz



SEHR WICHTIG: Wenn ihr versucht test.c mit eurem Makefile zu kompilieren gibts nen Fehler. Ihr müsst euer Makefile nämlich etwas bearbeiten. Geht dabei so vor: Startet MFile >> Öffnet euer Makefile >> Menupunkt Makefile >> Enable Editing of Makefile. Sucht jetzt in eurem Makefile folgende Zeile:

# If there is more than one source file, append them above, or adjust and
# uncomment the following:
SRC += asuro.c

und fügt dort ultrasonics.h dazu (mit Lehrzeichen dazwischen), also so:

# If there is more than one source file, append them above, or adjust and
# uncomment the following:
SRC += asuro.c ultrasonics.c

Weiter gehts dann so: Menüpunkt File >> Save As... >> In euer Verzeichnis mit dem Makefile wechseln altes löschen und dann auf speicher klicken (Löschen geht durch auswählen des Makefiles im Browser und dann einfach auf Entf auf der Tastatur drücken ). Fertig.

EDIT: Wer Verbesserungsvorschläge für die Software hat soll die nur rausrücken!

Es waren noch 2 Archive mit hochgeladen. Haben versucht aus diesen schlau zu werden und sie nach der Anleitung zu verwenden, aber nachdem wir das makefile bearbeitet hatten kammen immer noch Fehlermeldungen:

(siehe Attachment)

Könnte uns heir vll. noch mal jemand helfen?

Oder uns einer mal ein Programm mit allen anderen Dateien hochladen, damit wir endlich mal testen könnten, ob wir keinen Baustein beim Löten versenkt haben. Das wäre super nett!

Thx im vorraus für jegliche Hilfe!

mfg

azubi007