-         

Ergebnis 1 bis 4 von 4

Thema: Nibobee Ping Pong! WAS ist denn das???

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    23.10.2010
    Beiträge
    23

    Nibobee Ping Pong! WAS ist denn das???

    Anzeige

    hallo,
    ich versuche das Programm PingPong (S.27-29) zu kapieren

    aber irgendwie sind die Erklärung ein bisschen zu kurz bzw. zu ungenau (da ich auch ein fast absolute anfänger bin!!!)

    Kann mir jemand das Programm ein bisschen näher erläutern?


    Ich habe das Programm auch kompliiert und die rechte gelbe LED (LED3) von den biene leuchtet auf und es reagiert gar nicht wenn ich auf den Fühler drücke. das macht mich irgendwie noch mehr verwirrt,

    Für was ist eigentlich das Programm???


    danke im voraus

    gruß,
    vnrobot1

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.11.2009
    Alter
    24
    Beiträge
    474
    Blog-Einträge
    4
    das ist ein recht sinnfreies "spiel".
    die leuchtende led verkörpert den ball. wenn du den fühler auf der seite wo der ball ist zurückziehst und schnalzenlässt bewegt sich der "ball" auf die andere seite. und so weiter und so fort.
    hoffe das war verständlich
    ein demoprogramm halt nichts sinnvolles.
    mfg Sebastian

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    23.10.2010
    Beiträge
    23
    achso, das ist der "Funktion" von das Programm
    danke Sebas,

    aber ich verstehe den code immer noch nicht?
    Kann mir vielleicht jemand den code stück für stück erklären?
    Hier ist der code:

    Code:
    #include <nibobee/iodefs.h>
    #include <nibobee/led.h>
    #include <nibobee/sens.h>
    #include <nibobee/delay.h>
    enum {
      STATE_IDLE  = 0,
      STATE_PULL0 = 1,
      STATE_PULL1 = 2,
      STATE_KICK  = 3,
      STATE_PUSH  = 4
    };
    uint8_t calculate_state(uint8_t state, int8_t sensor) {
      switch (state) {
        case STATE_PUSH:
        case STATE_IDLE:
          if (sensor==-1) {
            return STATE_PULL0;
          } else if (sensor==+1) {
            return STATE_PUSH;
          }
          return STATE_IDLE;
    
        case STATE_PULL0:
          if (sensor==-1) {
            return STATE_PULL1;
          } else if (sensor==+1) {
            return STATE_PUSH;
          }
          return STATE_IDLE;
    
        case STATE_PULL1:
          if (sensor==-1) {
            return STATE_PULL1;
          }
          return STATE_KICK;
    
        case STATE_KICK:
          return STATE_IDLE;
      }
      return state;
    }
    int main() {
      led_init();
      sens_init();
      uint8_t ball_pos = 3;
      int8_t direction = -1;
      uint8_t state_l = STATE_IDLE;
      uint8_t state_r = STATE_IDLE;
      while(1==1) {
        delay(100);
        state_l = calculate_state(state_l, sens_getLeft());
        if( ((state_l==STATE_PUSH) && (ball_pos==1)) ||
             ((state_l==STATE_KICK) && (ball_pos==0)) ) {
          direction = +1;
        }
        state_r = calculate_state(state_r, sens_getRight());
        if( ((state_r==STATE_PUSH) && (ball_pos==2)) ||
             ((state_r==STATE_KICK) && (ball_pos==3)) ) {
          direction = -1;
        }
        if(direction==+1) {
          if(ball_pos<3) {
            ball_pos++;
          } else {
            direction=0;
          }
        }
    
        if(direction==-1) {
          if(ball_pos>0) {
            ball_pos--;
          } else {
            direction=0;
          }
        }
        led_set(LED_L_YE, ball_pos==0);
        led_set(LED_L_RD, ball_pos==1);
        led_set(LED_R_RD, ball_pos==2);
        led_set(LED_R_YE, ball_pos==3);
      }
      return 0;
    }
    Woher kommt diese Zustandsautomaten, wurde es in das Programm irgendwie definiert
    Und was soll den das ganze "case STATE_..." ?

    Ich hoffe ihr könnt mir dabei weiterhelfen

    danke im voraus

    mfg
    vnrobot
    Geändert von radbruch (09.08.2011 um 12:13 Uhr) Grund: Code-Tags eingefügt

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

    ...es reagiert gar nicht wenn ich auf den Fühler drücke.
    Die Schalter der Fühler sind nicht optimal aufgebaut:
    http://www.roboternetz.de/community/...l=1#post435341

    Zur Funktionsweise des Ping-Pong kannst du ja mal beim Entwickler nachfragen:

    http://www.roboter.cc/index.php?opti...u=21&Itemid=20

    Vielleicht kann er die fehlenden Kommentare für das Programm nachliefern. Früher hatte er hier auch mitgelesen...

    Gruß

    mic

    [Edit]
    Ich habe mal versucht das Programm zu kommentieren. Ohne Gewähr:
    Code:
    // PingPong für die bee aus den Tutorial                                 9.8.2011 mic
    
    // Umformatiert und kommentiert von mic :)
    
    // Spielbeschreibung:
    
    // Mit den Fühlern kann man den virtuellen Ball ins Spiel bringen oder zurückschlagen.
    // Eingeworfen wird durch das Ziehen am Fühler und anschliesendem Loslassen des Fühlers
    // (ähnlich wie die Startvorrichtung beim Flipper).
    
    // Zurückschlagen kann man den Ball, wenn man gegen den Fühler drückt, wenn sich der Ball
    // eine Position vor der Endlage des jeweiligen Fühlers befindet.
    
    #include <nibobee/iodefs.h>
    #include <nibobee/led.h>
    #include <nibobee/sens.h>
    #include <nibobee/delay.h>
    
    // Die statemachine schaltet den Status weiter
    // Es werden 5 Zustände definiert die für jede Seite getrennt weitergeschaltet werden:
    
    enum {
      STATE_IDLE  = 0, // nichts zu tun
      STATE_PULL0 = 1, // Fühler wurde nach außen gezogen (Ball drückt von innen auf Fühler)
      STATE_PULL1 = 2, // Ball drückt immer noch bedeutet kein Prellen am Konkakt
      STATE_KICK  = 3, // Fühler ist wieder frei (nicht mehr gedrückt oder gezogen)
      STATE_PUSH  = 4  // Fühler wurde von außen nach innen gedrückt
    };
    
    uint8_t calculate_state(uint8_t state, int8_t sensor)
    {
      switch (state)
      {
        case STATE_PUSH:           // Volleyreturn
    
        case STATE_IDLE:           // rumlungern und warten bis "Sensor" betätigt wird
          if (sensor==-1)
    		{
            return STATE_PULL0;    // "sensor" meldet "Fühler gezogen", weiter mit Entprellen 1
          }
    		else if (sensor==+1)
    		{
            return STATE_PUSH;    // "sensor" meldet "Fühler gedrückt", zurückschlagen möglich?
          }
          return STATE_IDLE;
    
        case STATE_PULL0:         // Beim zweiten Aufruf von calculate_state() ist der
          if (sensor==-1)
    		{
            return STATE_PULL1;   // Fühler immer noch gezogen, deshalb weiter mit warten auf loslassen
          }
    		else if (sensor==+1)
    		{
            return STATE_PUSH;    // inzwischen hat der Status des Fühlers gewechselt, zurückschlagen möglich?
          }
          return STATE_IDLE;
    
        case STATE_PULL1:        // Warten auf loslassen
          if (sensor==-1)
    		{
            return STATE_PULL1;  // Fühler immer noch gezogen
          }
          return STATE_KICK;     // Ball abgeschossen
    
        case STATE_KICK:         // Einwerfen fertig
          return STATE_IDLE;
      }
      return state;
    }
    
    int main(void)
    {
      led_init();
      sens_init();
    
      uint8_t ball_pos = 3;          // Startposition ist rechts und
      int8_t direction = -1;         // Richtung ist nach links: Lauflicht beim Einschalten
      uint8_t state_l = STATE_IDLE;  // Statusspeicher für beide Seiten
      uint8_t state_r = STATE_IDLE;  // dummystatus ist idle
    
      while(1==1)
      {
        delay(100);
    
        state_l = calculate_state(state_l, sens_getLeft()); // Status für linken Fühler berechnen
        //  Status           Zurückschlagen         oder                  Einwerfen?
        if( ((state_l==STATE_PUSH) && (ball_pos==1)) || ((state_l==STATE_KICK) && (ball_pos==0)) )
    			{
          direction = +1; // Dann soll Ball nach rechts fliegen
        }
    
        state_r = calculate_state(state_r, sens_getRight()); // Status für rechten Fühler berechnen
        //  Status           Zurückschlagen         oder                  Einwerfen?
        if( ((state_r==STATE_PUSH) && (ball_pos==2)) || ((state_r==STATE_KICK) && (ball_pos==3)) )
    			{
          direction = -1; // Dann soll Ball nach links fliegen
        }
    
        if(direction==+1) // wenn Richtung nach rechts...
    	 {
          if(ball_pos<3)  // und rechts noch nicht erreicht wurde, dann...
    		{
            ball_pos++;   // weiter nach rechts wandern
          }
    		else            // aber wenn schon rechts angekommen
    		{
            direction=0;  // dann keine Richtung setzen
          }
        }
    
        if(direction==-1) // wenn Rinchtung nach links...
    	 {
          if(ball_pos>0)
    		{
            ball_pos--;
          }
    		else
    		{
            direction=0;
          }
        }
    
    // Darstellung des "Balls". Von Hinten (Akkuseite) betrachtet ist Pos0 links und Pos3 rechts
    
    // led_set() erwartet als ersten Parameter die Nummer der LED (0-3) Diese werden indirekt
    // über led.h und iodefs_nibobee.h definiert:
    
    // enum {                            // aus led.h
    //   LED_L_YE = IO_LEDS_BIT_L_YE,
    //   LED_L_RD = IO_LEDS_BIT_L_RD,
    //   LED_R_RD = IO_LEDS_BIT_R_RD,
    //   LED_R_YE = IO_LEDS_BIT_R_YE
    // };
    
    /*! LED group */                    // aus iodefs_nibobee.h
    // #define IO_LEDS_PORT  PORTB
    // #define IO_LEDS_MASK  0x0f
    // #define IO_LEDS_DDR   DDRB
    // #define IO_LEDS_BIT_L_YE 0
    // #define IO_LEDS_BIT_L_RD 1
    // #define IO_LEDS_BIT_R_RD 2
    // #define IO_LEDS_BIT_R_YE 3
    
    // zweiter Parameter ist eigentlich vom Typ Boolean und kann deshalb true oder false sein
    // True schaltet die betreffende LED an, false schltet sie aus
    
        led_set(LED_L_YE, ball_pos==0); // wenn ball_pos==0 ergibt true wenn ball-pos 0 ist (links)
        led_set(LED_L_RD, ball_pos==1);
        led_set(LED_R_RD, ball_pos==2);
        led_set(LED_R_YE, ball_pos==3); // wenn ball_pos==3 ergibt true wenn ball-pos 3 ist (recht)
      }
      return 0; // wird nie erreicht
    }
    
    // ich hoffe, das passt so ;)
    Geändert von radbruch (09.08.2011 um 14:13 Uhr)

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

Ähnliche Themen

  1. 2 Quadrokopter spielen Ping-Pong
    Von meddie im Forum Vorstellungen+Bilder von fertigen Projekten/Bots
    Antworten: 1
    Letzter Beitrag: 21.07.2011, 21:13
  2. Ping Pong umprogrammieren?
    Von bnitram im Forum C - Programmierung (GCC u.a.)
    Antworten: 23
    Letzter Beitrag: 27.02.2011, 15:15
  3. Spiel Ping Pong bei Conrad mit Mega8 & 120LEDs
    Von chr-mt im Forum AVR Hardwarethemen
    Antworten: 9
    Letzter Beitrag: 08.08.2010, 20:19
  4. ping-pong-anfang mit fbas-signal und atmega32 8mhz
    Von purebasic im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 14.01.2008, 15:03

Berechtigungen

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