Dies ist ein kleines Experiment mit einem Zentrifugalregler, wie er von Dampfmaschinen bekannt ist. Die Fliehkräfte drücken die sich drehenden Stangen nach außen. Der Spreizwinkel wächst mit der Drehzahl (nicht linear).

Da die Hebelkräfte bei der leichten Konstruktion nicht für den Winkelsensor oder den Drucksensor ausreichen, kommt wieder einmal der Lichtsensor zum Einsatz (Wie bei der Briefwaage). Die herumschleudernden Stangen sind hell, so dass der Lichtsensor sie erkennen kann, wenn der Untergrund Dunkel ist. Nun misst der Lichtsensor recht schnell und daher nur ganz gelegentlich wenn gerade eine helle Stange vorbeischleudert. Um trotzdem, mit Sicherheit die vorbeifliegenden Stangen zu erkennen, werden schnell 100 Messung hintereinander gemacht, und das Maximum der Messgruppe genommen.

Der Regelkreis erhöht die Drehgeschwindigkeit, wenn der gemessenen Lichtwert unter einem Grenzwert ist und verringert sie, wenn ein anderer Grenzwert überschritten wird. Der Lichtsensor kann (ungefähr) radial verstellt werden, um den Winkel zu verändern, bei dem die Stangen ins Blickfeld schleudern. Je weiter der Lichtsensor von der Drehachse entfernt ist, desto schneller müssen die Stangen gedreht werden, um vom Sensor gesehen zu werden.

Das Verhalten des Regelkreises wird graphisch ausgegeben. Die obere Kurve auf der NXT Anzeige zeigt den gemessenen Lichtwert, die untere Kurve die Leistungseinstellung für den Motor. In dem gezeigten Bild wurde der Lichtsensor von weit außen nach innen geschoben.

NXC Quelltext:

 
    
#define RAD OUT_A
#define LICHT IN_1
#define X_MAX 99
#define Y_MAX 63
#define LICHT_GRENZWERT_UNTEN 140
#define LICHT_GRENZWERT_OBEN 150
#define MOTOR_MAX 60
#define LEISTUNG_SCHRITT 1

inline void plotLine(int x, int value)
{
  int yValue=value/10;
  PointOut(x,yValue);
}
inline void plotSpeed(int x)
{
  int yValue=MotorActualSpeed(RAD);
  PointOut(x,yValue);
}
inline int getLicht()
{
  int lichtMax=0;
  int zaehler=0;
  do
  {
    Wait(1);
    zaehler++;
    int lichtJetzt=Sensor(LICHT);
    if (lichtMax<lichtJetzt)
    {
       lichtMax=lichtJetzt;
    }
  } while (zaehler<100);
  return lichtMax;
}
task main ()
{
     int i=0;
     ClearScreen();
     SetSensorType(LICHT,IN_TYPE_LIGHT_ACTIVE);
     SetSensorMode(LICHT,IN_MODE_RAW);
     ResetSensor(LICHT);
     int motorLeistung=0;
     do
     {
         Wait(100);
         i++;
         int licht=getLicht();
         plotLine(i,licht);
         plotSpeed(i);
         if (licht< LICHT_GRENZWERT_UNTEN 
             && motorLeistung < MOTOR_MAX)
         {
           motorLeistung += LEISTUNG_SCHRITT;
           OnFwd(RAD,motorLeistung);
         }
         if (licht> LICHT_GRENZWERT_OBEN 
           && motorLeistung > LEISTUNG_SCHRITT)
         {
           motorLeistung -= LEISTUNG_SCHRITT;
           OnFwd(RAD,motorLeistung);
         }
         if (i==X_MAX)
         {
           i=0;
           ClearScreen();
         }
     } while (true);
}