- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 4 von 4

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

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    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:
    https://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 13:13 Uhr)
    Bild hier  
    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, 20:13
  2. Ping Pong umprogrammieren?
    Von bnitram im Forum C - Programmierung (GCC u.a.)
    Antworten: 23
    Letzter Beitrag: 27.02.2011, 14:15
  3. Spiel Ping Pong bei Conrad mit Mega8 & 120LEDs
    Von chr-mt im Forum AVR Hardwarethemen
    Antworten: 9
    Letzter Beitrag: 08.08.2010, 19: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, 14:03

Berechtigungen

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

Labornetzteil AliExpress