2 avril 2012
Pilotage d'un servomoteur par le clavier, nécessite l'interface processing.
Pilotage d'un servo par clavier (flèche haut et bas) http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertServoControlePositionClavierPC ARDUINO // --- Programme Arduino --- // par X. HINAULT - 02/2010 // www.mon-club-elec.fr // --- Que fait ce programme ? --- /* Positionne un servomoteur à l'aide du clavier du PC - 10 positions Utilise une interface processing de visualisation côté PC. L'appui sur les touches HAUT/BAS incrémente/décrémente une variable processing La valeur (de 0 à 9) est envoyée vers l'Arduino Lorsqu'un caractère est reçu, la position est calculée et le servomoteur est positionné */ // --- Fonctionnalités utilisées --- // Utilise la connexion série vers le PC // Utilise les servomoteurs // --- Circuit à réaliser --- // Connexion série entre la carte Arduino et le PC (utilise les broches 0 et 1) // Connecter sur la broche 2 (configurée en sortie) la broche de commande d'un servomoteur. la broche de commande d'un servomoteur. // Connecter les servomoteurs sur les broches de commandes utilisées //**************** Entête déclarative ******* // A ce niveau sont déclarées les librairies, les constantes, les variables... // --- Inclusion des librairies utilisées --- #include <Servo.h> // librairie pour servomoteur // --- Déclaration des constantes --- const int POS_MIN=550; // largeur impulsion pour position 0° servomoteur // POS_MIN=550 pour futaba S3003 const int POS_MAX=2330; // largeur impulsion pour position 180° servomoteur // POS_MAS=2330 pour futaba s3003 // --- constantes des broches --- const int broche_servo=2; //declaration constante de broche // --- Déclaration des variables globales --- // variable position du servomoteur en degré int position_servo=0; // variable de stockage des valeurs reçues int OctetReception=0; // --- Déclaration des objets utiles pour les fonctionnalités utilisées --- Servo mon_servo; // crée un objet servo pour contrôler le servomoteur //**************** FONCTION SETUP = Code d'initialisation ***** // La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme void setup() { // debut de la fonction setup() // --- ici instructions à exécuter au démarrage --- Serial.begin(115200); // initialise connexion série à 115200 bauds // IMPORTANT : régler le terminal côté PC avec la même valeur de transmission mon_servo.attach(broche_servo, POS_MIN, POS_MAX); // attache l'objet servo à la broche de commande du servomoteur // ------- Broches en sortie ------- pinMode(broche_servo, OUTPUT); //met la broche en sortie // ------- Broches en entrée ------- // ------- Activation du rappel au + interne des broches en entrée si nécessaire ------- // ------- position initiale du servomoteur mon_servo.write(position_servo); delay(200); } // fin de la fonction setup() // ******************************************************************************** //*************** FONCTION LOOP = Boucle sans fin = coeur du programme ************* // la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension void loop(){ // debut de la fonction loop() // --- ici instructions à exécuter par le programme principal --- if (Serial.available()>0) { // si un octet en réception OctetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable OctetReception=OctetReception-48; // isole valeur numerique 0-9 à partir valeur ASCII // calcule la nouvelle position position_servo=map(OctetReception,0,9,0,180); //positionne le servomoteur mon_servo.write(position_servo); //entre chaque changement de position delay (200); }// fin gestion octet en réception } // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin // ******************************************************************************** // --- Fin programme ---
PROCESSING (à coller sous processing)
// programme Processing // par X. HINAULT - 02/2010 // www.mon-club-elec.fr // Interface Vumètre réglable par clavier HAUT/BAS et envoi série vers arduino valeur 0-9 // inclusion librairies utilisées import processing.serial.*; // importe la librairie série processing // déclaration variables //--- variables utiles tracé vumètre float Y_ref=220; // ordonnée de ligne de référence dessin rectangle float largeur=50; float hauteur=180; //180 représente 100% (0 à 9 = 10 positions) int SendValue=0; // valeur envoyée à Arduino float niveau=0.0; // 0% au départ Serial MySerialPort; // variable désignant le port série void setup(){ // fonction d'initialisation exécutée 1 fois au démarrage size(100,250); //dimensionne la fenêtre processing à 200x200 (largeur x hauteur) // 1ère instruction de Setup // si Size() oublié => fenêtre 100x100 par défaut -- //---- initialisation port série --- println(Serial.list()); // liste et affiche tous les ports disponibles // Open whatever port is the one you're using. MySerialPort = new Serial(this, Serial.list()[1], 115200); // vérifier si c'est le bon port qui est utilisé delay (100); // pause background (255,255,255); // fixe la couleur du fond - format RGB stroke(255,0,0); // fixe la couleur du trait de dessin et bordure - format RGB //nostroke(); // Désactive trait de dessin et bordure // dessin des 2 rectangles du niveau de démmarrage (=50%) stroke (0); // trait de contour fill(255,255,255); // remplissage rect (10,Y_ref-hauteur,largeur, hauteur); // trace un rectangle de hauteur voulue //à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence stroke (255,0,0); // trait de contour fill(255,0,0); // remplissage rouge rect (10,Y_ref-niveau,largeur, niveau); // trace un rectangle de hauteur voulue //à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence //----- initialisation valeur série ---- MySerialPort.write(48); // valeur initiale 0+ 48 pour format ASCII delay (100); // pause } void draw() { // fonction exécutée en boucle //--- nb : la vitesse de rafraîchissement de l'écran est de 60 par seconde apr défaut - cf frameRate() } // fonction de gestion des évènements //----- clavier -------- void keyPressed() {// cette fonction est exécutée quand un touche est appuyée... if (key == CODED) { // si appui d'une touche particulière (les touches spéciales up, down, etc.. cf Keycode) if (keyCode == UP) { // si touche Haut appuyée niveau=niveau+(hauteur/9); // /9 pour avoir 10 niveaux if (niveau>=hauteur)niveau=hauteur; // ne pas dépasser hauteur SendValue=SendValue+1; // incrémente SendValue if (SendValue >=9) SendValue=9; // Empêche débordement variable SendValue MySerialPort.write(SendValue+48); // valeur initiale + 48 pour format ASCII - envoie valeur 0 à 9 delay (100); // pause } else if (keyCode == DOWN) {// si touche BAS appuyée niveau=niveau-(hauteur/9); // /9 pour avoir 10 niveaux if (niveau<=0)niveau=0; // ne pas dépasser 0 SendValue=SendValue-1; // décrémente SendValue if (SendValue<=0) SendValue=0;// ne pas dépasser 0 MySerialPort.write(SendValue+48); // valeur initiale + 48 pour format ASCII - envoie valeur 0 à 9 delay (100); // pause } } // fin if key==coded // dessin des 2 rectangles du niveau stroke(0); // contour noir fill(255,255,255); // remplissage blanc rect (10,Y_ref-hauteur,largeur, hauteur); // trace un rectangle de hauteur voulue //à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence stroke(255,0,0); // contour rouge fill(255,0,0); // remplissage rouge rect (10,Y_ref-niveau,largeur, niveau); // trace un rectangle de hauteur voulue //à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence } //------- souris ------- //void mousePressed() { // est appelée à chaque fois qu'un bouton de la souris est appuyé // } //------- gestion du port Série ------ //void serialEvent (Serial myPort) { // } // fin gestion port série
Publicité
Publicité
Commentaires