Contrôle de sonar, 2014/2015, TD1 : Différence entre versions

De Wiki de Projets IMA
Ligne 103 : Ligne 103 :
 
<center><strong>Schema général</strong></center>
 
<center><strong>Schema général</strong></center>
  
La partie informatique s'occupe de concevoir et réalisée une application web et un serveur pouvant communiquer entre eux en utilisant la technologie web socket.<br>  
+
La partie informatique traite de la conception et la réalisation d'une application web et d'un serveur pouvant communiquer entre eux en utilisant la technologie web socket.<br>  
Les deux étant dissocié tant d'un point de vue physique (l'application sur la machine de l'utilisateur / le serveur sur la Foxboard) que d'une point de vue programmation (application : html, css, javascript/ serveur : c).
+
Les deux étant dissociées tant d'un point de vue physique (l'application sur la machine de l'utilisateur / le serveur sur la Foxboard) que d'une point de vue programmation (application : html, css, javascript/ serveur : c).
  
 
<h2>Répartition et avancement au fur et à mesure des séances</h2>
 
<h2>Répartition et avancement au fur et à mesure des séances</h2>
Ligne 119 : Ligne 119 :
 
A la fin de la séance:<br>
 
A la fin de la séance:<br>
 
- Serveur fonctionnel avec un application 'basique': <br>
 
- Serveur fonctionnel avec un application 'basique': <br>
- Envoi d'un angle via l'application <-> réception par le serveur et envoi de la commande au servomoteur<br><br>
+
- Envoi d'un angle via l'application réception par le serveur et envoi de la commande au servomoteur<br><br>
  
 
<h3>Séance 3</h3>
 
<h3>Séance 3</h3>
 
- Mise en place de la liaison série<br>
 
- Mise en place de la liaison série<br>
 
- Réception des données du capteur ultrason par le serveur<br>
 
- Réception des données du capteur ultrason par le serveur<br>
- Envoi de ces données a l'application<br>
+
- Envoi de ces données à l'application<br>
 
- Création de l'application Web finale<br>
 
- Création de l'application Web finale<br>
  
Ligne 132 : Ligne 132 :
  
 
<h3>Séance supplémentaire 1</h3>
 
<h3>Séance supplémentaire 1</h3>
- Envoi et réception de plusieurs données: angle de balayage/vitesse <-> distance/angle réel du servomoteur<br>
+
- Envoi et réception de plusieurs données: angle de balayage/vitesse distance/angle réel du servomoteur<br>
 
- Ajout de fonctionnalités à l'application (rotation/Etat de la connexion)<br><br>
 
- Ajout de fonctionnalités à l'application (rotation/Etat de la connexion)<br><br>
  
Ligne 145 : Ligne 145 :
  
 
Au démarrage, le serveur initialise plusieurs paramètres :<br>
 
Au démarrage, le serveur initialise plusieurs paramètres :<br>
-  la position du servomoteur à sa position d'origine (0 degrée)<br>
+
-  la position du servomoteur à sa position d'origine (0 degré)<br>
 
-  la vitesse maximale et minimale du servomoteur<br>
 
-  la vitesse maximale et minimale du servomoteur<br>
  
Ligne 152 : Ligne 152 :
 
[[Fichier:Transmission_3.png | center]]
 
[[Fichier:Transmission_3.png | center]]
  
Lors du lancement de l'acquisition, trois données sont envoyés de l'application Web vers le serveur :<br>
+
Lors du lancement de l'acquisition, trois données sont envoyées de l'application Web vers le serveur :<br>
 
- Un booléen acquisition (1: démarrage/ 0 : arrêt)<br>
 
- Un booléen acquisition (1: démarrage/ 0 : arrêt)<br>
 
- Un entier correspondant à l'angle de balayage [20 à 90]<br>
 
- Un entier correspondant à l'angle de balayage [20 à 90]<br>
Ligne 161 : Ligne 161 :
 
[[Fichier:Transmission_2.png | center]]
 
[[Fichier:Transmission_2.png | center]]
  
Pendant l'acquisition, le serveur envoie en continue 2 données :<br>
+
Pendant l'acquisition, le serveur envoie en continu 2 données :<br>
 
- l'angle réel (ou courant) du servomoteur<br>
 
- l'angle réel (ou courant) du servomoteur<br>
 
- la distance envoyée par le sonar<br>
 
- la distance envoyée par le sonar<br>
Ligne 171 : Ligne 171 :
 
<h2>Méthode de transmission</h2>
 
<h2>Méthode de transmission</h2>
  
Les données qui transitent entre l'application et le serveur se font grâce a la technologie WebSocket.<br>
+
Les données qui transitent entre l'application et le serveur se font grâce à la technologie WebSocket.<br>
On concatène toute les données à envoyer dans une chaine de caractère avec un caractère 'espace' entre chaque.<br>
+
On concatène toutes les données à envoyer dans une chaîne de caractères avec un caractère 'espace' entre chaque.<br>
A la réception on doit découper cette chaine de caractère afin de séparer chaque donnée puis on les converties en entier pour initialiser les variables correspondantes. <br>
+
A la réception, on doit découper cette chaîne de caractère afin de séparer chaque donnée puis on les convertie en entier pour initialiser les variables correspondantes. <br>
  
<h3>Découpage de la chaine de caractère reçue en C:</h3>
+
<h3>Découpage de la chaîne de caractère reçue en C:</h3>
 
<pre>
 
<pre>
 
void ReceiveMsg(int NbDonnee, char* msg)
 
void ReceiveMsg(int NbDonnee, char* msg)
 
{
 
{
 
      
 
      
     // Création de chaine de caractère qui vont récupérer chaque valeur
+
     // Création de chaîne de caractère qui vont récupérer chaque valeur
 
     char don[NbDonnee][10];
 
     char don[NbDonnee][10];
 
     int i=0, j=0;
 
     int i=0, j=0;
 
     int debut=0, k=0;
 
     int debut=0, k=0;
  
     //Tant que l'on ne detecte pas la fin du message
+
     //Tant que l'on ne détecte pas la fin du message
 
     while(msg[i] != 0)
 
     while(msg[i] != 0)
 
     {
 
     {
         //on initialise 'j' à la position au début de la chaine courante
+
         //on initialise 'j' à la position au début de la chaîne courante
 
         debut = j;   
 
         debut = j;   
 
          
 
          
Ligne 194 : Ligne 194 :
 
         if(msg[i] == ' ') {  
 
         if(msg[i] == ' ') {  
  
             //Puis on récupère la chaine entre debut et la position courante
+
             //Puis on récupère la chaîne entre 'debut' et la position courante
 
             for(k=0; k<(i-debut); k++){
 
             for(k=0; k<(i-debut); k++){
 
                 don[cmpt][k] = msg[k+debut];
 
                 don[cmpt][k] = msg[k+debut];
 
             }
 
             }
 
            
 
            
             //On réinitialise j a la position courante pour qu'il puisse modifier 'début'
+
             //On réinitialise j a la position courante pour qu'il puisse modifier 'debut'
 
             j = i;
 
             j = i;
 
         }
 
         }
Ligne 206 : Ligne 206 :
 
     }
 
     }
  
     //On convertie la chaine de caractère en valeur réélle
+
     //On convertie la chaîne de caractère en valeur réelle
 
     //et on assigne cette valeur au variable correspondante
 
     //et on assigne cette valeur au variable correspondante
 
     acquisition = atof(don[0]);
 
     acquisition = atof(don[0]);
Ligne 244 : Ligne 244 :
 
<h2>Application Web</h2>
 
<h2>Application Web</h2>
  
L'application a été construite pour être à la fois simple et intuitive. Elle est codé en Html5/css3 et Javascript.<br>
+
L'application a été construite pour être à la fois simple et intuitive. Elle est codée en Html5/css3 et Javascript.<br>
 
Elle utilise notamment l'outil CANVAS permettant de réaliser des dessins/animations en javascript. C'est un outil puissant et très modulable.<br>
 
Elle utilise notamment l'outil CANVAS permettant de réaliser des dessins/animations en javascript. C'est un outil puissant et très modulable.<br>
  
Ligne 257 : Ligne 257 :
 
- Un slider 'Vitesse' : permettant de modifier la vitesse de balayage<br>
 
- Un slider 'Vitesse' : permettant de modifier la vitesse de balayage<br>
  
A noté que lors de l'acquisition l'angle et la vitesse ne peuvent être modifié.<br>
+
A noter que lors de l'acquisition, l'angle et la vitesse ne peuvent être modifiées.<br>
  
 
- Un bouton 'Lancer l'acquisition'<br>
 
- Un bouton 'Lancer l'acquisition'<br>
Ligne 263 : Ligne 263 :
 
- Un bouton 'Supprimer les données'<br>
 
- Un bouton 'Supprimer les données'<br>
  
- Une checkbox 'Rotation' : permettant de faire une rotation a 180° du dessin<br>
+
- Une checkbox 'Rotation' : permettant de faire une rotation à 180° du dessin<br>
  
 
[[Fichier:Panel.png | center]]
 
[[Fichier:Panel.png | center]]
<center><strong>Tous ces éléments on été trouvé sur : www.foundation.com</strong></center>
+
<center><strong>Tous ces éléments ont été trouvés sur : www.foundation.com</strong></center>

Version du 19 mars 2015 à 14:19

Introduction

Le projet consiste à créer un sonar et à le contrôler grâce une application web. Le sonar est un détecteur d'obstacle qui estime la distance qui le sépare d'un obstacle.
Pour cela, il se compose d'un émetteur et d'un récepteur à ultrason. En calculant le temps séparant l'émission et la réception d'un signal et connaissant sa vitesse de propagation on peut estimer la distance.

Le projet se découpe en plusieurs parties:
- Electronique: modules analogiques émetteur et récepteur
- Logique: module logique émetteur, comptage
- Informatique: création de l'application web



L'application et le serveur se trouve sur la Foxboard n°5.
Aller a l'adresse: http://172.26.79.5/FoxBoard/ApplicationWeb/Sonar.html



Conception

Séance 1: 13/02/2015

Principe de fonctionnement du sonar : Un signal ultrason est envoyé par l'émetteur, est renvoyé par les obstacles vers le récepteur, et la distance parcourue est obtenue en calculant le temps entre l'émission et la réception multiplié par la vitesse du son.

Concept.jpg
Etude du concept

Lors de la première séance, dès la prise de connaissance du sujet, nous avons conceptualisé et séparé les différentes tâches à accomplir pour la réalisation du projet. Cela nous a permis de nous répartir le travail à accomplir. La partie logique consiste à réaliser un montage logique sur le logiciel Altium Designer et le charger dans la Nanoboard afin de simuler le montage. Dans la partie électronique, nous avons réaliser un montage à amplificateur opérationnel afin d'amplifier le signal modulé par la Nanoboard, transmis à l'émetteur et reçu par le récepteur et renvoyé à la Nanoboard afin de calculer la distance parcouru par le signal.


Signal.jpg
Etude du signal

On envoie 5 signaux créneaux à 40kHz toutes les 0.1 secondes. Le signal créneau est modulé à l'aide d'un premier compteur tandis que la pause est gérée par le second compteur comme dans le schéma ci-dessous.

Schema Logique1.JPG
Schéma logique pour la création du signal

Réalisation

Séance 2: 20/02/2015

Ampli op.png
Schéma d'un amplificateur opérationnel

Afin de réaliser un amplificateur opérationnel, on utilise le composant TL062 câblé comme ci-dessus.

Montage non inverseur.png
Schéma d'un montage non-inverseur

Ce montage permet d'amplifier les signaux. Grâce aux deux résistances branchés à l'amplificateur opérationnel, la tension d'entrée est modifiée suivant la formule : Formule non inverseur.png Pour amplifier le 3.3V en 14V on prendra R1 =15 kOhm et R2= 47 kOhm. Pour amplifier le signal reçu de l'ordre de la centaine de mV en quelque V, on prend R1 = 1 kOhm et R2 = 56 kOhm

Montage comparateur.png
Schéma d'un montage comparateur

Ce montage permet de comparer les signaux reçus par le récepteur avec une valeur donnée afin d'éliminer les bruits et de détecter les pics. Les signaux reçus et amplifiés sont de l'ordre de quelques volts, on branche une broche du récepteur sur la borne (+) et un générateur sur la borne (-).

Séance supplémentaire: 26/02/2015

Schema final sonar.JPG
Schéma de la partie logique du sonar


Vert: Le générateur de fréquence crée le signal et l'envoie dans le compteur. On peut modifier sa valeur avec le logiciel Altium Designer lorsqu'on fait fonctionner la Nanoboard.

Jaune: Le compteur 4 bits génère les 5 signaux séparés de 25µs chacun.

Bleu: Le compteur 8 bits permet de temporiser entre 2 émissions de signaux.

Violet: Le compteur 16 bits compte le temps entre émission et réception.

Rouge: La bascule D permet de stopper le compteur quand le récepteur capte un signal.

Orange: Branchement du bus de données 16 bits contenant la valeur du retard transmis aux broches de la Nanoboard sur le port HA. Les bits ne sont transmis qu'en cas de réception d'un signal.

Séance 3: 27/02/2015

Montage sonar nanoboard.jpg

1- La nanoboard délivre 5 signaux en créneaux à 40kHz toute les 0,1 seconde. Ces signaux ont une amplitude de 3,3V et sont injectés dans un montage suiveur afin d'éviter les risque d'endommagement de la Nanoboard.

2- Le signal émis étant trop faible pour être envoyé directement à l'émetteur, il est nécessaire de l'amplifier à l'aide d'un montage non inverseur.

3- Le signal émis par l'émetteur est réfléchi par d'éventuels obstacles et est capté par le récepteur.

4- Le signal reçu étant très atténué, on l'amplifie avec un montage non inverseur.

5- Ce signal est alors comparé à une valeur constante grâce à un trigger.

6- Le trigger renvoie 3,3V (1 logique) à la Nanoboard en cas de réception d'un signal et 0V sinon


Photo sonar1.jpg
Photo sonar2.jpg
Photo sonar3.jpg
Câblage de la partie logique du sonar

Nous avons branché ce câblage à la Nanoboard et à l'analyseur logique afin de vérifier son bon fonctionnement. Nous avons pu observer la bonne interruption du compteur permettant de calculer la distance séparant l'émetteur de l'objet.

Partie informatique

General.png
Schema général

La partie informatique traite de la conception et la réalisation d'une application web et d'un serveur pouvant communiquer entre eux en utilisant la technologie web socket.
Les deux étant dissociées tant d'un point de vue physique (l'application sur la machine de l'utilisateur / le serveur sur la Foxboard) que d'une point de vue programmation (application : html, css, javascript/ serveur : c).

Répartition et avancement au fur et à mesure des séances

Séance 1

- Etude et analyse du sujet en groupe
- Répartition du travail
- Planification des tâche à réaliser

Séance 2

- Installation des librairies libwebsockets et libphidget21
- Analyse des programmes 'exemples' (AdvancedServo-simple.c et websocket.c)
- Mise en place du serveur et de l'application web

A la fin de la séance:
- Serveur fonctionnel avec un application 'basique':
- Envoi d'un angle via l'application ↔ réception par le serveur et envoi de la commande au servomoteur

Séance 3

- Mise en place de la liaison série
- Réception des données du capteur ultrason par le serveur
- Envoi de ces données à l'application
- Création de l'application Web finale

A la fin de la séance:
- Application et serveur fonctionnels
- L'application envoi l'angle de balayage et reçoit la distance capté par le module ultrason

Séance supplémentaire 1

- Envoi et réception de plusieurs données: angle de balayage/vitesse ↔ distance/angle réel du servomoteur
- Ajout de fonctionnalités à l'application (rotation/Etat de la connexion)

Séance supplémentaire 2

- Tournage de la vidéo de présentation
- Mise en place du serveur sur la Foxboard

Procédure de communication : Application ↔ Serveur

Initialisation

Transmission 1.png

Au démarrage, le serveur initialise plusieurs paramètres :
- la position du servomoteur à sa position d'origine (0 degré)
- la vitesse maximale et minimale du servomoteur

Démarrage de l'acquisition

Transmission 3.png

Lors du lancement de l'acquisition, trois données sont envoyées de l'application Web vers le serveur :
- Un booléen acquisition (1: démarrage/ 0 : arrêt)
- Un entier correspondant à l'angle de balayage [20 à 90]
- Un entier correspondant à la vitesse

Acquisition

Transmission 2.png

Pendant l'acquisition, le serveur envoie en continu 2 données :
- l'angle réel (ou courant) du servomoteur
- la distance envoyée par le sonar

Arrêt de l'acquisition

Même procédure que lors du démarrage, mais cette fois avec le booléen acquisition à 0.

Méthode de transmission

Les données qui transitent entre l'application et le serveur se font grâce à la technologie WebSocket.
On concatène toutes les données à envoyer dans une chaîne de caractères avec un caractère 'espace' entre chaque.
A la réception, on doit découper cette chaîne de caractère afin de séparer chaque donnée puis on les convertie en entier pour initialiser les variables correspondantes.

Découpage de la chaîne de caractère reçue en C:

void ReceiveMsg(int NbDonnee, char* msg)
{
    
    // Création de chaîne de caractère qui vont récupérer chaque valeur
    char don[NbDonnee][10];
    int i=0, j=0;
    int debut=0, k=0;

    //Tant que l'on ne détecte pas la fin du message
    while(msg[i] != 0)
    {
        //on initialise 'j' à la position au début de la chaîne courante
        debut = j;  
        
        //On attend de détecter un espace ' '
        if(msg[i] == ' ') { 

            //Puis on récupère la chaîne entre 'debut' et la position courante
            for(k=0; k<(i-debut); k++){
                don[cmpt][k] = msg[k+debut];
            }
           
            //On réinitialise j a la position courante pour qu'il puisse modifier 'debut'
            j = i;
         }

        i++; //On incrémente i
    }

    //On convertie la chaîne de caractère en valeur réelle
    //et on assigne cette valeur au variable correspondante
    acquisition = atof(don[0]);
    Angle = atof(don[1]);
    vitesse = atof(don[2]);
}

Découpage de la chaine de caractère reçue en Javascript

function ReceiveMsg(nbDonneeRecu, msg)
{
    var don = new Array(nbDonneeRecu);
    var i =0, j=0, cmpt= 0, debut = 0;
    
    while(msg.charAt(i) != '')
    {
    
        debut = j;
        if(msg.charAt(i) == ' ') {
             j = i;
             don[cmpt] = msg.substring(debut,i);
             
             cmpt++;
        }
        
        i++;
    }
    
  
    AngleReel = don[0] - 137;
    distance = don[1];
    
}

Application Web

L'application a été construite pour être à la fois simple et intuitive. Elle est codée en Html5/css3 et Javascript.
Elle utilise notamment l'outil CANVAS permettant de réaliser des dessins/animations en javascript. C'est un outil puissant et très modulable.


Screen.png
Screenshot de l'application

Elle possède :

- Un slider 'Angle' : permettant de modifier l'angle de balayage
- Un slider 'Distance' : permettant de modifier la distance maximale d'affichage
- Un slider 'Vitesse' : permettant de modifier la vitesse de balayage

A noter que lors de l'acquisition, l'angle et la vitesse ne peuvent être modifiées.

- Un bouton 'Lancer l'acquisition'
- Un bouton 'Stop'
- Un bouton 'Supprimer les données'

- Une checkbox 'Rotation' : permettant de faire une rotation à 180° du dessin

Panel.png
Tous ces éléments ont été trouvés sur : www.foundation.com