Würfeln

ftComputing : Programme für die fischertechnik-Interfaces und -konstruktionskästen
  
ftComputing.de
Home
Back
Sitemap
Index
Links
Impressum
Mail
 

Würfeln : 8 Lampen an einem Interface

Lampen werden an die M-Ausgänge eines Interfaces angeschlossen, da sie aber nur ein- und ausgeschaltet werden müssen, kann man auf die Umpolung beim Schalten der M-Ausgänge verzichten Würfel auf Brett in Action :

ein Lampen-Pol an einen M-Ausgang-Kontakt und ein Lampen-Pol an Masse

Die Masse ist eine einzelne Buchse, beim Intelligent Interface über der LED, beim Universal Interface ganz rechts im Buchsenfeld. Der Anschluß des zweiten Pols erfolgt nach dem Schema 
Lampe 1 : M1 Vorn, Lampe 2 : M1 Hinten (Universal Interface).
Lampe 1 : M1 Hinten, Lampe 2 : M1 Vorn (Intelligent Interface).

Am einfachsten können so angeschlossene Lampen über den Befehl SetLamp(n) angesprochen werden. Beim Intelligent Interface ist zu beachten, daß die Lampen AN sind, wenn der Ausgang nicht geschaltet ist. Hier sollte man SetMotors &HFFFF zum Ausschalten aller Lampen gleich nach dem OpenInterface einsetzen (beim Unversal Interface : ClearMotors). Außerdem gibt es unterschiedliche Bauzustände des Intelligent Interface (gearbeitet wurde mit Softwarestand V2.10 vom 25.8.97). Man sollte da vorsichtig anfangen.

Hier ein Modell dazu, das mit Visual Basic und FishFa30.DLL/umFish30.DLL (vbFish30Setup.EXE) betrieben wird, das Programm selber ist in Wuerfel.ZIP verpackt :

Würfel Modell

 

Private Sub Action()

Dim i&, j&, n&, m&

  n = 0
  m = 0
  Do
    For j = 1 To 10
      i = Int(Rnd * 6) + 1
      n = n + 1
      m = m + i
      If cboPortName.Text = "LPT" _
         Then ft.SetMotors Wuerfel(i) _
         Else ft.SetMotors Not Wuerfel(i)
      ft.Pause 123
    Next j
    lblStatus = "Geworfen wurde eine : " & i
    imgWuerfel(i - 1).Visible = True
    ft.Pause 3333
    imgWuerfel(i - 1).Visible = False
  Loop Until ft.Finish()
  If cboPortName.Text = "LPT" Then ft.ClearMotors _ 
                              Else ft.SetMotors &HFF
  lblStatus = "Das ist im Schnitt eine : " & _
              Format$(m / n, "0.0")

End Sub

Das Programm ist eigentlich recht einfach (es basiert auf dem Template ftcomputing30), das meiste ist "SchnickSchnack". Interessant ist der Befehl : 

ft.SetMotors Wuerfel(i)

mit dem die Augen des Würfels angezeigt werden, man könnte es natürlich auch mit einer Serie von ft.SetLamp Befehlen tun, aber so ist es bedeutend einfacher, wenn man erstmal die Tabelle Dim Wuerfel(1 To 6) erstellt und verstanden hat. Hier werden alle Lampen mit einem Schlag geschaltet (an und aus) :

Der Reihe nach :

Eine einzelne Lampe wird mit SetMotors MotorStatus durch Setzen des zugehörenden bits in MotorStatus geschaltet.

Lampe Hexa binär
1 01  00 00 00 01
2 02  00 00 00 10
3 04  00 00 01 00
4 08  00 00 10 00
5 10  00 01 00 00
6 20  00 10 00 00
7 40  01 00 00 00

 Dabei sind die Lampen folgendermaßen auf dem Modell angeordnet :

6   7
3 4 5
1   2
 

Will man nun mehrere Lampen gleichzeitig schalten, so sind die zugehörenden 1er bits im MotorStatus im entsprechend zu arrangieren (durch OR zu verknüpfen) z.B. für eine Würfelanzeige mit 3 Augen :

Lampe   1 00 00 00 01
        4 00 00 10 00
OR      7 01 00 00 00
---------------------
hexa 49   01 00 10 01

In der Tabelle Wuerfel(3) muß dann also &H49 stehen (bei VC++ 0x49).

Da das Intelligente Interface das alles umgekehrt macht, ist dieser Wert dort mit NOT entsprechend zu "verwursteln" :

NOT 49 = B6 = 10 11 01 10

Im Code ist deswegen auch eine entsprechende Abfrage :

      If cboPortName.Text = "LPT" Then ft.SetMotors Wuerfel(i) _
         Else ft.SetMotors Not Wuerfel(i)

Das wars.


Mir ging ein Hinweis zum Intelligent Interface zu :

Anstelle des Masseanschlusses kann man auch den Plus-Pol (links außen) nehmen. Vorteil : es wird dann nicht invertiert. Läuft dann also wie beim Universal Interface. Im Wuerfel-Programm kann die Abfrage If cboPortName ... entfernen und nur den True-Zweig verwenden. (Statt If .... also nur noch ft.SetMotors Wuerfel(i) bzw. ClearMotors). Nachteil : der Befehl SetLamp funktioniert dann (vorerst) nicht.


ft.SetMotors(new int[] { 0x8, 0x41, 0x49, 0x63, 0x6B, 0x77 }[new Random().Next(1, 6)]);

Eine modernere Version des gleichen Programmes in C# 2008 und für das ROBO Interface :

public {

  FishFace ft = new FishFace();

  int[] Wuerfel = { 0x8, 0x41, 0x49, 0x63, 0x6B, 0x77 };

  Random rnd = new Random();

  private void Action() {

    float summe = 0;

    int anz = 0;

    int w;

    do {

      w = rnd.Next(1, 7);

      anz++;

      summe += w;

      lblWurf.Text = w.ToString();

      lblStatus.Text =

      String.Format("Mittelwert : {0:0.00} / {1:0} Werte"

                    summe / anz, anz);

      ft.SetMotors(Wuerfel[w - 1]);

      ft.Pause(2222);

    } while (!ft.Finish());

    lblWurf.Text = "0";

  }

......

Hier läuft das Programm in einer Endlos-Runde, Abbruch durch HALT oder ESC-Taste.

Die Überschriftszeile enthält übrigens die im Programm über mehrere Zeilen verteilten für die Zufallsanzeige auf dem ROBO Interface in einer einzigen Zeile.

Stand : 09.02.2009