Les phidgets sont des blocs de construction, des composants électroniques pas cher que vous pouvez contrôler à partir de votre ordinateur personnel via un port USB. Ils vous donnent quelques méthodes supplémentaires d'entrée/sortie de données au-delà de la combinaison classique souris + clavier + écran.

Comme Harold Thimbleby l'a mentionné dans son livre Press On, les phidgets sont un moyen très pratique de débuter dans la programmation hardware, au cas où on veut construire des systèmes réels, et non pas des simulations Web ou sur écran: les phidgets sont appelés ainsi parce qu'ils sont l'équivalent physique des widgets de l'écran (gadgets Windows).
Phidgets = Physique + de Widgets
(Widgets = Windows + de Gadgets)

Où les trouver?

il y a différents distributeurs officiels phidgets répartis à travers le monde. Par exemple, pour ceux qui sont en France, vous pouvez consulter le site de RoboShop Europe.

Commencer la manipulation/programmation de phidgets

Toute la complexité USB est gérée derrière l'API (Application Programming Interface). Les applications peuvent être développées rapidement par les programmeurs en utilisant leur langage préféré: C / C + +, C#, cacao, Delphi, Flash AS3, Flex AS3, Java, LabVIEW, MATLAB, Max / MSP, MRS, Python, REALBasic, Visual Basic.NET, Visual Basic 6.0, Visual Basic pour Applications, script Visual Basic, Visual C / C + + / Borland.NET, etc. (Si vous ne savez pas programmer, vous pouvez cependant utiliser un logiciel tel que Microsoft Robotics Studio ou même Microsoft Excel). Tout ce dont vous avez besoin, ce sont les pilotes que vous pouvez obtenir en téléchargeant l'installateur adéquat. De même, vous pouvez accéder aux différents manuels, aux échantillons et à l'API à partir d'ici.

Par exemple, en tant que développeur C#, il suffit de télécharger les ressources suivantes et vous êtes prêt à démarrer:
1. Guide de démarrage
2. L'installateur Windows 
3. Les exemples de code

Un exemple pratique

Permettez-moi de vous présenter le Quick-&-Dirty-Pad (le temps que je pense à un meilleur nom), un "contrôleur de jeu" que j'ai construit avec mon partenaire Daniel Williams, alors que nous étions à l'Université, classe de technologies de l'interaction menée par le Docteur Parisa Eslambolchilar.

Oui je sais, ce n'est pas terrible, mais il faut bien commencer quelque part...

Nous l'avons utilisé principalement pour aller de pair avec un jeu de simulation de vol que nous avions programmé. Nous avons utilisé des capteurs de force pour le tir, un joystick pour l'orientation, des étiquettes RFID pour l'authentification d'utilisateur et un capteur de rotation pour réguler la vitesse du jeu. Les événements du jeu transparaissent à travers un écran LCD et quelques indicateurs LED.

(Merci d'avoir lu jusqu'ici. Le reste est pour les nerds seulement. C'est la partie où nous discutons brièvement les principaux détails techniques.)

Le jeu lui-même a été écrit en C#. Il est inspiré d'un tutoriel XNA de Riemers. Les éléments clés du code incluent le système de navigation:

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;

L'avion se déplace continuellement vers l'avant et le code ci-dessus est utilisé pour contrôler les mouvements de rotation. Un de nos défis a été d'intégrer le code Phidget pour le joystick dans cette partie du projet de telle sorte que le joystick se comporte comme les touches directionnelles.

Tout d'abord, nous avons créé un nouvel input wrapper, la classe qui contient le gestionnaire de capteurs pour détecter tout changement dans le mouvement de la manette. La classe input wrapper implémente l'objet interface kit qui détecte les entrées de données

InputWrapper iw = new InputWrapper();

ifKit.SensorChange += new SensorChangeEventHandler(ifKit_SensorChange);

La première section du code suivant contrôle l'axe X de la manette de commande. Les valeurs de sortie de la manette sont comprises entre 0 et 999, donc pour toute valeur supérieure à 500 le plan serait tourné  vers la droite et toute valeur inférieure à 500 le plan serait tourné vers la gauche. La deuxième partie du code est utilisé pour contrôler l'axe Y sur la manette de commande. Cette fois-ci une valeur supérieure à 500 tournerait le plan de sorte qu'il s'oriente vers le haut tandis que toute valeur inférieure à 500 ferait tourner le plan de sorte qu'il s'oriente vers le bas.

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;

L'écran LCD a été utilisé pour afficher le nom du joueur et son score. L'utilisateur doit scanner sa carte RFID pour démarrer le jeu. Nous avons écrit des wrappers LCD et RFID qui contiennent les différents gestionnaires d'événements. La classe RFID détecte si un tag est présent, sinon un message s'affiche sur l'écran LCD demandant à l'utilisateur de placer son tag

TextLCDWrapper tlw = new TextLCDWrapper();

   RFIDWrapper rw = new RFIDWrapper();

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

        {

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

        }

Lorsque l'utilisateur scanne son étiquette, le capteur RFID permet de détecter si l'utilisateur est enregistré, et afficher le message correspondant sur ​​l'écran LCD

private void DrawText()

    {

           if(rw.tag != null && rw.tag.EndsWith("cb"))

        {

        tlw.JustTyped("Necemon : " + score);

        spriteBatch.DrawString(font,"Necemon - score:" + score, newVector2(20, 45), Color.White);

        }

    else if (rw.tag != null && rw.tag.EndsWith("8a"))

        {

        tlw.JustTyped("Daniel : " + score);

        spriteBatch.DrawString(font,"Daniel - score:" + score, newVector2(20, 45), Color.White);

        }

    else if (rw.tag != null)

        {

        spriteBatch.DrawString(font, rw.tag + " - score:" + score, newVector2(20, 45), Color.White);

        tlw.JustTyped("Unknown : " + score);

        }

    }

Le détecteur de rotation est utilisé pour contrôler la vitesse de l'avion. Les valeurs du capteur de rotation sont obtenues par la classe input wrapper, comme mentionné précédemment dans la description de la manette. Plus vous tournez le capteur, plus la vitesse augmente

gameSpeed = iw.RotationValue/100;

Le code suivant crée un nouveau projectile à chaque fois que la barre d'espace est enfoncée à condition que la balle précédente ait été tirée au moins 100 millisecondes plus tôt.

 

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;

        }

        }

Notre tâche consistait à mettre en œuvre quatre capteurs pour contrôler les projectiles étant tirés de l'avion. Les valeurs du capteur de force sont également obtenues via la classe input wrapper. Le code suivant crée maintenant une nouvelle balle de type 3 à chaque fois que les capteurs de force sont pressés

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;

        }

        }