So hier noch ne kleine Meldung an alle die sich das US-Bauteil noch kaufen wollen. Auf http://www.arexx.com findet ihr unter Asuro >> Downloads eine kleine aber ausführliche Bauanleitung von mir zum Download bereit. Viel Spass!
Druckbare Version
So hier noch ne kleine Meldung an alle die sich das US-Bauteil noch kaufen wollen. Auf http://www.arexx.com findet ihr unter Asuro >> Downloads eine kleine aber ausführliche Bauanleitung von mir zum Download bereit. Viel Spass!
kauft euch für den asuro einen srf04-ultra, ist sehr gut in winavr-c zu proggen und einfach anzuschliessen. im forum winavr-c gibt es unter anderem von mir ein programm, wie er funktioniert. lässt sich sehr fei proggen, bis auf 1cm genauigkeit und 3m weit.
mfg pebisoft
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 8)). Fertig.
EDIT: Wer Verbesserungsvorschläge für die Software hat soll die nur rausrücken!
Hi
Also ich hab mir jetzt den Code nicht angeschaut, aber deiner Beschreibung und der Messerwerte zu Folge, hast du dir sehr viel Arbeit gemacht und es scheint wirklich was gebracht zu haben.
Hio. Das Problem der Software ist, dass sie nicht Rundet. Deswegen kann es sein das ein Objekt z.B. 10,9 cm weg ist meine Funktion aber nur 10 cm zurückgibt und nicht 11 cm...
IR-Sensoren sind auf jedenfall besser.
Hallo luma,
x = y +0.5;
11 = 10.9 + 0.5;
der Fehler liegt dann nur noch bei.... äh 0.5.
Gruss Winne
@ winne: Das verstehe ich jetzt nicht ganz. Ich habe in meinem Code expliziet auf Fließkommeberechnungen (oder wie man das nennt) verzichtet. Das spart unheimlich Flash-Speicher. D. h. ich multipliziere Kommazahlen mit z. B. 1000 und später wenn ich dann das Ergebnis habe wieder (je nachdem welche Einheit ich haben will - [cm] [mm]) durch 1000...
@luma: sorry, wenn die Antwort vorher zu kurz war!
in der Funktion int Chirp(unsigned char flag). Die Zeile durch die 0.5 erweitern und der Rundungsfehler ist dann von 0,9 unentlich periode nur noch 0,5.
Die Zeile sollten, wenn ich mich nicht irre, so ausehen.
dist = (unsigned int) (((long) ((344L * ((sleeptime * 1000L) / 72L) / 10000L) / 2L))+0.5);
Durch die Cast Operation (unsigned int) wird knallhard die Kommerstelle abgeschnitten.
Muss ich das ganze nicht davor (bevor ich + 0.5 mache) nicht alles in float mit (float) konvertieren? Das wäre ja sinnlos. Aber ich probiers aus!
Hallo,
Am besten noch mal *10 und +5
dann gibts keine Probleme mit Kommas,
Hallo Lutz!
Wie sieht bei dir die Datei "asuro.h" aus?
Grüße
Barbara
Oh da hab ich wohl ne Frage übersehen! Ist zwar schon ein bissel her, aber egal.
Wie die ausro.h-Datei aussieht? Wiso willst du das wissen? Funktioniert irgendwas nicht? Ich glaube meine asuro.h "sieht" eigentlich identisch wie die von Weja (such mal hier im Unterforum nach Erweiterter Asurobibliothek). Ich hab meine nur ein bisschen mehr auskommentiert.
Gruß
Lutz
Hallo Lutz!
Bei mir gibts ein Problem mit der "ultrasonics"-Datei. Ich verwende auch die asuro.c und asuro.h -Dateien von weja. Ich bekomme immer eine Fehlermeldung, dass "autoencode" und "StartEncoder" in der ReinitAsuro-Funktion nicht bekannt sind.
Schöne Grüße
Barbara
Hallo zusammen,
@lutz ich hab mir mal deine messwerte angesehen: Da Du eine lineare Abweichung hast, kannst Du die einfach mit einem weiteren Faktor rausrechnen. So wie ich das sehe, mußt Du nur alle Werte mit mit etwa 1.1 multiplizieren, dass stimmt dann nur für die kleinen Werte <30 cm nicht so ganz, aber für alle anderen recht gut.
bei dem Rundungsproblem stimme ich für die variante von linux_80
Moritz
@ Barbara1: Ich poste hier heute Abend einfach meine ganze Bib... Die lläuft zu 100%
Hallo!
Bei meinem Asuro tritt folgendes Problem auf: Wenn ich die Funktion Encoder_Init() verwende, funktioniert die Funktion Chirp nicht mehr (liefert den Wert 0).
Mein Problem hat sich schon erledigt. Die Funktion Chirp funktioniert nach Aufruf von Init() wieder.
Hallo Leute
Ich bin neu hier im Forum.
Ich habe mir den Asuro samt Ultraschallortung aufgebaut. Zum testen habe ich mir die Bibliothek von @luma gezogen. --> vielen Dank an luma für die Arbeit und bereitstellung. Leider habe ich ein Problem damit.
Die Test.c lässt sich nicht kompilieren. Ich habe die Ultrasonics.c in den Makefile integriert.
Ich bekomme die folgenden Fehler angezeigt. Bin leider noch nicht soooo fit was c-Programmierung von AVRs angeht.
fahren.c:12: warning: implicit declaration of function `set_sleep_mode'
fahren.c:12: error: `SLEEP_MODE_IDLE' undeclared (first use in this function)
fahren.c:12: error: (Each undeclared identifier is reported only once
fahren.c:12: error: for each function it appears in.)
fahren.c:19: warning: implicit declaration of function `sleep_mode'
fahren.c:20: warning: implicit declaration of function `MSleep'
evtl. habe ich die falschen Bibliotheken Asuro.c Asuro.h ?!?!?
Ich hoffe mir kann noch geholfen werden.
Ich sag schon mal VIELEN DANK :)
Oliver
Ach ja.
Ich habe mir einLayout für die US-Platine erstellt.
Hallo
kann mir denn niemend einen Tipp geben welche Bibliotheken in der Lösung von luma verwendet werden, habe irgendwie nicht die richtigen gefunden...
Danke
Oliver
Hallo olima,
könntest Du mal den Code posten? Dann kann man vielleicht die ensprechenden Funktionen ändern.
Gruss,
stochri
OK , hier ist der Code :
Der Code der Ultrasonics.h von lumaCode:
#include "asuro.h"
void InitUlrasonics(void)
{
// Change Oscillator-frequency of Timer 2
// to 40kHz, no toggling of IO-pin:
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 100; // 40kHz @8MHz crystal
ADCSRA = (0 << ADEN); // ADC deaktivieren
// Analog Comparator einstellen:
ACSR = (1 << ACIS1); // Comparator Interrupt on Falling Output Edge
ADMUX = 0x03; // ADC3-Eingang mit Komparator verbinden
SFIOR |= (1 << ACME); // ADC Multiplexer mit Komparator verbinden
DDRD &= ~(1 << 6); // Port D Pin 6 als Eingang schalten (AIN0)
}
int Chirp(unsigned char flag)
{
// Variablen definieren
unsigned int sleeptime = 0, dist = 0;
if(flag)
InitUlrasonics();
// Chripen:
count72kHz = 0;
while(count72kHz != 20) {
OCR2 = 100 + 20 / 2 - count72kHz;
}
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 100;
// Echos auswerten:
for(;;) {
Sleep(1);
sleeptime += 1;
if((ACSR & (1 << ACI))) {
dist = (unsigned int) ((long) ((344L * ((sleeptime * 1000L) / 72L) / 10000L) / 2L));
ACSR |= (1 << ACI);
break;
}
ACSR |= (1 << ACI);
if(sleeptime > 3500) {
return -1;
}
}
//if(flag)
//ReinitAsuro();
return dist;
}
int main(void)
{
// Variablen
int chirpData = 0;
int speed =200;
// Asuro initialisieren
Init();
for(;;) {
chirpData = Chirp(TRUE);
if(chirpData>21){
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(100,speed);
}
}
return 0;
}
Danke schonmal für die HilfeCode:/*******************************************************************************
* Dateiname: ultrasonics.h
* Projekt: Erweiterte Asurobibliothek
*
*
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or any later version.
*
*
* Kleine Funktionsbibliothek, mit welcher man die Ultraschall-
* Erweiterungsplatine für Asuro betreiben kann.
*
*
* @version 1.0.0
* @since 13.08.2005
* @author Luma
*******************************************************************************/
#ifndef ULTRASONICS_H
#define ULTRASONICS_H
#include "asuro.h"
/**
* Konfiguriert den Asuro so, das er die Ultraschall-Erweiterungsplatine in
* Betrieb nehmen kann. Hinweis: Diese Funktion wird automatisch von der
* Funktion Chirp aufgerufen und sollte sonst nicht verwendet werden.
*/
void InitUlrasonics(void);
/**
* Diese Funktion wird aufgerufen, wenn man den Asuro wieder zurückstellen
* will. (Das geschieht normalerweise nach einem "Chirp".). Auch diese
* Funktion sollte sonst nicht verwendet werden.
*
*/
void ReinitAsuro(void);
/**
* Sendet einen sogenannten "Chirp". Ist flag true (also = 1), so wird der
* Asuro nach dem Chrip wieder zurückgestellt, damit man wieder wie gewohnt
* alle Funktionen verwenden kann (während eines Chirps ist es z. Bsp. nicht
* möglich über USART Daten zu schicken/empfangen, da der ADC deaktiviert werden
* muss). Tritt irgendein Fehler auf, oder kann nicht gemessen werden, gibt
* die Funktion -1 zurück.
*
* @param flag Ist flag true wird der Asuro nach jedem Chirp
* wieder zurückgestellt und vor dem Chirpen,
* umkonfiguriert. Ist flag false so kann man
* mit den Funktionen InitUlrasonics sowie
* ReinitAsuro Asuro entweder zum Chirpen oder
* zum "Normalbetrieb" umkonfigurieren. flag auf
* true zu setzen wird empfohlen wenn man nur
* einzelne Messung macht.
* @return Gibt die gemessene Strecke in [cm] zurück
*/
int Chirp(unsigned char flag);
#endif
Oliver
Hallo olima,
unter http://sourceforge.net/project/showf...roup_id=155217
findest Du die aktuellen ASURO-libs.
Leider kann man es auch mit der aktuellen 2.6 nicht kompilieren, es gibt leider die Variable count72kHz nicht mehr öffentlich. Deshalb habe ich die lib etwas verändert und einfach die dort enthaltene Variable count36kHz global gemacht und einfach count72kHz durch count36kHz ersetzt. Möglicherweise stimmt die Frequenz jetzt um den Faktor 2 nicht, also falls es nicht geht, einfach alles Stellen an denen count36kHz vorkommt durch count36kHz/2 ersetzen. Dann könnte es theoretisch funtkionieren.
Ich habe als Entwicklungsumgebung AVR-Studio verwendet, das compilierte Projekt findest Du im ZIP-File.
Gruss,
stochri
Moin,
noch eine Anmerkung zur Vermeidung von Fließkomma-Arithmetik. Statt mit einem Faktor 10 hoch x zu arbeiten, ist es besser 2 hoch x zu wählen. Die Multiplikation mit 10... ist noch recht einfach. Aber die Division ist eher aufwändig. Durch eine Zweierpotenz läßt sich hingegen durch einfaches Rechtsscheiben dividieren.
Gruß Red Baron
vielen Dank @storchi für die klasse Unterstützung.
Leider klappt es immer noch nicht so ganz.
Anscheinend bleibt der AVR in der "InitUltrasonics" hängen.
Welche Funktion hat die count36khz denn überhaupt, und weshalb wurde die geändert ???
Sorry für die dummen Fragen.
Oliver
Wenn es nicht klappt, liegt das vermutlich an Deiner Installation von Win-AVR. Entweder hast Du eine sehr alte Version oder es ist sonst irgendwas faul
Gruss,
stochri
wer von euch weiß was das Erweiterungsset kostet mit dem kleinen LCD-Bildschirm
Bitte eine PN schicken Danke
apotecarius
Hallo Oliver,
ich habe das gleiche Problem wie du mit der Ultraschall Erweiterung und dem Programm von luma im Zusammenhang mit der aktuellen Asuro Bibliothek.
Das Programm bleibt einfach hängen.
Allerdings funktioniert das ganze mit dem Original Programm Beispiel und der Original Asuro Bibliothek ohne Probleme (Das Programm gibt es mit der Beschreibung von luma auf der Arexx-Homepage .
Ich werde das ganze noch weiter untersuchen.
@apotecarius: das LCD Modul ist noch nicht verfügbar.
Gruß Peter
Edit:
Problem erkannt. Das US Modul kann so nicht mehr mit der neuen Asuro Bibliothek funktionieren. Mit Einführung der count36kHz Variablen wurde auch die IRQ Funktion von SIG_OUTPUT_COMPARE2 nach SIG_OVERFLOW2 geändert. Der Grund für die Umstellung war wohl der Umbau der IR Schnittstelle zur Kollisionserkennung.
Fazit:
Wer das US Modul benutzen will, muß mit der Original Asuro Bibliothek arbeiten!
is there really no way to use the 'Ultraschall' module with the newer library? i tried to figure out what has change but couldn't really find any reference to the SIG_OUTPUT_COMPARE2 to SIG_OVERFLOW2 change, could you give me a pointer where to look?Zitat:
Zitat von m.a.r.v.i.n
thanks in advance
regards,
dopez
Hi dopez,
maybe it can be done by an #ifdef #else construct and a preprocessor define.
If the US Module is in use, the old code is included, else the new code.
The old Asuro Lib:
The new Asuro Lib sources:Code:/* uses timer2 (36kHz for IR communication */
/* counts falling and rising edge => 36kHz*2 = 72kHz */
SIGNAL (SIG_OUTPUT_COMPARE2)
{
count72kHz ++;
}
/* Init function Processor will be initalized to work correctly */
void Init (void)
{
//-------- seriell interface programmed in boot routine and already running -------
// prepare 36kHz for IR - Communication
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
OCR2 = 0x6E; // 36kHz @8MHz
TIMSK |= (1 << OCIE2); // 36kHz counter for sleep
Best reagrds m.a.r.v.i.nCode:/* uses timer2 (36kHz for IR communication */
SIGNAL (SIG_OVERFLOW2)
{
TCNT2 += 0x25;
count36kHz ++;
if (!count36kHz) timebase ++;
}
/* Init function Processor will be initalized to work correctly */
void Init (void)
{
//-------- seriell interface programmed in boot routine and already running -------
// prepare 36kHz for IR - Communication
TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
OCR2 = 0x91; // duty cycle for 36kHz
TIMSK |= (1 << TOIE2); // 36kHz counter for sleep
Hi m.a.r.v.i.n
thanks for the reply, i will take a look if with that init values and that interrupt setting/handler (i guess?) get the new asuro lib working with Ultraschall
and else perhaps with a #ifdef #else construct
(the problem is that im quite a newbie when it comes to avr programming and C in general, i guess #ifdef #else would be easiest at first)
greetings,
dopez
I was able to intergrate functions for the Ultraschall module into the latest libasuro from MadMan2k, basicly you can now use it to see how far away an object or wall is and decide what to do with it, i've included a small example that keeps on going straight ahead using the Travel command and turns around when it 'sees' something.
All code in the zip is based on other people's work, please see the README file for more information and i'm sorry if i forgot to give credit to someone (let me know, i'll correct it)
Hopefully this is usefull to others too and maybe could be intergrated into future releases of libasuro/asurolib (will these two get merged?)
Thanks to all the people who made/helped making asurolib/libasuro and related software and hardware :)
greetings,
dopez
Hallo allerseits,
ich bin ganz neu und hoffe an der richtigen Stelle gelandet zu sein.
Ich habe mir ebenfalls einen ASURO gebaut und möchte ihn nun auch mit der Ultraschall-Erweterungsplatine aufrüsten.
Layouts etc habe ich hier schon gefunden, aber
wo finde ich den SCHALTPLAN der Ultraschallerweiterung ??
Kann mir da jemand helfen?
Danke
Gruß
Klaus
Hallo Klaus,
den Schaltplan gibt es leider nur in dem Buch
'Mehr Spaß mit ASURO Band 1'.
Gibt es z.B. bei http://www.science-shop.de/
Gruß m.a.r.v.i.n
Hallo m.a.r.v.i.n,
danke für die schnelle Antwort.
ich dachte nur - weil im US-Bauplan.pdf (auf einer AREXX-Seite) einleitend einem gewissen Robin für die Veröffentlichung eines guten Schaltplanes hier irgendwo gedankt wird.
Ich gehe mal davon aus, dass die Handskizze im o.g. Buch weiterhin aktuell ist.
Gruß
Klaus
Hallo Klaus,
wenn Du diesen Thread von Anfang an durchschaust, findest Du die gewissen Leute incl. Plan ;-)
hi,
habe nun die US-erweiterungsplatine zusammengebaut, die anleitung von Lutz auf der arexx-webseite hat sehr geholfen. Die software ist auch von Lutz.
Jetzt passiert folgendes:
nach dem einschalten leuchtet die STATUS-LED und die zwei BAK-LED´s. Dann wechselt die statusLED zu grün und die motoren drehen vorwärts (wenn man am poti eingestellt hat, sonst dreht nur das rechte rad und das linke "zuckt" nur so komisch rückwärts). Der asuro fährt aber nur vorwärts, ohne vor einem hindernis anzuhalten...
Meine katze zeigt sich aber unbeeindruckt von den US-geräuschen. Ist schon alt (die katze), weiss nicht, ob sie noch so alles hört, was katzen sonst hören.
Kann ich es anders überprüfen ob der sender sendet?
danke schon mal für Euere hilfe...
du kannst mal mit einem multimeter ((viel) besser wäre ein oszilloskop) an den anschlüssen der US-kapseln messen ob da überhaupt strom ankommt... ein multi müsste einen unkonstanten, recht kleinen wert anzeigen und ein oszi vermutlich eine regelmäßige welle
hi damaltor,
danke erstmal, folgendes habe ich gemessen:
transmitterseite, asuro abgeschaltet- liegen 0,28V an, asuro läuft (mit US-software) spannung schwankt zwischen 54,3 und 55,2 mV
receiverseite, ob asuro ein, oder aus ist, spannung 0V
dann könnte es sein dass am receiver nix kommt... irgendwie muss da ja was gemessen werden, dazu muss eine spannung anliegen. 55 mV sind verdammt wenig, könnte aber sein weil ja immer nur kurze impule gesendet werden. was mich mehr stört, ist dass beim abgeschalteten asuro trotzdem spannung anliegt. erstmal zieht das die batterien leer, und ausserdem weist das auf eine brücke zwischen out+ und dem transmitter hin. untersuche nochmal deine platine! die dräte liegen sehr dicht beieinander, es könnte sein dass sich die isolierung der kabel durch lötwärme aufgelöst hat und sich jetzt zwei drähte berühren, die das nicht sollten.
also ich hab mir die platine noch einmal angeschaut, noch einmal ein paar drähte mit der isolation etwas angehoben, ein paar lötstellen nachgelötet. Die spannung beim abgeschaltetetm asuro am transmitter liegt immer noch bei 0,25V. Mir ist aber was anderes aufgefallen, von der logik her würde ich die beiden gehäusen der US sensoren an masse legen, es ist aber so, dass der isolierte pin des transmitters mit dem gehäuse des receivers verbunden ist und beide an out+ liegen.
Spielt die polarität bei den US sensoren eine rolle ?(nach dem stromlaufplan würde ich die frage verneinen). Kann man sender und empfänger gegeneinander tauschen?
danke...
edit: in der anleitung von luma steht:
--------------------------------------------------
D1: 1N4148 (Auf richtige Polung achten. Strich der Diode auf Strich
des eingezeichneten Dreieckes)
--------------------------------------------------
der strich auf der diode ist mit dem strich auf den das dreieck mit seiner spitze zeigt identisch - richtig?
--------------------------------------------------