PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe! AsuroProgramm für Zimmer abfahren!



hirbel
02.10.2009, 18:30
Hallo liebe Gemeinde,

ich hab folgendes Anliegen.

Ich möchte ein Programm schreiben, bei dem der Asuro eine rechteckige Fläche abfährt. Er soll zum Beispiel ein Zimmer von der einen Ecke zur anderen, gegenüberliegenden abfahren. Dabei soll er gerade aus fahren (mittels Odometrie) und wenn er an der Wand anstößt, einen bestimmten Wert zurückfahren (z.B. 11cm) und dann eine Drehung nach links, bzw. rechts ausführen. Dabei soll er zwei Werte vergleichen um dann zu entscheiden, ob er ne links- oder rechtsgerichtete Drehung machen soll.

Nun habe ich um das Programm zu schreiben meinen Asuro vermessen um die Werte der Sensoren feststellen zu können und programmieren zu können. Zur Hinleitung des Programmes habe ich ein Miniprogramm geschrieben und geflasht, bei dem der Asuro eine Strecke von 50 cm gerade aus fahren soll und dann ne 180° Drehung aussführen soll.
Leider fährt er ohne aufzuhören gerade aus. Lösche ich das Fahren raus, dreht er sich nur noch im Kreis.
Ich habe bei dem Programm die erweiterte Lib verwendet, kann es sein, dass diese nicht richtig eingebunden ist?

Könnte mir bitte jemand bei dem Programm helfen? Ich weiß einfach nicht mehr weiter!

Würde mich freuen! Vielen Dank!

Grüße lehirb

[edit] ich habe leider nur noch die 12er scheiben da... [edit]

Sternthaler
02.10.2009, 19:04
Hallo hirbel,

klar kann geholfen werden. Poste aber dazu mal dein Programm und das Makefile.
Sonst würde ich jetzt mal sagen: Jaein, das liegt daran, oder doch nicht ;-)

Gruß Sternthaler

hirbel
02.10.2009, 19:17
Ich hab mal meine programmcode angehängt, das makefile will er nicht hochladen... :( weiß nicht warum?! Hast du ne Idee?
Hoffe du kannst mir helfen - bin vollkommen verzweifelt!


#include "asuro.h"
#include "myasuro.h"

int main(void)
{
Init();

GoTurn(500, 0, 150);
Msleep(5000);
GoTurn(0, -180, 150);


while(1);
return 0;
}

Grüße

Sternthaler
03.10.2009, 01:00
Hallo hirbel,

im Prinzip ist dein Miniprogramm OK.
Es fehlt nur das EncoderInit(); zwischen Init() und dem ersten GoTurn().

Zur LIB wird eine recht ausführliche Doku mitgeliefert.
Wenn du mal im Verzeichnis (unter deinem Pfad zur LIB) .../doc/html die Datei index.html anklickerst, findest du links "Datei-Elemente". Das anklicken, und dann rechts den Buchstaben "g" anklicken. Nun stehen hinter GoTurn() die Dateien asuro.h und encoder.c. Hier ist es egal welchen Link du nutzt um die Beschreibung und Funktionsweise von GoTurn() zu erfahren.

So, ich hoffe, dass nun erst einmal dein Miniprogramm laufen wird.

Gruß Sternthaler
P.S.: Und immer schön die Doku lesen ;-).
P.P.S.: Mit dem Makefile wird es sein, dass dieses Forum Dateien ohne Extention nicht zuläßt. Probieren könntest du mal die Datei zu KOPIEREN und ein .txt anzuhängen. Also makefile.txt
Das müsste dann funktionieren. Ist aber bestimmt nicht mehr notwendig.

hirbel
03.10.2009, 21:54
Vielen Dank für die schnelle ANtwort. Ich werde es bis morgen mal ausprobieren und dir Bescheid geben.

Schönen Abend und nochmals vielen Dank Grüße lehirb

hirbel
04.10.2009, 15:06
[Edit] weiß nicht wos Problem lag, aber jetzt war das Kompilieren erfolgreich. Testprogramm läuft, jetzt wird am Hauptprogramm getüfftelt! Falls Probleme entstehen, würde ich mich nochmal an dich wenden Sternthaler, okay?

Hey,

habs jetzt mal versucht umzusetzen.
Ich habe folgendes Problem. Wenn ich versuche meine test.c-Datei mit der Test-all.bat zu kompilieren, dann schmeißt er mir nur eine Datei raus mit dem Tittel test.d.
Folgendermaßen habe ich das bei mir aufgebaut. In einem Ordner befindet sich der Ordner "lib" sowie die Datei test.c, das makefile, sowie test-all und test-clean!

Wo steckt mein Problem?

Vielen Dank und beste Grüße

Sternthaler
05.10.2009, 18:47
Hallo hirbel,

klar ist das OK, wenn du dich bei weiteren Problem nochmal meldest.
Schön, dass du dein erstes Miniprogramm hier jetzt lauffähig machen konntest.
Viel Erfolg mit dem 'kleinen' Rest.

Gruß Sternthaler

hirbel
19.10.2009, 19:25
So - das Programm ist fertig.

Der Asuro, modifiziert mit zwei Swiffern, kann jetzt fein das Zimmer kehren.

Dabei stellt man ihn einfach in eine Ecke des Zimmers und lässt ihn starten. Er sollte dann gerade aus fahren, wenden und so in parallelen Bahnen das Zimmer abfahren und säubern.

@Sternthaler:
Könntest du mir sagen ob das alles einwandfrei so passt bzw. noch irgendwelche Verschönerungstipps?

Beste Grüße

Sternthaler
19.10.2009, 22:48
Hallo hirbel,

na, das ging ja recht flott.

Wie aber zu erwarten war, fährt mein Asuro nicht richtig in der Gegend rum.
Geradeaus ist bei mir ein recht heftiger Linksbogen.
Nach dem Anstossen an der Wand scheint es ein Stückchen zurück zu gehen.
Die Drehung schafft mein Asuro überhaupt nicht. Er fährt nur mit einem Rad und das so ziemlich endlos.

Meine Parameter für die ODO-Sensoren sind bestimmt ganz anders als bei dir.
Um nun zu sagen, was besser zu machen wäre, solltest du deinen Programmcode posten und auch mittteilen, welche LIB-Version du benutzt.

\/ \/ \/ \/ ;-) ;-) ;-) \/ \/ \/ \/
Ansonsten deutet die Länge vom Hex-File schon auf viele 'Extras' hin.
Ich tippe mal so, dass nach 10 Putz-Bahnen, eine Fahrt zu einer Müllsammelstelle erfolgt. Der Asuro sich ein bisschen schüttelt und den Staub aus den Swiffern klopft. Und dann weiter seinen Bahnen zieht.
Hat er das Zimmer fertig, wird bestimmt ein Lied gespielt, so dass man den gesammelten Staub von der Müllsammelstelle nur noch in den Eimer kehren muss.
/\ /\ /\ /\ ;-) ;-) ;-) /\ /\ /\ /\

Grinsende Grüße vom Sternthaler
P.S.: Nicht böse sein. Ich schreibe immer so einen Mist.
P.P.S: Kannst du ein Foto von deinem Swiffer-Putz-Asuro hier posten?

hirbel
19.10.2009, 23:24
Jop, dass liegt dann vermutlich an den Odometriedaten. Hab diese mit Hilfe deines Programmes ausgelesen, meine Scheriben mit schwarzem Papier beklebt und ein kleines schwarzes Häusl über die Dioden gebaut ;).
Optimal für jedes "lichszenario" ist es zwar trotzdem nicht, aber gut...

Code siehe unten.

Bild folgt morgen ;)

Nehm dir natürlich sowas net übel - musste lachen...

Schütteln tut er sich net, einfach Swiffer wechseln und gut ;) und Lied spielen tut er auch net ;)

Beste Grüße und schönen Abend

lehirb

Valen
20.10.2009, 18:04
Hmm, ich verstehe etwas nicht. Dein program schaltet auf mehrere stellen den BackLEDs an, aber verlast auch auf den odometrie. Das sollte im prinzip nicht möglich sein zusammen.

hirbel
20.10.2009, 18:07
Versteh gerade nicht, was du mir sagen willst. Könntest du mir das bitte genauer erklären?

[edit] hab mal ein kleines Bild vom Asuro angehängt. Hinten und über die Batterien habe ich aus Aluprofiel ein Gerüst gebaut, an dem der Swiffer aufgesteckt wird. Der obere Swiffer ist nur zum optischen "Aufwerten" da, da nur der hintere Swiffer nicht schön aussah. Außerdem wird so der Sensorbereich am Rad weiter abgeschirmt.

[edit2] du meinst, dass Leds und Odometrie nicht gleichzeitig leuchten, richtig? Bei diesem Programm leuchten die entsprechenden Leds nur kurz auf. Gehen dann wieder aus und dann wird über Odometrie weitergesteuert.
Oder irre ich mich?

Grüße

Valen
20.10.2009, 18:31
Laut dem Schaltplan kan man nicht den Backleds anschalten UND dem odometrie sensoren betrieben. Beim anschalten von den Backleds wird den PD7 pin ausgeschaltet, was auch den odometrie beleuchtungleds aus schaltet. Und dem ADC pins PC0, PC1 pins werden zum ausgang benutzt. Messen von helligkeiten auf dem scheiben geht dan nicht mehr.


...

Aber ich habs schon gesehen. Du verwendest immer EncoderInit vorne von einer GoTurn commando. Dammit werden die einstellungen wieder fur analog messungen zuruckgesetzt.

radbruch
20.10.2009, 18:39
Hallo

Die Idee und das Programm sind schon klasse (zum BackLeds/Odometrie Problem kann ich als 2.8-Verweigerer nichts sagen), aber das Bild topt ja alles. :)

Was wiegt dein asuro mit der Alukonstruktion und dem "Fell"? (Wieviel Shampoo braucht er... *lol*)

Gruß

mic

[Edit]
Die Codescheiben zusammen mit den Zahnrädern:
http://conrad.de/goto.php?artikel=191385

Oder selber bauen:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=27081

(Ich hatte meine Ausdrucke erst auf Alufolie und dann auf die Zahnräder geklebt:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=32143)

Sternthaler
21.10.2009, 02:58
Gutem Morgen zusammen,

JA, JA, JA, so sieht ein weiterer gemoddeter Asuro aus.

Das Programm ist schon bei mir auf der Platte. Da werde ich aber erst morgen reinschauen.

Gruß Sternthaler

hirbel
22.10.2009, 07:42
Hey Sternthaler, hast du mal übers Programm drüber geguckt?

Irgendwelche Tipps?

Beste Grüße

Sternthaler
23.10.2009, 02:17
Hallo hirbel,

uff, nun aber was tippen.

Ein paar Dinge sind mir erst mal so aufgefallen:
- Super formatierter Code.
- Sparsame Kommentierung. Vor allem wenden() ist betroffen.
- Schön modular geschrieben.

Inhaltlich ist mir aufgefallen, dass du Drehungen nur auf 90°-Drehungen zurückführst. Und dann hast du per Define mit "#define WINKEL90 60 //Drehwinkel (60 ~ 90 Grad)" das auch noch 'getürkt'. Warum nutzt du nicht eine Winkelangabe mit den gewünschten Werten?
Hier scheint deine Odometrie doch noch nicht richtig abgestimmt zu sein mit den Parametern für my_asuro.h.

Schön ausgetrickst hast du das Geradeausfahren mit der Tastenerkennung.
Ja, ja, da ist die Lib ein bisschen schwach. Entweder Fahren mit GoTurn(), oder Tasten auswerten.

Auch ohne Kommentare finde ich deine Auswertung in wenden() gut gelößt, wenn du nach dem ersten Wandkontakt erkennen must, wo die nächste Bahn zu putzen ist. Rechts oder Links? Das ist die Frage; hatte schon Otto vor bestimmt 30 Jahren bemerkt.


Als Erweiterung, könnte ich mir vorstellen, dass man nach dem Einschalten vom Asuro erst mal in einem Menü-Mode ist, um mit den Tasten z.B. die Geschwindigkeit und eventuell die Odometriedaten ändern zu können. Mit ein bisschen Kommunikation zum PC könnte angezeigt werden was gerade eingestellt ist im Asuro und der faule 'Nichtputzer' kann dann so lange Tasten drücken, bis die per Asurotasten änderbaren my_asuro-Werte zu seiner Hardware passen.
Erst auf Tastendruck einer 'Lets go'-Taste sollte dann dein Putz-Programm starten.

Natürlich fehlt auch noch die Swiffer-Ausklopft-Funktion ;-)

Mein Senf: Nicht schlecht gemacht!

Mit frisch geputzen Grüßen
Sternthaler

hirbel
30.10.2009, 13:05
Hallo Sternthaler, hallo Gemeinde,

ich hab den Asuro noch etwas modifiziert. Ich hab die Odometriesensoren doppelt abgeschirmt, sodass sie weniger lichtanfällig sind. Ist auf jedenfall empfehlenswert, dass der Asuro auch wirklich 100%ig gerade fährt und richtig dreht.

Frage an Sternthaler: Hab das Programm beibehalten und nur die neuen Odometriewerte eingegeben. Jetzt dreht er plötzlich über beide Räder. Also macht im Endeffekt ne 180° Drehung und fährt auf der selben Bahnzurück, was für den Reinigungsprozess ja herzlich wenig bringt. Er soll also immer über ein entsprechendes Rad drehen, sodass er immer um eine Asurobreite sich zur gegenüberliegenden Wand vorarbeitet.
Hast du eine Idee wo das Problem liegt?

Vielen Dank und Grüße

lehirb

Sternthaler
10.11.2009, 00:40
Hallo hirbel,

ich habe nochmal gesucht, ... und gefunden.

In deinen Funktionen rechts270() und links270() benutzt du "GoTurn(0, -1 * WINKEL90, -1 * MOTOR_SPEED);" bzw "GoTurn(0, WINKEL90, -1 * MOTOR_SPEED);".
Somit gibt du hier negative Speed-Werte an GoTurn() weiter.
- GoTurn() aus encoder.c hat als Beschreibung für Speed: "speed Geschwindigkeit (Wertebereich 0...255)"
- In GoTurn() wird mit "int l_speed = speed, r_speed = speed;" dein negatives Speed 2 mal lokal gespeichert.
- In GoTurn() wird die Drehrichtung mit "if (degree < 0) MotorDir (RWD, FWD); else MotorDir (FWD, RWD);" eingestellt.
- In GoTurn() wird mit "MotorSpeed (l_speed, r_speed);" der Speed-Wert an beide Motoren weitergereicht.
===> Somit MUSS der Asuro über beide Räder drehen. <===

- In MotorSpeed() aus motor_low.c werden die beiden Speed-Angaben nur auf die AVR-Register zur Einstellung der PWM gegeben.
===> Diese MUESSEN zwischen 0 und 255 liegen. Negativ gibt nur Kraut und Rüben.
Und somit musst du die Funktionen rechts270() und links270() von den negativen Speed-Angaben erlösen.

... und weil der Asuro nun über beide Räder auf der Stelle dreht, fehlt dir nun das 'versetzen' um eine halbe/ganze Asurobreite.

Um ein sicheres Anfahren beider Motoren zu gewährleisten, solltest du deinen Define "#define MOTOR_SPEED 150" vielleicht vergrößern.
Einer meiner Motoren fängt z.B. erst bei ca. 180 an sicher zu drehen.


Weiterhin frohes Putzen und einen erfolgreichen Termin.

Gruß Sternthaler

hirbel
10.11.2009, 18:07
Hallo Sternthaler, hallo Gemeinde,

danke für deine Antwort. Da die Zeit etwas gedrängt hatte, hab ich schon eine neue Version fertig gehabt. Diese funktioniert jetzt einwandfrei und super gut :)

Für alle dies interessiert und die eventuell ähnliches vorhaben, hänge ich den Quellcode an :)

Beste Grüße

Sternthaler
10.11.2009, 20:52
Hallo hirbel,

Version 2 ist natürlich schon geräubert.
Noch sind die -1 * MOTOR_SPEED ja in rechts270() und links270() vorhanden. Vorsicht mit den Dingern.
Aber wenn's geht für das Wochenende, dann soll's lieber so bleiben ;-).

Weiter habe ich noch nicht nach anderen Problemkindern geschaut.

Gruß Sternthaler

hirbel
11.11.2009, 07:24
Morgen,

ja ich weiß, dass das Drehen über beide Räder noch drin ist. Da ich es nicht wegbekommen hatte, hab ich es einfach ausgenutzt und bewusst so verwendet... :)

Asuro stößt jetzt an die Wand fährt zurück; Drehung über beide Räder um 90°; Asurobreite vorfahren; 90° Drehung und dann gehts wieder gerade ;)

Falls du noch ein Sorgenkind bei Gelegenheit findest, sag einfach Bescheid - Vielen Dank an dieser Stelle!

Grüße hirb