Phidgets sind Bausteine, billige elektronische Bauteile, die Sie über einen USB-Anschluss von Ihrem Heimcomputer aus steuern können. Sie bieten einige zusätzliche Möglichkeiten der Dateneingabe und -ausgabe, die über die klassische Kombination Maus + Tastatur + Bildschirm hinausgehen.

Wie Harold Thimbleby in seinem Buch Press On schreibt, sind Phidgets ein sehr praktischer Einstieg in die Hardwareprogrammierung, wenn man reale Systeme bauen will, keine Web- oder Bildschirmsimulationen: Phidgets werden so genannt, weil sie das physische Äquivalent zu den Widgets auf dem Bildschirm (Windows Gadgets) sind.
Phidgets = physisch + Widgets
(Widgets = Windows + Gadgets) Wo findet man sie? Es gibt verschiedene offizielle Phidget-Vertriebsstellen auf der ganzen Welt. In Frankreich können Sie z.B. die Webseite von RoboShop Europe besuchen. Beginnen Sie mit der Manipulation/Programmierung von Phidgets. Die gesamte USB-Komplexität wird hinter der API (Application Programming Interface) verwaltet. Anwendungen können schnell von Programmierern in ihrer bevorzugten Sprache entwickelt werden: C / C + +, C#, Kakao, Delphi, Flash AS3, Flex AS3, Java, LabVIEW, MATLAB, Max / MSP, MRS, Python, REALBasic, Visual Basic.NET, Visual Basic 6.0, Visual Basic for Applications, Visual Basic Script, Visual C / C + + / Borland.NET, etc. (Wenn Sie nicht programmieren können, können Sie eine Software wie Microsoft Robotics Studio oder sogar Microsoft Excel verwenden.) Alles, was Sie brauchen, sind die Treiber, die Sie durch Herunterladen des entsprechenden Installers erhalten. Von hier aus können Sie auch auf die verschiedenen Handbücher, Beispiele und die API zugreifen.

Als C#-Entwickler brauchen Sie beispielsweise nur die folgenden Ressourcen herunterzuladen und können sofort loslegen:
1. Startup-Handbuch
2. Windows Installer 
3. Code-Beispiele Ein praktisches Beispiel Ich möchte Ihnen das Quick-&-Dirty-Pad vorstellen (bis mir ein besserer Name einfällt), einen „Game-Controller“, den ich zusammen mit meinem Partner Daniel Williams gebaut habe, als wir an der Universität in der Klasse für Interaktionstechnologie waren, die von Parisa Eslambolchilar geleitet wurde.

Ja, ich weiß, das ist nicht so toll, aber irgendwo muss man ja anfangen...

Wir benutzten es hauptsächlich, um mit einem Flugsimulationsspiel zu arbeiten, das wir programmiert hatten. Wir verwendeten Kraftsensoren zum Schießen, einen Joystick zur Steuerung, RFID-Tags zur Benutzerauthentifizierung und einen Rotationssensor zur Steuerung der Spielgeschwindigkeit. Das Spielgeschehen wird durch einen LCD-Bildschirm und einige LED-Anzeigen transparent gemacht.

(Danke, dass Sie bis hierher gelesen haben. Der Rest ist nur für Freaks. Hier werden kurz die wichtigsten technischen Details besprochen).

Das Spiel selbst ist in C# geschrieben. Inspiriert wurde es durch ein XNA-Tutorial von Riemers. Eines der Schlüsselelemente des Codes ist das Navigationssystem:

if (keys.IsKeyDown(Keys.Right))

        leftRightRot += turningSpeed;

    if (keys.IsKeyDown(Keys.Left))

        leftRightRot -= turningSpeed;

    float upDownRot = 0;

    if (keys.IsKeyDown(Keys.Down))

        upDownRot += turningSpeed;

    if (keys.IsKeyDown(Keys.Up))

        upDownRot -= turningSpeed;

Das Flugzeug bewegt sich kontinuierlich vorwärts und der obige Code wird verwendet, um die Drehbewegungen zu steuern. Eine unserer Herausforderungen bestand darin, den Phidget-Code für den Joystick so in diesen Teil des Projekts zu integrieren, dass sich der Joystick wie die Richtungstasten verhält.

Zuerst haben wir eine neue Input-Wrapper-Klasse erstellt, die den Sensor-Manager enthält, der jede Änderung in der Bewegung des Joysticks erkennt. Die Input-Wrapper-Klasse implementiert das Kit-Interface-Objekt, das die Eingabe erkennt.

InputWrapper iw = new InputWrapper();

ifKit.SensorChange += new SensorChangeEventHandler(ifKit_SensorChange);

Der erste Abschnitt des folgenden Codes steuert die X-Achse des Joysticks. Die Ausgangswerte des Joysticks liegen zwischen 0 und 999, so dass jeder Wert über 500 die Ebene nach rechts dreht und jeder Wert unter 500 die Ebene nach links dreht. Der zweite Teil des Codes wird verwendet, um die Y-Achse des Joysticks zu steuern. In diesem Fall würde ein Wert über 500 die Ebene nach oben drehen, während ein Wert unter 500 die Ebene nach unten drehen würde

if(iw.XJoystick>550)

        leftRightRot = (iw.XJoystick-500)/10000;

    if (iw.XJoystick < 450)

        leftRightRot = (iw.XJoystick-500)/ 10000;

if (iw.YJoystick > 550)

        upDownRot = (iw.YJoystick - 500)/10000;

    if (iw.YJoystick < 450)

        upDownRot = (iw.YJoystick - 500) / 10000;

Auf dem LCD-Bildschirm werden der Name des Spielers und sein Punktestand angezeigt. Der Benutzer muss seine RFID-Karte scannen, um das Spiel zu starten. Wir haben LCD- und RFID-Wrapper geschrieben, die die verschiedenen Event-Handler enthalten. Die RFID-Klasse erkennt, ob ein Tag vorhanden ist, andernfalls erscheint eine Meldung auf dem LCD-Bildschirm, die den Benutzer auffordert, seinen Tag zu platzieren.

TextLCDWrapper tlw = new TextLCDWrapper();

   RFIDWrapper rw = new RFIDWrapper();

while (rw.tag == null || rw.tag.Length < 2)

        {

        tlw.JustTyped("Tag, Please!");

        }

Wenn der Benutzer seinen Tag scannt, erkennt der RFID-Sensor, ob der Benutzer angemeldet ist, und zeigt die entsprechende Meldung auf dem LCD-Bildschirm an.

 

Der Drehratensensor wird verwendet, um die Geschwindigkeit des Fahrzeugs zu kontrollieren. Wie bereits in der Beschreibung des Controllers erwähnt, werden die Werte des Rotationssensors von der Input Wrapper Klasse ermittelt. Je mehr man den Sensor dreht, desto höher ist die Geschwindigkeit.gameSpeed = iw.RotationValue/100;Der folgende Code erzeugt jedes Mal, wenn die Leertaste gedrückt wird, eine neue Kugel, vorausgesetzt, die vorherige Kugel wurde mindestens 100 Millisekunden zuvor abgefeuert.

if (keys.IsKeyDown(Keys.Space))

        {

    double currentTime = gameTime.TotalGameTime.TotalMilliseconds;

        if (currentTime - lastBulletTime > 100)

        {

        Bullet newBullet = new Bullet();

        newBullet.position = xwingPosition;

        newBullet.rotation = xwingRotation;

        bulletList.Add(newBullet);

        lastBulletTime = currentTime;

        }

        }

Unsere Aufgabe bestand darin, vier Sensoren zu implementieren, um die vom Flugzeug abgefeuerten Geschosse zu steuern. Die Werte der Kraftsensoren werden ebenfalls über die Klasse input wrapper ermittelt. Der folgende Code erzeugt nun jedes Mal, wenn die Kraftsensoren gedrückt werden, ein neues Geschoss vom Typ 3

if (keys.IsKeyDown(Keys.C) || iw.Force3 > 25)

        {

        //make the lights blink

        iw.ifKit.outputs[0] = (!iw.ifKit.outputs[0]);

        iw.ifKit.outputs[1] = (!iw.ifKit.outputs[1]);

        iw.ifKit.outputs[2] = (!iw.ifKit.outputs[2]);

        iw.ifKit.outputs[3] = (!iw.ifKit.outputs[3]);

        double currentTime = gameTime.TotalGameTime.TotalMilliseconds;

        //within a certain frequency

        if (currentTime - lastBulletTime > 300)

        {

        //Create the bullet and add it to the bulletlist

        Bullet newBullet = new Bullet();

        newBullet.position = xwingPosition;

        newBullet.rotation = xwingRotation;

        bulletList3.Add(newBullet);

        //play a sound

        soundEffect1.Play();

        lastBulletTime = currentTime;

        }

        }