Go Down

Topic: project USB Controle (Read 936 times) previous topic - next topic

Skall

Bonjour à tous.

J'ai commencé il y a quelque temps un projet dont le but est de faciliter la création d'applications .net capables de gérer les ressources d'une carte Arduino.

Mon projet commence à être pas mal aboutit, donc j'ai commencé l'écriture d'un article sur ce que j'ai fait :
http://www.arduino.cc/playground/Fr-projets/Fr-UsbControle

Ce thread permettra d'échanger idées et remarques à propos de ce projet...

L'état actuel du projet :
La partie embarquée fonctionne, et implémente le protocole décrit dans l'article.
Le contrôle .net principal, ayant pour but de gérer la carte fonctionne.
Des contôles supplementaire permettant de gérer des entrées/sorties sont faits :
- Un controle de type "trackbar" (sorte de curseur) permet de gérer la valeur de sortie d'un Digital output.
- Un controle de type "label" permet d'afficher la valeur d'un entrée (analogique ou digitale).
- Un controle de type "progressbar" permet d'afficher la valeur d'un entrée analogique sous forme d'une barre de progression
- Un controle de type "led" permet de contrôler l'état d'une sortie digital ToR (tout ou rien), avec la particularité d'afficher un rond dont la couleur dépend de l'état envoyé à la sortie. Cela permet en gros d'avoir à l'écran l'état réel de la led.

Reste à faire :
- Nettoyer le code et ajouter plus de commentaires
- Packager le tout pour pouvoir en faire profiter la communauté
- De la doc
- Plus de contrôles
- Elargir le protocole en y ajoutant des ordres.
- ...

Skall

#1
Feb 22, 2008, 09:36 pm Last Edit: Feb 22, 2008, 09:59 pm by Skall Reason: 1
Voici un article sur mon blog :
http://pbuirey.aliceblogs.fr/blog/_archives/2008/2/2/3502084.html

J'y ai mis une première version de mes softs : la partie embarquée et la partie PC écrite en C#.

Il faut encore que je documente tout ca, en particulier la partie C#, mais globalement, c'est de la prog evenementielle.

La base, c'est le controle ArduinoCtrl.
Ce controle instancie :
1 objet de type SerialAcquisitionModule
1 tableau de 14 objets de type DigitalIO
1 tableau de 6 objets de type AnalogIO

Principe de fonctionnement :

Receptions de données issues la carte par le port série :
Quand l'objet de type SerialAcquisitionModule recoit des données, il declenche un evenement DataAcquisition. Cet événement, implementé par ArduinoCtrl recupére les données, et "parse" le message reçu. On regarde s'il s'agit d'une DI ou d'une AI, et de quelle pin il s'agit. Une fois qu'on a identifié l'objet concerné (disont qu'il s'agisse d'une DI) , on appelle la  methode readValue sur l'objet de la DI en question. Cette méthode lit la valeur, et modifie la valeur interne à la DI. Si la valeur a effectivement changée, l'objet DI, à son tour, déclenche un evenement : onHardValueChange. Cette evenement remonte directement au composant qui sert à gérer la DI qui vient de s'activer (ex un label, un trackbar, ...)

Envoie de données par la carte :
Supposons qu'un utilisateur fasse bouger un trackbar qui est liée à une sortie (DO) PWM.
Le composant va récupérer la nouvelle valeur de la trackbar, et affecter cette valeur à l'objet DO auquel il est attaché. Lorsqu'on change sa valeur de cette facon, l'objet DO va declencher un evenement onSoftValueChange qui sera attrapé par le controle arduinoCtrl. Le gestionnaire de cet evenement crée une chaine de caratere correspondant au message à envoyer à la carte, et appeler la methode writeValue de l'objet SerialAcquisitionModule. Cette méthode va simplement écrire le message sur le port série.

Je ne suis pas sur que ma description soit facile à suivre, si j'arrive à trouver le temps, j'essairai de faire un schéma...

a suivre...
Pascal

Skall

#2
Feb 28, 2008, 11:16 pm Last Edit: Feb 29, 2008, 03:13 pm by Skall Reason: 1
ca maaaarche !!!!!
ce soir, j'ai recu ma commande, avec un capteur de distance 4-30cm...
ce capteur est un GP2D120 de chez sharp : http://www.robopolis.com/produit/1887/72/Capteurs/Capteur-de-distance-IR---GP2D120.php
Il s'alimente en 5v, et sort une tension entre 0.4v et 2.65V quasiment proportionnelle à la distance de l'objet detecté.

Je l'ai interfacé avec mon systeme de commande via le PC, et piloté mon "bras" robot...
résultat : quand je place un objet pres du bras, il ouvre sa pince, se baisse, ferme la pince, et se releve tout seul...

les lignes de code C# pour le faire :

         AnalogInput datapoint = ((AnalogInput)sender);
       /*si l'objet est assez pres*/
         if (datapoint.Value > 512)
         {
             /*desactive le capteur pour que la pince ne le declenche pas*/
             datapoint.pinMode = IOPinMode.IGNORE;

             /*allume une led indiquant qu'un objet a été detecté*/
             arduinoLED1.TurnOn();

             /*ouvre la pince*/
             arduinoServo2.SetValue(30);
             System.Threading.Thread.Sleep(1000);
             /*baisse la pince*/
             arduinoServo1.SetValue(30);
             System.Threading.Thread.Sleep(1000);
             /*referme la pince*/
             arduinoServo2.SetValue(120);
             System.Threading.Thread.Sleep(1000);
             /*releve la pince*/
             arduinoServo1.SetValue(90);

         }

simple, non  ?

j'essairai de faire une petite video demain...

Skall

voici une photo du systeme :

on y voit les 2 servos, et le capteur de distance GP2D120 sous la pince.

et voici la chose en action : http://video.google.com/videoplay?docid=8904327928604384045&hl=en

Skall

j'ai fait un nouveau bras avec 5 servos  8-)
http://video.google.com/videoplay?docid=-5095037340452473619

pour la partie soft, je n'ai rien changé a la partie embarquée, et avec mes controles .net en C#, ca m'a pris
moins de 2 minutes pour avoir 5 trackbars qui controlent chacune un servo...

Go Up