- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 10

Thema: Mein erstes vernünftiges Programm?

  1. #1
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8

    Mein erstes vernünftiges Programm?

    Anzeige

    Powerstation Test
    Hallo

    Mein Ansatz für das Anstossproblem dieser Tage und der Versuch einer zuverlässigen Tastenabfrage sieht so aus:

    Code:
    /*  asuro fährt nach Anstoss einstellbare Zeit drehend(!) zurueck
        mic 4.1.2007
    */
    #include <asuro.h>
    
    unsigned long zurueckzeit;           // Zeit Rueckwaerts in Millisekunden
    unsigned char sw,sw0,sw1,sw2;          // Zwischenspeicher für Schalter k1-k6
    
    int main(void) {
        Init();
    
        zurueckzeit=0;         // vorwärts losfahren
        MotorDir(FWD,FWD);
        MotorSpeed(150,150);
        BackLED(OFF,OFF);
    
    /*  Achtung! Das funzt nur wenn die Taster richtig erkannt werden!
    */
    
    do {
        sw0=PollSwitch();      // Schalter einlesen und für eine Runde speichern
        sw1=PollSwitch();
        sw2=PollSwitch();
        if ((sw0==sw1) && (sw0==sw2)) sw=sw0; else sw=0;
    
        if (!zurueckzeit && (sw==32)) {
        zurueckzeit=Gettime()+750; // Aktuelle Zeit plus x millisek. zurueck
        MotorSpeed(0,0);
        MotorDir(RWD,RWD);
        MotorSpeed(90,150);
        BackLED(ON,OFF);
        }
    
        if (!zurueckzeit && (sw==16)) {
        zurueckzeit=Gettime()+1500; // Aktuelle Zeit plus x millisek. zurueck
        MotorSpeed(0,0);
        MotorDir(RWD,RWD);
        MotorSpeed(90,150);
        BackLED(ON,OFF);
        }
    
        if (!zurueckzeit && (sw==2)) {
        zurueckzeit=Gettime()+1500; // Aktuelle Zeit plus x millisek. zurueck
        MotorSpeed(0,0);
        MotorDir(RWD,RWD);
        MotorSpeed(150,90);
        BackLED(OFF,ON);
        }
    
        if (!zurueckzeit && (sw==1)) {
        zurueckzeit=Gettime()+750; // Aktuelle Zeit plus x millisek. zurueck
        MotorSpeed(0,0);
        MotorDir(RWD,RWD);
        MotorSpeed(150,90);
        BackLED(OFF,ON);
        }
    
        if (zurueckzeit && (Gettime() > zurueckzeit)) { // Lange genug zurueck?
        zurueckzeit=0;
        MotorSpeed(0,0);
        MotorDir(FWD,FWD);
        MotorSpeed(150,150);
        BackLED(OFF,OFF);
        }
    
    }while (1); // mainloop (Endlosschleife)
    
        return 0;
    }
    Die Tasten werden 3x abgefragt und bei Gleichheit als gültig gewertet.

    Die Funktionen der Tasten:

    k1(Wert1): asuro fährt kurze Zeit rückwärts drehend rechts mit BackLED
    k2(Wert2): asuro fährt lange Zeit rückwärts drehend rechts mit BackLED
    k5(Wert16): asuro fährt lange Zeit rückwärts drehend links mit BackLED
    k6(Wert32): asuro fährt kurze Zeit rückwärts drehend links mit BackLED

    Das funktioniert bei meinem asuro fast tadellos. "Fast" weil unglaublicherweise dies geschah:

    Bild hier  

    Blöderweise werden k3 und k4 nicht abgefragt. Aber wer hätte gedacht, dass die Testfahrt nach zwei Minuten so endet?

    Gruß

    mic

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Aber hallo,

    dass kann ich ja so nicht auf mir sitzen lassen. Hier das Update mit "Rettungsanker":

    Code:
    /*  asuro fährt nach Anstoss einstellbare Zeit drehend zurueck mit timeout
    
        Der timeout "rettet" unser Baby wenn es feststeckt,
        (aber nur, wenn die Raeder nicht unterm Sofa eingeklemmt sind ;-)
    
        mic 4.1.2007
    */                      
    #include <asuro.h>
    
    unsigned long zurueckzeit; // Zeit Rueckwaerts in Millisekunden
    unsigned long timeout; // zu lange kein Taster gedrückt
    unsigned char sw,sw0,sw1,sw2; // Zwischenspeicher für Schalter k1-k6
    
    int main(void) {
        Init();
    
        zurueckzeit=0; // vorwärts losfahren ohne timeout
        timeout=Gettime()+7000; // ein Defaultwert für Standartzimmer
        MotorDir(FWD,FWD);
        MotorSpeed(150,150);
        BackLED(OFF,OFF);
        FrontLED(OFF);
    
    /*  Achtung! Das funzt nur wenn die Taster richtig erkannt werden,
        sonst bleibt der asuro auf freier Strecke stehen!
    */
    
    do {
        sw0=PollSwitch();      // Schalter einlesen und für eine Runde speichern
        sw1=PollSwitch();
        sw2=PollSwitch();
        //(sw0==sw1==sw2)?(sw=sw0):(sw=0);  // swx gleiche Tasten?
        if ((sw0==sw1) && (sw0==sw2)) sw=sw0; else sw=0;
    
        if (!zurueckzeit && (sw==32)) {
        zurueckzeit=Gettime()+750; // Aktuelle Zeit plus x millisek. zurueck
        MotorSpeed(0,0);
        MotorDir(RWD,RWD);
        MotorSpeed(90,150);
        BackLED(ON,OFF);
        }
    
        if (!zurueckzeit && (sw==16)) {
        zurueckzeit=Gettime()+1500; // Aktuelle Zeit plus x millisek. zurueck
        MotorSpeed(0,0);
        MotorDir(RWD,RWD);
        MotorSpeed(90,150);
        BackLED(ON,OFF);
        }
    
        if (!zurueckzeit && (sw==2)) {
        zurueckzeit=Gettime()+1500; // Aktuelle Zeit plus x millisek. zurueck
        MotorSpeed(0,0);
        MotorDir(RWD,RWD);
        MotorSpeed(150,90);
        BackLED(OFF,ON);
        }
    
        if (!zurueckzeit && (sw==1)) {
        zurueckzeit=Gettime()+750; // Aktuelle Zeit plus x millisek. zurueck
        MotorSpeed(0,0);
        MotorDir(RWD,RWD);
        MotorSpeed(150,90);
        BackLED(OFF,ON);
        }
    
        if (zurueckzeit && (Gettime() > zurueckzeit)) { // Lange genug zurueck?
        zurueckzeit=0;
        MotorSpeed(0,0);
        MotorDir(FWD,FWD);
        MotorSpeed(150,150);
        BackLED(OFF,OFF);
        FrontLED(OFF);
        }
    
        if (Gettime() > timeout) { // wir stecken fest :-(
        zurueckzeit=Gettime()+750;
        MotorSpeed(0,0);
        MotorDir(RWD,RWD);
        MotorSpeed(0,150);
        BackLED(ON,ON); // Mit voller Beleutung zurueck, etwas Show muss sein ;-)
        FrontLED(ON);
        }
    
        if (zurueckzeit) timeout=Gettime()+7000; // abhängig vom Gelände ;-)
    
    }while (1); // mainloop (Endlosschleife)
    
        return 0;
    }
    Neue Funktion:

    Der asuro flipt aus wenn er sich festfährt.

    Ich bin der Herr und er ist der Knecht!

    Gruß

    mic

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Unglaublich! Nach ein paar Minuten blieb er hier stecken:

    Bild hier  
    Vollbild

    Ich muss das nochmal überdenken....

    (Sorry für die miese Dokumentation, aber meine Videocam schläft leider schon)

    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!

  4. #4
    Dies hat nun nichts mit Software zu tun.
    Es ist ein echtes Hardware (konstruktives) Problem des Asuro. Der Einfachheit halber wurden nur die 6 Schalter verbaut, so daß er an manchen Stellen "gefühllos" ist. Ich bin gerade dabei, eine Mechanik zu bauen und zu optimieren, welche diese Probleme vermeidet.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    04.01.2007
    Beiträge
    26
    Ich hab mal im Forum ein Programm gesehen, da wurde das Problem gelöst.
    Da erkannte der Asuro mittels Odometrie, ob er sich "festgefahren" hat oder nicht.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    27.12.2006
    Beiträge
    10
    Ja, das ist ganz einfach, hab ich auch schon implementiert. Einfach messen, ob die Geschwindigkeit sehr stark unter den Normalwert fällt.

    Storchi hat das glaub ich mal geschrieben.

  7. #7
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    heyho,

    erstmal: bitte nicht so riesige bilder posten!!

    dann: es gibt hier im forum eine methode, die unabhängig von den tastern die kollision abgefragt wird (über die odometrei werte). sucht mal. diese funktion funktioniert nämlich auch, wenn keinder der taster erwischt wurde und auch zB rückwärts.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Danke für die Anteilnahme, dass mit der Bildgröße tut mir leid, es war schon spät..

    Natürlich geht das alles besser, wurde schon zig mal gemacht und die Programme stehen irgendwo im Forum zum Download bereit. Aber ich habe mir den asuro zugelegt weil ich das selbst machen möchte, zum einen, weil ich etwas c lernen möchte und zum anderen weil ich das Programmieren mit mangelhafter Hardware liebe (im Ernst!).

    Da ich ja noch Anfänger bin, mir aber die "Sleep(xxx) und tu solange nichts"-Programme gar nicht gefallen und ich meinen asuro noch beschnuppere sind meine Programme noch bescheiden. Aber immerhin klappt nun meine Tastenabfage zuverlässig und meine Programme laufen als Loop ohne Warteschleifen (noch ohne Interrupts). Das ist schon mal ok nach der kurzen Zeit. Und bevor ich mich auf pulsbreitenmodulierte Drehzahl- und Lageregelungen stürzte möchte ich erst noch die restliche Sensorik austesten.

    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!

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.147
    Blog-Einträge
    3
    Storchi hat das glaub ich mal geschrieben.
    Stimmnt, ich war's: https://www.roboternetz.de/phpBB2/vi...c.php?p=214058

    Der Sourcecode befindet sich im Thread.

    Mein Nickname ist allerdings sto-chri und hat nix mit einem Storch zu tun....

    Gruß,
    stochri

  10. #10
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    stochri hat auch die Methode der Mehrfachabfrage der Taster schon vor zwei Jahren beschrieben. Danke an dieser Stelle.

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test