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