The NeceMoon | Phidgets : Premiers Pas En Robotique ?

Phidgets : Premiers Pas En Robotique ?

by necemon 13. June 2012 21:33

 

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 ou 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 ya différents distributeurs officiels phidgets répartis à travers le monde. Par exemple, pour ceux qui habitent 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 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 adequat. 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. le Windows Installer (32-bit)
3. Exemple 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 directionelles.

Tout d'abord, nous avons créé un nouveau 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 leur é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 une nouvelle balle à 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 tot.

 

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 balles étant tirées de l'avion. Les valeurs du capteur de force sont également obtenue 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;

                }

            }

(source image robotique: geminiedu.in)

Tags: , , , ,

Francais | Prototype | Technical

blog comments powered by Disqus

About

Necemon

I am Necemon Yai. I am a .NET developer and a digital artist. Let's keep in touch via Twitter, LinkedIn or Facebook.

Je suis Necemon Yai. Je suis un développeur .NET et un artiste numérique. Restons en contact via Twitter, LinkedIn ou Facebook.