PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ASURO] Eure Programme



freq.9
02.01.2005, 23:42
Ich würd mal gern sehen, was ihr euch für euren ASURO so für Programme geschrieben habt. Ich bastel zur Zeit an diesem hier:


#include "asuro.h"

int main(void)
{
Init();

unsigned int crash;
unsigned int i;

i = 0;
crash = 0;

while(1)
{
if(PollSwitch() != 0)
{
crash = 1;
MotorSpeed(0, 0);
StatusLED(YELLOW);
}

if(crash == 1)
{
StatusLED(RED);
while(i < 10)
{
MotorDir(RWD, RWD);
MotorSpeed(100, 100);
i++;
}

i = 0;

while(i < 10)
{
MotorDir(FWD, RWD);
MotorSpeed(100, 100);
i++;
}

crash = 0;
}
else
{
MotorSpeed(150, 150);
MotorDir(FWD, FWD);
StatusLED(GREEN);
}
}

return 0;
}


Wobei das nicht so läuft wie es sollte. Ich möchte, dass wenn mein ASURO irgendwo gegenfährt, ca. 1-2 Sekunden rückwärts fährt, sich dann ein wenig dreht und dann wieder vorwärts. Und das dann immer so, wenn er irgendwo gegenfährt. Nur habe ich das Problem, dass er sich nur dann dreht, wenn PollSwitch() ungleich 0 ist, also wenn einer der Sensoren gedrückt ist.

RCO
03.01.2005, 00:01
Also wie schon geschrieben habe ich mich mit Sonics Hilfe mal dran gesetzt und die Funktionen in Bascom geschrieben. Das gibts alles hier zum Downloaden mit einer Beschreibung aller Funktionen:

Zur Seite (http://www.free-webspace.biz/update/)

Oder halt hier das ganze Script:


'************************************************* *************
'****** Der Versuch Asuro in Bascom zu übersetzen ;-) ******
'****** Von: RCO ******
'****** Mit Hilfe von Sonic und natürlich der Asuro.c ******
'************************************************* *************
'********* www.Roboternetz.de **********
'************************************************* *************

'Integrierte Funktionen:
'Motordir(x,x) x: Fwd, Rwd, Break, Free
'Motorspeed(x,x) x: 0-255
'Backled(x,x) x: An, Aus
'Statusled(x) x: Aus, Green, Red, Yellow
'Frontled(x) x: An, Aus
'Odometrie() Ausgabe in Odoright;Odoleft(word)
'Linidata() Ausgabe in Lineright;lineleft(word) (da data reserviert)
'Pollswitch() :ist selbst die Variable(byte)

$regfile = "m8def.dat"
$crystal = 8000000
$baud = 2400
On Int1 Int1_int
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Enable Interrupts
Start Adc
Enable Adc
Enable Int1

Config Int1 = Falling


Declare Sub Motordir(byval Mldir As Byte , Byval Mrdir As Byte)
Declare Sub Motorspeed(byval Mlspeed As Byte , Byval Mrspeed As Byte)
Declare Sub Backled(byval Led1 As Byte , Byval Led2 As Byte)
Declare Sub Frontled(byval Led1 As Byte)
Declare Sub Statusled(byval Color As Byte)
Declare Sub Odometrie()
Declare Sub Linedata()
Declare Function Pollswitch() As Byte
'-----------Motoren-------------------
Const Fwd = 1
Const Rwd = 2
Const Free = 3
Const Brake = 4

'Motor Rechts
Config Pinb.1 = Output
Config Pind.4 = Output
Config Pind.5 = Output

'Motor Links
Config Pinb.2 = Output
Config Pinb.4 = Output
Config Pinb.5 = Output
'----------Led------------------------
Const Aus = 0
Const Red = 1
Const Green = 2
Const Yellow = 3
Const An = 1
'FrontLED (Odometrie)
Config Pind.6 = Output

' ****** !!! ACHTUNG !!! *******BACKLEDs***********************************

Config Pinc.0 = Output 'Rechts
Config Pinc.1 = Output 'Links

' Die BackLEDs können nicht genutzt werden wenn die Odometrie benutzt wird.
' --> BackLEDs pinc.0 und pinc.1 als Ausgang definieren
' --> Odometrie pinc.0 und pinc.1 als Eingang bzw. ADC definieren
' ****** !!! ACHTUNG !!! **************************************************

'StatusLED
Config Pind.2 = Output 'Rot?
Config Pinb.0 = Output 'Grün?

'----------Odometrie-------------------
Dim Odoright As Word 'data geht nciht, da expression
Dim Odoleft As Word
Config Pinc.2 = Input
Config Pinc.3 = Input

'----------Line-------------------
Dim Lineright As Word
Dim Lineleft As Word
'Config Pinc.0 = Input 'Nur aktivieren wenn Backleds aus
'Config Pinc.1 = Input

'-----------Pollswitch-----------
Config Pind.3 = Input
Portd.3 = 0 'für den Interrupt
Config Pinc.4 = Input
Portc.4 = 0
Dim Poll As Byte


'################################################# #########################
'############################### Main #####################################
'################################################# #########################

Do



Loop
End

'################################################# #########################
'############################### Ende #####################################
'################################################# #########################

'--------Subs-------------------------
Sub Motorspeed(byval Mlspeed As Byte , Byval Mrspeed As Byte)
Pwm1a = Mlspeed
Pwm1b = Mrspeed
End Sub

Sub Frontled(byval Led1 As Byte)
Portd.6 = Led1
End Sub

Sub Motordir(byval Mldir As Byte , Byval Mrdir As Byte)
If Mldir = 1 Then 'FWD
Portd.4 = 0
Portd.5 = 1
Elseif Mldir = 2 Then 'RWD
Portd.4 = 1
Portd.5 = 0
Elseif Mldir = 3 Then 'FREE
Portd.4 = 0
Portd.5 = 0
Elseif Mldir = 4 Then 'BRAKE
Portd.4 = 1
Portd.5 = 1
End If
'-----------------
If Mrdir = 1 Then 'FWD
Portb.4 = 0
Portb.5 = 1
Elseif Mrdir = 2 Then 'RWD
Portb.4 = 1
Portb.5 = 0
Elseif Mrdir = 3 Then 'FREE
Portb.4 = 0
Portb.5 = 0
Elseif Mrdir = 4 Then 'BRAKE
Portb.4 = 1
Portb.5 = 1
End If
End Sub

Sub Backled(byval Led1 As Byte , Byval Led2 As Byte)
Portc.1 = Led1
Portc.0 = Led2
End Sub

Sub Statusled(byval Color As Byte)
If Color = 0 Then 'Aus
Portd.2 = 0
Portb.0 = 0
Elseif Color = 1 Then 'ROT?
Portd.2 = 1
Portb.0 = 0
Elseif Color = 2 Then 'Green ?
Portd.2 = 0
Portb.0 = 1
Elseif Color = 3 Then 'Yellow
Portd.2 = 1
Portb.0 = 1
End If
End Sub

Sub Linedata()
Lineright = Getadc(2)
Lineleft = Getadc(3)
End Sub

Sub Odometrie()
Odoright = Getadc(0)
Odoleft = Getadc(1)
End Sub

Function Pollswitch() As Byte
Dim Erg2 As Long
Dim Erg1 As Word
Portd.3 = 1
Erg1 = Getadc(4)
Erg2 = 10240000 / Erg1
Erg2 = Erg2 - 10000
Erg2 = Erg2 * 63
Erg2 = Erg2 + 5000
Erg2 = Erg2 / 10000
Pollswitch = Erg2
Portd.3 = 0
End Function

Int1_int:
'Platz fpr Routine, z.B. Aufruf von Pollswitch()
Return

MFG Moritz

bergowitch
03.01.2005, 08:15
Das ist wirklich sehr schön und vereinfacht das Leben ungemein.
Ich habe mal ein wenig gespielt. Ich möchte gerne Eure Treiber auslagern und mit :
$include "Asu_Basc2_h.bas"
und
$include "Asu_Basc2_c.bas"
die Anteile vor bzw nach der dem eigentlichen Hauptprogramm einbinden.
Wenn ich das aber mache bekomme ich diverse Fehlermeldungen, die nicht erscheinen, wenn ich alles in einem File lasse.
Kann mir das jemand erklären?
Gruß Stefan

RCO
03.01.2005, 20:17
Sorry, da kann ich dir auch nicht helfen, ich wollte eigentlich das selbe machen, habe mihc aber noch nicht damit beschäftigt, wie man Code auslagern kann.

Vielleicht einfach mal einen neuen Thread dazu aufmachen. :mrgreen:

MFG moritz

bergowitch
05.01.2005, 18:51
Ich habs,
man muss nur die ersten initialisierungsdaten (mit dem "$" davor im Hauptfile haben - dann gehts

yjeanrenaud
26.01.2005, 21:04
Ich habs,
man muss nur die ersten initialisierungsdaten (mit dem "$" davor im Hauptfile haben - dann gehts
du meinst das $include <>? natürlich muss das im Hauptfile sein, weil du compilierst ja das Hauptfile ;-)
ansonsten, schau mal in google nach "C in 21 days" da lernst du bestimmt schnell und viel

DO2STL
27.01.2005, 20:17
Hallo!!

Ich arbeite grade an einer extra datei die das programmieren in c mit bisher 3 funktionen vereinfacht:

-MotorSpeed wird zu Speed und muss nun in prozent angegeben werden(individuell einstellbar auf eigenen roboter rechts-links-verhältnis....)
-Blinken aller LEDs mit angaben des zeitintervalls in 10tel sekunden
- unsd die dafür nötige funktion die sleep benutzt um einen timer in 10tel sekunden einzubauen.


/************************************************** **********
*
* Dateiname: eigen.h
* Projekt : ASURO
*
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------
* 1.00 27.01.2005 build
*
************************************************** **********/
/************************************************** *********
*
* Dieses Program ist frei verwendbar für jegliche Zwecke. man darf es verändern und/oder * duplizieren. Ich übernehme keine Haftung für eventuelle Schäden durch diese Datei.
*
************************************************** **********/


//Sleep mit eingabe in 10tel sekunden!
//-----------------------------------------------------
void Wait(unsigned int sek);
void Wait(unsigned int sek){
unsigned int i;
unsigned int x;
for(i=0; i<sek;i++){
for(x=0;x<36;x++){
Sleep(200);
}
}
}
//-----------------------------------------------------


/*Blinken aller LEDs in rot */
//-------------------------------------------------
void Blinken(int i);
void Blinken(int i){
StatusLED(RED);
FrontLED(ON);
BackLED(ON,ON);
Wait(i);
StatusLED(OFF);
FrontLED(OFF);
BackLED(OFF,OFF);
Wait(i);
}

//---------------------------------------------------


/*MotorSpeed=Speed ( jetzt mit prozent angabe!)*/
//----------------------------------------------------
void Speed(int x, int y);
void Speed(int x, int y){
unsigned char left,right;
if (((x*255)/100)>255){Blinken(10);}
if (((x*251)/100)>251){Blinken(20);}
left=(x*255)/100;
right=(y*251)/100;
MotorSpeed (left,right);
}
//-----------------------------------------------------/

Arexx-Henk
14.02.2005, 19:57
Hallo Robotiker,

Ich hab mich ein bischen verliebt in die Asuro und seinem Atmega chip. Ich mochte mahl genau verstehen wass da alles in die Atmega chip hervor geht. Mann ist das ein menge Arbeit!
Ich hab mich jetzt mahl auf die InfraRot empfanger geworfen (mit hilfe von die Asuro.c Datei) und mahl ein einfaches Asuro steurung program geschrieben.
Vielleicht habt Ihr schon manchmal dasselbe gemacht. Ich mochte's nur zeigen.
Mit Hyperterminal kan mann Asuro mittels die pfeilen-tasten lenken.

(immer die '.txt' entfernen)

Gruss,

Henk

RCO
14.02.2005, 20:24
Simpel und trotzdem lustig, macht echjt Spaß ;-)

MFG Moritz

Proworx
27.02.2005, 11:57
Auch wenn das eine ziemlich blöde Frage ist wie kann ich das ´.txt´entfernen?????

Alter Knacker
27.02.2005, 12:00
Auch wenn das eine ziemlich blöde Frage ist wie kann ich das ´.txt´entfernen?????

einfach die datei umbenennen ;-)


übrigens gibts keine blöden fragen, nur dumme antworten [-X
mfg knacki

Arexx-Henk
27.02.2005, 13:22
Hallo Proworx

Vielleicht ist in deinem computer die datei.extensionen sichtbarkeit nicht eingeschaltet.

Ich kenne die Deutsche worter nicht aber...hier eine mischung

Ein 'Windows explorer' offnen, menu 'extra' oder 'optionen' offnen, selectieren 'folder options', tabulator 'wiedergabe', und 'extensionen fur bekannte dateitypen verbergen' ausschalten.

Die datei finden, mahl linkermauseklicken, taste F2, '.txt' entfernen, Enter taste drucken.

Gruss

Henk

RCO
27.02.2005, 16:53
Oder im Texteditor öffnen und neu speichern.

MFG Moritz

Proworx
28.02.2005, 16:04
danke für die tipps

Banzai
05.03.2005, 22:37
Hi Leutz,

bin 1. neu hier, 2. eine elektronische NULL und 3. funzt mein ASURO nicht so ganz (dazu in einem anderen Thread mehr).

Habe zum Testen (nachdem mir das mitgelieferte Testprg. nicht gefallen hat) ein eigenes Prog. geschrieben.

Zuerst das Steuerprogramm für den PC (Console unter Windows):

//************************************************** ***************************
//*
//*
//* ComDemo.cpp
//*
//*
//************************************************** ***************************
//
// Mit deisem Programm kann man eine Konsolenverbindung über die serielle
// Schnittstelle mit einem Null-Modem-Kabel herstellen.
//
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include "ComTools.h"


#define COM1 0
#define COM2 1
#define COM3 2
#define COM4 3

#define ESC 27


//************************************************** ***************************
//*
//* main
//*
//************************************************** ***************************
int main(int argc, char* argv[])
{
int iLen,iKey,iWait;
char inBuffer[65];
char outBuffer[65];

ComInit();

if(!ComOpen(COM1,2400,P_NONE,S_1BIT,D_8BIT))
{
printf("\nKann die Schnittstelle nicht oeffnen !\n\n");
return -1;
}

while(1)
{
if(kbhit()) // Wurde eine Taste gedrückt
{
iKey = getch();

if(iKey == ESC)
break;

if(iKey != 'f' && iKey != 'r' && iKey != 'l' && iKey != 'x' && iKey != 'o'
&& iKey != 'k' && iKey != '+' && iKey != '-') // kein 1-Zeichen-Befehl
{
while(_kbhit());
outBuffer[0] = iKey;
outBuffer[1] = getch();
}
else
{
outBuffer[0] = iKey;
outBuffer[1] = ' ';
}
printf("%c%c\n",outBuffer[0],outBuffer[1]);
ComWrite(COM1,outBuffer,2);
}
memset(inBuffer,0,65);
iLen = ComRead(COM1,inBuffer,64); // Zeichen einlesen
if(iLen > 0)
{
inBuffer[iLen] = '\0';
if(inBuffer[2] == 'f') // vordere Fototransistoren
{
int val_Links = (inBuffer[3] << 8) | inBuffer[4];
int val_Rechts = (inBuffer[5] << 8) | inBuffer[6];
printf("\nFoto L: %d R: %d\n",val_Links, val_Rechts);
}
else if(inBuffer[2] == 'o') // Odometrie
{
int val_Links = (inBuffer[3] << 8) | inBuffer[4];
int val_Rechts = (inBuffer[5] << 8) | inBuffer[6];
printf("\nOdo L: %d R: %d\n",val_Links, val_Rechts);
}
else if(inBuffer[2] == 'p') // Schalter
{
int value = inBuffer[3];
char ausgabe[7] = { '-','-','-','-','-','-','\0' };
if(value & 1)
ausgabe[5] = 'X';
if(value & 2)
ausgabe[4] = 'X';
if(value & 4)
ausgabe[3] = 'X';
if(value & 8)
ausgabe[2] = 'X';
if(value & 16)
ausgabe[1] = 'X';
if(value & 32)
ausgabe[0] = 'X';
printf("Schalter: %s\n",ausgabe);
}
else
printf("%s\n",&inBuffer[2]);
}
else
{
Sleep(50); // Wenn keine Zeichen im Buffer sind dann warten
}
}

ComClose(COM1);
ComExit();

return 0;
}


..und das ASURO-Progrämmsche:

#include "asuro.h"

int main(void)
{
Init();
StatusLED(GREEN);
unsigned char data[65];
unsigned char frontLED = 0;
unsigned int lD[2];
unsigned char send[12];
unsigned char speed = 200;
unsigned char Motors[2];

while(1)
{
SerRead(data,2,0); // auf 2 Zeichen warten
switch(data[0])
{
case 's': // StatusLED
if(data[1] == 'g')
{
StatusLED(GREEN);
SerWrite("Set StatusLED to Green\0",23);
}
if(data[1] == 'r')
{
StatusLED(RED);
SerWrite("Set StatusLED to Red\0",21);
}
if(data[1] == 'y')
{
StatusLED(YELLOW);
SerWrite("Set StatusLED to Yellow\0",24);
}
if(data[1] == 'o')
{
StatusLED(OFF);
SerWrite("Set StatusLED Off\0",18);
}
break;
case 'l': // Front-LED
if(frontLED == 0)
{
SerWrite("Set FrontLED On\0",16);
FrontLED(ON);
}
else
{
SerWrite("Set FrontLED Off\0",17);
FrontLED(OFF);
}
frontLED = !frontLED;
break;
case 'f': // vorwärts
SerWrite("Set Motordirection FORWARD\0",27);
MotorDir(FWD, FWD);
break;
case 'r': // rückwärts
SerWrite("Set Motordirection REVERSE\0",27);
MotorDir(RWD, RWD);
break;
case 'g':
speed = data[1];
break;
case '+':
if(speed < 255)
speed += 10;
if(Motors[0])
MotorSpeed(speed,0);
if(Motors[1])
MotorSpeed(0,speed);
break;
case '-':
if(speed > 0)
speed -= 10;
if(Motors[0])
MotorSpeed(speed,0);
if(Motors[1])
MotorSpeed(0,speed);
break;
case 'm': // Motoren
if(data[1] == 'l')
{
SerWrite("Set left Motor\0",15);
MotorSpeed(speed,0);
Motors[0] = 1;
Motors[1] = 0;
}
if(data[1] == 'r')
{
SerWrite("Set right Motor\0",16);
MotorSpeed(0,speed);
Motors[0] = 0;
Motors[1] = 1;
}
if(data[1] == 'o')
{
SerWrite("Set Motors OFF\0",15);
MotorSpeed(0,0);
Motors[0] = 0;
Motors[1] = 0;
}
break;
case 'b': // Rück-LED's
if(data[1] == 'l')
{
SerWrite("Set left BackLED ON\0",20);
BackLED(ON,OFF);
}
if(data[1] == 'r')
{
SerWrite("Set right BackLED ON\0",21);
BackLED(OFF,ON);
}
if(data[1] == 'o')
{
SerWrite("Set BackLEDs OFF\0",17);
BackLED(OFF,OFF);
}
break;
case 'k':
send[0] = 'p';
send[1] = PollSwitch();
send[5] = '\0';
SerWrite(send,3);
break;
case 'x':
// Zustände senden
LineData(lD); // Zustände der vorderen Fototransistoren holen
send[0] = 'f';
send[1] = lD[0] >> 8; // HighByte
send[2] = lD[0] & 0xFF; // LowByte
send[3] = lD[1] >> 8; // HighByte
send[4] = lD[1] & 0xFF; // LowByte
send[5] = '\0';
SerWrite(send,5);
break;
case 'o': // Odometriedaten
// Zustände senden
OdometrieData(lD); // Zustände der vorderen Fototransistoren holen
send[0] = 'o';
send[1] = lD[0] >> 8; // HighByte
send[2] = lD[0] & 0xFF; // LowByte
send[3] = lD[1] >> 8; // HighByte
send[4] = lD[1] & 0xFF; // LowByte
send[5] = '\0';
SerWrite(send,5);
break;
}
}
StatusLED(RED);
while(1);
return 0;
}


Es werden auch noch die ComTools von http://members.inode.at/anton.zechner/az/Seriell.htm Anton Zechner benötigt (sind angehängt).

Die Console reagiert auf folgende Tasten(kombinationen):
f = MotorDir(FWD,FWD)
l = FrontLED(ON/OFF) 'als Switch
r = MotorDir(RWD,RWD)
+ = MotorSpeed(+10,+10)
- = MotorSpeed(-10,-10)
o = OdometrieData()
x = LineData()
k = PollSwitch()
mo = MotorSpeed(0,0)
ml = MotorSpeed(n,0)
mr = MotorSpeed(0,n)
bo = BackLED(OFF,OFF)
bl = BackLED(ON,OFF)
br = BackLED(OFF,ON)
so = StatusLED(OFF)
sr = StatusLED(RED)
sy = StatusLED(YELLOW)
sg = StatusLED(GREEN)

Daher auch eine Frage: Wie regelt ihr eine abgestimmte Kommunikation zwischen Robbie & PC???

Viel Spass damit (auch wenn's recht popelig ist)

Banzai

Moebius
09.03.2005, 16:32
Hi,
hab ein kleines Programm für asuro geschrieben. Asuro faährt erstmal grade aus, und wenn er anstösst fährt er erst rückwärts, dreht sich und fährt wieder geradeaus.
Diesen Vorgang wiederholt er unendlich.
Also ich weis das bis jetzt das Programm noch sehr simpel ist, habe aber vor es so weiterzuschreiben, dass wenn asuro wo steckenbleibt eine "Troubleshooting" Schleife einsetzt, die Asuro wieder befreit wenn er wo stecken bleibt.
P.S.: Die Geschwindigkeiten sind für meinen Bot eingestellt. Eventuell muss man diese verändern.

chrispyy
24.03.2005, 12:19
Hallo Freunde,

ich bin neu hier und habe mich mit dem Kauf des ASURO's jetzt zum ersten Mal an einen Robi gewagt. Meine C-Kenntnisse sind noch recht beschränkt, aber um das zu ändern hab ich den kleinen auch gekauft.
Mein erstes Problem war das Auslesen der Schalter durch PollSwitch().
Am Anfang war der Wert den ich bekam noch sehr unzuverlässig.
Ich habe mir jetzt damit beholfen die Funktion mehrmals hintereinander aufzurufen und zwischendrin Pausen mit Sleep() einzubauen. Geht das vielleicht etwas eleganter? Oder hat mein ADC etwa noch Probleme? Tritt dieses Phänomen bei euch auch auf?

Vielen Dank im Vorraus für die Hilfe,
Chrispyy

Weja
24.03.2005, 13:45
Hallo Chrispyy,
hier sind schon einige Male Probleme mit PollSwitch() gemeldet worden.
Bitte prüf doch mal die Funktion mit vollen Akkus/Batterien und abgeschalteten Motoren. Wenn jetzt auch falsche Werte ermittelt werden liegt warscheinlich ein kleiner Hardwarefehler vor.
Bitte verfolge auch den Thread " erweiterte ASURO Billiothek".
Gruß
Weja

RCO
24.03.2005, 14:50
Also es kann ganz einfach auch mit den verwendeten Widerständen zusammenhängen. Bei mir habe ich bei einem Switch auch manchmal einen falschen Wert. Du könntest natürlich die Bibiliothek weglassen und die funktionen selber schreiben, dann könntest du die Funktion anpassen.

MFG Moritz

chrispyy
24.03.2005, 18:32
Ich denke ich habe die Erklärung für das Problem selber gefunden.
Wenn ich die Motoren nicht einschalte funktioniert das Auslesen ganz gut.
Nach einschalten (und gerade beim einschalten) treten Fehler auf.
ASURO hat wie ich festgestellt habe leider keine Spgsstabilisierung und da durch sinkende Betriebsspg (Motoren) leider auch der Wert im Speicher (C7) absinkt bekommt der ADC evtl. einen falschen Wert.

Naja ... durch erneuern der Batterien tritt der Effekt seltener auf.
Mal schauen ob ich irgendwie ne Spgsstabilisierung zwischen Batterien und ASURO bauen kann.

MfG
Chris

chrispyy
24.03.2005, 18:40
Ohh sehe grad die Antwort von Weja.
Dann liege ich wohl gar nicht so falsch mit meiner Vermutung.
Evtl langt schon eine Diode vor R23 um Abhilfe zu schaffen und die Batterien länger nutzen zu können.

Hat jemand von Euch schon ein funktionierendes Programm mit Auswertung der Odometrie?
Ich bin noch etwas ratlos wie ich die OdometrieDaten sinnvoll verwende. Für einen kleinen Denkanstoss wäre ich sehr dankbar.

MfG
Chris

Weja
24.03.2005, 23:07
Hallo Chris,
wegen der Odometrie Sache siehe mal unter:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=7571
Wie Du die Tasten auch bei eingeschalteten Motoren und schwachen Batterien korrek ausliet kommt da auch, aber teste erstmal die Odometrie Funktion.
Gruß, Weja

Kaiak
03.08.2005, 17:50
Hi Leutz,

haben wohl viele Leute, wie auch ich, die Idee von nem ASURO der rumfährt und bei Bedarf zurücksetzt und in einer anderen Richtung weiter fährt.
Habs mal probiert und das ist raus gekommen:


/* fahren(Kai) */
/* langsam fahren, irgendwo anstoßen, schnell zurücksetzen, 90°drehen, weiterfahren */
/* 02.08.2005 vom Kai */

#include "asuro.h"

int main(void){

int i;

Init();

while(1){
if(PollSwitch()>0){ /* falls taster gedrückt --> */
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD); /* fahre rückwärts -->*/
MotorSpeed(200,200);
for(i=0;i<=270;i++){ /* --> für diese wilkürliche zeitspanne */
Sleep(255);
if(i==270){ /* ist die zeit abgegelaufen--> */
StatusLED(YELLOW);
MotorDir(RWD,FWD); /* --> dreh linksherum --> */
MotorSpeed(152,150);
for(i=0;i<=120;i++){ /* --> für diese wilkürliche zeitspanne */
Sleep(255);
}
}
}
}
else{ /* falls kein taster gedrückt --> */
StatusLED(GREEN);
BackLED(OFF,OFF);
MotorDir(FWD,FWD); /* fahre vorwärts */
MotorSpeed(150,150);
}
}
return 0;
}


und weil mir das noch nicht gereicht hat, hab ich mal versucht das noch ein bißchen schöner zu machen:


/* fahrenfeiner2 */

#include "asuro.h"


int main(void){

int j,i;

Init();



while(1){
if(PollSwitch() > 0 && PollSwitch() < 8){
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(200,202);
for(i=0;i<=270;i++){
Sleep(255);
if(i==270){
StatusLED(YELLOW);
BackLED(ON,OFF);
MotorDir(RWD,FWD);
MotorSpeed(150,150);
for(j=0;j<=120;j++){
Sleep(255);
}
}
}
}
else if(PollSwitch() > 7 && PollSwitch() < 60 && PollSwitch() != 12 && PollSwitch() != 18 && PollSwitch() != 30){
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(200,202);
for(i=0;i<=270;i++){
Sleep(255);
if(i==270){
StatusLED(YELLOW);
BackLED(OFF,ON);
MotorDir(FWD,RWD);
MotorSpeed(150,150);
for(j=0;j<=120;j++){
Sleep(255);
}
}
}
}
else if(PollSwitch() == 12 || PollSwitch() == 18 || PollSwitch() == 30){
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(200,200);
for(i=0;i<=270;i++){
Sleep(255);
if(i==270){
StatusLED(YELLOW);
BackLED(ON,ON);
MotorDir(RWD,FWD);
MotorSpeed(152,150);
for(j=0;j<=200;j++){
Sleep(255);
}
}
}
}
else{
StatusLED(GREEN);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
}
}
return 0;
}



Sorry habs leider noch nicht geschafft mir die anderen Beiträge anzuschauen. Sind bestimmt ganz ähnliche Sachen dabei.
Und habs auch noch nicht geschafft die Dokumentation zu schreiben; aber ist ja eigentlich auch ganz einfach das Programm.
Jetzt will ich fahrenfeiner2 mit noch nen paar Funktionen und vielleicht auch mit einer anderen Struktur verfeinern.
@freq.9: fahren und fahrenfeiner funktionieren ziemlich gut auf meinem ASURO
@Banzai: Das klingt echt gut was du da gemacht hast werd ich direkt mal ausprobieren
@Moebius: Deine Idee mit der Befreiungsschleife gefällt mir, werd ich auch mal probieren in fahrenfeiner2 einzubauen

Kaiak
03.08.2005, 18:33
Hi Leutz,

haben wohl viele Leute, wie auch ich, die Idee von nem ASURO der rumfährt und bei Bedarf zurücksetzt und in einer anderen Richtung weiter fährt.
Habs mal probiert und das ist raus gekommen:


/* fahren(Kai) */
/* langsam fahren, irgendwo anstoßen, schnell zurücksetzen, 90°drehen, weiterfahren */
/* 02.08.2005 vom Kai */

#include "asuro.h"

int main(void){

int i;

Init();

while(1){
if(PollSwitch()>0){ /* falls taster gedrückt --> */
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD); /* fahre rückwärts -->*/
MotorSpeed(200,200);
for(i=0;i<=270;i++){ /* --> für diese wilkürliche zeitspanne */
Sleep(255);
if(i==270){ /* ist die zeit abgegelaufen--> */
StatusLED(YELLOW);
MotorDir(RWD,FWD); /* --> dreh linksherum --> */
MotorSpeed(152,150);
for(i=0;i<=120;i++){ /* --> für diese wilkürliche zeitspanne */
Sleep(255);
}
}
}
}
else{ /* falls kein taster gedrückt --> */
StatusLED(GREEN);
BackLED(OFF,OFF);
MotorDir(FWD,FWD); /* fahre vorwärts */
MotorSpeed(150,150);
}
}
return 0;
}


und weil mir das noch nicht gereicht hat, hab ich mal versucht das noch ein bißchen schöner zu machen:


/* fahrenfeiner2 */

#include "asuro.h"


int main(void){

int j,i;

Init();



while(1){
if(PollSwitch() > 0 && PollSwitch() < 8){
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(200,202);
for(i=0;i<=270;i++){
Sleep(255);
if(i==270){
StatusLED(YELLOW);
BackLED(ON,OFF);
MotorDir(RWD,FWD);
MotorSpeed(150,150);
for(j=0;j<=120;j++){
Sleep(255);
}
}
}
}
else if(PollSwitch() > 7 && PollSwitch() < 60 && PollSwitch() != 12 && PollSwitch() != 18 && PollSwitch() != 30){
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(200,202);
for(i=0;i<=270;i++){
Sleep(255);
if(i==270){
StatusLED(YELLOW);
BackLED(OFF,ON);
MotorDir(FWD,RWD);
MotorSpeed(150,150);
for(j=0;j<=120;j++){
Sleep(255);
}
}
}
}
else if(PollSwitch() == 12 || PollSwitch() == 18 || PollSwitch() == 30){
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(200,200);
for(i=0;i<=270;i++){
Sleep(255);
if(i==270){
StatusLED(YELLOW);
BackLED(ON,ON);
MotorDir(RWD,FWD);
MotorSpeed(152,150);
for(j=0;j<=200;j++){
Sleep(255);
}
}
}
}
else{
StatusLED(GREEN);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
}
}
return 0;
}



Sorry habs leider noch nicht geschafft mir die anderen Beiträge anzuschauen. Sind bestimmt ganz ähnliche Sachen dabei.
Und habs auch noch nicht geschafft die Dokumentation zu schreiben; aber ist ja eigentlich auch ganz einfach das Programm.
Jetzt will ich fahrenfeiner2 mit noch nen paar Funktionen und vielleicht auch mit einer anderen Struktur verfeinern.
@freq.9: fahren und fahrenfeiner funktionieren ziemlich gut auf meinem ASURO
@Banzai: Das klingt echt gut was du da gemacht hast werd ich direkt mal ausprobieren
@Moebius: Deine Idee mit der Befreiungsschleife gefällt mir, werd ich auch mal probieren in fahrenfeiner2 einzubauen

Kaiak
03.08.2005, 18:38
Fahren jetzt noch feiner:


/* fahrenfeiner3 */

#include "asuro.h"

int back(void){

int i;

StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(200,202);
for(i=0;i<=270;i++){
Sleep(255);
}
}

int taster(void){

if(PollSwitch() > 0 && PollSwitch() < 8)
return 0;
else if(PollSwitch() > 7 && PollSwitch() < 60 && PollSwitch() != 12 && PollSwitch() != 18 && PollSwitch() != 30)
return 1;
else if(PollSwitch() == 12 || PollSwitch() == 18 || PollSwitch() == 30)
return 2;
}

int main(void){

int j;

Init();



while(1){
if(PollSwitch() != 0){
taster();
taster();
taster();
switch(taster()){
case 0:
back();
StatusLED(YELLOW);
BackLED(ON,OFF);
MotorDir(RWD,FWD);
MotorSpeed(150,150);
for(j=0;j<=120;j++){
Sleep(255);
}
break;
case 1:
back();
StatusLED(YELLOW);
BackLED(OFF,ON);
MotorDir(FWD,RWD);
MotorSpeed(150,150);
for(j=0;j<=120;j++){
Sleep(255);
}
break;
case 2:
back();
StatusLED(YELLOW);
BackLED(ON,ON);
MotorDir(RWD,FWD);
MotorSpeed(152,150);
for(j=0;j<=200;j++){
Sleep(255);
}
break;
}
}
else{
StatusLED(GREEN);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
}
}
return 0;
}



So und jetzt werd ich das mal alles ausbauen.

Schönen Abend

fotomarco
07.05.2007, 00:32
moibius sehr einfaches program ,gefaelt mir aber sehr gut