PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Antikolisionsprogramm mit Tastern



JensK
02.03.2007, 21:40
ich habe mal ein programm mit meine Vater entworfen, wo der Asuro, wenn er irgendwo gegen fährt dem hinderniss ausweicht.

nur jetzt haben wir ein problem... alle Taster senden immer verschieden signale von sich an den hyperterminal... wie kann man das programm optimieren, so dass es funktioniert?
ich hoffe ihr könnt uns helfen

schonmal vielen dank für eventuelle Hilfe

MfG

JensK
wenn ihr die .hex braucht um es zu testen.. dann fragt einfach nach:)

/************************************************** ************************************
*
* File Name: test.c
* Project : ASURO
*
* Ver. Date Author Comments
* ------- ---------- ------ ------------------------------
* 1.00 17.04.2006 mko build
* 1.10 17.04.2006 mko erweiterte asuro.h vom 27. September 2005 eingebunden
* 1.20 20.04.2006 mko erweitert um Odometriedaten und doppeltes Auslesen der
* Schalter
* 1.30 02.03.2007 mko erweitert "geradeausfahren"
*
************************************************** **************************************/


#include "asuro.h"
#define LA 0x20 // Taster links aussen
#define LM 0x10 // Taster links mitte
#define LI 0x8 // Taster links innen
#define RI 0x4 // Taster rechts innen
#define RM 0x2 // Taster rechts mitte
#define RA 0x1 // Taster rechts aussen
#define LRI 0xC // Taster links und rechts innen
#define LAM 0x30 // Taster links aussen und mitte
#define LRM 0x12 // Taster links und rechts mitte
#define RAM 0x3 // Taster rechts aussen und mitte

#define LMIN 0x60 // Links läuft der Motor früher an als rechts
#define RMIN 0x60 // rechts etwas höher beginnen
#define LMAX 0x64 // Maximal 200, gleiche maximal Umdrehung für beide Seiten
#define RMAX 0x64 // Maximal 200

unsigned int i, j;
unsigned int lspeed, rspeed;
unsigned char taste1, taste2;
unsigned int odata[1];

int NachLinksAusweichen(void)
{
// LED einschalten
BackLED(OFF,ON);
// Motor stoppen
MotorSpeed(0,0);
// Rechtskurve zurück
MotorDir(RWD,BREAK);
MotorSpeed(120,0);
Msleep(1000);
MotorSpeed(0,0);
// LED ausschalten
BackLED(OFF,OFF);
// Weiterfahren
MotorDir(FWD,FWD);
lspeed=LMIN;
rspeed=RMIN;
return 0;
}

int NachRechtsAusweichen(void)
{
// LED einschalten
BackLED(ON,OFF);
// Motor stoppen
MotorSpeed(0,0);
// Linkskurve zurück
MotorDir(BREAK,RWD);
MotorSpeed(0,120);
Msleep(1000);
MotorSpeed(0,0);
// LED ausschalten
BackLED(OFF,OFF);
// Weiterfahren
MotorDir(FWD,FWD);
lspeed=LMIN;
rspeed=RMIN;
return 0;
}

int ZurueckSetzen(void)
{
// LED einschalten
BackLED(ON,ON);
// Motor stoppen
MotorSpeed(0,0);
// Linkskurve zurück
MotorDir(RWD,RWD);
MotorSpeed(LMAX,RMAX);
Msleep(1000);
MotorSpeed(0,0);
// LED ausschalten
BackLED(OFF,OFF);
// Weiterfahren
MotorDir(FWD,FWD);
lspeed=LMIN;
rspeed=RMIN;
return 0;
}

int Aufgeben(void)
{
// LED einschalten
BackLED(ON,ON);
// Motor stoppen
MotorSpeed(0,0);
// LED ausschalten
BackLED(OFF,OFF);
// Status LED ausschalten
StatusLED(OFF);
}

int main(void)
{
Init();

// Vorwärts fahren
MotorDir(FWD,FWD);
// mit minimaler Geschwindigkeit beginnen
lspeed = LMIN;
rspeed = RMIN;
do
{
// Eine Sekunde mit dieser Geschwindigkeit fahren
Msleep(1000);
// Solange Geschwindigkeit erhöhen, bis maximal Geschwindigkeit erreicht ist
if (lspeed < LMAX) lspeed++;
if (rspeed < RMAX) rspeed++;
MotorSpeed(lspeed,rspeed);
OdometrieData(odata); // Auslesen der Umdrehung
PrintInt(odata[0]); // Ausgabe auf serielle Schnittstelle
PrintInt(odata[1]); // Ausgabe auf serielle Schnittstelle
taste1 = PollSwitch(); // Taster einmal abfragen
taste2 = PollSwitch(); // Taster zweitesmal abfragen
PrintInt(taste1);
PrintInt(taste2);
if (taste1 == taste2) // beide Tastedrücke vergleichen
{
// Entscheiden, was zu tun ist
if (taste1 == LA)
NachRechtsAusweichen();
else if (taste1 == LM)
NachRechtsAusweichen();
else if ((taste1 == LI) || (taste1 == RI))
ZurueckSetzen();
else if (taste1 == RM)
NachLinksAusweichen();
else if (taste1 == RA)
NachLinksAusweichen();
else
Aufgeben();
}
} while (1);
return 0;
}

radbruch
02.03.2007, 23:06
Hallo

In der Suche "Problem AND Taster" eingeben und "|||-- Asuro" wählen.

Ein Beispielthread:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=26648

Gruß

mic

JensK
03.03.2007, 10:51
ohh sry bin ahlt neu hier im fourm und wuste net wo man suchen kann..


MfG

JensK

radbruch
03.03.2007, 18:36
Kein Problem. Herzlich willkommen hier im Forum.

Thowil
03.03.2007, 23:20
Hallo,

die meisten Tasterprobleme werden meiner Erfahrung nach auch durch diese kleinen Modifikationen an PollSwitch gelöst:



unsigned char PollSwitch (void){
unsigned int i;

// Kehrt sofort zurück, falls kein Taster gedrückt ist
if (PIND & SWITCHES) return 0;

DDRD |= SWITCHES; // Port-Bit SWITCHES als Output
SWITCH_ON; // Port-Bit auf HIGH zur Messung
ADMUX = (1 << REFS0) | SWITCH; // AVCC reference with external capacitor
Sleep (10); // Kondensator Zeit geben

ADCSRA |= (1 << ADSC); // Starte AD-Wandlung
while (!(ADCSRA & (1 << ADIF))); // Ende der AD-Wandlung abwarten
ADCSRA |= (1 << ADIF); // AD-Interupt-Flag zuruecksetzen

i = ADCL + (ADCH << 8); // Ergebnis als 16-Bit-Wert

DDRD &= ~SWITCHES; // Pin SWITCHES als Eingang
SWITCH_OFF; // Pull-Up abschalten
Sleep (5);

return ((10240000L / (long)i - 10000L) * 63L + 5000L) / 10000;

}


Die Abfrage des INT1/PD3"=Pins sofort zu Beginn ist eher eine Performance=Frage und unterbindet das Anwerfen des Wandlers, wenn sowieso keiner der Taster gedrückt ist.

Wesentlich wichtiger ist das Rücksetzen von PD3 auf Input&PullUpOff direkt nach der Messung.

In der ursprünglichen Version von PollSwitch wird lediglich SWITCH_OFF (=PORTD &= ~(1 << PD3)) durchgeführt, was PD3 als Output/GND hinterlässt. Damit lädt sich Kondensator C7 nach dem ersten Aufruf von PollSwitch nur noch auf die durch den Spannungsteiler R24/R23 (1k/1M) erzeugte Spannung auf (jedenfalls solange kein Taster gedrückt ist). Der nächste Aufruf von PollSwitch setzt PD3 zu Beginn zwar wieder auf HighPegel, wodurch eine zweckmäßige Messung prinzipiell gelingen kann -- Jedoch zeigt das Ergebnis wohl durch das träge Aufladen des Kondensators oftmals auch dann einen gedrückten Taster an, wenn tatsächlich keiner gedrückt ist.

Natürlich muss unter Umständen zusätzlich noch der bekannte Multiplikator (bei mir 63) angepasst werden, damit überhaupt sinnvolle Werte zurückgegeben werden können. Die jedoch mitunter auch nach dieser "Kalibrierung" verbleibende gröbste Verwirrung der Taster -- nämlich die Fehlanzeige eines gedrückten Tasters -- sollte durch das Rücksetzen von PD3 behoben werden.

HTH
Thomas

JensK
08.03.2007, 19:12
supi also bei mir klappt jez alles... dankeschön