Zeig doch bitte mal eine komplette und komplierfähige Version von deinem Kollision-Programm.
Zeig doch bitte mal eine komplette und komplierfähige Version von deinem Kollision-Programm.
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Normalerweiße auf 3 Dateien verteilt, hier der Einfachheit halber in einer:
Code:#include "asuro.h" // Prototypen void Kollisionskontrolle (void); void Drehung (int Grad,unsigned char Geschwindigkeit); int main(void) { Init(); MotorDir(FWD,FWD); MotorSpeed(210,210); while(1) { Kollisionskontrolle (); Msleep(5); } return 0; } void Kollisionskontrolle (void) { char Zaehler = 0; // Zaehler für die Kontrolle der Taster int i; // Teste auf Kollision for (i=0; i<5; i++) { if (PollSwitch() != 0) Zaehler++; Msleep(1); } // Ist der Zahler größer als 1, so leigt eine Kollision vor // In diesem Fall muss anhand des Pollswitch-Wertes, der auf Zaehler übergeben wird // unterschieden werden wie zu reagieren ist. if (Zaehler > 1) { Zaehler = PollSwitch(); // Unterschiedliche Reaktionen // Stößt ganz links an - Asuro dreht 45° rechts if (Zaehler == 32) { // K1 gedrückt - 45° nach rechts Drehung(45, 150); } // Stößt ganz rechts an - Asuro dreht 45° nach links else if (Zaehler == 1) { // K6 gedrückt - 45° nach links Drehung(-45, 150); } // Stößt anders an - Asuro dreht 180° else { // 90° Drehung Drehung(180, 150); } } } void Drehung (int Grad,unsigned char Geschwindigkeit) { int Faktor = 4; unsigned char Left_Speed; unsigned char Right_Speed; // Ursprüngliche Geschwindigkeit übernehmen Left_Speed = OCR1A; Right_Speed = OCR1B; // Sicherheitshalber kurz zurücksetzen MotorDir(RWD,RWD); MotorSpeed(120,120); Msleep(200); MotorSpeed(0,0); // Unterscheide Links und Rechtsdrehung if (Grad >0) // Rechtsdrehung { MotorDir(FWD,RWD); MotorSpeed(Geschwindigkeit,-Geschwindigkeit); Msleep(Grad * Faktor); } else // Linksdrehung { MotorDir(RWD,FWD); MotorSpeed(-Geschwindigkeit,Geschwindigkeit); Msleep(-Grad * Faktor); } MotorDir(FWD,FWD); MotorSpeed(Left_Speed,Right_Speed); }
So vielleicht:
Code:void Kollisionskontrolle (void) { char Zaehler = 0; // Zaehler für die Kontrolle der Taster char sw[5]; // Speicher für 5 Tastenwerte int i; // Teste auf Kollision for (i=0; i<5; i++) { sw[i]=PollSwitch(); // Tastenwert speichern if (sw[i] != 0) Zaehler++; // Wenn eine Taste erkannt wird Zähler erhöht Msleep(1); } // Wurde fünf mal die selbe Taste erkannt? if ((Zaehler == 5) && (sw[0]==sw[1]) && (sw[0]==sw[2]) && (sw[0]==sw[3]) && (sw[0]==sw[4])) { //Zaehler = PollSwitch(); Zaehler=sw[0]; // Unterschiedliche Reaktionen ...
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Guten morgen
Ich habe deine Änderung vorgenommen und den Asuro geflasht. Momentan dreht er sich bei einem Aufprall zumindestens nicht mehrfach.
Dafür kommt es vor, dass er nachdem er gegen einen Schrank oder Ähnliches fährt anschließend nur noch rückwärts fährt.
Manchmal verändert er nach einer normaler Drehung auch die Geschwindigkeit, was wohl die Geschwindigkeit beim Drehen ist, jedoch nicht die ursprüngliche.
Ein weiterer Fehler ist, dass er sich manchmal nach einem aufprall endlos dreht. Manchmal beginnen während der Fehler auch LEDs zu leuchten...
Alle Versuche die ich unternommen hab um nach einem System hinter dem Fehler zu suchen laufen ins leere... der kleine hat wohl nen widerspenstiges Eigenleben entwickelt.
Geändert von Tausendacht (17.08.2011 um 10:32 Uhr)
Hallo
Wenn die LEDs blinken gabs einen Reset oder eine "VL"-Meldung. Beides könnte von schwachen/leeren Akkus kommen, z.B. nach längerer Fahrtdauer, oder von den Erschütterungen beim Aufprall.
Grundsätzlich muss man bedenken, dass jede Kollision den asuro komplett erschüttert. Die Taster sind fast schon am Ende des Betätigungswegs, wenn der Kontakt durchschaltet. Und sie werden dann bis zum Anschlag gedrückt, weil der asuro nicht schnell genug bremsen kann. Dadurch ist die mechanische Belastung an der Platine recht hoch. Schlechte Lötstellen, Kontaktprobleme im Batteriehalter oder am Schalter, Blockierströme der Antriebe, und was weiß ich noch alles, könnte stören.
Zusätzlich könntest du die Tastenwerte zur Kontrolle an ein Terminal senden:PHP-Code:
int main(void)
{
int i;
Init();
for(i=1; i<10; i++) // Reseterkennung
{
StatusLED(i & 3);
Msleep(200);
}
StatusLED(GREEN);
while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(210,210);
Kollisionskontrolle ();
Msleep(5);
}
return 0;
}
https://www.roboternetz.de/community...ernd-kollision
https://www.roboternetz.de/community...l=1#post284529
https://www.roboternetz.de/community...rekt-auslesen?
https://www.roboternetz.de/community...e-korrigieren?
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen