PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro Steuerung



greenko
05.06.2008, 14:00
Schreiben Sie ein Programm, um den ASURO (Atmega 8 ) fernzusteuern. Vom Terminalprogramm eines Computers aus soll der ASURO folgende Befehle entgegennehmen. Jeder Befehl besteht aus einem großen Buchstaben und wird mit dem zugehörigen kleinen Buchstaben quittiert. Wird ein anderes Zeichen übertragen, meldet der ASURO einen Stern zurück.

V – vorwärts fahren
R – rückwärts fahren
L – langsam (wenn der ASURO fährt, ändert er die Geschwindigkeit)
S – schnell (wenn der ASURO fährt, ändert er die Geschwindigkeit)
B – bremsen
A - ausrollen

Benutzen Sie die ASURO-Bibliothek zum kontinuierlichen Abfragen der IR-Schnittstelle und steuern Sie mit einer eigenen Software die Hardware zur PWM so an, dass die Steuerung der Motoren nebenläufig zur Abfrage der IR-Schnittstelle arbeitet.

Ich bräuchte vorschläge, wie ich das realisieren kann. Code wäre wünschenswert. :) [-o<

Andun
05.06.2008, 20:20
Öhm, wo ist denn jetzt das Problem?

A) Es steht eigentlich alles in der Aufgabe
B) Wenn wir dir Code-Schnipsel geben, dann ist dein Lernerfolg dabei minimal
C) Hättest du ein wenig im Forum gestöbert, hättest du das Asuro-Unterforum entdeckt ... https://www.roboternetz.de/phpBB2/viewforum.php?f=44
D) Wenn du ne klare Frage stellst, bekommst du ne klare Antwort

mfg
Andun

greenko
06.06.2008, 11:10
Ich verstehe schon das man diese Tastereingaben mit if Abfragen realisieren kann. Nebenläufige Abfrage zur IR-Schnitstelle verstehe ich als einfache while(1) schleife drum herum, und keine Msleep() befehl zu benutzen.

fürs programm vorstellung

#include "asuro.h"
int main()
{
Init();
while(1){}
return 0;
}


//Mit .. lässt sich vorwärts realisieren
MotorSpeed(a,b);
MotorDir(FWD,FWD);

//Mit .. lässt sich rückwärts realisieren
MotorSpeed(a,b);
MotorDir(RWD,RWD);

//Fürs schneller fahren
??

//Fürs langsamer fahren
??

//Für bremsen ?
break;

//Ausrollen ?
MotorSpeed(0,0);

und die Eingabe mit den Tastern groß bzw. klein soll man da irgendwie die ASCII tabelle benutzen um das zu begrentzen usw..

Also bitte, da ich Anfänger bin, wenn jemand seinen Code hier posten/erklären kann, wäre ich ihm sehr dankbar. **Wenn nötig den Topic ins ASURO unterforum versetzen.**

robo.fr
06.06.2008, 11:40
Das einfachste wäre hier im Forum nach einem Beispielprogramm zu suchen. Das Thema "Asuro Steuerung vom PC" wurde hier nämlich schon öfters bearbeitet ( inclusive Programmbeispiele ).

oberallgeier
06.06.2008, 12:14
... oder dieses hübsche Lehr-/Lern-Beispiel von Henk:
http://home.planet.nl/~winko001/Asuro/Software/Asuro%20019/Asuro%20019.c

greenko
06.06.2008, 12:29
ok mal schauen :)

greenko
06.06.2008, 22:04
#include "asuro.h"

int main(void)
{
Init();
StatusLED(YELLOW);

char c[3]={0, 0, 0};
while(1)
{
SerRead(c,3,20);

while( (c[1]||c[0]) != 'v'){
if(c[1]=='V'||c[0]=='V') //Vorwaerts fahren
{
StatusLED(YELLOW);
MotorSpeed(150,150);
MotorDir(FWD,FWD);

if(c[1]=='L'||c[0]=='L') //langsam
{
StatusLED(YELLOW);
MotorSpeed(100,100);

}
if(c[1]=='S'||c[0]=='S') //schnell
{
StatusLED(YELLOW);
MotorSpeed(250,250);

}
if(c[1]=='B'||c[0]=='B') //break
{
MotorSpeed(BREAK, BREAK);
StatusLED(GREEN);
}
if(c[1]=='A'||c[0]=='A') //motor aus, ausrollen
{
MotorSpeed(0,0);
StatusLED(GREEN);
}
if((c[1]||c[0])!= ('A'||'B'||'S'||'L'||'R')){SerWrite("*\r\n",3);} //blabla

} }



while( (c[1]||c[0]) != 'r'){
if(c[1]=='R'||c[0]=='R') //Rueckwaerts fahren
{
StatusLED(YELLOW);
MotorSpeed(150,150);
MotorDir(RWD,RWD);

if(c[1]=='L'||c[0]=='L') //langsam
{
StatusLED(YELLOW);
MotorSpeed(100,100);

}
if(c[1]=='S'||c[0]=='S') //schnell
{
StatusLED(YELLOW);
MotorSpeed(250,250);

}
if(c[1]=='B'||c[0]=='B') //break
{
MotorSpeed(BREAK, BREAK);
StatusLED(GREEN);
}
if(c[1]=='A'||c[0]=='A') //motor aus, ausrollen
{
MotorSpeed(0,0);
StatusLED(GREEN);
}
if((c[1]||c[0])!= ('A'||'B'||'S'||'L'||'V')){SerWrite("*\r\n",3);} //blabla
} }

c[0]=0;c[1]=0;c[2]=0;
Msleep(100);
}

return(0);
}


So, jetzt! Verbesserungsvorschläge usw. Wozu brauche ich auch eigentlich c[0] und c[1] in den abfragen?

Es gibt da auch eine (unbedeutende? da gelbe farbe im AVRstudio) fehlermeldung
tastat.c:11: warning: pointer targets in passing argument 1 of 'SerRead' differ in signedness

Earnie
07.06.2008, 11:25
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=26505&highlight=signedness

Da wurde das Problem behandelt. Hatte gestern das selbe Problem und mit den Tipps aus dem Thread hab ich es hinbekommen.

greenko
12.06.2008, 13:00
//Besseres Programm
#include "asuro.h"

void vorwaerts()
{
//Motor links auf vorwärts
PORTD |=(1<<PD5);
PORTD &=~(1<<PD4);

//Motor rechts auf vorwärts
PORTB |=(1<<PB5);
PORTB &=~(1<<PB4);
}

void rueckwaerts()
{

//Motor links auf rueckwaerts
PORTD |=(1<<PD4);
PORTD &=~(1<<PD5);

//Motor rechts auf rueckwaerts
PORTB |=(1<<PB4);
PORTB &=~(1<<PB5);
}

void bremsen()
{
//Motor links bremsen (den Motor kurzschliessen)
PORTD &=~(1<<PD4);
PORTD &=~(1<<PD5);

//Motor links bremsen (den Motor kurzschliessen)
PORTB &=~(1<<PB4);
PORTB &=~(1<<PB5);
}

void leerlauf()
{
//Motor kein Transistor öffnet
PORTD |=(1<<PD4); //T1 geschlossen
PORTD |=(1<<PD5); //T3 geschlosen
OCR1A=0; //T2 und T4 geschlossen

//Motor rechts auf leerlauf
PORTB |=(1<<PB4); //T1 geschlossen
PORTB |=(1<<PB5); //T3 geschlosen
OCR1B=0; //T2 und T4 geschlossen
}

void schneller()
{
//Wichig: 255 ist das Maximum
if(OCR1A<=245) OCR1A += 10;
else OCR1A=255;
if(OCR1B<=245) OCR1B += 10;
else OCR1B=255;
}


void langsamer()
{
//keinen negativen wert
if(OCR1A>=10) OCR1A -= 10;
else OCR1A=0;
if(OCR1B>=10) OCR1B -= 10;
else OCR1B=0;
}

int main()
{
Init();
char zeichen;

// Motorrichtung einstellen
// PD4, PD5 für linken Motor, PB4, PB5 für rechten motor
// als erstes die Pins als Ausgang setzten
DDRD|=(1<<PD4) | (1<<PD5);
DDRB |=(1<<PB4) | (1<<PB5);

// PB1 und PB2 sind für die Ansteuerung der H-Brücken zuständig und werden von der PWM erzeugt
// Jedoch müssen die Pins erst als Ausgang gesetzt weden.
DDRB |= (1<<PB1) | (1<<PB2);

//PWM einheit einstellen
//Da wir jedes Bit in den Registern TCCR1A und TCCR1B aendern wollen koennen wir hier "=" benutzen und muessen nicht "|=" bzw "&=" benutzen
//Wir setzen also nicht nur WGM10, COM1A1, COM1B1 und CS11 sondern löschen auch alle anderen Bits!!!
TCCR1A = (1<<WGM10) | (1<<COM1A1) | (1<<COM1B1); //PWM phase correct 8-Bit, clear on match when upcounting
TCCR1B = (1<<CS11); //nur CS11 etzen alles andere 0, fuer Takt/8

//Startrichtung
vorwaerts();

//Startgeschwindigkeit 100
OCR1A=100;
OCR1B=100;

SerWrite("Eingabe:",7);
while(1)
{
SerRead(&zeichen,1,0);

switch(zeichen)
{
case 'V': vorwaerts();
SerWrite("v",1);
break;

case 'R': rueckwaerts();
SerWrite("r",1);
break;

case 'S': schneller();
SerWrite("s",1);
break;

case 'L': langsamer();
SerWrite("l",1);
break;

case 'B': bremsen();
SerWrite("b",1);
break;
case 'A': leerlauf();
SerWrite("a",1);
break;

default: SerWrite("*",1);
}
}

}


/*
//Beispiele von Studenten

DDRB |= 54; //PB1,PB2,PB4,PB5 setzen => alle 4 als Ausgang
DDRD |= 48; //PD4,PD5 auf Ausgang

TCCR1A |= 161; //TCCR1A/B setzen wie in Vorlesungsfolien angegeben


//ist das gleiche wie
DDRB |=(1<<PB4) | (1<<PB5) | (1<<PB1) | (1<<PB2);
DDRD|=(1<<PD4) | (1<<PD5);

// Jedoch ist die schreibweise DDRB |= 54; deutlich unübersichtlicher und Fehleranfällig


//Mann kann sich auch Macros definieren um den COde strukturierter zu gestalten
/ Beispiel:
//********* MACROS **********
#define setBit(Byte, BitNo) (Byte |= (1<<BitNo)) // sets the BitNo in Byte
#define clrBit(Byte, BitNo) (Byte &= ~(1<<BitNo)) // clears the BitNo in Byte
#define chkBit(Byte, BitNo) (Byte & (1<<BitNo)) // true (!=0) , if Bit is set.


//Beisüiel aus der AVR Library:
// In ./avr/include/avr/sfr_defs.h steht folgendes:
#define _BV(bit) (1 << (bit))


// Hier ein Beispiel wie die Motorensteuerung in der Asuro Bibliothek realisiert wird
inline void MotorDir (
unsigned char left_dir,
unsigned char right_dir)
{
PORTD = (PORTD &~ ((1 << PD4) | (1 << PD5))) | left_dir;
PORTB = (PORTB &~ ((1 << PB4) | (1 << PB5))) | right_dir;
}
//als Eingabe dienen die Makros:
#define FWD _BV(PB5)
#define RWD _BV(PB4)
#define BREAK 0x00
#define FREE _BV(PB4) | _BV(PB5)

*/