PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro Programme gesucht



broeggle
16.05.2005, 22:19
Hi,ich habe mitlerweile schon das ein oder andere Asuro programm (ok mit viel mühe) draufgeflasht und ich wollte mir bevor ich selbst mit der programmierung anfange ein paar weitere beispiele anschauen, was auf dem asuro so alles möglich ist.
Musik hören,
'segnen',
diese reaktion auf eine Fernbedienung (verabschiedet sich mit einer endlos schleife nach der zeit, fährt nur noch gerade aus) etc habe ich von
http://home.planet.nl/~winko001/AsuroIdx.htm
schon ausprobiert.

Ich denke für jeden Asuro Neuling (und alle andere) wäre so eine software sammlung ganz nett

Also dann postet mal los.

Moebius
17.05.2005, 15:57
Also ich hätte da mein erstes "richtiges" Programm vorzustellen.
Asuro fährt damit immer gerade aus, stösst er wo dagegen kehrt er um dreht sich leicht (nur zeitgeregelt) nd fährt wieder los. Das Programm hab ich geschrieben um zu sehen wieviel Raum ein Roboter abdeckt wenn er kreuz und quer durch einen Raum fährt. ( Dachte an evt. Saugroboter etc. )



Ach ja die Geschwindigkeiten sind für meinen Roboter angepasst, müssen noch individuell angepasst werden:
Hier also das test File (muss noch konvertierrt werden)

RCO
17.05.2005, 20:15
Mich würde vor Allem ein Programm interessieren, dass die Motordrehsensoren mal aktiv einsetzt. Hat schon jemand was mit denen gemacht. Bis jetzt hab ich nur Programme gesehen, wo diese Sensoren zweckentfremdet eingesetzt wurden.

julien
21.05.2005, 09:41
Jo, ich habe schon ein Radgeschwindigkeitssynchronisationsprogramm geschrieben, das den Roboter geradeaus fahren lässt:


#include "asuro.h"
int main(void){
int Lnow;
int Rnow;
int Rold;
int Lold;
int Count;
int sl;
int sr;
unsigned int data[2];
Init();
Count=0;
sl=120;
sr=120;
while(1){
MotorDir(FWD,FWD);
MotorSpeed(sl,sr);
OdometrieData(data);
if (data[0] > 512) Lnow = 1; else Lnow = 0;
if (data[1] > 512) Rnow = 1; else Rnow = 0;
if (Lnow ^ Lold) Count++;
if (Rnow ^ Rold) Count--;
Lold=Lnow;
Rold=Rnow;
if (Count>0) {sr++;}
if (Count<0) {sr--;}
if (sr>254){sr=255; sl--;}
if (sr<61){sr=60; sl++;}
}
return 0;
}

Heermatz
02.09.2005, 12:08
Hallo ich habe mir das programm von moebius und julien heruntergeladen. Ich habe ein programm auf meinen asuro geflasht. Wenn ich ihn dann ausschalte und wieder einschalte, leuchtet nur die status LED grün , mehr passiert nicht. Das passiert bei beiden programmen. Kann mir einer helfen? Hab ich vielleicht irgendetwas vergessen oder falsch gemacht? :-k :-k :-k

Winne
02.09.2005, 16:10
@Herrmatz

Sind die Batterien voll?
Zeigt beim Einschalten im Hyperterminal (Windows) irgend etwas an?

Gruß Winne

Heermatz
02.09.2005, 20:16
Ja die sind voll. Wenn ich das programm von moebius z.B. auf asuro übertrage, muss ich ja zuerst das programm umwandeln in eine hex datei.
Dann kann ich es doch flashen, oder muss jetzt noch eine andere datei dabei? Ich hab nicht den plan von dieser programmiersprache C, wenn es jetzt eine SPS währe hätte ich kein problem, aber so! Der asuro ist der erste roboter den ich mir gekauft habe und das ist für mich alles noch neuland. Obwohl ich energieelektroniker bin :oops:

Winne
03.09.2005, 10:18
OK, kaufe Dir das Buch "Programmieren in C" von Brian W. Kernighan bzw Dennis M. Ritchie. Damit ist der Anfang C zu lernen nicht soooooooo schwer. Mit dem Compiler WinAVR hatte ich auch meine Probleme! Aber egal was für Problem und Fehlermeldungen Du hast ich kann Dir helfen.
Habe übringens Fachrichtung Betriebstechnik gelernt. Welche Fachrichtung bist Du?
Gruß Winne

RCO
05.09.2005, 21:58
Wenn ich das programm von moebius z.B. auf asuro übertrage, muss ich ja zuerst das programm umwandeln in eine hex datei.

Genau, wenn du ein passendes Makefile hast, z.B. das Original vom Asuro, sit es so einfach.

Sommer
06.09.2005, 08:49
Hi,

hab mir gestern auch mal einen kleinen ASURO geholt aber es geht kein Programm erst rot die LED dann GRÜN das wars geht nich hab mir ein Make gemacht und das test.hex geflasht aber es passiert nix :-(

Was mache ich falsch?

Danke für eure Hilfe.

Bye Ulli

m.a.r.v.i.n
06.09.2005, 09:16
Hallo,

du hast erst mal nix falsch gemacht. Ich nehme an du hast das Programm 'FirstTry' von der Asuro CD übersetzt und geflasht.
Dieses Testprogramm macht nämlich nichts, außer die Hardware zu initialisieren, ist sozusagen nur ein Skelett für eigene Versuche.


#include "asuro.h"

int main(void)
{
Init();

while(1);
return 0;
}

Hast du mal den SelbstTest durchgeführt?
Auch auf der CD unter 'SelfTest' zu finden.

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

Sommer
06.09.2005, 09:56
Hi,

ja hab nicht das kleine test genommen sondern auch das Quadrad und Line Demo so wie die PID Line vom Forum aber immer das selbe er macht keinen muxer :-(

Flash ich das Selftest.hex von der CD gehts.

Beim Make macht er auch keinen Fehler Code 0

Hm...

m.a.r.v.i.n
06.09.2005, 10:30
Hi Ulli,

merkwürdig. Klingt nach Fehler in der Entwicklungsumgebung.

Compiliert wird aber richtig?
Object- und Hex-Files werden erzeugt und haben auch aktuelles Datum und Uhrzeit?

Hast du mal versucht den Selbsttest neu zu übersetzen mit 'make all'?
Dabei müßte ein File 'main.hex' generiert werden, das identisch sein muß zu 'selftest.hex'.

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

Andun
06.09.2005, 13:12
Das hört sich mehr danach an, als ob du entweder 1. nicht gespeichert hast, vor dem compilieren oder du immer noch das selbe compilierst, da du im makefile nichts genändert hast, aber ne andere datei nehmen willst.

Sommer
06.09.2005, 14:45
Hi,

also mit den WINAVR komm ich bissl durcheinander :-)

Ich gehe so vor:

1. lade ein Programm z.B LineDemo.c mit open in WINAVR

2. ich speichere es in TryFirst als test.c

3. ich mache nun Make (link: Auro_scr/TryFirst/make-al.bat)

4. jetzt kommt dann das...


D:\ASURO\ASURO_src\FirstTry>make all
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 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 (GCC) 3.3.1
Copyright (C) 2003 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 test.c -o test.o
avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst 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 test.o asuro.o --output test.elf -Wl,-Map=test.map,--cref -lm
asuro.o(.text+0xae): In function `__vector_14':
D:\ASURO\ASURO_src\FirstTry/asuro.c:75: multiple definition of `__vector_14'
test.o(.text+0x0):D:\ASURO\ASURO_src\FirstTry/test.c:30: first defined here
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\bin\ld.exe: Warning: size of symbol `__vector_14' changed from 316 in test.o to 208 in asuro.o
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o(.in it9+0x0): undefined reference to `main'
make: *** [test.elf] Error 1

> Process Exit Code: 2


also ich komm mit den Makefile nicht zurecht :-(

Was mach ich den da alles falsch?!

Danke für eure Hilfe.

Bye Ulli

m.a.r.v.i.n
06.09.2005, 16:11
Hallo Ulli,
in deiner Datei 'test.c' fehlt die main() Funktion. Die wird für jedes C-Programm benötigt. Wenn du die Datei 'LineDemo.c' aus dem SelfTest Ordner kopiert hast, mußt du dazu nur die Main Funktion


int Main(void)
{
LineFollow();
return 0;
}

hinzufügen. Die Main Funktion ist die Funktion die nach dem Programm Start als erstes aufgerufen wird.

Die Warnung mit 'multiple definition of __vector_14' ist mir nicht ganz erklärlich.
Verwendest du die asuro.c und asuro.h aus dem SelfTest Ordner, oder eine modifizierte?

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

Sommer
07.09.2005, 11:28
Hi,

jetzt sieht es besser aus :-)

muss ich biss austesten!

Danke für eure Hilfe!

Bye Ulli

SnoopysBot
10.09.2005, 15:06
Das make-file von Selftest kompiliert ja mächtig viele Quelltextdateien (alle *.c aus dem SelfTest-Ordner).

Schaut man sich die main()-Funktion an, so überprüft das Selbsttest-Programm zuerst, ob es Hell-/Dunkel-Wechsel am linken Rad erkennen kann. Werden mehr als 10 Wechsel erkannt, verzweigt das Programm in die Funktion Demo().

Hier wird es nun richtig interessant. Falls ich den C-Code richtig verstehe, werden abhängig von folgenden Kollisions-Erkennungs-Tastern verschiedene Unterfunktionen aufgerufen:

Schalter 6: LineDemo() --> Asuro folgt einer Linie
Schalter 5: RechteckDemo() --> Asuro macht was auch immer?
Schalter 4: PCDemo() --> ebenfalls recht unklar, was Asuro hier treibt.
Schalter 3: IRDemo() --> Asuro durch Fernbedienung steuern?

Hat jemand von Euch diese Programme schon einmal aus dem Selbsttest-Programm heraus starten können? Was machen die Unterprogramme genau?

Ich werde jetzt gleich einmal folgendes probieren:
- SelfTest flashen
- Asuro auf ein Blatt Papier mit einer dick schwarzen Linie setzen
- Asuro einschalten
- das linke Hinterrad mehrmals rumdrehen
- Schalter 6 drücken: Asuro sollte der Linie folgen

Habe ich den Programmcode soweit richtig verstanden?
Gruß,

SnoppysBot

m.a.r.v.i.n
10.09.2005, 16:38
Hallo SnoopysBot,

ja du hast recht. Das ist eines der "Geheimnisse" des Asuro. :-$
Die Programme funktionieren auch einigermaßen, und sind auf alle Fälle
als Grundlage für eigene Versuche brauchbar.
Der Demomode ist übrigens auch in dem Buch
"Mehr Spaß mit Asuro, Band 1" sehr gut beschrieben.

LineDemo() läßt den Asuro einer Linie folgen.

Rechteckdemo() läßt den Asuro ein Rechteck "zeichnen". Dazu werden die Odometriesensoren verwendet.

Mit PCDemo() kann man den Asuro mit einem Terminalprogramm, über die Zifferntasten des Nummernblocks, und der IR Schnittstelle steuern (8-vorwärts, 2 rückwärts, 4 links, 6 rechts, 5 stop)
Die Reichwerte der IR Schnittstelle ist leider sehr begrenzt.

Mit IrDemo() kann man den Asuro mit einer IR Fernbedienung steuern. Die Codes muß man aber zuerst an die eigene Fernbedienung anpassen.

Gruß Peter

firestar
23.09.2005, 11:18
Moin. suche ein Programm was mir den Ladestand der battarien anzeigt (wenn es sowas gibt) jedesmal wenn er an einer markierung bzw dem ir transceiver vorbei kommt

m.a.r.v.i.n
23.09.2005, 12:11
Hallo firestar,

in der erweiterten ASURO Bibliothek befindet sich die Routine Batterie().
Damit erhält man den A/D Wandler Wert. Eine Interpretation der Daten, sprich Umrechnung in Volt oder Prozent fehlt aber.
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11256

Gruß Peter

stochri
23.09.2005, 18:03
Hallo,
das mit der Spannungsmessung kann man so machen:



/* This function returns the adc-value of the vplus-input ( ADC5 )
* physical Vplus may be calculated by u=Vbandgap/1024*V_Plus_ADC_value*(R12+R13)/R13
* Vbandgap=2.56V ( datasheet )
* R12=12K
* R13=10K
* On my ASURO processor board I measured 2.73V on the ARef pin ( strange ) so I calculated
* 2.73V instead of the bandgap voltage mentioned in the datasheet
*/
unsigned int VPlus()
{
ADMUX = (1 << REFS0) | (1 << REFS1) | 0x05; // Bandgap Reference and ADC5
ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
return(ADCL + (ADCH << 8));
}

Gruss,
stochri

drejc-slo
24.09.2005, 17:31
Hallo,

Ich weis nicht was ich falch mache (habe den Ausro shon dreimal geflasht), und er macht garnichts)
#include "asuro.h"

]

#include "asuro.h"

int Main(void) {
unsigned char sw;
sw = PollSwitch() ;
MotorDir(FWD,BREAK) ;
MotorSpeed(0, 0) ;
if (sw & 0x01)
MotorSpeed(30, 30) ;
if (sw & 0x02)
MotorSpeed(50, 50) ;
if (sw & 0x04)
MotorSpeed(80, 80) ;
if (sw & 0x08)
MotorSpeed(120, 120) ;
if (sw & 0x10)
MotorSpeed(160, 160) ;
if (sw & 0x20)
MotorSpeed(250, 250) ;
}


Gruss

Winne
25.09.2005, 17:38
@drejc-slo

zwischen
unsigned char sw;
und
sw = PollSwitch() ;

fehlt
Init();

Ergo
.
.
.
unsigned char sw;
Init();
sw = PollSwitch() ;
.
.
.

roborookie
25.09.2005, 18:49
außerdem
- beim MotorDir hast Du die linke Seite auf "vorwärts", die rechte aber auf "break" - also halt gesetzt. Wenn Du dann die Geschwindigkeit erhöhst - in Abhängigkeit vom gedrückten Schalter - dann dreht sich nur die linke Seite.
- entweder solltest Du die gesamte Funktion mit einem "while" kapseln oder am Ende des Programmes ein "while(1) stehen haben. Das verhindert, dass der Asuro nach dem beabsichtigten Programm eventuelle Code-Reste von vorherigen Flashs durchläuft

firestar
26.09.2005, 06:19
[glow=red:a1e1e03877]Dankeschön[/glow:a1e1e03877] O:) O:) O:) O:)

Kaiak
29.09.2005, 16:02
Moinsen,
habs endlich geschafft: hatte ein Ausweichprogramm geschrieben und hatte das Linienfolgeprogramm soweit abgeändert, dass der Bot einer Taschenlampe folgen kann. Und jetzt kommts: beide Programme zusammen funktionieren so, dass der Roboter der Lampe folgt und wenn er anstößt ausweicht um dann wieder der Lampe zu folgen. Hier ist der Code:



/* fahrenlightfeiner
der Roboter folgt einem Licht über die zwei Phototransistoren oder fährt, bei gleichmäßiger Ausleuchtung gerade aus.
Stößt er mit den Tastern an wird ein Ausweichmanöver eingeleitet

kai 29.09.2005 */

#include "asuro.h"
#define KNOPF PollSwitch() //Funktion PollSwitch() wird als KNOPF derfiniert
#define SPEED 0x8F //SPEED wird als 248 definiert

int speedleft, speedright; //globale Variablen
unsigned int lineDaten[2]; // "
int ADOffset, i, j, k=0, l; // "

void search_left(void); //Funktionsprototyp
void search_right(void); // "

void LineLeft(void){ //Funktion der main Funktion
//für die Erhöhung der Geschwindigkeit des linken Motors
speedleft+= 1;

if(speedleft>0xFE)
speedleft = 0xFF;
}

void LineRight(void){ //Funktion der main Funktion
//für die Erhöhung der Geschwindigkeit des rechten Motors
speedright += 1;

if(speedright>0xFE)
speedright = 0xFF;
}

void back(void){ //Funktion back() der Funktion taster()
//für zurücksetzen
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(254,255);
for(i=0;i<=100;i++)
Sleep(255);
}

void pause(void){ //Funktion pause() der Funktion taster()
//für eine kleine Pause mit Lichteffekten (nicht unbedingt erforderlich)
MotorSpeed(BREAK,BREAK);

while(k<=4){
StatusLED(RED);
BackLED(OFF,OFF);
FrontLED(ON);
for(i=0;i<=35;i++)
Sleep(255);

StatusLED(OFF);
BackLED(ON,ON);
FrontLED(OFF);
for(i=0;i<=35;i++)
Sleep(255);
k++;
}
}

void taster(void){ //Funktion zur Steuerung des Ausweichens

KNOPF; //mehrmaliger Aufruf von PollSwitch, wegen dem bekannten Problem mit
KNOPF; //dem Kondensator
KNOPF;
KNOPF;
KNOPF;
KNOPF;
KNOPF;
KNOPF;
KNOPF;
KNOPF;

if(KNOPF > 0 && KNOPF < 8){ //falls Tasten 1-3 gedrückt wurden, fahre hier fort
back();
pause();
search_left();
BackLED(ON,OFF);
MotorDir(RWD,FWD); //Abdrehen des Roboters in entgegengesetzter Richtung zur gedrückten Taste
MotorSpeed(180,180);
for(j=0;j<=170;j++)
Sleep(255);
}
else if(KNOPF > 7 && KNOPF < 60 && KNOPF != 12 && KNOPF != 18 && KNOPF != 30){ //falls Tasten 4-6 gedrückt wurden, fahre hier fort
back();
pause();
search_right();
BackLED(OFF,ON);
MotorDir(FWD,RWD); //Abdrehen des Roboters in entgegengesetzter Richtung zur gedrückten Taste
MotorSpeed(180,180);
for(j=0;j<=170;j++)
Sleep(255);
}
else if(KNOPF == 12 || KNOPF == 18 || KNOPF == 30){ //falls Tasten 2-4 gedrückt wurden, fahre hier fort
back();
pause();
search_left();
BackLED(ON,ON);
MotorDir(RWD,FWD); //Abdrehen des Roboters in entgegengesetzer Richtung zur bisherigen Fahrtrichtung
MotorSpeed(180,180);
for(j=0;j<=240;j++)
Sleep(255);
}
}

int main(void){ //Hauptfunktion

Init();

StatusLED(GREEN);

for (l = 0; l < 0xFF; l++)
LineData(lineDaten); //Überschreiben des Speicherinhalts aus lineDaten[0,1] in die Funktion LineData

LineData(lineDaten);
ADOffset = lineDaten[0] - lineDaten[1]; //Berechnen von ADOffset
speedleft = speedright = SPEED; //Geschwindigkeit links und rechts gleich SPEED

for(;;){ //Endlosschleife

LineData(lineDaten); //Auswerten von LineData
i = (lineDaten[0] - lineDaten[1]) - ADOffset; //Berechnung von i zur Bestimmung des heller beschienen Transistiors

if(i > 50){ //falls rechter Transistor höhere Helligkeit-->
BackLED(ON,OFF);
LineRight(); //Erhöhe links die Geschwindigkeit
if(KNOPF > 0){ //Bedingung für Ausweichsequenz
taster(); //Aufruf der Ausweichfunktion
}
}
else if(i < -50){ //falls linker Transistor höhere Helligkeit-->
BackLED(OFF,ON);
LineLeft(); //Erhöhe rechts die Geschwindigkeit
if(KNOPF > 0){ //Bedingung für Ausweichsequenz
taster(); //Aufruf der Ausweichfunktion
}
}
else{ //bei gleichmäßiger Beleuchtung-->
BackLED(OFF,OFF);
speedleft = speedright = SPEED; //beide Motoren gleiche Geschwindigkeit
if(KNOPF > 0){ //Bedingung für Ausweichsequenz
taster(); //Aufruf der Ausweichfunktion
}
}
MotorDir(FWD,FWD);
MotorSpeed(speedleft,speedright); //Einsetzen der Variablen für die Geschwindigkeit der Motoren
}
while(1); //Endlosschleife (ASURO spezifisch)
return 0;
}

void search_left(void){ //Funktion search_left für Funktion taster()
//für Sucheffekt(nicht unbedingt erforderlich)
StatusLED(GREEN);

for(k=0;k<=0;k++){
BackLED(OFF,OFF);
MotorDir(RWD,FWD);
MotorSpeed(150,150);
for(i=0;i<=250;i++)
Sleep(255);
MotorDir(FWD,RWD);
MotorSpeed(150,150);
for(i=0;i<=250;i++)
Sleep(255);
}
Sleep(255);
}

void search_right(void){ //Funktion search_right für Funktion taster()
//für Sucheffekt(nicht unbedingt erforderlich)
StatusLED(GREEN);

for(k=0;k<=0;k++){
BackLED(OFF,OFF);
MotorDir(FWD,RWD);
MotorSpeed(150,150);
for(i=0;i<=250;i++)
Sleep(255);
MotorDir(RWD,FWD);
MotorSpeed(150,150);
for(i=0;i<=250;i++)
Sleep(255);
}
Sleep(255);
}


So das wärs. Endlich. Aber es gibt noch einiges zutun. Nämlich möchte ich gerne die zeitgesteuerten Elemente durch die Odometriedaten ersetzen und
außerdem muß die Suchfunktion noch einen näheren Sinn bekommen. Ich stelle mir das so vor, dass er solange in der Suchfunktion verbleibt bis ein Helligkeitsunterschied ermittelt wurde und dann wieder der Lichtquelle folgt.
Was haltet ihr davon. Wenns einer ausprobiert hat dann sagt doch mal bescheid.
Kai

pebisoft
29.09.2005, 16:34
ideal ist es noch nicht. warum muss der robby immer wo anstossen. ein entfernungssensor draufsetzen. besser wär es auch noch die geschwindigkeit langsam drosseln ab einer bestimmten entfernung bis auf 0 wenn er dann dicht davor steht. die vorgegebenen routinen vom asuro sind nicht ideal geproggt. am besten das programm von grund auf neu schreiben, es ist viel überflüssiges zeug darin, muss mehr modulhafter aufgebaut werden.
mfg pebisoft

Kaiak
29.09.2005, 18:56
Hi Pebisoft,

danke für deine Kritik. Das mit dem Entfernungsmesser hört sich gut an, nur leider hab ich keinen und weiß auch nicht wie ich den da drauf bauen soll.
Meinst du mit dem überflüssigen Krams z.B. die ganzen LED-Aktionen oder die Funktionen wie pause(), search_left, search_right? Ist mir nämlich klar, dass die völlig überflüssig sind; sind nur zum Spass da.
Und wie meinst du das mit den vorgegebenen Funktionen? Was kann man da besser machen? Könntest du vielleicht ein bißchen Code mitgeben, wenn du Antwortest? Danke schon mal

Vogon
29.09.2005, 19:13
Schau dir das mal an:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=99791#99791

Beaverhead
04.05.2006, 10:05
Ich würde gerne Versuchen, das die räder sich beim vorwärtsfahren anpassen, sodass er exakt geradeausfährt.

#include "asuro.h"

int main(void){
Init();

int zeit;

while(1) {
MotorDir(FWD,FWD); // Beiden Motoren auf Vorwärts
MotorSpeed(120,150); // Die Motoren arbeiten ungleichmäßig stark, so gehts geradeaus
StatusLED(GREEN); // Status-Leuchtdiode auf grün schalten
while (PollSwitch()==0) { // Kollisionskontakte prüfen und solange keine Kollision erfolgt...
SerWrite("Los gehts!\n",9); // ...weiterfahren

}
MotorSpeed(0,0); // Kollision! sofort anhalten!
StatusLED(RED); // Status-Leuchtdiode auf rot schalten
for(zeit=0;zeit<1000;zeit++){ // Ne pause von 1000 millisekunden
Sleep(72);}
BackLED(ON,ON); // Rückleuchten anschalten
MotorDir(RWD,RWD); // Rückwärtsgang einlegen
MotorSpeed(120,150); // losfahren
SerWrite("Wech hier!\n",10); // "Wech hier!" schicken
for(zeit=0;zeit<1000;zeit++){ // wieder Pause
Sleep(72);}
MotorSpeed(0,0); // Motoren ausschalten
SerWrite("Uff! Das war knapp.\n",16);
StatusLED(GREEN); // StatusLED wieder grün schalten
BackLED(OFF,OFF); // und Rückleuchten wieder aus
for(zeit=0;zeit<1000;zeit++){ // schon wieder Pause
Sleep(72);}
MotorDir(FWD,RWD); // Den linken Motor vorwärts und den rechten Rückwärts schalten,
StatusLED(YELLOW); // StatusLED gelb schalten,
MotorSpeed(100,129); // Beide Motoren einschalten
SerWrite("Drehn! Drehn! Drehn!\n",18); // und sich drehen
for(zeit=0;zeit<1000;zeit++){ // wieder kurz warten...
Sleep(72);}
MotorSpeed(0,0);
for(zeit=0;zeit<1000;zeit++){
Sleep(72);} // ...und dann alles von vorne
}

}

Schalter
13.06.2006, 22:18
Hallo!!
Ic habe nicht viel Ahnung von Programmiersprachen, kann mir jeman bitte erklären was diese zwei Zeilen aus dem oberen Programm bedeuten?

void search_left(void); //Funktionsprototyp
void search_right(void); // "


vielen Dank !!

=P~

m.a.r.v.i.n
14.06.2006, 08:38
Hi,

Die beiden Zeilen sind Funktionsdeklarationen (Prototypen). Jede Funktion die in einem C-Programm verwendet wird, muß vor der Verwendung deklariert werden (Name der Funktion, Funktionsparameter, Rückgabewert), sonst meckert der Compiler. Näheres siehe auch im C-Tutorial (https://www.roboternetz.de/wissen/index.php/C-Tutorial#Prototypen)

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

Soko
14.06.2007, 08:56
Einen Wunderschönen guten Morgen.
Also ich bzw wir haben folgendes problem mit unserem Asuro. Wir haben Projektwoche in der Schule und befinden uns beim vorletzen Tag an dem wir efektiv an dem Roboter arbeiten können . Der Robo ist zusammengebaut und funktioniert soweit. Nach kleineren und größeren start problem lief auch das testprogrammm irgend wann. Lämpchen blinken auf er fuhr rückwerts,drehte ich im kreis etc. So dann wollten wir das flashen anfangen ...was aus irgend welchen gründen nicht funktonierte. Bis wir dann herausgefunden haben das wenn wir den Robo beim Flashen aus-an-aus schalten er geflasht wird. Soo test programm von der CD in den Prozzesor geflashed...nix tut sich nur lämpchen blinken auf. Eigen geschriebene Programme...nix funktonier ...kann uns /mir jemand helfen? Ich hab mir auch ma das programm


#include "asuro.h"

int Main(void)
{
unsigned char sw;
Init();
sw = PollSwitch() ;
MotorDir(FWD,BREAK) ;
MotorSpeed(0, 0) ;
if (sw & 0x01)
MotorSpeed(30, 30) ;
if (sw & 0x02)
MotorSpeed(50, 50) ;
if (sw & 0x04)
MotorSpeed(80, 80) ;
if (sw & 0x08)
MotorSpeed(120, 120) ;
if (sw & 0x10)
MotorSpeed(160, 160) ;
if (sw & 0x20)
MotorSpeed(250, 250) ;
}

aus dem forum geklaut und es probiert aber es tut sich trozdem nix.evtl weis wer rat :)

MFG

m.a.r.v.i.n
14.06.2007, 09:14
Hallo Soko,

da hast du dir kein sehr gutes Codebeispiel geklaut. Probier mal alles hinter Init() in eine Endlosschleife zu packen, dann sollte es funktionieren.




#include "asuro.h"

int Main(void)
{
unsigned char sw;
Init();
while(1) // Endlosscheife
{
sw = PollSwitch() ;
...
}
}


btw, für Programmcode heißt das Metatag 'code' nicht 'list'.

radbruch
14.06.2007, 09:17
Hallo

Dein Progamm sollte in einem "Grundgerüst" sein:



#include "asuro.h"

int main(void) {

unsigned char sw;

Init();

do{

sw = PollSwitch() ;
MotorDir(FWD,BREAK) ;
MotorSpeed(0, 0) ;
if (sw & 0x01)
MotorSpeed(30, 30) ;
if (sw & 0x02)
MotorSpeed(50, 50) ;
if (sw & 0x04)
MotorSpeed(80, 80) ;
if (sw & 0x08)
MotorSpeed(120, 120) ;
if (sw & 0x10)
MotorSpeed(160, 160) ;
if (sw & 0x20)
MotorSpeed(250, 250) ;

}while (1);
return 0;
}



Ausserdem:

if (sw & 0x01)

sollte besser

if (sw && 0x01)

heisen. Bei einem & wird bitweise und-verknüpft und das Ergebniss in sw gespeichert. Alle weiteren sw-Abfragen funktionieren dann nicht mehr so wie gedacht. Bei && wird wird nur das Ergebnisse eines logischen Und gebildet und ausgewertet, sw bleibt dabei unverändert. (Das gilt natürlich auch für alle anderen IFs in deinem Code!)

Längerer Programmcode sollte in Code-Tags gepostet werden.

Meine asuro dreht die Rädchen erst bei MotorSpeed()-Werten ab ca. 100.

Gruß

mic

Soko
14.06.2007, 09:29
Mhh okay ich hab nu verschiedenes ausprobiert. Mit einer while endloschleife, mit do er fährt aber immer noch nicht :(...Wir haben uns ne hex ausem i-net geladen die funz aber wir wissen nicht wie die programmiert ist...da sie sich net auslesen läst

Soko
14.06.2007, 12:28
Also unser Roboter fährt nu vorwärst rückwärts ect ;). Aber die Sensoren wollen nicht wie wir . Funktionieren tun sie haben es mit einer hex ausem i-net getestet.Aber wenn wir nu unser eigene Programme schreiben funktionieren sie nicht.


#include “asuro.h”
int main(void) {
Init ()
MotorDir(FWD,FWD); // Beide Motoren auf vorwärts
MotorSpeed(120,120); // Beide Motoren etwa halbe Kraft voraus
StatusLED(GREEN); // Status-Leuchtdiode auf grün schalten
while (PollSwitch()==0) { // Solange keine Kollision erfolgte...
SerWrite(“Alles OK!\n”,10); // ... Euphorie verbreiten
}
MotorSpeed(0,0); // Kollision! Sofort anhalten!
StatusLED(RED); // Statusleuchtdiode rot schalten
while (1) {
SerWrite(“Aua!\n”,5); // und weinen!
}
}


Was machen wir falsch?

damaltor
15.06.2007, 11:32
dieses programm habt ihr nicht selbst geschrieben, sondern irgendwo kopiert. wichtig ist, dass das "asuro.h" in normalen anführungszeichen steht (SHIFT+2). wenn man solche quelltexte kopiert, dann wird dieses zeichen oftmals zerstört, in eurem codefenster oben sieht man deshalb nur nich solche blöcke. das gilt natürlich für sämtliche anführungszeichen im code.

Soko
15.06.2007, 17:55
Der code ist ausem manual vom Asuro kopiert...und in der ver in der wirs getestet haben waren die "" auch ""

damaltor
20.06.2007, 09:19
was gabs denn für fehler? beim kompilieren? beim testen? beim flashen? welche lib habt ihr verwendet? die programme des manuals funktionieren ncht mehr mit neueren versionen der library.

mega8_Tuner
03.10.2008, 14:50
I hob gepimt wos des zeig ghoidn hod, und dann ist mein Asuro hoffnungslos gegen die Wand gedonnert. Bei dem Versuch den Asuro aufzuhalten, wurde ich vom Regal aufgehalten (Platzwunde am Kopf --> Spital)

Asuro hatte einen Totalschaden, reparatur war teuer!

mega8_Tuner
03.10.2008, 15:01
Gepimpt im sinne von aufgemotzt!

-ASURO-
03.10.2008, 15:03
[highlight=red]Seas mega8 tuner[/highlight:631c76a2ef]

Habe auch eine dramatische Situation mit meinem Asuro erlebt!!!

Mein Asuro war ebenfalls WAHNSINNS gepimpt!!! Als ich mal so mit meinem Asuro im Garten rumgerast bin, sprang zufällig ein Eichkätzchen vom Baum! Dieses blöde Vieh war aber etwas zu langsam für mein Geschoss!!!! Hab es mächtig abgeschossen!!! Blieb nicht mehr viel über, doch leider war mein Asuro auch ein Totalschaden!!!

lg

Pewi006
12.12.2010, 10:14
Beispiel Programm für ASURO.
Der ASURO ist der erste Roboter den ich mir gekauft habe und das ist für mich alles noch Neuland.
Mich würde vor Allem ein Programm interessieren, wie das von Moebius. (16.5.2005 22:19)
Wozu hat ASURO sonst die 6 Sensoren?


Danke schon mal.
Pewi.

Valen
12.12.2010, 10:24
Du solltest eine Komplette FirstTry Ordner kopieren, und den Datei test.c dort in ersetzen. Dan muss make funktionieren, gleich wie bei andere Programmen.

Den link der broeggle gab ist vermutlich geändert zu diese:

http://home.planet.nl/~winko001/Asuro/Software/AsuSfwPagFrm.htm

Pewi006
13.12.2010, 13:08
Das ist doch das Testprogramm oder?

Pewi006
13.12.2010, 14:54
Hallo Valen
So wie du gesagt hast klappt es jetzt auf einmal.
Schönen Dank.
Nur.
ASURO fährt sehr kurze Strecken und dreht sich dann in eine andere Richtung.
Er reagiert aber, wenn ich meine Hand auf der Seite von den Sensoren halte. Dann fährt er zurück.
Reagier er jetzt auf Sichtkontakt?
Er soll doch erst mit den Sensoren anstoßen und dann rückwärts fahren.
Dank deiner Hilfe habe ich jetzt Blut geleckt und möchte den Rest auch noch hinbekommen.
Wenn jemand eine Lösung weiß?

Valen
13.12.2010, 16:37
Ich weiß nicht bei welcher Sensoren du dein Hand neben hast. Außerdem ist das Programm oben nicht Komplett. Deshalb kann ich nichts von eventuelle Fehler sagen. (auch den eventuelle Fehlermeldungen von make/Kompiler sind wichtig)

Bitte schreib dein Programm in deiner nächste Beitrag zwischen

[co de] [/co de]

Blocks (aber entferne die Leerzeichen zwischen co und de). Dan bleibt diesen Thread besser lesbar.

[EDIT] Dumm von mir. Das Programm steht naturlich in dem Beitrag von Mobieus. :Haue Aber welcher Sensoren du meinst ist mich noch nicht sicher.

Pewi006
13.12.2010, 17:08
Hallo Valen
Ich meine die Sensortaster K1 bis K6

Das test File habe ich mir beim Stammmitglied Moebius runtergeladen
Verfasst am: 17.05.2005, 15:57
Was mag denn wohl [co de] [/co de] sein?
In dem test File steht nichts.
Ich möchte nicht so viel Platz verbrauchen.
Kannst du dir das von Moebius runterladen und mal ansehen?
Wenn nicht, kopiere ich dir das auch gerne.
Gruß Pewi.

Valen
13.12.2010, 17:45
#include "asuro.h"

int main(void)
{
int i;
int k=0;
i=0;
int l;
l=1;
Init();
while(1)
{
while(1)
{
if (PollSwitch()>1) i=1;
if(i==0)
{
MotorDir(FWD,FWD);
MotorSpeed(200,210);
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(150,160);
Sleep(250);
k++;
}
if(k>500)
{
MotorSpeed(0,0);
break;
}
}
while(1)
{
if(l<300)
{
MotorDir(FWD,RWD);
MotorSpeed(120,120);
l++;
Sleep(250);
}
else
{
MotorSpeed(0,0);
i=0;
k=0;
l=1;
break;
}
}
}

return 0;
}Das meine ich.

Er reagiert sicher nicht auf Sichtkontakt. Die Taster sind nur Mechanische Schaltern. Er macht eine irre. Die Motoren stören die Tastermessung uber die Bordspannung beim Fahren. Die taster K6, neben den Grosse Schalter liefert den wert 1. K5 liefert 2, und ist in deinem fall auch verirrt War genommen.


Die (Programmierbare) Lösung ist 2 mal oder mehr ein Pollswitch messung zu machen, aber das in 2 (oder mehr) verschiedene Variabelen zu speichern. Danach mit ein if-befehl abfragen ob die (beider) Variabelen gleich sind und auch nicht nul (0). Sind sie das sind kann man die Einzelne Tastern aus dem wert Berechnen. Sind die werten nicht gleich dann soll das Programm nichts machen, nur wieder anfangen mit eine neue Pollswitch anruf.



unsigned char t1, t2;
t1=0;
t2=0;

...
while(1)
{
t1=PollSwitch(); // Erste Taster Messung
t2=PollSwitch(); // Zweiter Messung
if ((t1=t2) && (t1>0)) i=1; //Ist die Tastenmessung gleich oder stabil? und ist irgendeiner Taster bemerkt? ! Moebious ignorierte den Taster K6 mit >1
if(i==0) // Kein Taster Bemerkt, Vorwärts!
{
MotorDir(FWD,FWD);
MotorSpeed(200,210);
}
else // Taster Bemerkt. Rückfahrt!
{
MotorDir(RWD,RWD);
MotorSpeed(150,160);
Sleep(250);
k++;
}
if(k>500) // Warteschleife, 500 mal reagiert auf Taster Erkennung. Nun Reichst!
{
MotorSpeed(0,0);
break;
}
...

Valen
13.12.2010, 17:49
Es gibt auch eine Elektronische Verbesserung fuhr diese Störungen:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=44641

Pewi006
14.12.2010, 12:01
Hallo Valen ………….. danke für deine Mühe.

Aus dem ersten Satz entnehme ich, dass das Programm, welches ich auf meinem ASURO gespeichert habe Fehler enthält.
Soll mir das erste Programm zeigen, wo der Fehler in meinem (Moebius) Programm steckt?

Im zweiten Satz (die Programmierbare Lösung) soll ich eine Pollswitchmessung machen und das in 2 oder mehr Variablen und dann mit einem if-Befehl abfragen.
Ich nehme an, dazu dient das zweite Programm!? Ich habe mir beide In WORD kopiert. Aber dann?
Wäre es auch möglich, dass Programm fehlerfrei umzuschreiben? Ich würde es mir auch abtippen. Wenn ich das kann.

Dort, wo ich über die elektronische Verbesserung nachgesehen habe, wird auch darauf hingewiesen,
dass die meisten ASURO auch ohne Umbau laufen.

Programmieren?????? Da bringe ich doch meiner Katze eher das Sprechen bei!!!!!

Valen
14.12.2010, 13:15
Hallo Valen ………….. danke für deine Mühe.

Aus dem ersten Satz entnehme ich, dass das Programm, welches ich auf meinem ASURO gespeichert habe Fehler enthält.
Soll mir das erste Programm zeigen, wo der Fehler in meinem (Moebius) Programm steckt?Vielleicht verstehe ich dich nicht richtig, aber das erste Venster mit Code in meinem Beitrag ist das ganze Program (den Datei test.c) von Moebius, ungeändert! Ich möchte nur angeben wie du das schöner in einem Beitrag wiedergeben kann, ohne Riesige Beitragen zu machen. Es hat meines wissen kein Fehler drin. Mit einer Ideal-Asuro ohne Messstörungen soll das Programm gut laufen.



Im zweiten Satz (die Programmierbare Lösung) soll ich eine Pollswitchmessung machen und das in 2 oder mehr Variablen und dann mit einem if-Befehl abfragen.
Ich nehme an, dazu dient das zweite Programm!? Ich habe mir beide In WORD kopiert. Aber dann?
Wäre es auch möglich, dass Programm fehlerfrei umzuschreiben? Ich würde es mir auch abtippen. Wenn ich das kann.In meinen Letzter (grosse) Beitrag habe ich nur das wichtigste Teil der Anderungen sehen lassen. Aber ich verstehe das du nicht gleich wisst was du damit anfangen soll. Jedenfall sollst du nicht mit Microsoft Word diese Programmen bearbeiten. Das tut den Kompiler wehe! Windows Notepad, oder Programmer Notepad (mitgeliefert mit den WinAVR Kompiler: pn.exe) reichts. Es ist nur ein einfaches Textdatei, und das soll es auch bleiben. Word macht gern seine eigenes Dateiformat davon. Mein Code-schnippsel ist die erste while-schleife innen von den Außerste While-schleife. Aber ich werde das Komplete dur mich Geänderte Programm hier geben. Das soll den Datei test.c ersetzen. Welcher Meldungen habst du beim Kompilieren bekommen? Bitte die Resultaten von den "make all" Anruf Posten. Nicht alle warnungen sind wichtig.


// Originale Program von Moebius
// https://www.roboternetz.de/phpBB2/viewtopic.php?t=9317
// Geändert durch Valen (14-12-2010): Mehrfache PollSwitch Anruf zur stabile Taster Erkennung, weitere Kommentaren.

#include "asuro.h"

int main(void)
{
int i;
int k=0;
i=0;
int l;
l=1;

unsigned char t1, t2; // Speicher führ Taster Werten, zugefugt durch Valen
t1=0; // Anfangswert geben, kein Taster
t2=0; // Anfangswert geben, kein Taster

Init();
while(1)
{
while(1)
{
// Änderungen von Valen: Stabiele Tastererkennung
t1=PollSwitch(); // Erste Taster Messung
t2=PollSwitch(); // Zweiter Taster Messung
if ((t1==t2) && (t1>0)) i=1; //Ist die Tastenmessung gleich oder stabil? Und ist irgendeiner Taster bemerkt? ! Moebius ignorierte den Taster K6 mit >1
// Ende von Änderungen von Valen: Stabiele Tastererkennung

if(i==0) // Kein Taster Bemerkt, Vorwärts!
{
MotorDir(FWD,FWD);
MotorSpeed(200,210);
}
else // Taster Bemerkt. Rückfahrt!
{
MotorDir(RWD,RWD);
MotorSpeed(150,160);
Sleep(250);
k++;
}
if(k>500) // Ausbrechen von diese schleife, 500 mal reagiert auf Taster Erkennung. Nun Reichst!
{
MotorSpeed(0,0);
break;
}
}
while(1) // Wegdrehen vom Objekt-umgebung
{
if(l<300) // 300 mal 250 Timer Ticks Drehen
{
MotorDir(FWD,RWD);
MotorSpeed(120,120);
l++;
Sleep(250);
}
else // Weit genug weggedreht! Wieder Vorwärts und Tastermessungen machen, also aus diese Schleife brechen.
{
MotorSpeed(0,0);
i=0; // Letzte Taster erkennung ist nicht mehr gultig.
k=0; // Zeitzähler Ruckwärtsgang zuruckzetsen.
l=1; // Zeitzähler Drehung zuruckzetsen.
break;
}
}
}

return 0;
}

EDIT Ich hatte noch ein Fehler bemerkt in meiner erste Beitrag:
if ( (t1==t2) && (t1>0)) i=1; // war (t1=t2)


Dort, wo ich über die elektronische Verbesserung nachgesehen habe, wird auch darauf hingewiesen,
dass die meisten ASURO auch ohne Umbau laufen.Das stimmt. Vielleicht geht es auch ohne, aber es ist Recht einfach (nur ein Bischen Knapp dort auf die Platine), und Angeraten durch den Atmega8 Fabrikant.



Programmieren?????? Da bringe ich doch meiner Katze eher das Sprechen bei!!!!!Dann wurde ich mal Bald anfangen mit Programmieren lernen. Deine Katze wird doch ein Gesprächspartner Brauchen im Mitte der Nacht, oder? ;)

Valen
14.12.2010, 13:19
Oder vielleicht Gesangpartner. ;)

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=32782

Pewi006
14.12.2010, 16:47
Hallo Valen
Jetzt muss ich dir doch etwas länger schreiben.
Ich habe den ASURO gebaut, weil ich gerne bastele. Ich war auch sehr stolz, dass er alle Tests ohne Fehler bestand.
Ich habe vor Jahren mal ein wenig mit Basic programmiert, nichts Tolles. Daher weiß ich, dass das Programmieren nicht so einfach ist und wenn man nicht immer damit zu tun hat, vergisst man schnell. Da es für den ASURO, im Internet sehr viel Information dazu gibt, habe ich mich darauf verlassen, auch einige Programme zu finden. Aber…. Fehlanzeige.
Da habe ich mir viel Mühe gegeben und was macht er? Eine grüne Lampe blinkt … na toll (sagt meine Frau.)
Aber….. dank deiner geduldigen Hilfe (und meinem Ehrgeiz) hat mein ASURO vor 12min
genau das gemacht, was ich mir vorgestellt habe. Er startet und wenn er mit einem Sensor an ein Hindernis stößt dreht er ab dazwischen macht er einige willkürliche Drehungen. Genau wie im Video(http://www.youtube.com/watch?v=rxcRx-FIbng). Prima, prima, ein schönes Weihnachtsgeschenk von dir.
Danke.
Ich werde meine vorherigen Beiträge etwas kürzen aber im Forum bleiben (es gibt ja noch Erweiterungen.) Ha – ha – ha.

Danke natürlich auch an Moebius.

Grüße aus Schleswig-Holstein.
In die Niederlande.

Ja, singen kann die Katze besser .. aber Bruder Jacob? Da programmiere ich doch lieber!!

ASUR0
16.12.2010, 20:23
Ich habe noch ein kleines Programm:
Nach dem Anschalten fährt er los und regelt mittels Odmetrie, er soll gerade fahren. Wenn man ein Rad festhält wird es beschleunigt usw.
Tastenbelegung:
(von vorne links nach rechts)
1 - langsam 123
2 - normal 150
3 - rückwärts
4 - rechtskurve
5 - stop
6 - linkskurve

Noch folgende "Features":
-flankengesteuerte Odometrie mit Helligkeitsanpassung
-sanftes Beschleunigen und Abbremsen
-verbesserte Tastenauswertung
Es würde mich interessieren ob das alles auch auf einen anderen ASURO klappt.

Gruß

ASUR0

Valen
17.12.2010, 04:08
Mein Asuro ist immer noch im Garage und noch nicht Flash fähig. Ich habe deshalb nichts an dein hex. Könnte ich vielleicht schon den Quell Code anschauen?

ASUR0
17.12.2010, 06:21
schwierig, da alles in einer Bibliothek drin ist und es deshalb zig Codeschnipsel sind.

t1000hh
27.01.2011, 18:53
Beitrag verlegt in anderen Threat