Go Down

Topic: Problème réalisation commande Servomoteur avec Shield (Read 99 times) previous topic - next topic

NicolasChtd

Salut, je souhaite commander un servo moteur à l'aide d'une page internet.
J'en suis arrivé à ça en récupérant divers programmes et en les adaptant:

Code: [Select]
#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x4E, 0xDE }; // A adapter en fonction du shield
byte ip[] = { 192, 168, 2, 1 }; // A adapter en fonction du reseau
Servo pinServo;  // broche connectée au Servo
int modeServo = 0;
unsigned long tpsDep;
EthernetServer server(80);
String HTTP_req;
int valeur;
int etatServo = 0;

void setup() {
 // Initialise le port série
  Serial.begin(9600);
  // Initialise la connexion Ethernet et le serveur
  Ethernet.begin(mac);//generer adresse mac
  server.begin();
  pinServo.attach(2);
  Serial.print("Le serveur est à l'adresse : ");// permet sur la liaison série de récupèrer l'adresse ip alloué par le serveur.
  Serial.println(Ethernet.localIP());
}
void loop() {
  gestionClient(); // fonction qui gère toute la communication avec le client
  gestionServo(); // fonction qui gère l'allumage des LED
}

void gestionClient()
{
    EthernetClient client = server.available();  // recevoir le client
    if (client) {  // got client?
        if (client.connected()) {
            if (client.available()) {   //pour lire les données
                char c = client.read(); // read 1 byte (character) from client
                HTTP_req += c;  // save the HTTP request 1 char at a time
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                    // send a standard http response header
                corps(client);
            } //fin if
        } //fin si
     } //fin si
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
}
void corps(EthernetClient cl) {
  cl.println("<br>"); // saut de ligne
  //boucle pour construire chaque ligne en fonction des LED
    cl.print("<br>Servo 2");
    cl.print(" ");
    Serial.println(2);
    cl.print(" <a href=?"); //création du lien inutile de répéter l'adresse du site
    cl.print("Servo: ");
    cl.println("<a href=?valeur=1>Augmenter</a><br>");
    cl.println("<a href=?valeur=2>Diminuer</a><br>");
}
void gestionServo() {
      if (valeur == 1) { // si mode éteint
        if (etatServo < 180) {
        etatServo = etatServo + 5; // on éteind
        }
      }
      if (valeur == 2) { // si mode éteint
        if (etatServo > 0) {
        etatServo = etatServo - 5; // on éteind
        }
      }
      pinServo.write(etatServo);
      Serial.println(etatServo); //afficher angle servo
      Serial.println(valeur); //afficher variable valeur pour voir si ça marche
      delay(1000);
}


L'idée c'est que quand je clique sur augmenter, l'angle du servomoteur fasse +5 et quand je clique sur diminuer il fasse -5
Hors, je débute et ça reçoit meme pas l'ordre de baisser ou d'augmenter et le moniteur serie m'envoie pleins de 0
Donc rien ne marche

Si quelqu'un pouvait m'aider ce serait fantastique !

Merci :)

J-M-L

Commencez par

- décrire votre matériel et votre montage
- faire un programme qui fait bouger le servo
- faire un programme qui fait l'interface web que vous voulez et qui fonctionne
- fusionner les 2

Notez que pinServi n'est pas un nom de variable super, la pin c'est 2.. là vous avez une instance de la classe Servo, pas une pin...

Utiliser la classe String c'est pas top surtout comme vous le faites, vous aurez dans la durée sans doute des soucis mémoire difficile à debugger

Éventuellement lisez mon petit tuto



Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

NicolasChtd

Merci de la réponse !
J'ai une carte Arduino Uno, un shield ethernet monté dessus, connecté en réseau ethernet, et le truc pour mettre les broches au dessus

L'interface web que je veux c'est 2 boutons, j'ai modifié un peu mon programme avec le tien, ça marche, ça change la variable dans l'Url mais je sais pas comment bien récupérer ce changement de variable afin de faire changer l'angle du servomoteur
Mon but à la base est de commander la mise au point d'un telescope

J'ai pas trop compris l'histoire d'instance et de classe, je débute dans la programmation
Et pour le string j'ai utilisé un autre programme d'exemple même si je suis pas sur de tout comprendre

Code: [Select]
#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x4E, 0xDE }; // A adapter en fonction du shield
byte ip[] = { 192, 168, 2, 1 }; // A adapter en fonction du reseau
Servo pinServo;  // broche connectée au Servo
int modeServo = 0;
unsigned long tpsDep;
EthernetServer server(80);
String HTTP_req;
int valeur;
int W = 0;
int etatServo = 0;

void setup() {
 // Initialise le port série
  Serial.begin(19200);
  // Initialise la connexion Ethernet et le serveur
  Ethernet.begin(mac);//generer adresse mac
  server.begin();
  pinServo.attach(2);
  Serial.print("Le serveur est à l'adresse : ");// permet sur la liaison série de récupèrer l'adresse ip alloué par le serveur.
  Serial.println(Ethernet.localIP());
}
void loop() {
  gestionClient(); // fonction qui gère toute la communication avec le client
  gestionServo(); // fonction qui gère l'allumage des LED
}

void gestionClient()
{
    EthernetClient client = server.available();  // recevoir le client
    if (client) {  // got client?
        if (client.connected()) {
            if (client.available()) {   //pour lire les données
                char c = client.read(); // read 1 byte (character) from client
                HTTP_req += c;  // save the HTTP request 1 char at a time
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                    // send a standard http response header
                corps(client);
            } //fin if
        } //fin si
     } //fin si
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
}
void corps(EthernetClient cl) {
    cl.println(F("<body bgcolor='#00979C'>"));
  cl.println("<br>"); // saut de ligne
  //boucle pour construire chaque ligne en fonction des LED
    Serial.println(2);
    cl.print("Mise au point servo: ");
  cl.println("<button onclick=\"location.href='/W=1'\" type='button'>+5</button>");
  cl.println("<button onclick=\"location.href='/W=2'\" type='button'>-5</button>");
}
void gestionServo() {
      if (W == 1) { // si mode éteint
        if (etatServo < 180) {
        etatServo = etatServo + 5; // on éteind
        }
      }
      if (W == 2) { // si mode éteint
        if (etatServo > 0) {
        etatServo = etatServo - 5; // on éteind
        }
      }
      pinServo.write(etatServo);
      Serial.println(etatServo); //afficher angle servo
      Serial.println(valeur); //afficher variable valeur pour voir si ça marche
      delay(1000);
}


Ca donne  ça http://image.noelshack.com/fichiers/2018/07/1/1518433580-capture.png

J-M-L

Il faut étudier un peu mon tuto pour voir comment on récupère les éléments de l'URL
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

Go Up