Go Down

Topic: Faire bouger des servo-moteurs par php. (Read 1 time) previous topic - next topic

Psit

Feb 23, 2013, 07:18 pm Last Edit: Feb 23, 2013, 07:26 pm by Psit Reason: 1
Bonjour, Bonsoirs,

Je vous présente mon projet , je souhaite pouvoir bouger Deux servo-moteurs brancher sur ma Arduino-UNO32 (pins 8 et 9 ) grace a un code Php donc d'une page web.



J'ai regardé plusieurs code sur internet pour mes servos-moteurs mais je vous avoue que je ne le comprend pas beaucoup , j'ai compris que en fessant :
@X$  > le moteur de la broche 8 tourne vers la droite.
@Y$ > le moteur de la broche 9 tourne vers la droite.
@X2600T$ > le moteur de la broche 8 tourne vers la gauche.
@Y2600P$ > le moteur de la broche 9 tourne vers la gauche.

Si quelqu'un pourrais m'aider pour que je comprenne un peux le code ? Surtout pour le faire tourner par exemple d'un quart de tours au lieu de 180° direct ?

Code: [Select]
// --- Programme Arduino ---
// par X. HINAULT - 01/2010

// --- Que fait ce programme ? ---
/* Test de la position d'un servomoteur par saisie directe de la largeur d'impulsion dans le Terminal côté PC*/

// --- Fonctionnalités utilisées ---
// Utilise la connexion série vers le PC
// Utilise un servomoteur

// --- Circuit à réaliser ---
// Connexion série entre la carte Arduino et le PC (utilise les broches 0 et 1)  
// Connecter Broche de commande d'un Servomoteur sur la broche 2 (configurée en sortie)

//**************** 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 ---

// --- constantes des broches ---

const int SERVOP=9; //declaration constante de broche
const int SERVOT=8;

// --- Déclaration des variables globales ---

int ReceptionOctet=0; // variable de stockage des octets reçus par port série
int ReceptionNombre=0; // variable de calcul du nombre reçu par port série
int impulsion=1500; // variable pour impulsion - valeur médiane initiale
int mouv = 0;
int cpt = 0;
int i;
int recmsg[16];


// --- Initialisation des fonctionnalités utilisées ---

Servo mon_servoP;// crée un objet servo pour contrôler le servomoteur
Servo mon_servoT;

//**************** 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 ---

mon_servoP.attach(SERVOP);// attache l'objet servo à la broche de commande du servomoteur
mon_servoT.attach(SERVOT);

Serial.end();
Serial.begin(115200); // initialise connexion série à 115200 bauds
// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission
//Serial.println("Ready!!!");


pinMode(SERVOP, OUTPUT); //met la broche en sortie

mon_servoP.writeMicroseconds(impulsion); // génère l'impulsion de la durée voulue en µs pour le servomoteur

pinMode(SERVOT, OUTPUT);

mon_servoT.writeMicroseconds(impulsion);
} // 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 ---


//--- lecture d'un nombre reçu par le Terminal et positionnement du servomoteur ---
if (Serial.available()>0) { // si caractère dans la file d'attente

 if(Serial.peek() == '&'){
   Serial.flush();
   Serial.end();
   Serial.begin(115200); // initialise connexion série à 115200 bauds
   delay(200);
 }
 cpt=0;
 //---- lecture du nombre reçu
 while (Serial.read() != '@') ; // cherche debut trame
 while (Serial.peek() != '$') { // cherche fin trame
   i = Serial.read();
   if((i != -1) && (i != '$')) {
     //Serial.write(i);
     recmsg[cpt++] = i;
   }
   if(i == '$') break;
 }
 recmsg[cpt]=0;
 //delay(1);
 Serial.flush();
 
 //Serial.println();
 //Serial.println((String)&recmsg[0]);
 
 if(recmsg[0] == 'Y') mouv = 'P';
   else if(recmsg[0] == 'X') mouv = 'T';
 
 for(i=2; i<cpt; i++){
   ReceptionNombre = (ReceptionNombre*10)+(recmsg[i]-48);
 }
 

  //Serial.print ("Nombre recu= ");
  //Serial.println(ReceptionNombre); // affiche valeur numerique entière ou à virgule au format décimal


  //----- positionnement du servomoteur en fonction de la largeur d'impulsion demandée
  if(impulsion != 0) impulsion=ReceptionNombre;
      else impulsion = 1500;

   if (impulsion>2600)impulsion=2600; // pour éviter valeur supérieure à 2600 = position maxi possible servomoteur
   if (impulsion<300)impulsion=300; // pour éviter valeur inférieure à 300 = position maxi possible servomoteur

   if(mouv == 'P') mon_servoP.writeMicroseconds(impulsion); // génère l'impulsion de la durée voulue en µs pour le servomoteur
    //Serial.print ("Impulsion servomoteur = ");
   //Serial.print(impulsion); // affiche valeur numerique entière
   //Serial.println (" microsecondes ");
if(mouv == 'T') mon_servoT.writeMicroseconds(impulsion);
   delay (2); //entre chaque changement de position

   ReceptionNombre=0; // réinitialisation de la variable de calcul du nombre reçu

} // end if


} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

// --- Fin programme ---


Ensuite j'ai donc voulu essayer de les faire bouger via un serveur ( tournant sous Ubuntu ) , et la pas de soucis , tout marche niquel:
Code: [Select]
<?php

   shell_exec
('stty -F /dev/ttyUSB0 speed 115200 cs8 -parity cread clocal -crtscts -hup -echo -cstopb ');


for(
$i=0$i $i++)
  {
shell_exec('echo "@X$" > /dev/ttyUSB0');
shell_exec('echo "@Y$" > /dev/ttyUSB0');
sleep(1);
shell_exec('echo "@X2600T$" > /dev/ttyUSB0');
shell_exec('echo "@Y2600P$" > /dev/ttyUSB0');
   
sleep(1);
  }
header('Location: clignote.php');
?>


Le problème c'est que je voudrais faire la même chose mais sur un serveur Windows (ou en localhost ) mais je ne trouve pas sur internet comment faire pour windows pour changer les " /dev/ttyUSB0".

Si des personnes auraient des solutions à mes problèmes , je suis preneur .
Merci beaucoup d'avance .

patg_

Ca n'est pas la seule chose à faire pour faire l'équivalent sous Windows.
Il faut ré-écrire le script en utilisant par exemple cette librairie php:
http://code.google.com/p/php-serial/

Le port COM à utiliser est celui utilisé par l'IDE Arduino (chez moi c'est COM10 par exemple).

Mes Arduineries: http://breizhmakers.over-blog.com/

Psit

Et du coup je les met ou tes codes ? Je change quoi ?

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy