Archiv verlassen und diese Seite im Standarddesign anzeigen : ASURO ... ein kleiner Wettbewerb
Hallo Miteinander,
ich möchte folgenden kleinen Wettbewerb hier im Forum vorschlagen:
An den Asuro wird ein Stift montiert, sodass der ASURO ein Bild malen kann.
Als einfaches Bild schlage ich 'das Haus vom Nikolaus' vor, weil man dort den Stift nicht abzuheben braucht.
Die einzelnen Einsendungen hier im Forum werden immer am Sonntag Abend ab 20 Uhr von den Lesern bewertet.
Als gut bewertet wird, wer entweder das Bild am genauesten hinkriegt.
Eine Sonderbewertung bekommen die orginellsten Bilder.
Viele Grüße,
Stochri
Na wenn da mal keiner fuscht.
Also um ehrlich zu sein, finde ich dass, was dahinter steckt interessanter, als den Wettbewerb selber. Wie man an deinem 2. Bild schön erkennen kann, hast du versucht, mit dem letzten Strich wieder am Startpunkt anzukommen. Das geht ja alles schon in die Richtung: Wegstrecke messen etc.
Bin mal gespannt was da rauskommt. Wäre schön, wenn man die geposteten Bilder auch echt vom ASURO kömen und nicht von eienr geschikten Hand ;-)
Naja, wenn man gezwungen wäre auch das Programm zu posten, ließe sich das leicht umgehen...
CU, Robin
Hallo Miteinander,
hier die Quelle für das Rechteck:
#include "asuro.h"
/************************************************** *************************
* *
* This program is made for the ASURO Robot *
* *
* It draws a square. *
* *
************************************************** *************************/
/************************************************** *************************
* *
* 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. *
************************************************** *************************/
/************************************************** *************************
*
* void SetMotor(unsigned char left_speed, unsigned char right_speed );
*
* Range of speed: -7-0-7;
*
* function to control the motors
* Direction and speed can be set with on parameter
*
* Copyright: Stochri 2005
*
************************************************** **************************/
unsigned char speedtable[8]={0,100,120,140,160,180,200,250};
void SetMotor(int leftspeed, int rightspeed )
{
unsigned char left,right;
if (leftspeed<0) left=RWD; // Test if leftspeed is negativ
else left=FWD;
if (leftspeed==0) left=BREAK;
if (rightspeed<0) right=RWD; // Test if leftspeed is negativ
else right=FWD;
if (rightspeed==0) right=BREAK;
leftspeed=abs(leftspeed);
rightspeed=abs(rightspeed);
if (leftspeed>7) leftspeed=7;
if (rightspeed>7) rightspeed=7;
MotorSpeed(speedtable[leftspeed],speedtable[rightspeed]);
MotorDir(left,right);
}
// delay in 1/10 seconds
void wait(int zehntel)
{
int i,temp2;
for(i=0;i<zehntel;i++)
for(temp2=0;temp2<100;temp2++) Sleep(72);
}
/************************************************** *************************
*
* main
*
************************************************** **************************/
#define zurueck {SetMotor(-6,-6);wait(7);};
#define links90grad {SetMotor(-2,2);wait(6);};
#define aus SetMotor(0,0);
int main(void)
{
Init();
wait(20);
StatusLED(YELLOW);
zurueck;
links90grad;
zurueck;
links90grad;
zurueck;
links90grad;
zurueck;
links90grad;
aus;
StatusLED(RED);
while(1)
{
StatusLED(RED);
wait(5);
StatusLED(GREEN);
wait(5);
}
return 0;
}
linux_80
21.06.2005, 22:57
Hi stochri,
ich hätte noch keinen Code veröffentlicht, :-$
kann ja schon jeder abgucken,
ich hab sicherheitshalber nicht geguckt O:)
weiss allerdings nicht wann ich dazukomme was zu erfinden.
Hallo Miteinander,
ich hätte da mal eine Frage:
Wenn ich diesen Thread mit Mozilla/Linux lese, kann ich die Bilder im ersten Post sehen. Wenn ich das ganze mit Explorer/Windows beobachte, sind die Bilder nicht vorhanden.
Wie kann den das sein ?
Gruß,
stochri
linux_80
23.06.2005, 21:20
@stochri, warst Du auch jedesmal angemeldet ?
IIRC, wenn man nicht angemeldet ist, werden Attachments nicht angezeigt.
Hallo,
Den Wettbewerb find ich nicht schlecht.
Nur was ist jetzt hier gefragt Haus vom Nikolaus oder Rechteck?
Gruß Sebastian
Also das Rechteck ist natürlich die etwas einfache Version.
Wenn einer das Haus vom Nikolaus hinkriegt, dann hat er das Rechteck ja automatisch schon in der Tasche.
Wenn einer nur das Rechteck hinkriegt, soll er halt das Rechteck posten, dann machen wir einer Sonderkategorie und bewerten die Rechtecke extra.
Viele Grüße,
stochri
Wie wärs wenn jeder ein Video oder so von seiner Fahrt macht?
Code posten find ich nicht so gut, da kann ja dann jeder abschauen ...
Hallo Miteinander,
hier noch genauere Angaben zum Wettbewerb:
1. die Ergebnisse ( Bilder ) sollen kurz ( oder ein paar Stunden vor ) 20 Uhr am Sonntag Abend gepostet werden
2. Ab 20 Uhr können die Forumsteilnehmer die Ergebnisse bewerten. Die Bewertungsphase soll am Dienstag 24Uhr enden.
Im demokratischen Prozess wird man sich auf einen Gewinner einigen können. Ebenso sollen die ASURO Programme in der Bewertungsphase gepostet werden.
3. Ergebnisse, die nach Sonntag 20Uhr eintreffen können in dieser Runde nicht gewinnen, weil sie zu spät dran sind. Die Forumsteilnehmer sollen sich aber darauf einigen, ob eine neue Runde gestartet wird, sonst wäre ja die schöne Arbeit vergeblich.
Anmerkung:
Bei den Fussbalroboterwettkämpfen werden nach den Wettkämpfen die Algorithmen untereinander ausgetauscht.
Das hat den Vorteil, dass die Entwicklung schneller voranschreitet. So können auch die schwächeren Teilnehmer von den Besseren lernen. Eine breite Codebasis kommt allen zu Gute.
Ausserdem sollen sich die besseren Teilnehmer nicht auf ihren Lorbeeren über mehrere Wettkämpfe ausruhen, sondern können sich bei jedem Wettkampf neu beweisen.
Also muss es jetzt ein Rechteck oder Nikolaushaus sein?
Es soll das Nikolaushaus sein !!
Wer nicht weiss es aussieht==> Wikipedia "Haus vom Nikolaus"
Den Code für das Rechteck habe ich geposted, damit eine einfache Grundlage vorhanden ist, an der sich die Leute orientiern können.
Aber das ganze kann man bestimmt vieeeeel besser machen ....
ich weiß was das ist, nicht aufregen ;-)
Danke, dann will ich da auch mal mitmachen.
Wie wärs wenn jeder ein Video oder so von seiner Fahrt macht?
Code posten find ich nicht so gut, da kann ja dann jeder abschauen ...
Und was wird dann bewertet? Die beste Zeichnung oder Schnitt und Regie? ;-)
Ist ja schon ein bischen schade, dass nichtmals ein kleiner Wettbewerb bei dem es weder um Geld noch um andere finanzielle Werte geht, veranstalten werden kann, ohne dass gleich alle Angst haben irgendwer könnte dabei fuschen.
Die beste Zeichnung wird natürlich bewertet. Nachher kann man dann natürlich die codes posten.
Es gibt immer welche die schummeln ... leider.
Die beste Zeichnung wird bewertet? Und wie erkennt man die beste?
Was hat der Gewinner denn davon, dass er gewonnen hat, außer das er sich intensiv mit dem ASURO beschäftigt und weiß, dass er der beste ist?
Er könnte beispielsweise in seiner Signatur den Ehrentitel
" O:) Sieger beim ASURO Häuschenmalen vom 26.6.05 O:) "
tragen.
Der Sieger könnte unter allen Teilnehmern durch Abstimmung entschieden werden. Oder per "Umfrage".
Da geht schon was.
Manfred
Dashfinder
24.06.2005, 20:05
Tach schön,
ich denke mal dass das haus des nikolaus, welches dem "original" am nächsten kommt, das beste ist.
Und was hat man davon?
Eine Aufgabenstellung und eine Menge Spaß bei der Lösung :)
Mit viel Spaß und etwas weniger ernst wird das schon.
Genau, es soll Spaß machen, und man lernt auch noch dabei,
und am Ende den Code auszutauschen finde ich auch gut, man wird dadurch nur noch besser.
Irgendwann versuchen wir dann mit dem Asuro die Monalisa zu zeichnen :D
Gruß Sebastian
Oder sparen den Schwarzweiß-Drucker ein. Wenn sollten aber auch alle unter gleichen Bedingungen starten. Der Stift z.B. sollte dann wirklich hinten und nicht mit irgendeiner Konstruktion genau unter den Drehpunkt gebracht werden. Die Kleinen Schlenker beim Drehen... nur Schönheitsfehler ;-)
Ja,
Stift genau hinter den Batterien mittig vom Asuro
Gruß Sebastian
Hallo RCO,
was die Mechanik anbelangt, finde ich, das ist durchaus ein sehr wichtiger Punkt bei der Robotik. Meiner Meinung nach kann man die Robotik schon ganzheitlich betrachten und wenn es einer schaft, den Stift mittig anzubringen, dann kann das meiner Meinung nach durchaus in die Bewertung mit einfließen.
Wenn man den Stift mittig anbringt, hat man vielleicht das Problem, dass man nur eine dünne Stiftspitze unter dem ASURO anbringen kann und deshalb das Bild auch nicht schön wird, weil die Linie kaum sichtbar ist.
Zur Robotik gehört ja nicht nur die Informatik, sondern auch alle möglichen Disziplinen und ganz besonders die Mechanik.
Also ich mag das jetzt mal nicht ausschließen.
Beste Grüße,
stochri
Ich bin auch dafür, dass jeder seine Mechanik bauen darf.
Aber keine Veränderungen am Asuro selbst,
d.h. keine extra Sensoren, oder bewaglichen Stift usw.
Einfach nur damit auskommen, was DLR gegeben hat.
Hallo Izaseba,
also ich bin für weitestgehende Freiheit. Es soll natürlich nicht so sein, dass einer mit seinem Rasenmäherroboter das Haus vom Nikolaus in Nachbars Garten fräßt, es geht hier schon um den Asuro-Roboter.
Und wenn einer die Kreativität besitzt, da was anzubauen, würde ich das nicht unterdrücken wollen.
Aber ich denke, es wird auch nicht zum Problem werden. Wenn jetzt erst jemand anfängt, seine Mechanik umzukonstruieren, dann wird er bestimmt nicht bis Sonntag um 20Uhr damit fertig. Und selbst wenn, bezweifle ich jetzt erst mal, dass es soviel für's Ergebnis bringt. Er hat dann einfach auf ein anderes Pferd gesetzt und das soll ja jedem unbenommen sein.
Viele Grüße,
stochri
OK Leute,
es geht hier ja um den Spaß und den olympischen Gedanken, "Dabei sein ist alles"
Stochri, Du hast recht, soll jeder machen, was er will, das kann interessant werden,
aber Rasenmäherroboter, und das Ergebnis als Luftaufnahme, das wäre auch cool
Ich hör dann auf zu meckern, und mach mir lieber ein paar Gedanken um das Programm.
Gruß Sebastian
Jetzt bin ich ja mal gespannt, ob bis heute Abend es jemand schaft, das Haus vom Nikolaus zu malen. Bei dem schönen Wetter und der Hizte liegt man ja vielleicht auch lieber am Bagersee.
viele Grüße,
stochri
Hallo Miteinander,
hier das Bild von meinem Nikolaushaus ( sieht man nur, wenn man eingeloggt ist ).
In der linken oberen Ecke ist mein erstes Haus. Ganz schön schief, weil ich die Dachkoordinaten falsch berechnet habe ( so was kommt davon, wenn man zu unachtsam ist ). Beim 2.ten Bild rechts die Zeichnung mit korrigierten Koordinaten. Und das große Bild unten das Endergebnis in blau.
Sieht ein wenig dürftig aus, aber das ganze hat mich mehr Arbeit gekostet, als ich gedacht habe.
Viele Grüße,
stochri
Hallo stochri!
Das sieht ja sehr gut aus, besser als ich vermutet habe! ;o)
Wodurch sind diese Kreissegmente an den Ecken entstanden?
Hallo Florian,
das Problem mit den Kreissegmenten hat RCO schon in der Vorphase des Wettbewerbs angesprochen: Es kommt daher, dass der Stift nicht genau zwischen den Achsen sonder leicht nach hinten versetzt angebracht ist. Sonst hätte ich ein Loch in den ASURO bohren müssen und den Batteriepack versetzen. Aber ich habs mal so in Kauf genommen und gedacht, es gibt vielliecht sogar dem "Gesamtkunstwerk" eine besondere Note.
Beste Grüße,
stochri
Prima die Aufgabe ist erfüllt, und bis jetzt sind das auch die besten Bilder ich bin mal gespannt was noch kommt. Hat sich jemand angekündigt?
Manfred
Achso stochri, das klingt logisch! ;o)
Schade, dass die Beteiligung so gering ist, wahrscheinlich bräuchten wir Preise! *lol*
Wie wäre es mit einem ASURO-Plotter? ;o)
Hallo Leute,
Ich habe lange überlegt, ob ich mein Ergebnis posten soll, aber was solls,
aber nicht lachen!! Mir ist weißes Papier ausgegangen ](*,) und meine Frau hat mir verboten
auf dem Boden rumzumalen [-X
Also hier ist das Haus von Mikimaus :-b
Man sieht zwar nicht viel, aber ich hoffe daß man das wichtigste doch sieht ...
Könntet ihr vielleicht Videos posten!?
Dann könnten wir besser nachvollzeiehn, wie ihr programmiert habt!
Hallo,
Habe ein Video aufgezeichnet, leider habe ich keine Mikimaus mehr da :-s
nur noch Weihnachtssterne :-& , die wollte ich Euch ersparen..
Ich habe den Asuro einfach nur auf einem Tisch fahrenlassen.
Man kann es hier (http://www.sebastianmazur.de/PICT0001.MOV) runterladen.
Ist leider was groß geworden (hab noch nie ein Video mit unserer Kamera gedreht)
Morgen besorge ich mir ein weißes Brett und ein Filzstift, den man auch wieder abwaschen kann, dann poste ich was besseres.
Gruß Sebastian
linux_80
26.06.2005, 22:13
Hallo,
ich hätte ja auch gerne mitgemacht, war aber bis vor kurzem unterwegs :-b
wenn sich nächstesmal was zusammengeht hab ich hoffentlich genug zeit gehabt, aus meinen subTests was gescheites zusammenzubringen.
Wie gehts jetzt hier weiter, hat schon jemand gewonnen ?
Gibt hier fast parallelitäten zur F1 ;-)
Hallo Miteinander,
20 Uhr ist vorbei, also dürft ihr die Ergebnisse bewerten !
Da wir nur zu zweit sind, finde ich jetzt einfach mal das Nikolaushaus von izazeba am besten.
Hier mein Code, damit ihr das ganze zu Hause auch mal probieren könnt:
/************************************************** ***********************************
Programm für ASURO-Wettbewerb
Nikolaushaus
das Programm hat 3 Funktionen:
Schalter2: Linienkallibrierung
Schalter3: Drehkalibrierung, hier muss im Programm der Drehwert
für den 360°Winkel auf die Eigenheiten des Asuro angepasst werden
Schalter4: Start der Zeichnung
(copyright ) 26.6.2005 stochri
This program is free software under GNU-2-license.
************************************************** ***********************************/
#include "asuro.h" // bitte library von weja im roboternetz benutzen
// asuro.h und asuro.c vom 31.03.05
#define aus MotorDir(BREAK,BREAK)
int rightspeed=141; // precalibration of stochri's ASURO
int leftspeed=150;
int trightspeed=131; // precalibration of stochri's ASURO
int tleftspeed=150;
/************************************************** ***********************************
Calibration Routine for ASURO Motors
Goal: Motorpowerregulation that ASURO goes a straight line
************************************************** ***********************************/
void straightcalib()
{
Encoder_Set(0,0); // reset encoder
MotorSpeed(leftspeed,rightspeed);
MotorDir(FWD,FWD);
Msleep(1000);
aus;
Msleep(500);
MotorDir(RWD,RWD);
Msleep(1000);
aus;
SerWrite("\n\r encoder Left,Right ",22);
PrintInt(encoder[LEFT]);
PrintInt(encoder[RIGHT]);
SerWrite(" speed Left,Right ",19);
PrintInt(leftspeed);
PrintInt(rightspeed);
Msleep(1000);
// Regelung
if(encoder[RIGHT]<encoder[LEFT]) rightspeed++;
if(encoder[RIGHT]>encoder[LEFT]) rightspeed--;
}
/************************************************** ***********************************
Calibration Routine for ASURO Motors
Goal: Motorpowerregulation that ASURO goes a straight line
************************************************** ***********************************/
void turncalib()
{
Encoder_Set(0,0); // reset encoderii
MotorSpeed(tleftspeed,trightspeed);
MotorDir(RWD,FWD);
while(encoder[LEFT]<157) Msleep(1);
aus;
SerWrite("\n\r encoder Left,Right ",22);
PrintInt(encoder[LEFT]);
PrintInt(encoder[RIGHT]);
SerWrite(" speed Left,Right ",19);
PrintInt(tleftspeed);
PrintInt(trightspeed);
Msleep(1000);
// Regelung
if(encoder[RIGHT]<encoder[LEFT]) trightspeed+=1;
if(encoder[RIGHT]>encoder[LEFT]) trightspeed-=1;
}
// degrees
void turn(int degree)
{
int deg_count;
deg_count=degree*155;
deg_count/=360;
Encoder_Set(0,0); // reset encoder
MotorSpeed(tleftspeed,trightspeed);
MotorDir(RWD,FWD);
while(encoder[LEFT]<deg_count) Msleep(1);
aus;
}
// distance ~mm, max 32meter
void go(int distance)
{
int enc_count;
enc_count=distance;
// enc_count=distance*10000;
// enc_count/=12823;
Encoder_Set(0,0); // reset encoder
MotorSpeed(leftspeed,rightspeed);
MotorDir(FWD,FWD);
while(encoder[LEFT]<enc_count) Msleep(1);
aus;
}
#define w2vor { go(143); Msleep(500);}
#define w2halbe_vor { go(71); Msleep(500);}
#define vor { go(100); Msleep(500);}
#define links45 { turn(180); Msleep(500);turn(135);Msleep(500);}
#define links90 { turn(90); Msleep(500);}
#define links135 { turn(135); Msleep(500);}
void nikolaus(void)
{
links45;
w2vor;
links90;
w2halbe_vor;
links90;
w2halbe_vor;
links90;
w2vor;
links135;
vor;
links90;
vor;
links90;
vor;
links90;
vor;
}
int main(void)
{
int n;
Init();
Encoder_Init();
StatusLED(OFF);
SerWrite("\n\r motor calibration V0.1 \n\r",28);
while(1)
{
n=PollSwitch ();
if(n==2)
{
SerWrite("\n\r staightcalib \n\r",18);
Msleep(3000);
for(n=0;n<5;n++) straightcalib();
}
if(n==4)
{
SerWrite("\n\r turncalib \n\r",15);
Msleep(3000);
for(n=0;n<5;n++) turncalib();
}
if(n==8)
{
SerWrite("\n\r nikolaus \n\r",14);
Msleep(3000);
nikolaus();
}
StatusLED(RED);
Msleep(500);
StatusLED(GREEN);
Msleep(500);
}
return 0;
}
das Programm hat 3 Funktionen:
Schalter2: Linienkallibrierung
Schalter3: Drehkalibrierung, hier muss im programm der Drehwert
für den 360°Winkel auf die Eigenheiten des Asuro angepasst werden
Schalter4: Start der Zeichnung
Das Papier für die Zeichnungen habe ich im Baumarktgekauft: Papiertischtecke für 1,69 Euro.
Ich muss gestehen, das Ganze hat mich mehr Zeit gekostet als erwartet. Meiner Meinung nach handelt es sich bei der Nilolaushauszeichnung um eine ganz schön harte Nuss. Und bei mir hat es auch erst nach einigen Kalibrierversuchen geklapt. Soweit ich informiert bin, haben sich schon ganze Forschungsabteilungen an der Odometrieproblematik aufgerieben.
Wer´s nicht glaubt, kann es gerne mal testen.
Ein großes Problem ist beispielsweise, dass man die Motoren während der Fart schwer regeln kann, damit eine gerade Linie entsteht und bei der Drehung hängt der Schlupf des Asuro von der Unterlage und der Andruckkraft des Stiftes ab.
Wie wars bei Dir izazeba ? Ich hab gesehen, Du konntest die kleinen Kreise an den Ecken vermeiden.
Gruss,
stochri
linux_80
27.06.2005, 00:01
Hallo,
ich will meine Stimme auch abgeben, und entschiede mich für die Version
von stochri,
weil ein Kriterium muss man ja finden, sind ja beide Toll,
aber bei stochri's Version passen die Ecken schöner zusammen.
Ja, Stochri, ich konnte die Kreise vermeiden, weil ich nur ein Rad gedreht habe um zu lenken, und Du beide eins vor und das andere zurück.
Damit habe ich schon die Ecken weg, aber direkt das Problem mit der richtigen Positionierung (sieht man eventuell in der linken unteren Ecke).
Dadurch hat sich ja auch der Rest etwas verschoben.
Bei einer Sache muß ich Dir schon recht geben, der Schlupf ist ja wirklich sehr stark vom Untergrund abhängig. Ich habe zuerst am Boden (Fliesen) geprobt und wo alles perfekt war habe ich aufm Papier malenwollen, und dann kam die große Überraschung, es war ein Haus nach einem Tornado geworden ](*,) , also nochmal neu :-s .
Vielleicht soll man die Motoren sanft anfahrenlassen und nicht direkt gas geben :-k
Na, ja wenn ich hier abstimmen darf, dann ist es ja klar:
Das Haus von Stochri sieht viel besser aus als meins, also meine Stimme für Stochri,
gut gemacht !
Gruß Sebastian
Ich stimme für izaseba. Sein Bild hat einfach den schöneren Hintergrund und mit einer Frau im Rücken,
die überwacht, dass er nicht auf den Fußboden malt, hatte er eindeutig erschwerte Bedingungen ;-)
Tja, das ist ja sehr schön, wenn ich richtig gezählt habe, dann hat jeder von uns zwei Stimmen bekommen, die vom jeweils anderen und noch eine.
Damit steht es UNENTSCHIEDEN !!!!
Aber das es ging ja um den Spass bei der Sache.
Was mich noch rein programmtechnisch interessieren würde: izaseba, wie hast Du den Gleichlauf der Motoren und den korrekten Winkel hingekriegt? Bei meinem Programm sind es ja die Kallibrierroutinen.
Was mich mal interessieren würde: hat mal jemand das Programm von mir in seinen ASURO geladen und ausprobiert ? Mich würde interessieren ob man die Winkelroutine anpassen muss.
Schade das linux_80 nicht mitmachen konnte und ICH_ hat sich angemeldet, aber konnte wohl auch nicht teilnehmen ( war ja auch ein zu schönes Wochenende)
Gut, das Wetter macht einem im Moment nicht so an, um was zu programmieren.
Aber meine Frage: Sollen wir noch mal so einen Wettbewerb veranstalten ? Ich denke es ließen sich sogar ein paar Preise organisieren. Wäre das ein Anreiz ?
viele Gruesse,
stochri
Oh, halt, "unentschieden": Ich habe vergessen, dass die Bewertungsphase ja eigentlich erst morgen um Mitternacht endet;-)
Tschuldigung,
stochri
Hallo stochri,
Ich habe einfach alles über die Odometrie gemacht,
Geradefahren tut mein Asuro schon so, da habe ich gottseidank nichts machen brauchen
(hatte auch nicht viel Zeit um das auch noch zu programmieren)
und die Winkel, ich habe gezählt wieviele schwarz-weiß Übergänge bei 90 grad stattfinden (ich habe die scheiben mit 4 weißen und 4 schwarzen Feldern drauf) und das waren genau 50.
Na ja dann kamen noch 75 für 135 grad und Fertig.
Für die Strecke habe ich 100 Übergänge genommen und für die diagonale und das Dach habe ich den Herrn Pytagoras befragt, stimmte zwar nicht ganz genau, wegen dem Schlupf (Theorie und Praxis) also noch etwas angepasst und fertig.
Anbei mein Programm, da ich ein Purist bin und C an meinem Rechner schon immer benutze, habe ich das Programm im Assembler geschrieben.
Ist zwar nicht ganz perfekt, aber wie Du schon sagtest, schönes Wetter, noch Kirmes im Dorf, die Bruderschaft hat gerufen, naja nicht viel Zeit gehabt.
;Version 1.0
;Odometrie nach dem Beispiel von Rechteck.c
.include "m8def.inc"
.equ fwd = PB5 ;vor
.equ rwd = PB4 ;zurück
.equ encodertrue = 7 ;Bit 7 von tooglereg für Odometrie an/aus
.equ kolisionflag = 6 ;Bit 6 von tooglereg für Kolisionerkennung
.equ toogleflagL = 2 ;Hat eine Änderung am Rad Links stattgefunden ?
.equ toogleflagR = 1 ;Hat eine Änderung am Rad Rechts stattgefunden?
.equ toogle = 0 ;Bit 0 von tooglereg für Rad R "0" und Rad L "1" umzuschalten
.equ geschwindigkeit = 0xA0
.equ encoderon = 0x80
.equ encoderoff = 0x7F
.equ rechterwinkel = 53 ; 90 grad rechts sind genau 53 schritte
.equ rechterwinkel2 = 54 ; 90 grad links sind genau 54 schritte
.equ halbrechterwinkel = 80 ;135 grad rechts
.equ weg = 100 ;soll 300 schritte fahren
.equ weglang = 150 ;Langer Weg diagonal
.equ wegkurz = 50 ;Kurzer Weg für das Dach
.def encoder_leftL = R1
.def encoder_leftH = R2
.def encoder_rightL = R3
.def encoder_rightH = R4
.def vergleicherL = R5
.def vergleicherH = R6
.def tmp = R16 ; Multipurose
.def tmpi = R17 ; Multipurose für Interrupts
.def tmpi2 = R19 ;Multipurose 2 für 16 Bit rechnen
.def tmp2 = R20 ;Multipurose für 16 Bit rechnen
.def geschlinks = R21 ;geschwindigkeit linkes Rad
.def geschrechts = R22 ;geschwindigkeit rechtes Rad
.def tooglereg = R18 ;Toogle Register
.org 0x00
rjmp reset ;ResetVector
.org ADCCaddr
rjmp ADCcomplete ; ADC Interrupt Vector Address
reset:
;Stack einrichten
ldi tmp,HIGH(RAMEND)
out SPH,tmp
ldi tmp,LOW(RAMEND)
out SPL,tmp
;Stack fertig
ldi tooglereg,0x00
ori tooglereg,encoderon
;PWM einstellen
ldi tmp,(1<<WGM10) | (1<<COM1A1) | (1<<COM1B1)
out TCCR1A,tmp
ldi tmp,(1<<CS11)
out TCCR1B,tmp
;DDR für Tastenabfrage
;A/D Conversion
ldi tmp,(1<< ADEN) | (1<<ADFR) | (1<<ADIE) | (1<<ADSC) | (1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2)
out ADCSRA,tmp
ldi tmp,(1<<REFS0) | (1<<ADLAR) | (1<<MUX0)
out ADMUX,tmp
; DDR für Motor Rechts und Statusled green
ldi tmp,(1<<PB0) |(1<<PB1) | (1<<PB2) | (1<<PB5) | (1<<PB4)
out DDRB,tmp
;DDR für Motor Links,Statusled red, LED für Linienverfolgung und LEDs
;Odometrie und Backleds
ldi tmp,(1<<PD2) | (1<<PD4) | (1<<PD5) | (1<<PD6) | (1<<PD7)
out DDRD,tmp
cbi DDRD,PD3
cbi DDRC,PC0 ;schalte PC0 als eingang
cbi DDRC,PC1 ;schalte PC0 als eingang
sbi PORTD,PD7 ;schalte Odometrie LEDs ein
cbi PORTB,PB0 ;Status LED aus
cbi PORTD,PD2 ;Dito
;ldi tmp,LOW(weg)
;mov vergleicherL,tmp
;ldi tmp,HIGH(weg)
;mov vergleicherH,tmp
;sbi PORTD,PD6
ldi geschrechts,geschwindigkeit
ldi geschlinks,geschwindigkeit
sei
main:
rcall motorengesch
rcall ladeweg
rcall fahre
rcall drehe
rcall ladeweg
rcall fahre
rcall drehe
rcall ladeweg
rcall fahre
rcall drehe
rcall ladeweg
rcall fahre
rcall drehehalb
rcall ladeweglang
rcall fahre
rcall drehelinks
rcall ladewegkurz
rcall fahre
rcall drehelinks
rcall ladewegkurz
rcall fahre
rcall drehelinks
rcall ladeweglang
rcall fahre
rcall motorenloeschen
stop:
rjmp stop
ladeweg:
cli
ldi tmp,LOW(weg)
mov vergleicherL,tmp
ldi tmp,HIGH(weg)
mov vergleicherH,tmp
sei
rcall odozaehlernull
sbi PORTB,fwd
sbi PORTD,fwd
ret
ladeweglang:
cli
ldi tmp,LOW(weglang)
mov vergleicherL,tmp
ldi tmp,HIGH(weglang)
mov vergleicherH,tmp
sei
rcall odozaehlernull
sbi PORTB,fwd
sbi PORTD,fwd
ret
ladewegkurz:
cli
ldi tmp,LOW(wegkurz)
mov vergleicherL,tmp
ldi tmp,HIGH(wegkurz)
mov vergleicherH,tmp
sei
rcall odozaehlernull
sbi PORTB,fwd
sbi PORTD,fwd
ret
drehe:
rcall motorenloeschen ;motoren STOP
ldi tmp,rechterwinkel ;Lade 90 grad Drehung
mov vergleicherL,tmp
ldi tmp,0x00
mov vergleicherH,tmp
rcall odozaehlernull ;Wegezähler löschen
sbi PORTD,fwd ;Jetzt Drehen wir uns was
rcall fahre ;Jetzt warten bis wir uns um 90 grad gedreht haben
rcall motorenloeschen ;motoren STOP
ret
drehelinks:
rcall motorenloeschen ;motoren STOP
ldi tmp,rechterwinkel2 ;Lade 30 schritte für die 90 grad Drehung
mov vergleicherL,tmp
ldi tmp,0x00
mov vergleicherH,tmp
rcall odozaehlernull ;Wegezähler löschen
sbi PORTB,fwd ;Jetzt Drehen wir uns was
rcall fahrelinks ;Jetzt warten bis wir uns um 90 grad gedreht haben
rcall motorenloeschen ;motoren STOP
ret
drehehalb:
rcall motorenloeschen ;motoren STOP
ldi tmp,halbrechterwinkel ;135 grad Drehung
mov vergleicherL,tmp
ldi tmp,0x00
mov vergleicherH,tmp
rcall odozaehlernull ;Wegezähler löschen
sbi PORTD,fwd ;Jetzt Drehen wir uns was
rcall fahre
rcall motorenloeschen ;motoren STOP
ret
fahre:
cli
mov tmp,encoder_rightL
mov tmp2,encoder_rightH
cp vergleicherL,tmp ;Vergleiche gefahrenen Weg
cpc vergleicherH,tmp2
sei
in tmp,SREG
sbrs tmp,0
rjmp fahre
ret
fahrelinks:
cli
mov tmp,encoder_leftL
mov tmp2,encoder_leftH
cp vergleicherL,tmp ;Vergleiche gefahrenen Weg
cpc vergleicherH,tmp2
sei
in tmp,SREG
sbrs tmp,0
rjmp fahrelinks
ret
.include "motoren.asm"
.include "LED.asm"
ADCcomplete:
in tmpi,SREG
push tmpi
ldi tmpi2,0x00
in tmpi,ADCL
in tmpi,ADCH
sbrs tooglereg,toogle ;Wenn Bit toogle = 1 Weiter bei Rechtem Rad
rjmp radlinks
;Rad Rechts
sbrs tooglereg,toogleflagR
rjmp flagRfalse
;flagRtrue
cpi tmpi,0x8C
brsh ausR
ldi tmpi,0x01
add encoder_rightL,tmpi
adc encoder_rightH,tmpi2
;debug
cbi PORTD,PD2
sbi PORTB,PB0
;ende debug
andi tooglereg,0xFD
rjmp ausR
flagRfalse:
cpi tmpi,0xA0
brlo ausR
ldi tmpi,0x01
add encoder_rightL,tmpi
adc encoder_rightH,tmpi2
;debug
cbi PORTD,PD2
sbi PORTB,PB0
;ende debug
ori tooglereg,(1<<toogleflagR)
ausR:
sbi ADMUX,MUX0
andi tooglereg,0xFE
rjmp rausadc
radlinks:
sbrs tooglereg,toogleflagL ;ist toogleflagL gesetzt? wenn ja springe zu flagtrue
rjmp flagLfalse ;wenn nicht springe zu flagLfalse
;flagLtrue
cpi tmpi,0x8C ;vergleiche mit 0xA0
brsh ausL ;wenn größer oder gleich springe zu ausL
ldi tmpi,0x01
add encoder_leftL,tmpi ;encoder_left++
adc encoder_leftH,tmpi2
;Debug
sbi PORTD,PD2
cbi PORTB,PB0
;Ende Debug
andi tooglereg,0xFB ;Lösche flagL
rjmp ausL
flagLfalse:
cpi tmpi,0xA0
brlo ausL
ldi tmpi,0x01
add encoder_leftL,tmpi
adc encoder_leftH,tmpi2
;Debug
sbi PORTD,PD2
cbi PORTB,PB0
;ende debug
ori tooglereg,(1<<toogleflagL)
ausL:
cbi ADMUX,MUX0
ori tooglereg,(1<<toogle)
rjmp rausadc
rausadc:
pop tmpi
out SREG,tmpi
reti
Sternthaler
19.03.2006, 01:06
Ok, ich bin jetzt etwas spät dran.
Trotzdem möchte ich meinen Nikolaus hier auch einbringen, da mich dieser Threat eigendlich dazu gebracht hat überhaupt mit dem Asuro weiterzumachen. (Natürlich verstehe ich es, wenn ich nicht mehr in die Wertung komme.)
Einmal vorweg:
Mein Asuro scheint eine echte Krücke zu sein. Wie ihr gleich am ersten Bild sehen könnt, hatte ich zwar keine Probleme mit dem Programm von stochri so halbwegs gerade Striche hinzubekommen, aber das gesamte Ergebnis war eher etwas für 'bildende Künste' als für den Nikolaus. Jedenfalls ist das mein bestes Ergenis, dass ich mit dem Program von stochri hinbekommen hatte.
Dann habe ich mich so ein paar Monate zurückgezogen und einige Infos hier aus dem Forum (waste sei Dank) und gründlichem Studium der Doku und einiger schlaflosen Nächte zusammengeschustert um meinem Asuro den Nikolaus zu entlocken.
Nachdem also der linienverfolgende PID-Regleger von waste zu einem Raddekoder-Regler umkonfiguriert war und alle Sensoren (außer der Empfangsschnittstelle) auf Interruptbetrieb umgestellt wurden, habe ich meine Willen durchsetzen können und dem vergammelten, verrosteten, und wahrscheinlich Vorgänger von R2D2 (soll heissen mein Asuro) doch noch einen Nikolaus so halbwegs malen lassen können.
So, nun der schlechteste Nikolaus in diesem Wettbewerb, und dann der nach monatelagen Versuchen entstanden 'Nachbau'.
Sternthaler
19.03.2006, 01:19
So, damit ihr auch nachsehen könnt, was ich mir für eine Mühe gemacht habe, gibt es auch noch meinen Source dazu.
- asuro_st.c entspricht ca. der asuro.c mit 'kleinen' Umbauten
- asuro_st.h bringt auch 'ungefähr' das Gleiche mit
- asuro_hw.h enthält nur einen Hardwaredefine für meine unterschiedlichen (Krücken-)Motoren
- asuro_md.h enthält einige Defines zum sammeln von MessDaten
- test.c enthält den Nikolaus
Im Source asuro_st.c sind vor allem die Umbauten zum Interruptbetrieb und ich habe dort den PID-Regler von waste so eingebaut, dass sowohl eine Linienverfolgung als eben auch eine Nutzung für die Raddekoder möglich ist.
[Edit 30.04.2010] Eine angepasste Version (V10-2) hinzugefügt, da es bei neueren Compilern Probleme mit dem #include <string.h> gibt. Die scheint nicht mehr notwendig zu sein.
GRATULATION ZU DISEM ERGEBNIS !!
Hallo Sternthaler,
Dein Nikolaushaus ist wirklich das Beste im ganzen Wettbewerb.
Und das Ziel des Wettbewerbs war es ja eingentlich, gute Verfahren für die Asuorwegsteuerung zu finden.
Bei meinem Programm muss man erst ein paar mal die Kallibrierroutinen laufen lassen, bis der ASURO um den richtigen Winkel dreht und eine gerade Linie fährt. Erst wenn man das gemacht hat, kann man das Ergebnisbild erreichen, welches ich gepostet habe.
Beim Wettbewerb stand ich vor der Entscheidung, einen Regler zu entwerfen, oder einfach nur eine Steuerung zu implementieren. Da ein hoher Zeitdruck ( fast wie im richtigen Entwicklerleben ) vorhanden war, habe ich mich für die Steuerung entschieden, weil ich davon ausgegangen bin, dass für eine kurze Zeit die Batteriespannung einigermaßen konstant bleibt und die Motoren gliechbleibend laufen.
Bei diesem Verfahren ist natürlich die Kallibrierung etwas umständlich und für ein gutes NIkolaushaus bedarf es dann einiger Versuche.
Das Programm ist deshalb für eine Wegsteuerung nicht allgemein verwendbar, aber für den Wettbewerb durchaus ausreichend.
Bei der Implementation des Reglers hätte ich die Schwierigkeit erwartet, beim Zeichnen einer geraden Linie einen Einschwingvorgang auf der Linie zu sehen. Und wenn der ASURO einmal seine Position leicht verloren hat, wird es mit dem Nikolaushaus nichts.
Deshalb halte ich Dein Ergebnis für super, nur mit dem Zeitkriterium ist es halt etwas knapp. Aber Dein Ergebnis ist sicherlich allgemein verwendbar und deshalb ist das Ziel, für den ASURO eine vernünftige Motorsteuerung zu realisieren wohl erreicht.
Bin mal gespannt, was Waste zu Deinerm Ergebnis meint.
Beste Grüße,
stochri
Sternthaler
19.03.2006, 23:16
@stochri
Danke für die Blumen.
Eigendlich kann ich dir nicht zustimmen, dass der Nicolaus von mir der Beste sein soll. Bei deinem passen die Ecken besser, und izaseba's Ansatz die Kringel beim Wenden durch eine Bogenfahrt zu vermeiden, ist zwar nicht der 'klassische' Nikolaus, aber alleine der Mut zu diesem Ansatz hatte mich damals schon überrascht. Da wäre ich nie im Leben selber drauf gekommen.
einen Einschwingvorgang auf der Linie zu sehen
Da hast du vollkommen Recht. Wenn ihr euch mal die rechte, obere Ecke, bzw. die obere waagerechte Linie an der rechten Seite anseht (Ausschnitt siehe unten), dort ist das Schwingen sehr gut zu sehen.
Der Bogen geht erst nach unten, das heisst der Asuro fährt erst mit dem linken Motor los, die Linie pendelt dann tatsächlich erst etwas bis der Regler alles in den Griff bekommen hat. Eigendlich ist bei allen Linien dieser Effekt zu sehen. Klar, ich hatte ja schon davon gesprochen, das mein linker Motor wesentlich besser ist.
Was ich aber nicht feststellen konnte, ist deine Vermutung, das der Asuro dann komplett seine Positionen verliert. Wahrscheinlich liegt es hier aber am großen Verhältnis zwischen der gut geregelten Strecke und dem ersten Stück Weg, an dem der Asuro noch schwingt.
Ich hatte noch vergessen anzugeben, wie ich auf die Zahlen für die Wegliste (in test.c) gekommen bin.
Ich habe (mal wieder) ein EXCEL-Blättchen gemacht und dort ein bisschen die Geometrie von dieser 2-rädrigen Art der Fortbewegung hinterlegt.
Mittlerweile gibt es in der Zelle [P4] einen sehr wichtigen Prozentwert, der angibt wie viele der Farbwechsel auf der Dekoderscheibe tatsächlich vom Asuro registriert werden. Ich komme mit den dann berechneten Tick-Werten am besten an das gewünschte Ergebnis, wenn ich nur 96% der eigendlich zu erwartenden Tick's in den Berechnungen berücksichtige.
Meine Vermutung ist, dass trotz konstantem, nächtlichem Licht über dem Küchentisch, die leider immer noch festen Schwellwerte zur Hell-/Dunkelübergangsbestimmung die Ursache sind.
Jetzt also auch noch das EXCEL als Tick-(Trick- und Track)-Berechner.
Nochmals vielen Dank für das große Lob. Bekommt mir sehr gut. :-)
Ist ja lustig, dass der ASURO trotz des Einschwingvorgangs seine Richung beibeihaelt.
Woher kommen eigentlich die leicht verdelten Kreise? Ist es moeglich, dass der Stift ein wenig in seiner Halterung wackelt ? O:)
Bei einem der Versuche habe ich einen 1.5mm Kupferdraht genommen und damit eine Halterung zurecht gebogen. Wenn man den Draht an den Enden abisoliert, kann man ihn in die Loecher der Batteriehalterung einhaengen:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=12316&highlight=servo+asuro
Das Servo braucht man natuerlich nicht unbedingt.
Dass die Encoderscheiben immer ungenaue Werte liefern, ist irgendwie seltsam. Vielleicht liegt es ja gar nicht unbedingt am Stoerlicht, sondern aus irgendwelchen Gruenden koennte der AD-Wandler ja auch ab und zu mal einen elektrischen Stoerpeak abkriegen.
Oder es ist ein Konflikt im Timing des Programms. Ich verwende AVR-Studio und mir ist aufgefallen, dass die 72kHz Interruptroutine relativ viel Rechenkapazitaet des Atmega auffrisst. Vielleicht koennte es ja bisweilen auch einen Konflikt mit der AD-Wandlung geben.
Deine Routinen scheinen sehr genau zu funktionieren. Da waere es doch lustig, mal etwas komplizierteres als ein Nikolaushaus zu malen. Oder wie waers, das Nikolaushaus einfach 4x in die 4 unterschielichen Himmelsrichtungen zu zeichnen. Sieht bestimmt auch gut aus.
Gruss,
stochri
Vielleicht liegt es ja gar nicht unbedingt am Stoerlicht,
Also ich habe mal irgendwo gelesen, dass einer um die Photdioden und die Scheibe irgendwie ein Gehäuse gebastelt hat (siehe Bild) und dann diese Probleme weg waren... Also liegt es wohl mit ziemlicher Sicherheit am Störlicht...
Hallo Nabla,
es ist richtig, dass starkes Stoerlicht ( z.B. Sonneneinstrahlung ) zur Fehlfunktion der Odometrie fuehren kann. Und es ist auch richtig, dass eine Abschirmung dieses Stoerlicht unterdrueckt.
Es ist allerdings keineswegs gesagt, dass es nicht noch andere Stoerquellen gibt. Und wenn man keine so hochpraezise Odometriefunktion wie fuer das Zeichnen des Nikolaushauses braucht, fallen statistisch wenige Ausreisser gar nicht auf. Ich vermute, dass dies beim DosenASURO der Fall ist.
Wenn man allerdings genauere Untersuchungen anstellt, wie Sternthaler in diesem Thread hier, dann fallen 4 Prozent Abweichung sehr wohl auf. Und dann stellt sich die Frage: woher kommen diese Ausreisser ?
Gruss,
stochri
Sternthaler
23.03.2006, 01:13
Hallo zusammen,
Woher kommen eigentlich die leicht verdelten Kreise?
Ne, die Halterung ist zwar nicht so stark wie deine Servo-Version, das liegt mal wieder an meinen schrottigen Motoren. P.S. Der Servo ist super stark! Alle Achtung!
Ich habe mal versucht den entstandenen 'Bogen' durch einen Film darzustellen. Da es leider nur ein paar Zeichnungen sind, hier noch eine Erklärung dazu:
Mein linker Motor ist einfach wesentlich besser. Jedesmal wenn der Asuro neu anfahren muss, bewegt sich fast immer der Linke zuerst. Irgendwann, kommt dann der Regler in's Spiel und reduziert die linke bzw. erhöht die rechte Motorleistung. Geregelt wird über die Abweichung der zu fahrenden Tik's gegenüber den tatsächlich gezählten Tik's.
Damit sind wir bei der Frage, warum das Zählen nicht so einfach ist. (siehe nächsten Eintrag, da ich nicht weiss wie man Bilder mitten in den Text setzen kann.)
Sternthaler
23.03.2006, 01:15
um die Photdioden und die Scheibe irgendwie ein Gehäuse gebastelt
Ok, ich habe euch verschwiegen, dass ich die schon lange habe. So richtig zufrieden bin ich nicht mit meiner Lösung, da ihr auf den Bildern gut sehen könnt mit welchem Spiel das Zahnrad mit der Dekoderscheibe hin und her wackeln kann. Im Moment seht ihr auf den Bildern nicht was ich dagegen getan habe, da die Lösung nicht besonders stabil ist. Ich habe meistens eine Unterlegscheibe mit Uhu an der Achse angeklebt um die Dekoderzahnradwichtigscheibe möglichst spielfrei zu haben. Da kann ich nabla nur Recht geben: Bei spielfreier Abdeckung ist das Tik-Zählen tatsächlich recht gut.
Ich bin der Meinung, dass Tik's durch wechselndes Umgebungslicht UND durch ein 'FLATTERN' der Dekoderscheibe verloren gehen. Das 'Flattern' ist mechanisch (Uhu hilft eine Zeit lang), aber das Umgebungslicht ist nur sehr schwer zu fassen. Ich habe da schon einige Versuche angestellt dies durch eine Messung ohne LED-Beleuchtung 'wegzurechnen'. Laut Schaltplan ist es eigendlich nicht möglich eine 'Dunkelmessung' zu machen. Es geht aber tatsächlich doch. Im Interrupt zum ADC ist die Messung auch schon vorhanden. Bis jetzt habe ich aber noch keine schnelle, kleine Berechnung hinbekommen so dass der Schwellwert zum Tik-Zählen beeinflusst werden kann. (Bei Bedarf kann ich endlose EXCEL-Daten für unterschiedliches Umgebungslicht posten)
trotz des Einschwingvorgangs seine Richung beibehaelt
Weiss nicht, wenn man mal 2 Extremfälle durchgeht: (in beiden Fällen sollen beide Räder 80 Tik's fahren. Eine Radumdrehung)
1:
- Links fährt 80; Rechts fährt 0
- Links fährt 0; Rechts fährt 80
---> gibt einen rechts- / links-Schlenker, aber der Asuro steht wieder in gleicher Richtung wie beim Start. Allerdings ist er mehr oder weniger diagonal nach rechts gefahren.
2:
- Links fährt 1; Rechts fährt 0
- Regler stopt Links; Vollgas Rechts
- Links fährt 0; Rechts fährt 1
- Regler ist zufrieden, da Zählergleichstand, aber rechter Motor 'brummt'
- Links fährt 0; Rechts fährt 2
- Regler sieht nun zu, dass Links wieder Speed aufnimmt.
- ...
---> Die Linie sieht gerade aus und niemandem fällt auf, dass der Asuro eigendlich wackelt.
Ich glaube, dass die von mir ermittelten Regler-PARAMETER nicht besonders optimal sind (siehe das Pendeln aus dem Ausschnitt), aber dass trotzdem die Abweichungen in Summe so klein bleiben, dass der Asuro eben nicht wie in Fall 1: geschildert "diagonal nach rechts" fährt. Aber wer weiss das schon ;-)
Nikolaushaus einfach 4x
Genau, aber nicht in 4 verschiedene Richtungen, sondern immer wieder von der gleichen Stelle aus. Leider ergeben sich dann immer noch Abweichungen von einer zur nächsten Fahrt. (Ich bin sicher, du hast auf deinem geposteten Bild in den oberen Bildteilen solche Wiederholungen?)
Hallo Sternthaler,
poste doch einfach mal 4 uebereinandergezeichnete Haueser, mich wuerde mal interessieren, wie sie aufeinander zu liegen kommen.
Beste Gruesse,
stochri
Sternthaler
25.03.2006, 19:21
Hallo stochri,
ich habe hier ein bisschen gemogelt und den Asuro nach jeder Fahrt wieder genau nach oben ausgerichtet. Ausserdem den Stift wieder etwas nach unten gedrückt (hab ja leider keinen Servo, heul, schnief), dadurch sieht man unten rechts die 'fetten' Startpositionen. Die erste Fahrt ging an der rechten Linie los.
Da waere es doch lustig, mal etwas komplizierteres ...
Ich habe mal überlegt, ob man den Asuro nicht in einen 'Lernmodus' bringen kann. Die Idee, ist folgende:
- Taster 'Lernmodus' drücken
- Loop
- Asuro möglichst gerade SCHIEBEN (Asuro zählt die Tik's)
- Taster 'Speichern' drücken
- LoopENDE wenn Taster 'Ende' gedrückt wurde
- Taster 'Los gehts' drücken (Reproduktionen nummerieren und verkaufen?)
Frohes Bildermalen (lassen)
hab ja leider keinen Servo, heul, schnief
Einen sehr schoen kleinen Servo gaebe es im Modellbaugeschaeft fuer ca. 15 Euro. Oder ein klein wenig groesser beim Conrad fuer 5 Euro. Den Stifthalter kann man aber auch sehr shoen ohne Servo benutzen, den Draht kann man im Baumarkt kaufen. Der Stift muss lose in der Drahtspule haengen, dann drueckt er von selber mit der richtigen Kraft nach unten.
Ich habe mal überlegt, ob man den Asuro nicht in einen 'Lernmodus' bringen kann.
Sehr interessante Idee. Eigentlich lassen sich die Motoren ja relativ schwer drehen, aber vielleicht koennte man sie schon mit eine wenig Strom beaufschlagen, sodass sie sich fast von selbst drehen. Man muss dann aber auf das Haftreibungsmoment aufpassen, sonst laeuft der ASURO weiter, wenn man ihn mal angeschoben hat.
Gruss,
stochri
Schöne Grüße von Sternthaler
---
Lieber Asuro programieren als arbeiten gehen.
Irgendwie erinnert mich Dein Spruch an das hier:
http://www.jrobot.net/Projects/AVRcam.html
Sternthaler
27.03.2006, 17:52
Hallo stochri,
das mit einem Servo für meinen Asuro meine ich aktuell nicht ernst. Trotzdem danke für die Infos zu Bezugsquellen.
Deine Stifthalterung aber werde ich mal übernehmen, da der Aufwand ja auch für andere 'Zeichenkünstler' so gering ist, dass man das jedem Asuro-Besitzer zutrauen kann. Sonst habe ich im Moment keinesfalls vor irgendeine Änderung an der Hardware zu machen.
Zum Lernmodus:
Keine schlechte Idee von dir die Motoren schon mal 'vorzuspannen'.
Zu meiner Idee ist mir allerdings noch ein entscheidender Fehler aufgefallen: Wenn der Asuro GESCHOBEN wird, bekommt er ja nix davon mit, ob ich vorwärts oder rückwärts schiebe. Somit muss die von mir angesprochenen LOOP noch ein wenig überdacht werden.
Evl. hilft folgendes:
Lernmodus einschalten
LOOP
. Taste drücken
. WENN Taste = vorwärts, dann Richtung merken und Motoren 'leicht' vorwärts
. WENN Taste = rückwärts, dann Richtung merken und Motoren 'leicht' rückwärts
. WENN Taste = fertig, dann letzten Tic-Counter speichern;Loop abbrechen
. Asuro schieben, Tic's werden gezählt und gespeichert
ENDE LOOP
Taste WIEDERHOLE
Ist ja nicht schlecht der Spruch auf jrobot.net
"Building robots instead of sleeping..." Da kann ich mich auf alle Fälle wiederfinden. Mit der Arbeit ist das so eine Sache: schlafen nicht erwünscht, Asuro programieren leider auch nicht. Thead-Beiträge schreiben hoffentlich nicht entdeckt (so wie dieser)
P.S.: Schreibt man programieren eigendlich mit 2 'm'?
hmm schön schön :) (sehr aktuell)
den 1. code habe ich verstanden, der 2. über forderte mich ein wenig, doch wenn ich meinen asuro habe, versuch ichs auch mal
na wer weiss, vielleicht kann ichs noch toppen :)
Sternthaler
14.12.2006, 20:56
(sehr aktuell)
.. der 2. über forderte mich ein wenig, ..
na wer weiss, vielleicht kann ichs noch toppen :)
Hallo dinoAG,
muss hier nicht aktuell sein, da der Wettbewerb zuende ist. ;-)
Wenn du zu zum 2.ten Fragen hast, helfe ich da sehr gerne weiter. Ich hatte gehofft durch die großzügig eingestreuten Kommentare im Code genuegend Infos zu geben.
Ich hoffe, dass du toppen kannst. Denn dann hast du das Problem mit den Raddekoder-Sensoren auf alle Fälle gelösst. Dieses Problem haben hier mehrere, und sind an einer funktionierenden Lösung bestimmt hochgradig interressiert. Ich jedenfalls suche/überlege/messe/programmiere da immer noch.
Mein nächster Versuch geht zu einem kleinen Umbau des Sensors. (Weiss aber noch nicht wann, da ich ja jetzt erst mal von der Arbeit nach Hause gehen muss.) Ich möcht die Empfindlichkeit RUNTER-schrauben, da die Probleme immer nur bei zu starkem Umgebungslicht auftreten. Ist allerdings nicht meine favorierte Lösung, da dies einen Umbau am ASURO bedeuten würde, den ich eigendlich vermeiden will, damit nicht alle anderen ASURO-Besitzer auch zum Lötkolben greifen müssen um meinen Programmcode laufen lassen zu können.
P.S.: Schön, dass sich hier nochmal einer meldet.
Hallo Zusammen,
ist ja witzig, dass das Thema nach so langer Zeit wieder aufgewärmt wird. Aber jetzt, so um die Weihnachtszeit ist "das Haus vom Nikolaus" ja durchaus ein passendes Thema.
Aber Vorsicht ! Das Ganze mag sich zwar einfach anhören, ist aber ganz schön schwierig, wenn man es wirklich gut lösen will.
Also viel Glück bei euere Weihnachtferien/ Urlaubs- Programmier-Roboter-Mal-Aktion.
Viele Grüße,
stochri
cs-admin
17.12.2006, 17:31
Guten Abend,
kann mir jemand sagen, was dieser Befehl in Storchi Source macht?
z.B.
#define links45 { turn(180); Msleep(500);turn(135);Msleep(500);}
Vielen Dank schonmal..
damaltor
17.12.2006, 19:24
das bedeutet, dass überall im quelltext wo "links45" steht,
turn(180); Msleep(500);turn(135);Msleep(500);
ausgeführt wird.
der befehl define sagt aus das das erste wort nach define (turn45) vor dem kompilieren dur das ersetzt wird, as dahinter steht (alles zwischen den {}).
das ist gut, wenn man nur ein paar befehle hat, für die es sich nicht lohnt, eine ganze funktion zu schreiben.
wird diese befehlsfolge allerdings öfter benutzt, sollte man eine funktion schreiben, um speicher zu sparen.
Sternthaler
17.12.2006, 23:43
Hätte ich nicht besser erklären können.
Kleine Fehlerteufel-Anmerkung noch zu den { } Klammern. Auch die werden zum Glück beim kompilieren mitgenommen und übersetzt.
Warum zum Glück?
if (x == y)
links45;
else
was_anderes;
würde sonst folgenden Code ergeben:
if (x == y)
turn(180);
Msleep(500);
turn(135);
msleep(500);
else
was_anderes;
Jetzt wäre nur noch das 'turn(180)' hinter dem if x==y gültig und wir würden wegen des noch folgenden 'else' einen Compiler-FEHLER bekommen. Im schlimmsten Fall würde der logische Ablauf in unserem Programm falsch sein wenn wir z.B. nur folgendes programmieren:
if (x == y)
links45;
mache_hier_weiter;
Jetzt bekommen wir KEINEN Fehler, aber hinter dem if ist wiederum nur das turn(180) und der Rest vom define (Msleep(500); turn(135); Msleep(500);) wird IMMER ausgeführt.
Tipp: #define Name { IMMER mit Klammern schreiben. }
Edit: 18.12.2006 Sternthaler. Wenn ich schon pingelich bin, dann gehören natürlich auch Klammern zum if.
cs-admin
18.12.2006, 18:28
Hallo,
brauch nochmal Hilfe.
Also das sind 2 Schleifen, soweit ist mir klar, aber was macht sie ganz genau in Storchi programm?
Verzögerung in zehntel sekunden ausrechnen?
//delay in 1/10 sec
void wait(int zehntel)
{
int i,temp2;
for(i=0;i<zehntel;i++)
for(temp2=0;temp2<100;temp2++) Sleep(72);
}
Nein, du gibts einfach die Zeit die du warten möchtest in Zehntel Sekunden ein und dann macht der Asuro so lange gar ncihts.
Andun
Nachdem ich das jetzt schon eine Weile beobachte, muss ich jetzt doch mal antworten:
#define links45 { turn(180); Msleep(500);turn(135);Msleep(500);}
Eine Rechtsdrehung um 180°+135° = 315° ist wie eine Linksdrehung um 45° ( 360°-45° = 315° ).
Mein ASURO hat die Eigenschaft, dass er je nach Richtung unterschiedlich weit dreht. Die Kallibrierroutine ist aber nur für die Rechtsdrehung ( glaub ich mich zu erinnern ). Deshalb habe ich die Linksdrehung über eine Rechtsdrehung realisiert.
Ein weiteres Problem der Turn ( und Go ) Routine ist, dass man die Bewegungen eigentlich mit einer programmgesteuerten Bremsphase versehen müsste. Schaltet man die Motoren schnell ab, bewegt sich der Roboter noch ein Stückchen weiter, was zu einem Fehler in der Sollposition führt.
Das ist eine Unsauberkeit der Routinen, die man irgendwan mal beheben könnte. Damals im Wettberwerb ging es aber darum, möglichst schnell das Ziel zu erreichen, deshalb sind solche Feinheiten unter den Tisch gefallen.
Gruss,
sto - chri
Stallion
03.01.2007, 22:46
Hier mal ein kleines Video meines Asuros: http://www.zippyvideos.com/5870203996486466/video3/
Die main-Funktion ist nicht besonders interessant, da nur eine Aneinanderreihung von Go und Turn...
Und hier poste ich mal die modifizierten Go und Turn Funktionen der asuro.c. Im Großen und Ganzen entsprechen diese den originalen aus der erweiterten Asuro-Lib auf Sourceforge. Aber vor allem bei der Turn habe ich einiges an den Parametern geändert (mit Abbremsfunktion). Ansonsten habe ich meist noch die Variablentypen und die Reihenfolge angepasst.
void Go(int distance, unsigned char speed)
{
unsigned int enc_count = abs(distance);
unsigned int tot_count = 0;
signed char diff = 0;
unsigned char l_speed = speed, r_speed = speed;
// mm -> ticks
enc_count /= 2; // only for 12 fields gearwheel
// set direction
if(distance < 0) MotorDir(RWD,RWD);
else MotorDir(FWD,FWD);
// reset encoder
Encoder_Set(0,0);
// set speed
MotorSpeed(l_speed,r_speed);
// do until destination reached
while(tot_count < enc_count)
{
tot_count += encoder[LEFT];
// calculate speed difference
diff = encoder[LEFT] - encoder[RIGHT];
// reset encoder
Encoder_Set(0,0);
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;
}
// set new speeds
MotorSpeed(l_speed,r_speed);
Sleep(36);
}
// Stop
MotorSpeed(0,0);
MotorDir(BREAK,BREAK);
Msleep(200);
}
void Turn(int degree, unsigned char speed)
{
unsigned int enc_count;
unsigned int tot_count = 0;
int diff = 0;
unsigned char l_speed = speed, r_speed = speed;
// degree -> tick
enc_count = (unsigned int) (((long)abs(degree) * (long)4080) / (long)10000);
// set direction
if(degree < 0) MotorDir(RWD,FWD);
else MotorDir(FWD,RWD);
// reset encoder
Encoder_Set(0,0);
// set speed
MotorSpeed(l_speed,r_speed);
// do until angel reached
while(tot_count < enc_count)
{
tot_count += encoder[LEFT];
// calculate speed difference
diff = encoder[LEFT] - encoder[RIGHT];
// reset encoder
Encoder_Set(0,0);
// calculate new speed
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;
}
// set new speed, with slow down
MotorSpeed(l_speed - (unsigned char) ((unsigned int)(l_speed) / enc_count),r_speed - (unsigned char) ((unsigned int)(r_speed) / enc_count));
Sleep(36);
}
// stop
MotorSpeed(0,0);
MotorDir(BREAK,BREAK);
Msleep(200);
}
Ist zwar noch immer nicht ganz 100%, aber das liegt wohl an der Ungenauigkeit der Odometrie. Ich werde versuchen es noch etwas zu verbessern; mal schauen, was ich noch erreichen kann.
radbruch
04.01.2007, 00:41
Klasse. Ich hoffe, mein 1. Versuch wird auch bald hier zu sehen sein.
Hallo Stallion,
Glückwunsch zum Nikolaushaus. :Weihnacht
Der ASURO fährt ganz gut in dem Video. Interresanterweise fährt er rückwärts.
Im Video kann man die Striche nicht so gut erkennen, vielleicht kannst Du so ein Bild mit mehreren hintereinandergezeichneten ASUROs wie Sternthaler posten, dann kann man erkennen, wie gut der ASURO seine Position hält.
Wenn's gut funktioniert, wären ja vielleicht sogar kompliziertere Gemälde denkbar. O:)
Gruss,
stochri
Stallion
05.01.2007, 12:03
Interresanterweise fährt er rückwärts.
Ja, ist dieser Bug, den alle neueren Asuros haben. Und ich war bisher zu faul die Kabel der Motoren umzulöten, damit er in die richtige Richtung fährt. Sollte aber eigentlich keinen großen Unterschied machen.
damaltor
05.01.2007, 15:45
naja... einen unterschied machts. wenn du fremde hex-files flasht, dann macht dein asuro nicht was er soll. und andere können mit deinen hexfiles nicht viel anfangen...
aber ansonsten ist es nicht so schlimm.
so nun hab ich mich auch am Haus probiert.
dabei musste ich folgendes beachten:
mein asuro macht sehr ungenaue Turn und ich habe nur die 8er scheiben drauf
--> ich habe eine MyTurn geschrieben die alle winkel in 60grad häppchen zerlegt
-->in Stallions Turn habe ich enc_count um 2/3 redziert
//falls 8er Scheibe
enc_count =(unsigned int) ((((long)abs(degree) * (long)4080) / (long)10000) * (long)2 / (long)3);
mein kleiner macht nun die kurven ganz gut bis auf....
.. er rechnet müll.
ich gebe die Seite (iSeite) und den Dachwinkel (iWinkel_Dach1) vor und berechen nun die Diagonale und die Dachseiten.
int iDiagonale= sqrt(2*iSeite*iSeite);
int iDach=(iSeite/2)/cos(iWinkel_Dach1/180*3.1415926535);
für iSeite = 100 geht das auch super idiagonale = 141 :)
für iSeite = 150 ist iDiagonale 28672 --<<<<<<<WARUM?
für iSeite = 200 ist iDiagonale 120 --<<<<<<<<WARUM?
pythagoras 150*150+150*150 = 2* 150*150 daraus die Wurzel->212
und bei iSeite 200 wäre 282 das richtige
gruß
downad
Stallion
05.01.2007, 16:44
int iDiagonale= sqrt(2*iSeite*iSeite);
int iDach=(iSeite/2)/cos(iWinkel_Dach1/180*3.1415926535);
für iSeite = 100 geht das auch super idiagonale = 141 :)
für iSeite = 150 ist iDiagonale 28672 --<<<<<<<WARUM?
für iSeite = 200 ist iDiagonale 120 --<<<<<<<<WARUM?
Dann rechnen wir mal:
für 100:
sqrt(2*100*100) = sqrt(20000) = 141
für 150:
sqrt(2*150*150) = sqrt(45000)
signed int geht aber nur bis +32767 -> overflow -> sqrt(-20535)...
Also kannst eigentlich froh sein, dass dir der Prozessor überhaupt etwas ausspuckt. Also sollte man in dem Fall (long) verwenden um sinnvolle Ergebnisse zu bekommen.
Zweitens kann man die Formel vereinfachen in iSeite*sqrt(2) = iSeite*1,414... (float verwenden nicht vergessen!)
Und drittens hab ich es vorher ausgerechnet und direkt in Programm geschrieben, damit sich der Asuro die Arbeit sparen kann.
Sternthaler
05.01.2007, 19:19
Hier mal ein kleines Video meines Asuros:
Hallo Stallion,
gratuliere, das ist ja wirklich auch eine sehr schöne Nikolaus-Fahrt.
Ich habe mal gezählt, wie häufig du bei deinem Nikolaus mal nach rechts bzw. nach links drehst. Du drehst 6 mal links und nur ein mal rechts. (oder anders rum)
Bei meinem Asuro hatte ich festgestellt, dass sich die Fahrfehler beim Drehen am besten aufheben, wenn man möglichst gleich viele Drehungen in beide Richtungen macht. Bei dir sieht aber das Ergebniss trotzdem recht gut aus.
Deshalb fände ich es auch gut, so wie stochri vorgeschlagen hat, die Fahrt mal öfters hintereinander zu zeigen um zu sehen wie die Wiederholgenauigkeit ist.
Weiter so.
Hallo Zusammen,
gerade eben habe ich im Netz einen Zeichenroboter gefunden:
http://www.hobbyrobotik.de/Kritzler.htm
Er unterscheidet sich in der Größenordnung nicht so sehr vom ASURO. Die Bilder sind allerdings doch um einiges komplexer. Das gibt mir doch etwas Hoffnung, dass bei Verbesserung der Odometrie aus dem ASURO doch noch etwas mehr herauszuholen ist.
Gruss,
stochri
damaltor
23.01.2007, 21:27
schrittmotoren sind natürlich eine feine sache für sowas... leider hat der asuro sowas nicht. da müsste man dann irgendwie die odometrie sehr exakt ansprechen.
Sternthaler
13.07.2007, 01:11
Es bleibt nicht aus, dass man immer mal wieder hier vorbei kommt.
Der Grund meines Besuchs hier ist der Code von Stallion, da ich mich erinnert habe, dass er eine Abbremsfunktion in Turn() eingebaut hatte.
Mein Problem: Ich verstehe nicht wie das gehen soll.
Ich habe mal (hoffentlich korrekt) den gekürzten code von Stallion nochmal wiedergegeben und meine Frage da reingeschrieben:
---> enc_count wird einmal berechnet.
---> Bei degree = 90 wird enc_count also 36,72 (36 oder 37 ist aber egal)
enc_count = (unsigned int) (((long)abs(degree) * (long)4080) / (long)10000);
// set direction
// reset encoder
// set speed
// do until angel reached
while(tot_count < enc_count)
{
tot_count += encoder[LEFT];
// calculate speed difference
// reset encoder
// calculate new speed
if (diff > 0) //Left faster than right
{
}
if (diff < 0) //Right faster than left
{
}
// set new speed, with slow down
---> Hier den nur einmal berechneten Wert von enc_count eingesetzt, ergibt fuer
---> mich keinen Sinn, da doch dann eigendlich nur [l|r]_speed durch diese
---> 'Konstante' geteilt und abgezogen wird.
---> Wenn Speed als so um 200 (plus/minus "calculate new speed") ist, und dann durch
---> 36 oder 37 geteilt wird, kommt da bei mir ein Wert um 200/36 = 5 raus.
---> Diese 5 werden nun aber einfach nur von den 200 abgezogen und wir fahren doch
---> 'nur' die gesamte Strecke etwas langsamer.
MotorSpeed (l_speed - (unsigned char) ((unsigned int)(l_speed) / enc_count),
r_speed - (unsigned char) ((unsigned int)(r_speed) / enc_count));
Sleep(36);
}
War es so gewollt, und ich habe falsch verstanden, das am Ende der Fahrstrecke abgebremst werden sollte? Oder habe ich den Code nicht verstanden?
Mag hier noch einer Antworten?
damaltor
13.07.2007, 16:45
hat das evtl den zweck dass die ganze kurve in der mitt etwas langsamer gefahren wird? quasi schnell rein in die kurve, auf der ideallinie lang, etwas bremsen, und dann mit gas wieder raus? =)
Hallo Sternthaler,
Bei menen Experimenten (http://www.roboterclub-freiburg.de/asuro/Motordrehzahl/Drehzahlmessung.html) hat sich gezeigt, dass die Motordrehzahl relativ unabhängig vom Untergrund ist. Ich hatte den Eindruck, dass der Schlupf auch nicht so stark Untergrund abhängig ist.
Allerdings treten in den Phasen der Geschwindikeitsänderung die größten Kräfte auf und deshalb ist in den Brems- und Beschleunigungsphasen der Schlupf auch am größten. Treten diese Phasen gehäuft auf, wird der Odometriefehler größter ( kann man einfach testen: eine Wegstrecke in kleinen Stücken und in einem großen Stück auf verschiedenen Untergründen fahren ).
Es ist also von sehr großem Vorteil für eine genaue Odometrie, sanft zu beschleunigen und zu bremsen ( besonders wenn man ein Nikolaushaus zeichnen will ).
Bei meinen Versuchen mit der Bluetoothübertragung (http://www.roboterclub-freiburg.de/asuro/hardware/bluetooth/bluetooth.html) konnte ich einen Fehler feststellen: Manchmal haben die Encoder ohne Bewegung hochgezählt. Da müsste also ein Fehler in den Odometrie-Interruptroutinen sein ( Das könnte man auch mit der Funktion PrintInt und der IR-Schnittstelle nachprüfen: einfach den Encoderwert zyklich auf der IR ausgeben und schauen, ob es eine Radstellung gibt, bei der die Encoder hochlaufen.
Gruss,
robo
radbruch
13.07.2007, 20:10
Da müsste also ein Fehler in den Odometrie-Interruptroutinen sein Der Verdacht wurde schon mehrfach geäußert, aber bisher noch nicht bewiesen. Ich hatte auch schon solche Effekte bemerkt obwohl ich eine ältere Version der Libary verwende. Möglicherweise ist das eine "Altlast" die immer wieder in die neuen Releases mitkopiert wird.
Sternthaler
14.07.2007, 15:13
Hallo damaltor, robo.fr und radbruch.
Hatt ein bischen gedauert eure Einträge zu bedenken.
Zum Thema Beschleunigen, Abbremsen und die dann auftretende Kräfte:
Ich kann diesem (schon wieder) nicht folgen. Wenn man sich den Beitrag von waste zur Lienienverfolgung über den PID-Regler ansieht, dann wird dort ja genauestens auf diesen Umstand eingegangen. Dort werden ja Massen und Trägheitsmomente bestimmt, berechnet und verknüpft, dass einem nur die Ohren schlackern. (Und schon wieder: Kann ich auch nicht nachrechnen)
Hier in dem von Stallion angepassten Turn() ist ja von stochri kein PID-Regler vorhanden. Ist auf alle Fälle ein Regler, da ja Abweichungen (encoder-Werte) zur Korrektur des Systems in einer echten Regel-Schleife genutzt werden. Aber ich kann hier nicht so richtig auf Regler-Parameter kommen. (Nix für ungut, das Ding macht bei mir schon alles ganz OK)
Um aber da zu optimieren, z.B. Beschleunigungen/Verzögerungen für Drehbewegungen, zu berücksichtigigen, muss bestimmt ein ähnlicher Rechenaufwand wie bei waste betrieben werden.
Und trotzdem: Es sieht also nicht so aus, als ob die Anpassungen im Code von Stalion zur 'sanften' Verzögerung am Ende der zu fahrenden Drehung geeignet ist?
Und nun zu den Tiks
Mal 2 Annahmen:
1: Der Programmcode ist fehlerhaft:
Ich kann nichts entdecken. Also alle sind gefragt.
2: Der Programmcode ist OK:
Jetzt stellt sich die Frage, wo die Tiks dann herkommen.
Wenn der Asuro steht, werden eigendlich keine Tiks erwartet.
Wenn aber Stromnetzbetriebe Beleuchtung vorhanden ist, kann es m.M. nach passieren, dass da mal Messungen reingeraten, bei der die Netz-Lampen-Beleuchtung gerade aus ist, da die Spannungsphase so gerade bei 0 Volt liegt.
Da bei der Odometrie ja offiziell keine Differenz-Messung mit ein-/ausgeschalteter LED-Beleuchtung vorhanden ist, sind wir hier also schon recht stark vom Umgebungslicht abhängig.
Sind es nun die 50 Hertz? Wie testen?
Als Idee hätte ich folgendes vorzuschlagen:
- Man misst einfach die ODO-Werte und schreibt sie in einen Ringbuffer. Sagen wir mal so 20 bis 30 Werte. Die alten Werte werden kontinuirlich überschrieben.
- Man macht die normale Auswertung zur Tik-Berechnung.
- Stellt man nun fest, das ein Tik erkannt wurde, werden die Daten aus dem Buffer an den PC gesendet.
Hier kann man dann ja mal versuchen dem Geheimnis auf den Grund zu gehen. Historie ist bekannt, Tik-Berechnung ist bekannt und die Schwell-Werte sind auch bekannt.
Nach diesem Ansatz müssen es meiner Meinung nach die Daten/Messwerte sein.
Wenn nicht, fangen wir halt von vorne an, oder gehen zu Punkt 1 ;-)
Ähm, meiner Meinung kann man den Test sehr einfach machen:
while(1)
{
PrintInt(encoder[left]);
Msleep(1000);
}
in groben Zügen.
Sternthaler
15.07.2007, 11:45
Hallo robo.fr,
wenn du nur den Wert aus encoder jede Sekunde sendest, kannst du nicht rausbekommen was dazu geführt hat, dass der Zählerstand hochgezählt wurde.
Ich möchte mit meinem Vorschlag aber die vom ADC gelesenen Odometrie-Werte zum PC senden. Denn aus diesen 'Netto'-Daten wird ja erst berechnet ob der Zähler in encoder weitergezählt werden soll oder nicht.
Der von mir angesprochene Ringbuffer soll dazu dienen die Historie der ODO-Daten aufzunehmen, ohne durch eine 'extrem' langsame PrintInt()-Funktion die Geschwindigkeit beim Datensammeln zu stören. Was ja passieren würde, wenn ich die Daten sofort senden würde.
('extrem' langsam ist das Verhältnis zwischen der Zeit zum Ermitteln der Daten über den ADC und dem Senden der Daten über IR. Micro-Sekunden zu Milli-Sekunden)
wenn du nur den Wert aus encoder jede Sekunde sendest, kannst du nicht rausbekommen was dazu geführt hat, dass der Zählerstand hochgezählt wurde.
Hallo Sternthaler,
bei der obigen Funktion geht es ja nur darum festzustellen, ob der Encoder im Stillstand hochzähtl.
Bei meinem ASURO ist das der Fall und ich vermute, dass der nicht der einzige ist.
radbruch
15.07.2007, 19:59
Hallo
...bei der obigen Funktion geht es ja nur darum festzustellen, ob der Encoder im Stillstand hochzähltl.
Ach, der steht? Das kann man doch nicht wissen, wenn du nur den Codeschnippsel anbietest. Davor könnte ja auch ein lockeres MotorSpeed(255,255), stehen.
mic
Ach, der steht?
Du hast recht, ich habe auch schon daran gedacht, dass es etwas missverständlich sein könnte. Wahrscheinlich ist es halt doch besser, ein ganzes Programm hinzuschreiben. Aber eigentlich fehlt nur noch Init(); und EncoderInit(); dann ist das Programm komplett.
Und noch was fehlt: vielleicht sollte man es für die linke und die rechte Seite probieren.
Wie sieht es bei euch aus? Gibt es bei eurem ASURO auch Encoderstellungen, bei denen im Stand hochgezählt wird?
Sternthaler
15.07.2007, 21:33
Bei meinen Versuchen mit der Bluetoothübertragung konnte ich einen Fehler feststellen: Manchmal haben die Encoder ohne Bewegung hochgezählt. Da müsste also ein Fehler in den Odometrie-Interruptroutinen sein
bei der obigen Funktion geht es ja nur darum festzustellen, ob der Encoder im Stillstand hochzähtl.
Ich dachte ja auch daran, nun mal dem Problem auf die Spur zu kommen. Und nicht nur die Auswirkungen bei den Tik-Zählern zu sehen.
Auch radbruch weist in seinem Beitrag darauf hin, dass er Tik's ohne sichtbaren Grund bekommt. Bei mir habe ich das auch schon vereinzelt bemerkt.
Auf alle Fälle stimme ich dir zu, dass man linke und rechte Seite untersuchen muss.
radbruch
15.07.2007, 23:03
Hallo
Ich möchte euch ja nicht unnötig verwirren, aber ich verwende doch die erweiterten Odo-Funktionen gar nicht. Bei mir gab es schon mit den alten Libraries seltsame Effekte. Ich verwende meist die Version mit Wastes IR-PWM-Erweiterung. Wenn ich mir z.B. die Linedaten senden lasse, kommt bei stehendem asuro immer wieder ein Wert, der völlig aus der Reihe tanzt. Vom Timeing her würde ich auf einen 16-Bit Überlauf tippen, ich habe das aber nie näher untersucht, sondern per Filter abgefangen. Mein Testprogramm für die Linedaten ist im Anhang, den Quellcode dafür kann ich blöderweise grad nicht finden (das wäre ja wichtig). Aber ihr könnt euch ja selbst einen kurzen Code dafür schreiben. Es werden endlos die Linedaten eingelesen und per IR zum PC geschickt. K6 (in Fahrtrichtung links) schaltet die LineLED an, K5 schaltet sie wieder aus. Hier mein Output:
0 0
0 0
0 0
0 0
0 0
457 493
446 487
446 486
445 485
445 484
444 485
444 484
444 484
443 484
443 484
443 484
443 483
443 483
443 483
443 483
442 483
442 482
442 482
442 482
442 482
442 482
442 482
442 482
442 482
441 482
440 482
441 482
441 482
441 481
441 481
441 482
441 482
441 481
441 481
441 481
441 481
441 481
441 481
441 481
440 481
441 481
441 481
441 481
440 481
440 481
440 481
440 481
440 481
440 480
440 481
440 481
440 481
440 481
440 481
440 481
440 480
440 480
440 480
440 480
440 480
440 480
440 480
438 480
441 480
440 480
440 480
440 480
440 480
439 480
439 480
440 480
440 480
440 480
440 480
440 480
Ähm, das ist mir jetzt echt peinlich, aber der Effekt tritt scheinbar nicht mehr auf. Bei 0-Werten ist die LineLED aus, die Werte sind so hoch, weil ich eine IR-LED aus einem alten Videorekorder eingebaut habe und der asuro auf einem weisen Blatt stand.
Eigentlich sollte ich diesen Beitrag ja löschen, aber jetzt habe ich soviel Zeit investiert, dann sollt ihr das auch sehen. In der Zeit hätte ich das auch mit der Odometrie machen können, dass werde ich noch nachreichen, für heute reichts mir mal mit rumrobotern.
Gruß
mic
Sternthaler
16.07.2007, 00:29
Guten morgen.
Hallo radbruch und alle anderen natürlich auch,
als Jäger und Sammler kann ich bei mir auf der Platte als erste Version mit Dateidatum vom 20.07.2005 folgendes finden:
SIGNAL (SIG_ADC)
{
static unsigned char tmp[2],flag[2],toggle;
static int speedcounter[2];
if (autoencode)
{
tmp[toggle]= ADCH;
if (toggle) ADMUX = (1 <<ADLAR) | (1 <<REFS0) | WHEEL_RIGHT;
else ADMUX = (1 <<ADLAR) | (1 <<REFS0) | WHEEL_LEFT;
// Hysteresis included 25.6.2005 stochri
if ( (tmp[toggle] < 150) && (flag[toggle] == TRUE)) // falling edge
{
encoder[toggle] ++;
Wheelspeed[toggle]=speedcounter[toggle];
speedcounter[toggle]=200; // preset speedcounter to maximum speed
flag[toggle] = FALSE;
}
if ( (tmp[toggle] > 160) && (flag[toggle] == FALSE)) // rising edge
{
encoder[toggle] ++;
flag[toggle] = TRUE;
}
toggle ^= 1;
if(speedcounter[toggle]) speedcounter[toggle]--; // if speecounter not zero
else Wheelspeed[toggle]=0;
}
}
Bis auf die Berechnung vom Wheelspeed ist aber der Code noch komplett in der aktuellen Forum-LIB vorhanden.
Zwei kleine Änderungen:
- Variable toggle wird mit FALSE initialisiert
- Der kleine Hysteresewert wurde von 150 auf 140 reduziert. (Etwas größere Hysterese zum oberen Wert von 160.)
SIGNAL (SIG_ADC)
{
static unsigned char tmp[2],flag[2],toggle=FALSE;
if (autoencode)
{
tmp[toggle]= ADCH;
if (toggle) ADMUX = (1 <<ADLAR) | (1 <<REFS0) | WHEEL_RIGHT;
else ADMUX = (1 <<ADLAR) | (1 <<REFS0) | WHEEL_LEFT;
if ( (tmp[toggle] < 140) && (flag[toggle] == TRUE))
{
encoder[toggle] ++;
flag[toggle] = FALSE;
}
if ( (tmp[toggle] > 160) && (flag[toggle] == FALSE))
{
encoder[toggle] ++;
flag[toggle] = TRUE;
}
toggle ^= 1;
}
}
Somit ist es erst einmal egal welche Version benutzt wird.
Aber interessant ist, dass nur der ADCH-Wert, also nur die oberen 8 Bit vom ADC-Wandler, benutzt werden. Dies war zumindest mir nicht so richtig bewußt.
OK, dein Testprogramm für die Liniensensoren ist hier ohne Source nicht so richtig.
Trotzdem ist deine Aussage: "Ähm, das ist mir jetzt echt peinlich, aber der Effekt tritt scheinbar nicht mehr auf." sehr interessant, da dann ja auch bei den Liniensensoren wohl irgendetwas nicht ganz in Ordnung ist.
Deshalb mal eine Frage: Sind die von dir geposteten Daten heute bei Sonnenlicht gewonnen worden? Und, kann es sein, dass du die ersten Tests mit deinem Programm bei Lampenlicht gemacht hast?
Dies würde ja für meine Theorie mit den 50 Hertz sprechen.
Mit deinem Programm bekomme ich nun, ohne Sonne :lol: , folgende Messdaten: (Hattest du heute so etwas erwartet, als du vom 'nicht mehr auftretenden Effekt' sprachst?)
83 94
115 132
116 137
104 126
91 111
79 95
82 93
97 109
113 128
117 138
107 129
94 114
81 98
81 93
94 105
110 124
118 138
110 133
97 118
83 102
Und nun, Trommelwirbel, 50 Hertz betriebene Schreibtischlampe ausgeschaltet:
Ohne LED-Beleuchtung (Nur LCD-Monitor an)
1 1
1 1
0 1
0 0
0 0
0 0
0 0
0 0
0 0
Mit eingeschalteter LED-Beleuchtung
34 40
35 38
35 38
35 38
35 38
34 38
35 38
35 38
35 39
35 39
35 39
35 39
35 39
Dies ist der Effekt, den ich eben auch bei den Odometrie-Messung erwarte, und für den man halt noch ein Testprogramm schreiben muss. Aber nicht mit einem Messen, und sofort-Senden Zyklus, sondern wie oben beschrieben.
radbruch
16.07.2007, 10:05
Hallo
Das scheint die einzige Erklärung für den Effekt zu sein, der übrigens so ähnlich aussah wie dein 50Hz-Effekt. Die Ausreiser waren nur kürzer und seltener. Das kann dann nicht nur an einer anderen Abtastfrequenz liegen, denn bei mehr Werten pro Zeit sollten ja dann auch mehr Fehler pro Zeit auftreten. Meine Werte von gestern habe ich unter Kunstlicht bei für mich "normalen" Lichtverhältnissen eingelesen. Hier noch meine Odo-Werte bei stehendem (,weil festgeklebten,) Ritzel:
Senden der Odometriedaten 16.7.07 mic
456 667
214 670
214 670
215 671
215 671
215 671
215 671
215 671
216 671
216 671
216 671
216 671
216 671
216 671
216 671
216 671
216 671
216 671
216 671
216 671
217 671
217 671
217 671
217 671
217 671
217 671
217 671
217 671
217 671
217 671
217 671
217 671
217 671
217 671
217 671
217 671
217 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
218 671
219 672
220 672
220 672
220 672
220 672
220 672
(Man sieht auch schön den Lesefehler beim ersten Wert)
Hier noch das Programm:
#include "ir-asuro.h"
uint16_t data[2];
int main(void)
{
Init();
StatusLED(RED);
SerWrite("\n\n\rSenden der Odometriedaten 16.7.07 mic\n\n\r",43);
StatusLED(YELLOW);
while(1)
{
OdometrieData(data);
PrintInt(data[0]);
SerWrite(" ",1);
PrintInt(data[1]);
SerWrite("\n\r",2);
}
return(0);
}
Und noch die Version meiner Library:
/************************************************** *****************************
*
* File Name: asuro.c
* Project : ASURO
*
* Description: This file contains ASURO main features
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------
* 1.00 14.08.2003 Jan Grewe build
* 2.00 14.10.2003 Jan Grewe LEFT_VEL, RIGHT_VEL -> MotorSpeed(unsigned char left_speed, unsigned char right_speed);
* LeftRwd(),LeftFwd(),RightRwd(),RigthFwd() -> MotorDir(unsigned char left_dir, unsigned char right_dir);
* GREEN_ON,GREEN_OFF,RED_ON,RED_OFF -> StatusLED(unsigned char color);
* LED_RED_ON, LED_RED_OFF -> FrontLED(unsigned char color);
* Blink(unsigned char left, unsigned char right) -> BackLED(unsigned char left, unsigned char right);
* Alles in Funktionen gefasst => leichter verständlich ?!?!
* 2.10 17.10.2003 Jan Grewe new Timer funktion void Sleep(unsigned char time36kHz)
*
* Copyright (c) 2003 DLR Robotics & Mechatronics
************************************************** ***************************/
/************************************************** **************************
*
* File Name: asuro.c
* Project : asuro library "Robotrixer Buxtehude"
*
* Description: This file contains additional functions:
*
* signal (SIG_ADC) interrupt/signal routine for encoder-counter
* signal (SIG_INTERRUPT1) signal for switches
* Encoder_Init() initializing encoder-counter
* Encoder_Start() start autoencoding
* Encoder_Stop() stop autoencoding
* Encoder_Set(int,int) set encodervalue
* Msleep(int delay) wait for delay in milliseconds
* Gettime() get systemtime in milliseconds
* PrintInt(int)
*
* modifications in Sleep, SIG_OUTPUT_COMPARE2, PollSwitch, LineData
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------
* beta1 31.03.2005 Robotrixer asuro library
* ------- ---------- -------------- ------------------------------
* the encoder source is based on RechteckDemo.c ver 2.0 by Jan Grewe 22.10.2003
* Copyright (c) 2003 DLR Robotics & Mechatronics
************************************************** ***************************/
/************************************************** **************************
*
* File Name: asuro.c
* Project : asuro library modified for IR collision detector
*
* Description: modifications made in following functions:
*
* SIGNAL (SIG_OUTPUT_COMPARE2) -> SIGNAL (SIG_OVERFLOW2)
* Gettime() counts now 36kHz
* Init() timer2 modified for adjustable duty cycle
* Batterie() bug fixed
* Sleep() counts now 36kHz
* Msleep() counts now 36kHz
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------
* beta2 11.06.2005 Waste asuro library
* ------- ---------- -------------- ------------------------------
************************************************** ***************************/
/************************************************** *************************
* *
* 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. *
************************************************** *************************/
Schade (oder gut?), dass man nichts mehr vom Effekt sieht.
Gruß
mic
H3llGhost
08.11.2007, 12:35
Hallo stochri,
Ich habe einfach alles über die Odometrie gemacht,
Geradefahren tut mein Asuro schon so, da habe ich gottseidank nichts machen brauchen
(hatte auch nicht viel Zeit um das auch noch zu programmieren)
und die Winkel, ich habe gezählt wieviele schwarz-weiß Übergänge bei 90 grad stattfinden (ich habe die scheiben mit 4 weißen und 4 schwarzen Feldern drauf) und das waren genau 50.
Na ja dann kamen noch 75 für 135 grad und Fertig.
Für die Strecke habe ich 100 Übergänge genommen und für die diagonale und das Dach habe ich den Herrn Pytagoras befragt, stimmte zwar nicht ganz genau, wegen dem Schlupf (Theorie und Praxis) also noch etwas angepasst und fertig.
Anbei mein Programm, da ich ein Purist bin und C an meinem Rechner schon immer benutze, habe ich das Programm im Assembler geschrieben.
Ist zwar nicht ganz perfekt, aber wie Du schon sagtest, schönes Wetter, noch Kirmes im Dorf, die Bruderschaft hat gerufen, naja nicht viel Zeit gehabt.
;Version 1.0
;Odometrie nach dem Beispiel von Rechteck.c
.include "m8def.inc"
.equ fwd = PB5 ;vor
.equ rwd = PB4 ;zurück
.equ encodertrue = 7 ;Bit 7 von tooglereg für Odometrie an/aus
.equ kolisionflag = 6 ;Bit 6 von tooglereg für Kolisionerkennung
.equ toogleflagL = 2 ;Hat eine Änderung am Rad Links stattgefunden ?
.equ toogleflagR = 1 ;Hat eine Änderung am Rad Rechts stattgefunden?
.equ toogle = 0 ;Bit 0 von tooglereg für Rad R "0" und Rad L "1" umzuschalten
.equ geschwindigkeit = 0xA0
.equ encoderon = 0x80
.equ encoderoff = 0x7F
.equ rechterwinkel = 53 ; 90 grad rechts sind genau 53 schritte
.equ rechterwinkel2 = 54 ; 90 grad links sind genau 54 schritte
.equ halbrechterwinkel = 80 ;135 grad rechts
.equ weg = 100 ;soll 300 schritte fahren
.equ weglang = 150 ;Langer Weg diagonal
.equ wegkurz = 50 ;Kurzer Weg für das Dach
.def encoder_leftL = R1
.def encoder_leftH = R2
.def encoder_rightL = R3
.def encoder_rightH = R4
.def vergleicherL = R5
.def vergleicherH = R6
.def tmp = R16 ; Multipurose
.def tmpi = R17 ; Multipurose für Interrupts
.def tmpi2 = R19 ;Multipurose 2 für 16 Bit rechnen
.def tmp2 = R20 ;Multipurose für 16 Bit rechnen
.def geschlinks = R21 ;geschwindigkeit linkes Rad
.def geschrechts = R22 ;geschwindigkeit rechtes Rad
.def tooglereg = R18 ;Toogle Register
.org 0x00
rjmp reset ;ResetVector
.org ADCCaddr
rjmp ADCcomplete ; ADC Interrupt Vector Address
reset:
;Stack einrichten
ldi tmp,HIGH(RAMEND)
out SPH,tmp
ldi tmp,LOW(RAMEND)
out SPL,tmp
;Stack fertig
ldi tooglereg,0x00
ori tooglereg,encoderon
;PWM einstellen
ldi tmp,(1<<WGM10) | (1<<COM1A1) | (1<<COM1B1)
out TCCR1A,tmp
ldi tmp,(1<<CS11)
out TCCR1B,tmp
;DDR für Tastenabfrage
;A/D Conversion
ldi tmp,(1<< ADEN) | (1<<ADFR) | (1<<ADIE) | (1<<ADSC) | (1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2)
out ADCSRA,tmp
ldi tmp,(1<<REFS0) | (1<<ADLAR) | (1<<MUX0)
out ADMUX,tmp
; DDR für Motor Rechts und Statusled green
ldi tmp,(1<<PB0) |(1<<PB1) | (1<<PB2) | (1<<PB5) | (1<<PB4)
out DDRB,tmp
;DDR für Motor Links,Statusled red, LED für Linienverfolgung und LEDs
;Odometrie und Backleds
ldi tmp,(1<<PD2) | (1<<PD4) | (1<<PD5) | (1<<PD6) | (1<<PD7)
out DDRD,tmp
cbi DDRD,PD3
cbi DDRC,PC0 ;schalte PC0 als eingang
cbi DDRC,PC1 ;schalte PC0 als eingang
sbi PORTD,PD7 ;schalte Odometrie LEDs ein
cbi PORTB,PB0 ;Status LED aus
cbi PORTD,PD2 ;Dito
;ldi tmp,LOW(weg)
;mov vergleicherL,tmp
;ldi tmp,HIGH(weg)
;mov vergleicherH,tmp
;sbi PORTD,PD6
ldi geschrechts,geschwindigkeit
ldi geschlinks,geschwindigkeit
sei
main:
rcall motorengesch
rcall ladeweg
rcall fahre
rcall drehe
rcall ladeweg
rcall fahre
rcall drehe
rcall ladeweg
rcall fahre
rcall drehe
rcall ladeweg
rcall fahre
rcall drehehalb
rcall ladeweglang
rcall fahre
rcall drehelinks
rcall ladewegkurz
rcall fahre
rcall drehelinks
rcall ladewegkurz
rcall fahre
rcall drehelinks
rcall ladeweglang
rcall fahre
rcall motorenloeschen
stop:
rjmp stop
ladeweg:
cli
ldi tmp,LOW(weg)
mov vergleicherL,tmp
ldi tmp,HIGH(weg)
mov vergleicherH,tmp
sei
rcall odozaehlernull
sbi PORTB,fwd
sbi PORTD,fwd
ret
ladeweglang:
cli
ldi tmp,LOW(weglang)
mov vergleicherL,tmp
ldi tmp,HIGH(weglang)
mov vergleicherH,tmp
sei
rcall odozaehlernull
sbi PORTB,fwd
sbi PORTD,fwd
ret
ladewegkurz:
cli
ldi tmp,LOW(wegkurz)
mov vergleicherL,tmp
ldi tmp,HIGH(wegkurz)
mov vergleicherH,tmp
sei
rcall odozaehlernull
sbi PORTB,fwd
sbi PORTD,fwd
ret
drehe:
rcall motorenloeschen ;motoren STOP
ldi tmp,rechterwinkel ;Lade 90 grad Drehung
mov vergleicherL,tmp
ldi tmp,0x00
mov vergleicherH,tmp
rcall odozaehlernull ;Wegezähler löschen
sbi PORTD,fwd ;Jetzt Drehen wir uns was
rcall fahre ;Jetzt warten bis wir uns um 90 grad gedreht haben
rcall motorenloeschen ;motoren STOP
ret
drehelinks:
rcall motorenloeschen ;motoren STOP
ldi tmp,rechterwinkel2 ;Lade 30 schritte für die 90 grad Drehung
mov vergleicherL,tmp
ldi tmp,0x00
mov vergleicherH,tmp
rcall odozaehlernull ;Wegezähler löschen
sbi PORTB,fwd ;Jetzt Drehen wir uns was
rcall fahrelinks ;Jetzt warten bis wir uns um 90 grad gedreht haben
rcall motorenloeschen ;motoren STOP
ret
drehehalb:
rcall motorenloeschen ;motoren STOP
ldi tmp,halbrechterwinkel ;135 grad Drehung
mov vergleicherL,tmp
ldi tmp,0x00
mov vergleicherH,tmp
rcall odozaehlernull ;Wegezähler löschen
sbi PORTD,fwd ;Jetzt Drehen wir uns was
rcall fahre
rcall motorenloeschen ;motoren STOP
ret
fahre:
cli
mov tmp,encoder_rightL
mov tmp2,encoder_rightH
cp vergleicherL,tmp ;Vergleiche gefahrenen Weg
cpc vergleicherH,tmp2
sei
in tmp,SREG
sbrs tmp,0
rjmp fahre
ret
fahrelinks:
cli
mov tmp,encoder_leftL
mov tmp2,encoder_leftH
cp vergleicherL,tmp ;Vergleiche gefahrenen Weg
cpc vergleicherH,tmp2
sei
in tmp,SREG
sbrs tmp,0
rjmp fahrelinks
ret
.include "motoren.asm"
.include "LED.asm"
ADCcomplete:
in tmpi,SREG
push tmpi
ldi tmpi2,0x00
in tmpi,ADCL
in tmpi,ADCH
sbrs tooglereg,toogle ;Wenn Bit toogle = 1 Weiter bei Rechtem Rad
rjmp radlinks
;Rad Rechts
sbrs tooglereg,toogleflagR
rjmp flagRfalse
;flagRtrue
cpi tmpi,0x8C
brsh ausR
ldi tmpi,0x01
add encoder_rightL,tmpi
adc encoder_rightH,tmpi2
;debug
cbi PORTD,PD2
sbi PORTB,PB0
;ende debug
andi tooglereg,0xFD
rjmp ausR
flagRfalse:
cpi tmpi,0xA0
brlo ausR
ldi tmpi,0x01
add encoder_rightL,tmpi
adc encoder_rightH,tmpi2
;debug
cbi PORTD,PD2
sbi PORTB,PB0
;ende debug
ori tooglereg,(1<<toogleflagR)
ausR:
sbi ADMUX,MUX0
andi tooglereg,0xFE
rjmp rausadc
radlinks:
sbrs tooglereg,toogleflagL ;ist toogleflagL gesetzt? wenn ja springe zu flagtrue
rjmp flagLfalse ;wenn nicht springe zu flagLfalse
;flagLtrue
cpi tmpi,0x8C ;vergleiche mit 0xA0
brsh ausL ;wenn größer oder gleich springe zu ausL
ldi tmpi,0x01
add encoder_leftL,tmpi ;encoder_left++
adc encoder_leftH,tmpi2
;Debug
sbi PORTD,PD2
cbi PORTB,PB0
;Ende Debug
andi tooglereg,0xFB ;Lösche flagL
rjmp ausL
flagLfalse:
cpi tmpi,0xA0
brlo ausL
ldi tmpi,0x01
add encoder_leftL,tmpi
adc encoder_leftH,tmpi2
;Debug
sbi PORTD,PD2
cbi PORTB,PB0
;ende debug
ori tooglereg,(1<<toogleflagL)
ausL:
cbi ADMUX,MUX0
ori tooglereg,(1<<toogle)
rjmp rausadc
rausadc:
pop tmpi
out SREG,tmpi
reti
Könntest du bitte die Dateien motoren.asm und LED.asm posten?
Danke!
JungerSpund
19.12.2008, 14:46
Ich suche eine bessere Stifthalterung. Möglichst eine solche die automatisch vom Controller abgesenkt und angehoben werden kann. Dadurch würde sich mehr zeichnen lassen. Hat jemand Ideen?
Chrissi_P
30.12.2008, 10:25
Vielleicht mit einem Servo als Stifthalterung, wie auf diesem Video: http://www.youtube.com/watch?v=6E_e8AHvhNg
gilt der wettkampf noch als aktuell? wenn ja probier ich mich auch mal :-)
Hallo
Man könnte ja eine neue runde starten finden sich bestimmt viele interessenten :P
Gruß Thund3r
Sternthaler
09.11.2009, 20:28
Ja, Runde 2.
Ich bin mal gespannt, was dann noch alles kommt.
Ich selbst hatte ja meine Lösung erst 'etwas' später geliefert, und einiges hier aus dem Forum dazu erlesen.
Nun ist im Forum noch viel mehr Material vorhanden um daraus vielleicht eine Version zu bauen, die komplett ohne ODO-Probleme losmalen kann.
Z.B. automatische Helligkeitsanpassung; Mittelwertbildung der Messdaten, u.s.w.
Nur zu und viel Spaß dabei.
Gruß Sternthaler
Hallo
Ja nun müssten die zeichnungen viel besser werden
Man kann ja auch den stift an einen servo anschließen der hebt und senkt hab ich in einem video auf youtube zu dem thema gesehen^^
Gruß Thund3r
asuro_besitz
27.04.2010, 19:12
wenn ich die datein benutzen will fom sternthaler kommt beim kompeilerdiese fehlermeldung:
Asuro Flash (Alias Eierlegendewollmilchsau) V1.4.6.56 (c) O.O. Müller 2008
User has admin rights.
Processor branding AMD Athlon(tm) 64 X2 Dual Core Processor 4800+, OS WINXP
Hello Besitzer on HENRY, have fun :)
>Session Environment Variables:
AF_AVRDIR=D:\WinAVR
AF_PROJECT=Project1
AF_SOURCE_FILES=
AF_ASM_SRC_FILES=
AF_PRGDIR=D:\Programme\AsuroFlash
AF_PRJDIR=C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash
AF_ASURO_LIB_PATH=%AllUsersProfile%\asuro_lib\lib
>Ready.
File test.c saved.
>Session Environment Variables:
AF_AVRDIR=D:\WinAVR
AF_PROJECT=AsuroTest
AF_SOURCE_FILES=test.c asuro.c
AF_ASM_SRC_FILES=
AF_PRGDIR=D:\Programme\AsuroFlash
AF_PRJDIR=C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt
AF_ASURO_LIB_PATH=%AllUsersProfile%\asuro_lib\lib
File test.c saved.
File asuro.c saved.
File asuro.h saved.
>Default make_all.cmd file created.
>Default makefile created.
Make
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt>D:\WinAVR\utils\bin\make.exe all
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst -ID:\Programme\AsuroFlash\include asuro.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > asuro.d; \
[ -s asuro.d ] || rm -f asuro.d
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst -ID:\Programme\AsuroFlash\include test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d
-------- begin --------
avr-gcc --version
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst -ID:\Programme\AsuroFlash\include test.c -o test.o
test.c:35: warning: function declaration isn't a prototype
test.c: In function 'straightcalib':
test.c:36: warning: implicit declaration of function 'Encoder_Set'
test.c:41: warning: implicit declaration of function 'Msleep'
test.c:53: warning: implicit declaration of function 'PrintInt'
test.c: At top level:
test.c:75: warning: function declaration isn't a prototype
test.c: In function 'main':
test.c:168: warning: implicit declaration of function 'Encoder_Init'
avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst -ID:\Programme\AsuroFlash\include asuro.c -o asuro.o
avr-gcc -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.o -ID:\Programme\AsuroFlash\include test.o asuro.o --output AsuroTest.elf -Wl,-Map=AsuroTest.map,--cref -ID:\Programme\AsuroFlash\lib -lm
test.o: In function `go':
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:125: undefined reference to `Encoder_Set'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:129: undefined reference to `Msleep'
test.o: In function `turn':
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:109: undefined reference to `Encoder_Set'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:113: undefined reference to `Msleep'
test.o: In function `nikolaus':
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:142: undefined reference to `Msleep'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:142: undefined reference to `Msleep'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:144: undefined reference to `Msleep'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:145: undefined reference to `Msleep'
test.o:C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:146: more undefined references to `Msleep' follow
test.o: In function `turncalib':
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:76: undefined reference to `Encoder_Set'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:82: undefined reference to `Msleep'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:95: undefined reference to `Msleep'
test.o: In function `straightcalib':
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:36: undefined reference to `Encoder_Set'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:41: undefined reference to `Msleep'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:44: undefined reference to `Msleep'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:48: undefined reference to `Msleep'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:61: undefined reference to `Msleep'
test.o: In function `main':
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:168: undefined reference to `Encoder_Init'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:177: undefined reference to `Msleep'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:183: undefined reference to `Msleep'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:189: undefined reference to `Msleep'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:193: undefined reference to `Msleep'
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:195: undefined reference to `Msleep'
make: *** [AsuroTest.elf] Error 1
ExitCode 2
>Ready.
File test.c saved.
>Session Environment Variables:
AF_AVRDIR=D:\WinAVR
AF_PROJECT=AsuroTest
AF_SOURCE_FILES=test.c asuro.c D:\Downloads\V10\test.c D:\Downloads\V10\asuro_st.c
AF_ASM_SRC_FILES=
AF_PRGDIR=D:\Programme\AsuroFlash
AF_PRJDIR=C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt
AF_ASURO_LIB_PATH=%AllUsersProfile%\asuro_lib\lib
>Default make_all.cmd file created.
>Default makefile created.
Make
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt>D:\WinAVR\utils\bin\make.exe all
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=D:\Downloads\V10\asuro_st.lst -ID:\Programme\AsuroFlash\include D:\Downloads\V10\asuro_st.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > D:\Downloads\V10\asuro_st.d; \
[ -s D:\Downloads\V10\asuro_st.d ] || rm -f D:\Downloads\V10\asuro_st.d
avr-gcc.exe: D:DownloadsV10asuro_st.c: No such file or directory
avr-gcc.exe: no input files
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=D:\Downloads\V10\test.lst -ID:\Programme\AsuroFlash\include D:\Downloads\V10\test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > D:\Downloads\V10\test.d; \
[ -s D:\Downloads\V10\test.d ] || rm -f D:\Downloads\V10\test.d
avr-gcc.exe: D:DownloadsV10test.c: No such file or directory
avr-gcc.exe: no input files
-------- begin --------
avr-gcc --version
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=D:\Downloads\V10\test.lst -ID:\Programme\AsuroFlash\include D:\Downloads\V10\test.c -o D:\Downloads\V10\test.o
In file included from D:\Downloads\V10\/asuro_st.h:30,
from D:\Downloads\V10\test.c:41:
d:/winavr/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."
D:\Downloads\V10\test.c: In function 'menue':
D:\Downloads\V10\test.c:293: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:294: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:295: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:296: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:297: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:298: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:299: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:300: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:325: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:326: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:327: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:328: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:329: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:330: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:352: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:353: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:383: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:384: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
D:\Downloads\V10\test.c:386: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=D:\Downloads\V10\asuro_st.lst -ID:\Programme\AsuroFlash\include D:\Downloads\V10\asuro_st.c -o D:\Downloads\V10\asuro_st.o
In file included from D:\Downloads\V10\/asuro_st.h:30,
from D:\Downloads\V10\asuro_st.c:27:
d:/winavr/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."
D:\Downloads\V10\asuro_st.c: In function 'PrintInt':
D:\Downloads\V10\asuro_st.c:975: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness
avr-gcc -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.o -ID:\Programme\AsuroFlash\include test.o asuro.o D:\Downloads\V10\test.o D:\Downloads\V10\asuro_st.o --output AsuroTest.elf -Wl,-Map=AsuroTest.map,--cref -ID:\Programme\AsuroFlash\lib -lm
D:\Downloads\V10\test.o: In function `main':
D:\Downloads\V10/test.c:58: multiple definition of `main'
test.o:C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:167: first defined here
D:\Downloads\V10\asuro_st.o: In function `__vector_2':
D:\Downloads\V10/asuro_st.c:163: multiple definition of `__vector_2'
asuro.o:C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/asuro.c:37: first defined here
D:\Downloads\V10\asuro_st.o: In function `__vector_4':
D:\Downloads\V10/asuro_st.c:195: multiple definition of `__vector_4'
asuro.o:C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/asuro.c:25: first defined here
D:\Downloads\V10\asuro_st.o: In function `__vector_14':
D:\Downloads\V10/asuro_st.c:476: multiple definition of `__vector_14'
asuro.o:C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/asuro.c:46: first defined here
D:\Downloads\V10\asuro_st.o: In function `Init':
D:\Downloads\V10/asuro_st.c:621: multiple definition of `Init'
asuro.o:C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/asuro.c:104: first defined here
D:\Downloads\V10\asuro_st.o: In function `BackLED':
D:\Downloads\V10/asuro_st.c:712: multiple definition of `BackLED'
asuro.o:C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/asuro.c:210: first defined here
D:\Downloads\V10\asuro_st.o: In function `MotorSpeed':
D:\Downloads\V10/asuro_st.c:726: multiple definition of `MotorSpeed'
asuro.o:C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/asuro.c:144: first defined here
D:\Downloads\V10\asuro_st.o: In function `SerWrite':
D:\Downloads\V10/asuro_st.c:767: multiple definition of `SerWrite'
asuro.o:C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/asuro.c:283: first defined here
D:\Downloads\V10\asuro_st.o: In function `SerRead':
D:\Downloads\V10/asuro_st.c:839: multiple definition of `SerRead'
asuro.o:C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/asuro.c:296: first defined here
D:\Downloads\V10\asuro_st.o: In function `LineData':
D:\Downloads\V10/asuro_st.c:881: multiple definition of `LineData'
asuro.o:C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/asuro.c:238: first defined here
D:\Downloads\V10\asuro_st.o: In function `PollSwitch':
D:\Downloads\V10/asuro_st.c:909: multiple definition of `PollSwitch'
asuro.o:C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/asuro.c:323: first defined here
D:\Downloads\V10\asuro_st.o: In function `Sleep':
D:\Downloads\V10/asuro_st.c:933: multiple definition of `Sleep'
asuro.o:C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/asuro.c:366: first defined here
D:\Downloads\V10\asuro_st.o: In function `Gettime':
D:\Downloads\V10/asuro_st.c:961: multiple definition of `Gettime'
asuro.o:C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/asuro.c:93: first defined here
D:\Downloads\V10\asuro_st.o: In function `PrintInt':
D:\Downloads\V10/asuro_st.c:971: multiple definition of `PrintInt'
asuro.o:C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/asuro.c:67: first defined here
d:/winavr/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe: AsuroTest.elf section .text will not fit in region text
d:/winavr/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe: region text overflowed by 1494 bytes
test.o: In function `turn':
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:113: undefined reference to `Encoder_Set'
test.o: In function `nikolaus':
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:147: undefined reference to `Encoder_Set'
test.o: In function `turncalib':
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:98: undefined reference to `Encoder_Set'
test.o: In function `straightcalib':
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:64: undefined reference to `Encoder_Set'
test.o: In function `main':
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\TestAsur oProjekt/test.c:194: undefined reference to `Encoder_Init'
make: *** [AsuroTest.elf] Error 1
ExitCode 2
>Ready.
Was Hat das zu bedeuten??
Bitte Um Hilfe.
mfg asuro_besitzer
Sternthaler
27.04.2010, 23:16
Hallo asuro_besitz,
erst einmal ein 'Willkommen im Forum'.
Ich bin mir sicher, dass du in dem von dir angegeben Output 2 Compilerläufe hast.
Du hat zwei mal "-------- begin --------" und "ExitCode" darin enthalten.
OK, das ist erst mal nicht so tragisch.
Im ersten Durchlauf finde ich so ca. 8 Zeilen unterhalb vom ersten "-------- begin --------" die Zeile:
--->> test.c: In function 'straightcalib': <<---
Die Funktion 'straightcalib' ist definitiv nicht aus dem Code von mir. Die kommt aus dem Code von stochri hier an dieser Stelle (https://www.roboternetz.de/phpBB2/viewtopic.php?p=92715#92715).
Die 4 folgenden Zeilen mit:
--->> test.c:--: warning: implicit declaration of function <<<---
sind nicht schön, aber erzeugen (in diesem Fall) keinen Fehler.
Auch die beiden Warnmeldungen:
--->> test.c:--: warning: function declaration isn't a prototype <<--
sind hier nicht relevant.
Und jetzt zum einzigen Fehler im Compilerlauf 1.
Du hast eine Menge Meldungen folgender Art:
--->> C:\Dokumente und Einst.. ..\TestAsuroProjekt/test.c:---: undefined reference to <<---
Davor steht ab und zu ein "test.o: In function "
Alles was hinter dem "reference to" steht wird in dem was hinter "In function " steht benutzt, kann aber leider nicht gefunden werden um es in dein Programm 'einzubauen' (zu linken).
Alle Funktionsnamen hinter "reference to" sind Funktionen aus der erweiterten Asuro-LIB und sind nicht in der Datei/LIB (asuro.c) von der Asuro-CD vorhanden.
Und wenn mal mal hinsieht, sind das nur die drei Funktionen Encoder_Init(), Encoder_Set() und Msleep().
FAZIT Compilerlauf 1:
Dir fehlt die erweitere Asuro-LIB bzw. die 'Eierlegendewollmilchsau' weiss nicht wo sie zu finden ist. Wie man das dort ändert weiss ich nicht.
Jetzt der 2-te Lauf.
Die Zeilen:
--->> :/winavr/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. .... <<---
sind hier nicht schlimm. Es sagt mir jetzt nur, dass du eine neue Compilerversion benutzt. Die gab es zu der Zeit als ich das Programm geschrieben hatte nicht auf meinem PC.
Dann kommen viele Zeilen mit:
--->> D:\Downloads\V10\test.c:---: warning: pointer targets in passing argument 1 of 'SerWrite' differ in signedness <<---
Auch hier steht davor ein "In function ". Also wie oben ein Problem mit der Funktion SerWrite(), die in der Funktion menue() bzw. PrintInt() aufgerufen wird.
Jetzt haben wir aber nicht das Problem, dass SerWrite() nicht gefunden wird (erweiterte LIB oder CD-LIB/Datei), sondern das es nur einen nicht so richtig passenden Parameter in die Funktion SerWrite() gibt.
Auch hier meckert dein neuerer Compiler. Meiner hatte nicht gemeckert und auch diese Warnung ist hier nicht wirklich wichtig.
Und nun hier zum Fehler:
Jede Zeile
--->> D:\Downloads\V10/test.c:58: multiple definition of <<---
sagt mir nun, dass du in dem Verzeichnis, in dem du die Dateien von mir (Sternthaler) übersetzten möchtest auch die Datei asuro.c übersetzt hast und die soll nun auch in das zu machende Programm 'eingebaut' (gelinkt) werden.
FAZIT Compilerlauf 2:
Hier ist die Datei asuro.c zuviel.
Achtung: Es könnte an der Umgebung der 'Eierlegendewollmilchsau' liegen, dass die asuro.c immer dazu genommen wird. Egal wo die auf deiner Platte liegt. Wie man das abstellen könnte weiss ich nicht.
Ich würde nun Vorschlagen, dass du im Verzeichnis mit den Sternthaler-Dateien erst einmal nachsiehst, ob dort asuro.??????-Dateien liegen. (asuro.c oder asuro.o, oder andere asuro. Dinger) Die löschst du alle aus dem Verzeichnis.
Dann prüfst du in der 'Eierlegendewollmilchsau', ob dort noch irgendwo etwas mit asuro.c steht. (Im Projekt, falls das dort so heißt?) auch das muss weg.
Ich schlage dies vor, da es erst einmal leichter ist als die erweiterte Asuro-LIB zu installieren.
Ich hoffe, dass du nicht eingeschlafen bist bei meinem langweiligen Roman und drücke die Daumen für deinen ersten Nikolaus. Zur Not ist es ja noch etwas Zeit bis der fertig sein muss. Ist ja erst April ;-).
Gruß Sternthaler
asuro_besitz
29.04.2010, 18:37
Erstmal VIELEN DANK Sternthaler
Ich habe mich nicht gelangweilt :D
Ich freue mich dass du mir sagemn konntest was es sein könte.
=D> Ich kann leider nicht immer direkt nachschauen wann geantwortet wurde , da ich nach der schule noch Hausaufgaben machen muss :(
Ich habe alles auser text.c und die Makefile gelöscht, doch ich habe noch die frage wo es die erweiterte Asuro lib gibt und wo bekomme ich asuro.h und .c wieder her? die sind weg.
Leider werde ich nächste woche vom montag bis sontag nicht antworten können.
PS: Welchen kompeiler benutzt du? Der von der CD geht bei mir nicht. Nur das programm wo ich den fehler her hab habe ich mal gefunden und erstellt alle datein irgendwie. z.B. Makefile, asuro.map asuro.o asuro.elf asuro.u test.elf test.o test.list asuro.list ...
mit den datein kann ich nichts anfangen und ich komme mit dem prog auch nicht klar.
Ich habe selbst die neusten Versionen von Programmers Notepad versucht und auf meine PC laufen die nicht. Achso Ich benutze Win XP Professional. Mein pc hat auch genügen leistung.
Sternthaler
30.04.2010, 02:42
Hallo asuro_besitz,
ob du dich sofort, oder erst später meldest ist nicht wichtig.
Wichtig ist, dass der Asuro in Fahrt kommt ;-)
-- Dateien gelöscht
Das dürfte nicht so schlimm sein.
Die 'normale' asuro.c ist auf der CD. Also kein Beinbruch.
Alle anderen asuro.xxx-Dateien werden immer aus der asuro.c 'gemacht'. Sind also (für dich erstmal) nicht wichtig.
-- Erweiteret LIB
Die gibt es hier: https://www.roboternetz.de/phpBB2/viewtopic.php?t=30004
damaltor hat sich da die Mühe gemacht und viele wichtigen und nützliche Sachen zum Asuro zusammengestellt. (Auch die Eierle..sau ist da zu finden)
Ich vermute, dass du dir schon auf diesem Weg die LIB und eben auch die 'Eierlegendewollmilchsau' geholt hast. Die ist nämlich in der neuen Lib dabei. (Warum auch immer)
Ohne Umweg bekomst du die LIB von hier:
http://sourceforge.net/projects/asuro/
-- Compilerversion
Ich habe den gcc Version 4.1.2 aus dem WinAVR mit Version 20070525
Die neueste WinAVR-Version ist immer hier zu finden:
http://sourceforge.net/projects/winavr/files/
-- Dein Compiler läuft nicht?
Wie hast du das festgestellt? Denn wenn du die asuro.xxx-Dateien hattest, dann sind sie ja vom Compiler erzeugt worden.
-- Wie gehts weiter?
Vielleicht soltest du dir nochmal die beiden Programme (stochris und meins) holen.
Und hier etwas ganz wichtiges: In der Datei test.c von mir, MUSS die Zeile "#include <string.h>" bei einer neueren Compilerversion entfernt werden.
Das habe ich gerade bei mir festgestellt. Ich habe versucht das ganze auch nochmal bei mir zu übersetzen. Es ging auch bei mir nicht!
(Mist alte und neue Version vom Compiler oder was auch immer.)
Im Anhang ist nochmal die überarbeitet Version. Ich habe da auch das test.hex-File dazugelegt. Das kannst du zum testen ja erst einmal auf den Asuro flashen. (Sichern der Version nicht vergessen)
Viel Erfolg und am allerwichtigsten sind (leider) die Hausaufgaben ;-)
Gruß Sternthaler
asuro_besitz
19.05.2010, 16:27
DANKE SternenThaler nur wie bekommt man es mit eierlegendewollmilchsau hin, dass er es kombilirt. Habe auf confirigation den inhalt der beigelegtn makefile eingefügt und die test.c geöffnet. Aber das "C" zum combilieren ist ausgeblendet.
Keine :idea:
Sorry für späte antwort nicht früher zu gekommen.
Asuro_Besitz
PS:Leider müssen die Lehrer Hausaufgaben geben. O:)
Hi Sternthaler, asuro_besitz,
@Sternthaler:
Die Eierlegendewollmilchsau ist dabei weil ich damals den Installer geschrieben haben und an m.a.r.v.i.n und damaltor geschickt habe, damit die Installation einfacher ist und alles zusammen fix und fertig installiert wird. Somit ist also eigentlich nicht AF dabei sondern die LIB ;-)
@asuro_besitz:
Dein Projekt ist wohl nicht gespeichert und deshalb ist das "C" noch grau, da AF nicht weiss wo die HEX Datei abgelegt werden soll.
Für die 1. Testst solltest Du vielleicht erst mal die mitgelieferten Beispielprojekte öffnen und compilieren, die müssen funktionieren.
Lade mal das TestAsuroProjekt und drücke dann auf das "C" für "Make all". Geht das?
Hier sind ein paar Tutorialvideos (http://www.secius.com/AsuroFlash/tutorial-movies)
Gruss,
O.
asuro_besitz
11.07.2010, 12:34
Hallo,
Sorry konnte mich nict früher melden.
Ich habe jetzt neuen Rehner und wider Instlirt. Ich Benutze jetzt Windows 7 Profesional. Ich habe jetzt das vorinstalirte test projekt geöffnet und bin auf das "C" da war dan folgendes:
Asuro Flash (Alias Eierlegendewollmilchsau) V1.4.6.56 (c) O.O. Müller 2008
User has admin rights.
Processor branding Intel(R) Core(TM)2 Quad CPU Q8300 @ 2.50GHz, OS WINXP
Hello Spiele on HENRY-PC, have fun :)
>Session Environment Variables:
AF_AVRDIR=D:\WinAVR
AF_PROJECT=Project1
AF_SOURCE_FILES=
AF_ASM_SRC_FILES=
AF_PRGDIR=C:\Program Files (x86)\AsuroFlash
AF_PRJDIR=C:\ProgramData\AsuroFlash
AF_ASURO_LIB_PATH=%AllUsersProfile%\asuro_lib\lib
>Ready.
>Session Environment Variables:
AF_AVRDIR=D:\WinAVR
AF_PROJECT=AsuroTest
AF_SOURCE_FILES=test.c asuro.c
AF_ASM_SRC_FILES=
AF_PRGDIR=C:\Program Files (x86)\AsuroFlash
AF_PRJDIR=C:\ProgramData\AsuroFlash\Projects\TestA suroProjekt
AF_ASURO_LIB_PATH=%AllUsersProfile%\asuro_lib\lib
File test.c saved.
File asuro.c saved.
File asuro.h saved.
>Default make_all.cmd file created.
>Default makefile created.
Make
C:\ProgramData\AsuroFlash\Projects\TestAsuroProjek t>D:\WinAVR\utils\bin\make.exe all
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst -IC:\Program Files (x86)\AsuroFlash\include asuro.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > asuro.d; \
[ -s asuro.d ] || rm -f asuro.d
C:\Users\Spiele\AppData\Local\Temp\make43082.sh: line 1: syntax error near unexpected token `(x'
C:\Users\Spiele\AppData\Local\Temp\make43082.sh: line 1: `set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst -IC:\Program Files (x86)\AsuroFlash\include asuro.c | sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > asuro.d; [ -s asuro.d ] || rm -f asuro.d'
D:\WinAVR\utils\bin\make.exe: *** [asuro.d] Error 258
ExitCode 2
>Ready.
Und er hat keine hexfile erstellt. Fazit: Es klappt nicht auch wenn es klappen solte. :-( Ich weiß nicht ob ich mich nur blöd anstelle oder ob ich einfach nur pech habe...
Ich danke schonmal für antwort
Asuro_Besitz
PS: Ich lasse unter kobilitäts modus als XP Service Pack 3 laufen.
Ein Scren Shot: Edit: Bild Entfernt
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.