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 ;)
Lesezeichen