PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : erweiterte ASURO Bibliothek



Weja
09.03.2005, 15:13
Hallo,
mir ist aufgefallen, daß mit den mitgelieferten Funktionen in asuro.h es schwer ist, gerade für Anfänger, gute Programme zu schreiben. Eine erweiterte Bibliothek kann da hilfreich sein. Natürlich muss dabei auf den kleinen Speicher geachtet werden. Ich würde mich freuen, wenn hier Verbesserungen zusammengetragen werden. Ich hab schon mal einen Anfang gemacht und 3 hilfreiche Funktionen in der angefügten Datei zusammengestellt.
1. Encoder_Init()
initialisiert einen Hintergrund Odometrie-Zähler
2. Encoder Signal(Interrupt) routine
setzt ständig die neuen Werte.
In der globolen Variable encoder(LEFT) und encoder(RIGHT) steht immer der aktuelle Zählerwert. Zurückgesetz wird mit z.B. encoder(LEFT)=0
3. Msleep(int Dauer) wartet die angegebene Zeit in ms.

als weitere Funktionen wünsche ich mr z.B. eine einfache formatierte Ausgabe und ein simples Multitasking oder watchdog-handling. Eine Verbesserung von PollSwitch() mit einer Rückgabe als BitFeld.......
Übrigens: Kann mir jemand StartSwitch(), StopSwitch() aus asuro.c erklären ?
Ich hoffe auf rege Beteiligung (was hälst Du davon Henk?)
Gruß
Weja

Weja
10.03.2005, 20:53
schätze mal, ich hab nicht genau genug erklärt was ich mir vorstelle oder der Sinn der obigen Funktionen ist nicht klar.
Ich programmiere den Asuro mit Kindern ab 11 Jahren, und die sollen sich nicht mit dem Innenleben des Controllers herumschlagen.
Wir möchten eine Bibliothek benutzen, die auch andere verwenden, damit man Ideen besser austauschen kann ("Roboternetz Asuro Bib"). Arexx bezieht sich in seiner Dokumentation auf diese Forum, daher hoffe ich auf Mitarbeit. Eine Idee hab ich schon im Thema "Asuro eure Programme"
gefunden (Prozentangabe für Speed).

Man kann mit den Funktionen aus der Bibliothek von oben den Asuro dynamisch geradeaus fahren lassen, da stören auch keine Teppichkanten oder das kurze Bremsen eines Rades. Das geht z.B.so:
________________________________________________
#include "asuro.h"
#include "aslib.c"
int main(void)
{ int diff;
Init();
Encoder_Init();
MotorDir(FWD,FWD);
MotorSpeed(175,175);
while(1){
div=encoder[RIGHT]-encoder[LEFT];
MotorSpeed(175+diff,175-diff);}
while(1);
return 0;
}
__________________________________________________ _
Ich danke hier schonmal allen die sich beteiligen.
Weja

Weja
10.03.2005, 21:13
sorry, kleiner Fehler in der 10.Zeile muß heissen:
diff=encoder[RIGHT]-encoder[LEFT]; // diff statt div

Foxbat
10.03.2005, 22:01
Hallo,

ích habe meinen Asuro erst seit 2 Tagen.

Bin deswegen für Programmierhilfen sehr dankbar.

Gruß, Foxbat

11.03.2005, 13:04
Leider haben wir z.Z.nur 1 Asuro zur Verfügung, aber unsere neuen Befehle sollen natürlich allgemeingültig sein. Deshalb kopiere bitte die Datei aslib.c in dein Asuro-Arbeitsverzeichnis und probiere einmal das Programm zum geradeausfahren aus und teile mit, ob es einwandfrei funktioniert.
Schreib auch, wenn Du sonst wo auf Probleme bei der Programmierung stösst. Vielleicht passt das Problem ja hier mit rein.
Gruß, Weja

Foxbat
11.03.2005, 21:41
Danke, ich werde es am Sonntag mal testen.

Poste das Ergebnis dann hier.

Gruß, Foxbat

Banzai
23.03.2005, 14:20
Hi Leutz,

hab das Progrämmchen gerade ausprobiert! Hatte 200x soviel Codezeilen und es NICHT hinbekommen, was mal wieder beweist, daß die einfachsten Lösungen meistens die besseren sind... *g*.

Weiter so...

cu

Banzai

Weja
24.03.2005, 08:35
Vielen Dank für die Rückmeldung. Es freut mich sehr, zu lesen, dass das Programm auch mit min. einem anderem Asuro funktioniert. (Was ist mit den anderen 38 Downloads?)
Ich teste gerade verbesserte Zeitfunktionen und Tastenabfrage. Wie man das alles gleichzeitig und einfach nutzen kann stelle ich wohl morgen hier vor.

Gruß
Weja

chrispyy
27.03.2005, 23:04
Hallo Weja,

in dem Int-Auswertung: SIGNAL (SIG_ADC)
vergleichst du den ADCH mit dem dez-Wert "160".
Woher kommt dieser Wert? Habe lange drann rumgerechnet aber es macht für mich einfach keinen Sinn. Ich hätte wohl mit "128" verglichen.

Gruß Chris

Weja
28.03.2005, 12:48
Hallo Chris,
den Wert habe ich nicht errechnet, sondern experientell ermittelt.
Durch immer vorhandenes Umgebungslicht liegt der Mittelwert eben etwas höher. Du kannst ja mal 128 einsetzen und prüfen, ob es einen Unterschied macht. Bei einer Abschirmung der Odometrie Sensoren ist 128 bestimmt besser.
Gruß
Weja

chrispyy
28.03.2005, 17:57
Hallo Weja,

habe mit aslib.c erste tests gemacht und habe festgestellt das nach Aufruf von Encoder_Init() die Funktion PollSwitch nicht mehr funktioniert. Schätze mal es liegt daran dass auch PollSwitch auf ADMUX und ADCSRA zugreift.
Es werden hier nur einzelne Bits gesetzt aber keine gelöscht.

Ich werde mal versuchen das irgendwie hinzubiegen wird aber wohl etwas dauern (wenn es denn überhaupt geht...)

Gruß Chris

Weja
28.03.2005, 21:58
Hi Chris, vielen Dank für den Fehlerhinweis.
Das Problem ist eigentlich leicht gelöst. Man muss nur die Rekursion von Signal[SIG_ADC] unterbrechen. Deklariere erstens eine globale Variable z.B autoencode=TRUE, dann führe 2. die Signal Funktion ( SIG_ADC)
bedingt aus if
(autoencode=TRUE)
{
hier der Code von SIG_ADC
}
und drittens setzte die Variable vor und nach PollSwitch(). Z.B. so:
int Lese_Tasten (void)
{ int wert;
autoencode=FALSE;
wert=PollSwitch();
autoencode=TRUE;
return wert;}
Ich hab das ausprobiert, und es klappt fehlerfrei. Ich will diese Korrektur, sowie die anderen Funktionen in die asuro.c mit einbauen, weil ich noch andere Verbesserungen an vorhandenen Funktionen gemacht hab.
Ich bin gerade dabei alles zu testen. Neu dabei ist das Lesen der Systemzeit in ms und die Signalfunktion eines Tastendrucks ohne das Gedöhns von oben.
Gruß Weja

pebisoft
28.03.2005, 22:25
hallo, die programme würde ich nicht zu kurz machen. es fehlt sonst die übersicht über die funktionsweise der sprache winavr c, ich vermute die kinder sollen auch strukturiertes programmieren lernen. wenn die programme sehr kurz sein sollen kann ich nur assembler empfehlen.
so habe ich auch sehr viel in den avr reinbekommen. natürlich geht in assembler die übersicht verloren.
mfg pebisoft

Weja
31.03.2005, 22:18
Hallo Leute,
nun habe ich es doch noch hinbekommen die "wichtigsten" Funktionen zum einfachen Programmieren für den Asuro in eine neue Bibliothek einzubinden.
Ich musste dabei die Dateien asuro.h und asuro.c vollständig ersetzen, weil auch viele Änderungen an den vorhandenen Funktionen nötig waren.
Diese Dateien und eine Kurzbeschreibung, sowie ein Beispielprogramm mit dem Namen test.c sind in dem begefügtem Archiv.
Sinn des ganzen Projektes ist es ja, dass sich der asuro-Programmierer um Lösungsstrategien für bestimmte Aufgaben kümmen kann, und sich nicht mit dem Setzen von irgendwelchen Registerwerten herumschlagen muss., die man in evt. nur kiloschweren Handbüchern findet.

Zum Beispielprogramm ( das gerade mal aus 30 Codezeilen besteht !!) :

Stell Dir vor, Du befindest Dich aus mir unbekannten Gründen, in einem Labyrinth mit Wänden, die unter Hochspannung stehen. Es ist stockdunkel, Du kannst nichts sehen. Bevor man Dich in dieses Labyrint verfrachtete hattest Du noch einen Wunsch frei. " Lasst mir den ASURO" war Dein Wunsch. Als Zugabe durftest Du den Asuro auch noch einige Minuten programmieren.
Das Ergebnis steht in test.c
Wenn der asuro startet fährt er eine Zeitlang (8 Sekunden) geradeaus. Triffte er dabei auf kein Hindernis, dreht er um und kommt zum Ausgangpunkt zurück. Er signalisiert die freie Strecke mit einer grünen LED. Wird vor Ablauf der 8 Sekunden auf ein Hindernis (schlimme Wand) getroffen, kommt asuro auch zum Ausgangspunkt zurück und signalisiert mit roter Status LED wenn diese Wand sehr nahe ist, oder mit gelber, wenn sie etwas weiter weg ist. So hast Du die Möglichkeit den Ausgang zu finden ( wenn denn einer da ist ) .

Ich hoffe, Ihr habt Spaß mit den neuen Programmiermöglichkeiten und würde mich über eine Rückmeldung sehr freuen.

Gruß
Weja

Weja
22.04.2005, 13:17
Nach nunmehr 3 Wochen Wartezeit und etwas mehr als 120 Downloads für die Asuro Bibliothek frage ich mich immer noch, ob das bei anderen auch alles funktioniert.
Habe ich keine Rückmeldung bekommen weil:
1. Ihr habt alle bessere Lösungen ?
2. Das Ganze ist zu kompliziert ?
3. Vielleicht fehlt auch was Wichtiges ?
Jedenfalls würde ich mich riesig über weitere Kritik und Anregungen freuen.

Gruß
Weja

robnew
25.04.2005, 11:52
hallo weja,

ich bin relativ neu im asuro geschäft und habe deine neue "asuro bibliothek" im einsatz. bisher funktioniert alles nach wunsch. die bibliothek finde ich sehr praktisch und hilfreich! =D>

gruss :-) newrob

Kurt Pieper
25.04.2005, 16:39
Hi Weja.

Leider gelingt es mir nicht ein Programm, welches geradeaus steuert, auf Sensor (Mechanik) richtig reagiert - rücktwärts, drehen und soweiter.

Wer hat ein Beispiel?

Gruß Kurt

Weja
26.04.2005, 09:42
Hallo Kurt,
im 2. Download , den ich bereitgestellt hab, ist so ein Beispiel drin.
Der Asuro fährt geradeaus bis zu einem Hindernis, dreht um und kommt die gleiche Strecke zurück. Bitte probier das mal aus. Was passiert bei Dir ?
@newrob
Danke für die Rückmeldung.

Gruß an euch
Weja

waste
02.06.2005, 20:25
Hallo Weja,

deine Bibliothek finde ich super. Sie enthält sehr nützliche Erweiterungen für mich. Ich verwende sie als Grundgerüst für meine Programme. Als einziges habe ich in der Interrupt-Routine bei der Abfrage der Odometriewerte eine Hysterese eingebaut. Die Grenzwerte sind bei mir jetzt unten 140 und oben 160. siehe auch CodeAuszug

Es hat auch vorher funktioniert, aber mit Hysterese ist es für mich sicherer.

Danke dir für die Bereitstellung deiner Routinen.

Gruss Waste


if ( (tmp[toggle] < 140) && (flag[toggle] == TRUE)) {
encoder[toggle] ++;
flag[toggle] = FALSE;
}
if ( (tmp[toggle] > 160) && (flag[toggle] == FALSE)) {
encoder[toggle] ++;
flag[toggle] = TRUE;
}

pinsel
06.06.2005, 21:14
Hallo Weja,

seit Freitag bin ich nun auch Besitzer eines ASURO.
Ich war schon am Überlegen wie ich die Odometrie auf Interruptbetrieb
umstelle da bin ich auf deine Erweiterung gestossen.

Klasse.

Bist jetzt hatte ich noch keine Probleme mit deinen Erweiterungen.

Gruß
Pinsel

JeanLuc
25.07.2005, 19:24
Hallo,

ich habe deine Dateien mal getestet, jedoch fängt er erst gar nicht an:
test.o(.text+0x16):E:\ASURO_src\FirstTry/test.c:11: undefined reference to `Encoder_Init'
test.o(.text+0x1e):E:\ASURO_src\FirstTry/test.c:14: undefined reference to `Encoder_Start'

Deine Header Dateien sind natürlich einbebunden.

So sieht der Code aus den ich habe

StatusLED(GREEN);
Encoder_Init();
MotorDir(FWD,FWD);
Encoder_Start();

natürlich davor das include, die main function und Init();
Habe auch nur mal ein Programm genommen wo ich nur Encoder_Init(); rein geschrieben habe, der gleiche Fehler. Ansonsten funktionieren alle neuen Funktionen!

backdraft
11.09.2005, 21:22
Hallo!

Ich habe das mal ausprobiert, aber das Beispielprogramm funktioniert bei mir leider nicht. Deswegen habe ich mal was einfacheres getestet.

StatusLED(GREEN);
StartSwitch();
while(!switched){;}
StatusLED(RED);

Wenn ich es richtig verstanden habe, sollte doch so die Status-LED solange grün leuchten bis ein Taster gedrückt wird. Dann rot. Oder? Er reagiert aber nicht auf den Tastendruck.

Woran kann das liegen?

Gruß

backdraft
11.09.2005, 21:23
Hallo!

Ich habe das mal ausprobiert, aber das Beispielprogramm funktioniert bei mir leider nicht. Deswegen habe ich mal was einfacheres getestet.

StatusLED(GREEN);
StartSwitch();
while(!switched){;}
StatusLED(RED);

Wenn ich es richtig verstanden habe, sollte doch so die Status-LED solange grün leuchten bis ein Taster gedrückt wird. Dann rot. Oder? Er reagiert aber nicht auf den Tastendruck.

Woran kann das liegen?

Gruß

Maniac
13.09.2005, 13:55
Also laut Doku (Lies_das.txt) heißt der Parameter "switches" NICHT "switched"!
Möglicherweise funzt es deshalb nicht! ;)

Wobei mich dann wundert, warum der Compiler die unbekannte Variable nicht anmeckert? Oder hast Du den (Tipp-)Fehler nur hier beim Posten eingebaut?

roborookie
14.09.2005, 07:12
Hallo Weja,

Deine Anfangsidee würde ich gerne nochmal aufgreifen.
Eigentlich hatte ich den Asuro für meinen Sohn (12) gekauft ... um noch weiter auszuholen sind wir vor ca. 1,5 Jahren beim RoboCup in Paderborn gewesen (Roboter-Fußball-Wettbewerb) und waren erschüttert, wie schlecht die Roboter auch im Jahre 2004 noch sind - völlig entgegen aller Hoffnungen von Asimov und diverser ScienceFiction.
Ich habe dann versucht meinem Sohn das Roboter- und KI-Dilemma zu erklären, hatte aber den Eindruck, dass nicht geklappt hat.

Nachdem ich einen kurzen c't-Bericht über den Asuro gelesen hatte, habe ich mich an den RoboCup erinnert und ihn fix bestellt.
Beim Zusammenbau hat Sohnemann nicht viel helfen können (außer zusehen und Widerstände heraussuchen). Und jetzt habe ich mit der Programmierung angefangen und stelle fest, dass der Zugang für ihn denn doch AUCH nicht so einfach ist (auch mir als Diplom-Informatiker fällt es nicht leicht).
Gleich bei der Odometrie habe ich mir die Zähne ausgebissen.
Man ist sehr viel auf Hilfe der anderen bzw. Code-Schnipsel und Informationsbröckchen angewiesen, die man irgendwo im Internet findet ...

Wie hast DU das mit deinen Kindern gemacht ?
Hast Du sie 'C' programmieren lassen ?
Da stolpert man nach den allerersten Schritten über sehr syntax-sensible Compiler, für Anfänger unverständliche Notationen und dergleichen.
Wahrscheinlich ist da der MindStorm-Weg nicht schlecht, die Programmierung auf grafische Art und Weise zu machen ...
Ich habe mich nicht tiefer damit beschäftigt, aber es scheint so zu sein, dass bei Lego die Funktionen farbige Kästchen in einer Art Programmablaufplan sind. Das können auch Kinder prima hintereinander bringen. Sowas für den Asuro hinzukriegen wird allerdings ein größerer Akt ...

Zu Deinem Beispielprogramm vom 01.12.04 ist mir aufgefallen dass Du Dich zwar bemühst sprechende Variablennamen zu verwenden, der Code aber überhaupt nicht kommentiert ist (ich weiß - jeder Programmierer meint, dass sein Code selbsterklärend ist ;-))
Außerdem verwendest Du C-Kurzfassungen, die sich nicht auf Anhieb erschließen. Z.B.: "!switched" oder "weg-=encoder".
Speziell im Sinne derer, die nicht fließend 'C' sprechen sind Kommentierung und ausgeschriebene Kommandos sehr wichtig.

Gruß
roborookie

backdraft
14.09.2005, 08:02
Also laut Doku (Lies_das.txt) heißt der Parameter "switches" NICHT "switched"!
Möglicherweise funzt es deshalb nicht! ;)

Wobei mich dann wundert, warum der Compiler die unbekannte Variable nicht anmeckert? Oder hast Du den (Tipp-)Fehler nur hier beim Posten eingebaut?

Da im Beispielprogramm von switched die Rede war, habe ich mal im Quelltext nachgeguckt und sie heißt tatsächlich int switched; Ist also wohl ein Tippfehler in der readme...

pebisoft
14.09.2005, 08:02
es ist nicht einfach den weg nach winavr-c zu finden. wenn man nur den asuro zu fahren bringen möchte und man das c nur dafür einfach mal schnell laden möchte ist hier nicht richtig aufgehoben. einen roboter zusammenzubauen ist die eine sache, einen roboter proggen ist die andere sache und sich erst einmal mit den avr auf dem asuro auseinander zu setzen ist die dritte sache. alle haben ein gleichwertigkeit in der wichtigkeit, wobei das c-proggen mit den registern des avr und deren verstehen erst zu einer vernünftigen reaktion des asuro führt. ohne ein teures buch über den avr ( von trampert) dümpelt man nur so dahin. darum sollte man mit einer einfachen avr-platine anfangen und nicht gleich mit pwm,ir-senden,ir-empfangen,radencoder,linienverfolger. es ist viel zu viel für den einstieg und man verdammt dann das spielzeug wenn es nicht funktiniert.
mfg pebisoft

Maniac
14.09.2005, 10:10
So, ich hab die Bibliothek auch mal angeschaut und getestet. Allerdings bisher nur das kleine Beispiel-Prog. Das läuft soweit auch und er fährt auch einigermaßen gerade aus.

@backdraft bei mir funktioniert das Programm ohne Veränderung.

Wo ich roborookie etwas zustimmen muss:
Der Code könnte etwas schöner aussehen. Auch wenn es dafür gedacht ist, die Funktionen "nur" zu benutzen, sollte man sich doch an ein paar (lesbarkeits-)Standards halten (sauber einrücken, 1 Befehl pro Zeile etc.). Und Kommentare wären für das Verstehen auch sehr hilfreich.

Wo ich allerdings kein Problem mit habe, sind die Kurzformen (--, += etc.), denn 1. sind die sogar in der Asuro-Anleitung beschrieben und 2. sind das nunmal allgemein gebräuchliche Sprachkonstrukte, die es in vielen Sprachen gibt.

Ich sehe den Asuro eben auch nicht als Spielzeug, sondern schon eine Stufe höher... und dass es für einen 12jährigen nicht so leicht sein dürfte, C zu lernen sollte Dir als Dipl-Inf doch klar sein, roborookie.
Aber das stand doch auf der Packung und im Bericht der c't, oder? Also möglicherweise bist Du mit etwas falschen Erwartungen an den Asuro ran gegangen?

Allgemein ist sowas natürlich nicht so einfach und mit paar Mausklicks und grafisch was hinschieben ist es nicht getan. Wenn das so einfach wäre, würde mich mein Auto nachher selbstständig nach Hause fahren! ;)

Aber ich denke, das gleitet auch etwas vom Thema ab. Hier geht es ja um die erweiterte Bibliothek. Und da kann ich sagen: habe getestet und scheint zu funktionieren. Genauer einsteigen, was mir der Encoder bringt und wie ich den nutze etc. muss ich demnächst. Denke aber, ich werde auch die extbib als Basis benutzen und nicht die mitgelieferte.

Edit:
Ne kurze Doku, was/wofür die Funktionen genau sind, wäre aber echt nicht schlecht. Das meiste erklärt sich zwar echt selbst, bzw. ist analog der original Bib, aber trotzdem.

Z.B. was der Encoder genau für Daten liefert und was ich damit anfangen kann. Ist aus dem Beispiel-Code auch nur etwas mühsam zu erlesen.

Und wofür ist z.B. Batterie()? Kann ich damit messen, wie voll die ist? Und wenn ja, was für einen Wert bekomme ich zurück? Spannung, Prozent, sonstwas? (ist auch im Header nicht beschrieben)

Dazu habe ich nicht gefunden, wo die Variable "encoder" definiert ist... scheint nicht weiter wild zu sein (wobei mich wundert, dass es den Compiler auch nicht stört), aber schön ist das auch nicht, oder?

stochri
15.09.2005, 19:21
Die Funktion 'Batterie' ist dazu da, die Batteriespannung zu messen. Funktioniert aber in der Lib noch nicht, da die Referenzspannung nicht umgestellt wird.
Die richtige Einstellung kannst Du hier

https://www.roboternetz.de/wiki/pmwiki.php?n=Main.ASURO-Linksammlung

in einer veränderten Version der Lib finden.

Gruss,
stochri

Vogon
16.09.2005, 14:32
Wie kann man mit GCC die Asuro.c als richtige Bibliothek bauen ?
Ich möchte das so machen wie bei den mitgelieferten LIBs, damit nicht alle Funktionen aus der Asuro.c mit gelinkt werden.
(ich habe schon in der GCC Doc nachgeschaut, bin aber nicht schlauer geworden !)

m.a.r.v.i.n
18.09.2005, 13:03
Hallo zusammen,

@vogon: um aus asuro. c eine Bibliothek zu machen probier mal


avr-ar -rv asuro.a asuro.o

Es bringt aber wohl nichts, das Programm wird dadurch nicht kürzer. :(

@maniac: Ich hatte schon mal vor einiger Zeit damit begonnen, die Asuro Bibliothek zu kommentieren. Dazu habe ich doxygen verwendet.

http://www.stack.nl/~dimitri/doxygen/

Das vorläufige Ergebnis ist auf meiner Asuro Wiki Page zu finden unter Programmierung.

http://asuro.pytalhost.de/pmwiki/pmwiki.php/Main/Programmierung

Die neuen Funktionen sind allerdings auch noch nicht kommentiert.

Gruß Peter

Elendil
12.12.2005, 22:24
Hallo zusammen,

ich verwende ebenfalls die erweiterte Lib (an dieser Stelle einmal vielen Dank dafür, dass ihr die zur Verfügung stellt) und habe dabei folgendes Problem:

Da ich zur sauberen Geradeausfahrt den Encoder nutze, muss ich auch die Kollisionsabfrage über Interrupts durchführen (mit einefachen PollSwitch()-Aufrufen gehen mir Encoderticks verloren und der Asuro fährt unkontrollierte Kurven).

Daher prüfe ich bei der Geradeausfahrt, ob switched gesetzt ist. Ist dies der Fall, so kann ich einfach zurücksetzen, drehen und weiterfahren (nach dem Zurücksetzen setze ich auch switched wieder auf 0 und führe StartSwitch() aus, damit es beim nächsten Mal wieder funktioniert). Soweit so gut - bis dahin läuft alles wie gewünscht.

Kritisch wird es, wenn ich die Drehrichtung anhand der Taster auswählen möchte. Da die Interruptbehandlung nur das switched Flag setzt, muss ich den gedrückten Taster also explizit herausfinden. Dazu nutze ich der Einfachheit halber PollSwitch() - wenn der Asuro ohnehin angehalten hat, ist diese Funktion ja nicht mehr zeitkritisch und ich kann bequem die langsame AD-Konversion ausführen.

Leider tritt hierbei das Problem auf, dass ab diesem Moment permanent Interrupts bei den Schaltern auftreten - sprich: sobald der Asuro fertig gedreht hat, stellt er fest, dass er schon wieder kollidiert ist (auch wenn das nicht der Fall ist).
Ich habe zu diesem Problem schon eine ganze Weile im Datenblatt geblättert, muss aber etwas übersehen haben. Vielleicht hat ja jemand von euch dieselben Schwierigkeiten und einen Tipp parat, woran das liegen könnte (?). Wenn ja, würde ich mich über eine Antwort hier freuen.

Gruß

Ole

P.S.: Zum Besseren Verständnis (und vielleicht selbst ausprobieren), füge ich hier mal meinen Code an.

/************************************************** *****************************
* File: drive.c
* Project: Asuro
*
* ------------
* Description:
* ------------
* Implements a simple drive-behavior.
*
* Features: - Move straight forward.
* - Step back, if we bump against an obstacle.
* - Turn left or right to aviod the obstacle.
* -----------------------------------------------------------------------------
*
* --------
* History:
* --------
* Version | Author | Date | Comments
* --------+----------------+------------+--------------------------------------
* 0.1 | Jan Ole Berndt | 11.12.2005 | Initial version.
*
************************************************** ****************************/

#include "asuro.h"

#define FORWARD 1
#define STEP_BACK 2
#define TURN_LEFT 4
#define TURN_RIGHT 8

#define BASE_SPEED 150

int driveState = FORWARD;
int turnDirection = TURN_LEFT;

/*
* Determines whether we have to stop the current move.
*/
int Interrupted(void)
{
return switched;
}

/*
* Moves the robot straight forward.
* This function is based on the Go()-function from the extended
* asuro-library.
*/
char Forward(int distance, int speed)
{
int enc_count = 0;
int tot_count = 0;
int diff = 0;
int l_speed = speed, r_speed = speed;
enc_count=abs(distance);

Encoder_Set(0,0); // reset encoder

MotorSpeed(l_speed,r_speed);
MotorDir(FWD,FWD);

//As long, as we haven't moved as far as we should and are not forced
//to stop:
while(tot_count<enc_count && !Interrupted()) {
tot_count += encoder[LEFT];
diff = encoder[LEFT] - encoder[RIGHT];
if (diff > 0) { //Left faster than right
if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
else r_speed += 10;
}
if (diff < 0) { //Right faster than left
if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10;
else l_speed += 10;
}
Encoder_Set(0,0); // reset encoder
MotorSpeed(l_speed,r_speed);
Msleep(1);
}
//If we are forced to stop:
if(Interrupted()){
MotorDir(BREAK,BREAK);
Msleep(200);
}

return 0;
}

/*
* Moves the robot in backward direction.
*/
char StepBack()
{
unsigned char switches = PollSwitch();
switches &= PollSwitch();
switches &= PollSwitch();
switches &= PollSwitch();
switches &= PollSwitch();
switches &= PollSwitch();
switches &= PollSwitch();
switches &= PollSwitch();
if(switches & 0x07)
turnDirection = TURN_LEFT;
else
turnDirection = TURN_RIGHT;

Encoder_Init();
Go(-50,150);
switched = 0;
StartSwitch();
return 0;
}

/*
* Turns the robot to the left.
*/
char TurnLeft()
{
Turn(-100,BASE_SPEED);
return 0;
}

/*
* Turns the robot to the right.
*/
char TurnRight()
{
Turn(100,BASE_SPEED);
return 0;
}

/*
* Returns the next state of the robot.
*/
int NextState()
{
if(driveState & STEP_BACK)
return turnDirection;
else if(Interrupted())
return STEP_BACK;
else
return FORWARD;
}

/*
* Main function.
* Determines the next state of the robot and calls the corresponding function.
*/
int main(void)
{
Init();
driveState = FORWARD;
Encoder_Init(); //Start Interrupt-handling for odometry.
StartSwitch(); //Start Interrupt-handling for switches.
while(1){
driveState = NextState();
switch(driveState){
case FORWARD:
Forward(500,BASE_SPEED);
break;
case STEP_BACK:
StepBack();
break;
case TURN_LEFT:
TurnLeft();
break;
case TURN_RIGHT:
TurnRight();
break;
}
}
//if any error occures and we leave the loop above,
//stop the motors and enter stable state (do nothing).
MotorSpeed(0,0);
MotorDir(BREAK,BREAK);
StopSwitch();
Encoder_Stop();
while(1);
return 0;
}

Weja
13.12.2005, 09:15
@Elendil

Beim Übersetzten Deines Codes sind die Funktionen "Go" und "Turn" nicht definiert . Kannst Du die bitte noch nachliefern?
Danke
Weja

Weja
13.12.2005, 10:00
Ich glaub, ich hab das Problem schon vor längerer Zeit gelöst.
Hier die meine modifizierte Start_Switch() Funktion, die den Spannungslevel für die Messung korrekt einstellt. Hier wird auch die Variable switched immer auf FALSE gesetzt. Das ist nun im Programm nicht mehr nötig.

/* for working with Interrupt */
void StartSwitch(void)
{
switched=0;
DDRD |= SWITCHES; // Switches as Output
SWITCH_ON; // Output HIGH for measurement
Sleep(10); // Load high level
SWITCH_OFF;
DDRD &= ~SWITCHES; // Switches as Input => ext. Int 1
MCUCR &= ~((1 << ISC11) | (1 << ISC10)); // Low level generates interrupt
GICR |= (1 << INT1); // Enable external Interrupt 1
}

Bitte ersetze den Teil in der asuro.c
Gruß
Weja

Weja
13.12.2005, 10:54
Hallo roborookie,
irgendwie hab Dein wichtiges posting verpasst und erst jetzt (nach 3 Monaten) gelesen, was mir wirklich leid tut.

Die Asuro-Programmierung Lego-like zu machen ist ein bisschen schwierig.
Die Kinder programmieren am Anfang LegoBots mit der Lego-Software.
Wenn man nun darauf achtet, dass einzelne Steuerbefehle und nicht die vorgefertigten Makros verwendet werden, fällt dann der Umstieg nach NQC
(C übersetzer fur Lego Firmware) oder Interactive C (eigene Firmware) nicht sehr schwer. Mit diesem Wissen gehts zum Asuro.
Für den Asuro habe ich die Programmierumgebung für PN , mit Hilfe von Batch-Dateien so eingestellt, dass mit einem Mausklick das Programm compiliert, und wenn fehlerfrei, zum Asuro geschickt wird. Alle nicht mehr benötigten Dateien werden automatisch gelöscht. Für die Programme kann man beliebige Dateinamen verwenden. Die Make Datei wird im Hintergrund erzeugt.

Gruß
Weja

stochri
13.12.2005, 12:55
Hallo weja,
Turn und Go findet man normalerweise auf der Seite von m.a.r.v.i.n

asuro.pytalhost.de/

Dort kann man auch sehr schön verfolgen, wie sich Deine Lib weiterverändert hat. Irgendwie scheint die Seite aber gerade offline zu sein.

Gruss,
stochri

Elendil
13.12.2005, 20:11
@stochri: Jepp, genau von dort habe ich die Quellen auch.

@weja: Vielen Dank. Das war der Missing Link, den ich noch brauchte.

Werde mal schauen, vielleicht kann ich ja auch ein paar Dinge der Lib hinzufügen, wenn ich etwas weiter gekommen bin - aber als nächstes folgt jetzt erstmal die Sache mit der IR-Schnittstelle...

Gruß

Ole

Achill
16.12.2005, 10:50
Ich habe mich ausgiebig mit der PollSwitch fnk auseinander gesetzt. Das Ergebnis ist eine interuptfähige PollSwitch() fnk. Meine Frage nun, wer ist der Maintainer dieser lib, gibt es einen Subversion/cvs Server?
Weitere Anfrage: Warum habt ihr den TimerCounter von 72 auf 36 KHZ umgestellt?
Ich bin zuerst von der orginal asuro lib ausgegangen und habe diverse änderungen selbst angebracht.

stochri
16.12.2005, 11:36
Hallo Achill,
eigentlich gibt es keinen richtigen Maintainer dieser Lib. M.a.r.v.i.n hat mal angefangen, das ganze etwas schöner zu dukumentieren.
Es wäre nicht schlecht, wenn man eine zentrale Stelle finden könnte. Sourceforge vielleicht ? Wie man das ganze angeht weiss ich aber leider nicht. Ich habe noch nie mit CVS gearbeitet.
Es wäre schon interessant, in die Lib ein wenig mehr Ordnung zu bringen und als Open Source Projekt irgendwo zu hosten.

Gruss,
stochri

Weja
16.12.2005, 12:03
Hallo Achill, Stochri,
ich würde es auch prima finden, wenn in die ganze Sache mal ein bisschen Ordnung käme. Die Seite von M.a.r.v.i.n ist scheinbar nicht erreichbar und in meiner Version ist der Timer noch auf 72khz. Ich hab auch noch nie ein CVS benutzt. Wer kann das in die Hände nehmen ?

Gruss Weja

m.a.r.v.i.n
16.12.2005, 12:24
Hallo zusammen,

leider hat mein Hoster pytal wg. Serverumbau derzeit alle Benutzerseiten vorrübergehend deaktiviert.
Der Mirror unter http://asuro.funpic.de funktioniert noch (allerdings mit PHP-Warnungen und Werbeeinblendungen).

Die Asuro Bibliothek auf einen CVS Server zustellen, würde ich auch begrüßen. Mit CVS kenne ich mich einigermaßen gut aus.
Lese mir gerade die 'terms of use' bei sourceforge durch und melde mich dann dort an.

Gruß Peter

Edit:
habe mich bei sourceforge angemeldet und das Projekt asuro angelegt.
Leider dauert die Prüfung von sourceforge mind. 2 Tage bis das Projekt freigegeben wird.

stochri
16.12.2005, 20:43
Hallo M.a.r.v.i.n,
super !, dass das klappt. Wenn Prüfung durch ist, kannst Du es hier ja mal melden.

Gruss,
stochri

m.a.r.v.i.n
19.12.2005, 15:40
Hallo zusammen,

die Anmeldeprüfung bei sourceforge ist erfolgt.
Die Projektseite befindet sich hier:
http://sourceforge.net/projects/asuro/

Derzeit befinden sich nur die Original Quellen der Lib und die Beispiele von der ASURO-CD im CVS.

Wer Interesse hat, an der Bibliothek mitzuarbeiten sollte sich als Entwickler bei sourceforge registrieren lassen und mir eine PM zukommen lassen, damit ich in die Liste der Entwickler aufnehmen kann.

Der Download der Quellen funktioniert natürlich auch ohne Anmeldung.

Als nächstes werde ich die Änderungen an der Bibliothek schrittweise
ins CVS einspielen bis zum aktuellen Status, und mich mit dem System vertraut machen.

Gruß Peter

Rakke
20.12.2005, 13:26
Hallo zusammen,

ich habe an den Asuro-Libs weitergearbeitet (und möchte mich hiermit zur weiteren Mitarbeit anmelden).
Meine Änderungen im Detail - viel Text ;-)

Weiterentwicklung der interruptgesteuerten ADC-Auswertung: die habe ich so erweitert, dass eine beliebige Reihenfolge der ADC-Kanäle in einer Liste definiert werden kann. Diese Liste wird dann interruptgesteuert abgearbeitet und die gemessenen Werte in globale Variable geschrieben, sodass sie überall im Code zur Verfügung stehen.
Die Idee dahinter: auf lange Sicht möchte ich dem kleinen Kerl doch noch eine Odometrie verpassen, zugleich soll er wissen, wie weit er einer Linie schon gefolgt ist, also abwechslend Liniensensor und Odosensoren auswerten. Mit der überarbeiteten ADC-Auswertung kann nun flexibel eine Reihenfolge der Kanalauswertung erfolgen. Wer das nicht braucht, kann über einen #define zur originalen stochri/weja-Auswertung wechseln. Oder er macht sich eine ganz kurze Konfigliste nur mit den Odo-Kanälen.

Um auf meinem Firmenlaptop mit Visual C++ Asuro-Funktionen entwickeln zu können (geniales Debugging), habe ich die Dateistruktur etwas modifiziert: es gibt zusätzlich zu Asuro. c und Asuro.h nun eine "globals.h", in der auf globale Variable und #defines Bezug genommen wird, z. B. auch #defines für die bedingte Kompilierung. Durch #include "globals.h" sind sofort alle asurospezifischen Variablen und #defines verfügbar. In der Asuro.h verblieben sind die defines, die sich direkt auf die Hardware beziehen.

Eine Datei "Tools.c/h" - enthält zunächst einmal zwei Funktionen, um unsigned chars/ signed ints zu begrenzen (saturate). Vielleicht hat ja noch jemand andere Tool-Funktionen, die ließen sich hier hervorragend sammeln und im sourceforge weiterentwickeln.

Code aufgeräumt: um die ADC-Funktion von stochri und weja zu begreifen, habe ich sie erstmal kommentiert und atmega8-Doku gelesen. Uff! Außerdem habe ich dann Funktionen, die ich nicht brauche, hinter einen #ifdef geschoben. Der zugehörige #define steckt wiederum in der globals.h.

Eine neue Funktion "go_rakke", die stochris Funktion "go" nachempfunden ist. Hier unterteilt sich das Fahren in mehrere Abschnitte: Anfahren, beschleunigen, Konstantfahrt, bremsen und 'rankriechen. Alles parametrierbar und halbwegs modular aufgebaut. Die Funktion benutzt "trq_ctrl", eine weitere Funktion, die ich auch noch für eine Drehfunktion analog zum "turn" einsetzen möchte.

Die ganze Chose habe ich getestet, soweit es ging - bei mir sieht's gut aus. Über Rückmeldungen zur Verwendbarkeit und Fehlerbehaftung würde ich mich natürlich freuen. Anbei ein Paket mit meinen Dateien inklusive makefile.Alaaf,
Rakke

Elle
30.01.2006, 18:50
Hallo Weja ich würde mich freuen wenn du mir deine Bibliothek an meine E-Mail-Adresse sende würdest.
an_elias@gmx.de

Wäre echt SUPER.......

MFG

Elle

stochri
31.01.2006, 07:25
Und warum lädst Du Dir die Bib. nicht von hier runter?

http://sourceforge.net/project/showfiles.php?group_id=155217

srocke
03.04.2006, 15:06
Hallo,
ich habe mir jetzt diese erweiterte bibliothek runtergeladen(mit den beispiel progs). leider funktioniert keins dieser programme. hat jemand eine idee woran das liegen kann??

izaseba
03.04.2006, 16:36
Herr KFZ-Mechanniker, mein Auto funktioniert nicht, woran kann es liegen ?

*Glas Kugel , kram,such*

Andun
03.04.2006, 18:24
Was der nette Her izaseba damit sagen will:

Du musst uns schon eeeetwas genauer sagen was nciht geht. Geht das überspielen auf den Asuro nciht? Geht das Compilieren nicht? Oder geht das alles nur auf dem Asuro geht es nciht? Bist du dir sicher, dass du auch die neuen Programme überspielt hast?

Andun

izaseba
03.04.2006, 18:59
@Andun,
Danke für die schöne Übersetzung :cheesy:

Sebastian

srocke
03.04.2006, 20:07
oh! sorry!
also...
ich hab mir die bibliothek heruntergeladen und entpackt. die asuro.h und asuro.c habe ich in meinen ordner firsttry gschoben und dann z.b. die test.c aus MotorTest in firsttry geschoben. die dann geöffnet compilt und mit dem flash tool auf den asuro getan... alles funktioniert.
doch wenn ich dann den asuro einschalte blinkt nur die statusled immer von rot auf grün

izaseba
03.04.2006, 21:07
Hmm,
also normal ist das nicht...
Es gäbe da so ein paar standard Fehler, die man durchgehen könnte:
1. Kompilierst Du wirklich auch das, was Du kompilieren möchtest? (Stimmt die *.c Datei mit der Datei überein, die auch im Makefile eingetragen ist)
2. Klappt das Kompilieren auch ohne Warnungen ?
3. Wie schnell blinkt denn die Status LED ? Wenn ganz schnell, ist das mein ich ein Anzeichen dafür, das die Batterien alle sind.

Am sonsten, mußt Du wohl ganz klein anfangen, z.B. erstmal nur den Asuro Fahren lassen, klappt das, weitere Funktionen dazunehmen.

Ich hatte mal die Biblitothek von Weja ausprobiert, und die klappt 100 Prozentig.

Gruß Sebastian

srocke
04.04.2006, 15:08
ich habe einfach die alte asuro.c durch die neue größere ersetzt reicht das nich?
auch die asuro.h habe durch die neue ersetzt