Go back to Yannick's Home HOME PAGE.
Back

Comment contrôler ses montages électronique par le web ?


Go to the Version 2 Webcam Control : Apache, Servo control Motor with PIC

photo de la réalisation mécanique<

Download the Version 2 : Port Serie RS232/USB + PIC + Servo Moteurs : Mandriva 2006 CGI sources with USB serial Com port (Servo control webcam's mount).
Download the Version 1 : Port // + Moteur pas à pas: Mandrake Linux 9.2 CGI sources (webcam's mount + DS1720 temperature sensor controls).
Download the Version 1 : Port // + Moteur pas à pas: Windows XP / 2K CGI sources (webcam's mount + DS1720 temperature sensor controls).

>>> You can control the webcam here : Control Here


Réalisation hardware & software.


  • 1)- Principe global
  • 2)- Le coté client.
    2.1 - Les requêtes et l'affichage.
  • 3)- Le coté server
    3.1 - La page web en HTML.
    3.2 - Le server HTTP (Apache).
    3.3 - La CGI (Common Gateway Interface) en C.
    3.4 - L'accés au port parallèle sous Windows 2000, XP et Linux.
    3.5 - L'électronique d'interface et de puissance pour moteur pas à pas.
    3.6 - Le capteur de température Dallas DS1720.
  • 4)- Liens et fichiers tres utiles.
  • 5)- Photos et accés au contrôle de la webcam ici (selon fonctionnement du server).





    1)- Le principe global pour envoyer des commandes depuis le web

    synoptique

    Top




    2)- Le coté client.


            2.1 - Les requêtes et l'affichage

    Pour les explications, on considère le cas d'un navigateur internet (Netscape/IE). Le navigateur contacte le serveur par une adresse URL, par exemple http://www.toto.edu/page.html. Afin de réaliser une interface conviviale, le serveur renvoit alors du code HTML affiché par le navigateur. On peut dissocier 2 parties dans la page : une partie affichage d'image et une partie contrôle.
    On peut concevoir les 2 parties enssemble mais le navigateur devra les recharger à chaque commande.


    client


    Top



    3)- Le coté server.



            3.1 - La page web en HTML.

    La méthode employée dans ce document pour envoyer les commandes au serveur est la méthode "GET".
    Elle se traduit par une adresse de type http://www.toto.edu/control.cgi?action=left. Le fichier control.cgi est un fichier qui va interprêter le paramètre action=left. Nous verrons par la suite comment le serveur lance le fichier control.cgi (ctrlcam.exe par la suite).
    Le code html pour réaliser la partie contrôle client peut ressembler à celui-ci : control.html. Ce code peut être renvoyé par le fichier control.cgi afin de se réappeler ou bien spécifier un target=autrefame si on désire afficher le résutlat dans une autre frame.





            3.2 - Le server HTTP (Apache).

    Dans le cas de notre exemple, nous allons voir comment configure le server Apache (Win32 et Linux ). Le serveur Apache est un des plus connu du monde professionnel.

    La configuration du server Apache est faite par l'édition du fichier httpd.conf dans le répertoire C:\Program Files\Apache Group\Apache\conf par défaut sous Windows XP. Pour exécuter les cgi, il suffit de placer notre programme écrit en C dans le répertoire cgi-bin et de l'appeler de maniere classique par http://monserveur.net/cgi-bin/ctrlcam.exe?action=left&action2=0....

    Les points à modifier dans la configuration (de base) du server Apache sont donnés ci-dessous. Le cgi est localisé à : C:\Program Files\Apache Group\Apache\cgi-bin\ctrlcam.exe dans notre exemple.
    Les lignes à modifier/vérifier sont alors :

         - DocumentRoot "D:\mon_site_web"
         - <Directory "D:\mon_site_web"> dans lequel est placé l'enssemble des pages HTMLs par exemple
         - ScriptAlias /cgi-bin/ "C:/Program Files/Apache Group/Apache/cgi-bin/"
         - <Directory "C:/Program Files/Apache Group/Apache/cgi-bin">
         - AddHandler cgi-script .cgi




            3.3 - La CGI (Common Gateway Interface) en C.

    Une CGI faite en C doit recevoir les données du client via le serveur et renvoyer une réponse compréhensible par le client. Le premier problème se résoud en analysant les variables d'environnement du server qui sont les suivantes :


    Variables Value
    ALL_HTTP HTTP_ACCEPT:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */* HTTP_ACCEPT_LANGUAGE:en HTTP_CONNECTION:Keep-Alive HTTP_HOST:localhost HTTP_USER_AGENT:Mozilla/4.79 [en] (Windows NT 5.0; U) HTTP_ACCEPT_ENCODING:gzip HTTP_ACCEPT_CHARSET:iso-8859-1,*,utf-8
    ALL_RAW Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */* Accept-Language: en Connection: Keep-Alive Host: localhost User-Agent: Mozilla/4.79 [en] (Windows NT 5.0; U) Accept-Encoding: gzip Accept-Charset: iso-8859-1,*,utf-8
    CONTENT_LENGTH 0
    CONTENT_TYPE
    QUERY_STRING
    CONTENT_LENGTH 0
    HTTPS off
    LOCAL_ADDR 127.0.0.1
    HTTPS off
    PATH_INFO /ServerVariables.pl
    PATH_TRANSLATED C:/Program Files/Apache Group/Apache/cgi-bin/ServerVariables.pl
    REMOTE_ADDR 127.0.0.1
    REMOTE_HOST 127.0.0.1
    REQUEST_METHOD GET
    SERVER_NAME www.gizmo.mog
    SERVER_PORT 80
    SERVER_PROTOCOL HTTP/1.0
    SERVER_SOFTWARE Apache/1.3.26 (Win32)
    HTTP_ACCEPT image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*
    HTTP_USER_AGENT Mozilla/4.79 [en] (Windows NT 5.0; U)
    HTTP_UA_PIXELS
    HTTP_UA_COLOR
    HTTP_UA_OS
    HTTP_UA_CPU
    HTTP_REFERER
    HTTP_CONNECTION Keep-Alive
    URL /ServerVariables.pl
    REMOTE_USER

    Seules 2 variables nous concernent dans notre application : les variables REQUEST_METHOD et QUERY_STRING.
    Le programme en C peut alors récupérer les variables d'environnement grâce à la fonction getenv().
    On vérifie alors que REQUEST_METHOD="GET" et on énumère les différentes valeurs de QUERY_STRING (ici action=left et action=right). Pour des premiers tests, on peut se contenter d'utiliser :

    #define REQUEST_METHOD getenv("REQUEST_METHOD")
    #define QUERY_STRING getenv("QUERY_STRING")
    [...]
    printf ("REQUEST_METHOD : %s \<br>\r\n ", REQUEST_METHOD);
    printf ("QUERY_STRING : %s <br>\r\n", QUERY_STRING);


    Pour renvoyer notre résultat vers le client via le serveur, on doit renvoyer une première information du style :

    printf("Content-type: text/html\r\n\r\n");

    Ensuite on envoit nos résultats en format HTML comme l'exemple ci-dessous :

    printf("<HTML>\r\n<HEAD>\r\n<TITLE>CGI : Camera Gizmo Interface</TITLE>\r\n</HEAD>\r\n
    <BODY ALINK=\"Aqua\">\r\n</HEAD>\r\n<CENTER>\r\n\r\n");



    On affiche des variables ou résultats quelconques comme par exemple :
    printf ("REQUEST_METHOD : %s <br>\r\n ", REQUEST_METHOD);

    et on termine par :

    printf("</BODY>\r\n</HTML>");



            3.4 - L'accés au port parallèle sous Windows 2000, XP et Linux.

    Sous Windows NT (XP, 2K, NT4...), l'accés aux ressources matérielles ne peut être fait que par 2 familles de code, le code noyau et le code des drivers. Une tentative d'accés direct au matériel (comme on peut le faire sous Windows 98) provoque une erreur de "privilège". Pour accéder au matériel on doit utiliser des drivers. Chaque périphérique posséde son driver. La plupart des drivers pour les systèmes d'exploitations connus pour des périphériques connus sont déjà écrit et sont disponible sur le net.


    L'architecture de Windows 2000

    windows 2000 architecture

    Dans le cas de notre exemple, nous envoyons des commandes vers le port parallèle. Afin de ne pas écrire un driver (chose fastidiueuse mais simplifiée grâce au Driver Development Kit (DDK) pour Windows 2000 téléchargeable gratuitement en ligne), nous utilisons le driver téléchargé sur le site de Martin Davey. Ce driver pour port parallèle est décomposé en 3 parties : un installeur (qui ne semble pas au point niveau inscription dans la base de registre), le driver lui même (fichier .sys copié dans /NTDirectory/system32/drivers/) et enfin un programme de test qui permet de tester l'installation du driver. L'avantage est d'avoir les sources dont le code permettant l'accés au driver via la fonction DeviceIoControl (fonction qui envoit un code de contrôle directement à un driver spécifique qui exécute la commande).


    Afin de lever le doute concernant l'inscription du driver dans la base de registre, exécutez l'installeur ParIOInstaller.exe et vérifiez avec regedit la clef suivante : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ParIO. Vous devez avoir (corrigez si nécessaire) la configuration suivante :



    windows 2000 driver registry

    Une fois le driver correctement testé avec l'application ParIOTest.exe, l'accés à ce drivers depuis votre programme en C/C++ se fait de la manière suivante (écriture sur les 8 bits de données du port //):


    - Types :

    #define COK 0
    #define CNOK -1
    #define OPEN_DRIVER_READ_ERR 4
    #define WRITE_ERROR -2
    #define CLOSE_DRIVER_ERR 6

    - Déclaration des variables globales :

    BOOL IoctlResult;
    HANDLE hndFile;
    DWORD Erreur;
    DWORD ReturnedLength;

    - Ouverture du driver :

    int OpenParPort(void)
    {
      hndFile = CreateFile(
                     "\\\\.\\LPTPARIO1", // Open the Device "file"
                     GENERIC_READ|GENERIC_WRITE,
                     0,
                     NULL,
                     OPEN_EXISTING ,
                     FILE_ATTRIBUTE_NORMAL,
                     NULL
                     );

      if (hndFile == INVALID_HANDLE_VALUE) // Was the device opened?
      {
                      printf("Unable to open the device.\n");
                      Erreur=GetLastError();
                      return (OPEN_DRIVER_READ_ERR);
      }
       return COK;
    }


    - Accés au driver en écriture (écriture d'un octet dans notre cas) :


    int WriteParPort(unsigned char Data2Write)
    {
      IoctlResult = DeviceIoControl
                     (hndFile,                                                            // Handle to device
                     IOCTL_PARIO_WRITE_PORT_DATA,        // IO Control code for Write
                     &Data2Write,                                                   // Buffer to driver.
                     1,                                                                      // Length of buffer in bytes.
                     NULL,                                                              // Buffer from driver. Not used.
                     0,                                                                      // Length of buffer in bytes.
                     &ReturnedLength,                                             // Bytes placed in outbuf. Should be 0.
                     NULL     ;                                                        // NULL means wait till I/O completes.
                     );

      if (IoctlResult) // Did the IOCTL succeed?
                      {
                     return 0;
                     }
      else
      {
                     Erreur=GetLastError();
                     return (WRITE_ERROR);
      }

    }


    - Fermeture du driver en fin de programme pour libérer la ressource :


    int CloseParPort(void)
    {
      if (!CloseHandle(hndFile))
      {              // Close the Device "file".
                     printf("Failed to close device.\n");
                     Erreur=GetLastError();
                     return (CLOSE_DRIVER_ERR);
      }
    return COK;

    }


    L'accès au port parallèle sous Linux peut se faire simplement par exemple grâce au instructions ioperm/outb/inb. Attention le binaire exige des droits de superuser pour être autoriser à accèder au port (chmod +S ctrlcam)... à manipuler avec précaution et prévoir un code robuste...



    Download the Version 2 : Port Serie RS232/USB + PIC + Servo Moteurs : Mandriva 2006 CGI sources with USB serial Com port (Servo control webcam's mount).
    Download the Version 1 : Port // + Moteur pas à pas: Mandrake Linux 9.2 CGI sources (webcam's mount + DS1720 temperature sensor controls).
    Download the Version 1 : Port // + Moteur pas à pas: Windows XP / 2K CGI sources (webcam's mount + DS1720 temperature sensor controls).


    Top


            3.5 - L'électronique d'interface et de puissance pour moteur pas à pas.

    Cette partie décrit la partie purement électronique du projet. chacun y trouvera l'application qui lui convient (circuits passifs, microncontrôleurs...). Le moteur utilisé est un moteur pas à pas unipolaire d'imprimante à aiguille (rouleau d'entrainement) et l'électronique décrite ci-dessous fait appel à des fonctions logiques élémentaires. Des circuits intégrés spécialisés pour le contrôle de moteur pas à pas bipolaire et unipolaire rendent la réalisation plus simple.


    Le schéma électronique de contrôle du moteur (sans capteur de position)

    schéma électronique



            3.6 - Le capteur de température Dallas DS1720.

    Le schéma utilisé provient d'une note d'application du DS1620 et d'un montage trouvé sur le net, il permet d'interfacer le DS1720 via le port parallèle. La précision est de +/- 2.5°C et ce composant ne nécessite aucun composant additionnel particulier. Ce composant est disponible gratuitement sous 7 jours sur le site de Maxim/Dallas.


    Le schéma électronique du capteur de température

    schéma électronique



    4)- Liens et fichiers sur les serveurs, CGI et moteurs pas à pas


    Les CGI (en C / Perl / PHP / Java)
    http://www.cgi-resources.com/
    CGI in C - A starter's tutorial
    http://www.scit.wlv.ac.uk/
    http://www.boutell.com/cgic/#howto
    http://www.cs.tut.fi/~jkorpela/forms/cgic.html
    http://www.eekim.com/pubs/cgiinc/index.html
    http://my.execpc.com/~keithp/bdlogcgi.htm

    Les servers web
    http://www.apache.org

    Les moteurs pas à pas
    http://www.robotdude.com/index.html
    http://www.cs.uiowa.edu/~jones/
    http://www.divms.uiowa.edu/~jones/step/example.html
    http://www.bbc.co.uk/bluepeter/

    Les webcams et les logiciels de captures (et sources)
    pjWebcams



    Top



    5)- Photos et accés au contrôle de la webcam ici (selon fonctionnement du server).

    Photos de la réalisation mécanique

    photo de la réalisation mécanique

    Go to the Version 2 Webcam Control : Apache, Servo control Motor with PIC

    >>> You can control the webcam here : Control Here

    Top



    L'ensemble des textes et photographies présents sur ce site sont la propriété exclusive de leur auteur. Merci de respecter la propriété intellectuelle et le droit d'auteur. All pictures and page content Copyright © 2003-2013 Yannick Bénaben.