Projet IMA3 P2, 2015/2016, TD2 : Différence entre versions

De Wiki de Projets IMA
(Prototype Arduino)
 
(28 révisions intermédiaires par 3 utilisateurs non affichées)
Ligne 35 : Ligne 35 :
 
=== Partie électronique ===
 
=== Partie électronique ===
  
Durant la première séance, nous nous sommes concentré (dans la partie électronique) sur la commande du servomoteur. Nous avons convenu que la FPGA commanderai de façon autonome le servomoteur, et renverra tous les x secondes sa position à la Raspberry via le liaison série.
+
Durant la première séance, nous nous sommes concentré (dans la partie électronique) sur la commande du servomoteur. Nous avons convenu que la FPGA commanderait de façon autonome le servomoteur, et renverrait tous les x secondes sa position à la Raspberry via le liaison série.
 
Dans la partie électronique, il nous faut donc gérer un compteur qui augmente progressivement le duty cycle jusqu'à atteindre sa valeur maximale. Ainsi, nous pourrons produire en sortie un signal analogique à connecter directement au moteur. Une fois que nous aurons terminé ce travail, nous ajouterons la décrémentation du duty cycle pour pouvoir faire tourner le servomoteur de 0 à 180° puis de 180° à 0° et cela durant toute la durée de fonctionnement du détecteur.
 
Dans la partie électronique, il nous faut donc gérer un compteur qui augmente progressivement le duty cycle jusqu'à atteindre sa valeur maximale. Ainsi, nous pourrons produire en sortie un signal analogique à connecter directement au moteur. Une fois que nous aurons terminé ce travail, nous ajouterons la décrémentation du duty cycle pour pouvoir faire tourner le servomoteur de 0 à 180° puis de 180° à 0° et cela durant toute la durée de fonctionnement du détecteur.
  
Voici notre avancement de notre schéma sur Altium Designer après la première séance de projet:
+
Voici l'avancement de notre schéma sur Altium Designer après la première séance de projet:
  
 
[[Fichier:elec1.jpg]]
 
[[Fichier:elec1.jpg]]
Ligne 50 : Ligne 50 :
  
 
Concernant la matrice de leds, nous avons pu sélectionner les leds que nous souhaitons utiliser (32 leds ici car on ne travaille que sur 180°) ainsi que modifier les couleurs de la matrice. <br>
 
Concernant la matrice de leds, nous avons pu sélectionner les leds que nous souhaitons utiliser (32 leds ici car on ne travaille que sur 180°) ainsi que modifier les couleurs de la matrice. <br>
[[Fichier:Jbad_detecteur-arduino.jpg]]
+
[[Fichier:Jbad_detecteur-arduino.png]]
  
 
=== Partie informatique ===
 
=== Partie informatique ===
 +
Nous considérons pour le moment que la partie électronique pourra gérer :<br>
 +
- la rotation du servomoteur<br>
 +
- l'envoi de sa position sur la liaison série<br>
 +
- le calcul de la distance à l'obstacle par le sonar<br>
 +
- l'envoi de cette information sur la liaison série<br>
  
 +
Nous nous intéressons désormais au programme à implémenter dans la raspberry afin de déterminer quelle led allumer sur la matrice.<br>
 +
 +
Lors de nos essais pour tester l'allumage des leds sur la matrice, nous nous sommes rendu compte qu'elles étaient numérotées de la manière suivante :
 +
[[Fichier:Matrice LED(1).jpg]]
 +
 +
 +
L'idée est donc de déterminer le numéro de la led à allumer à partir des données (sur la liaison série):<br>
 +
- p la position du servomoteur<br>
 +
- r la distance mesurée par le sonar<br>
 +
 +
Le problème est donc décrit en coordonnées polaires, nous nous plaçons en coordonnées cartésiennes de la manière suivante :<br>
 +
x = r * cos(téta)<br>
 +
y = r * sin(téta)      avec téta la valeur ramenée en radiant de la position p du servomoteur<br>
 +
 +
 +
Dans le cas où l'on n'utilise qu'un seul servomoteur, on ne travaille que sur la moitié (supérieure) de la matrice.
 +
Il faut identifier la colonne et la ligne de la led à allumer :<br>
 +
 +
colonne = E(x + r)      car x va de -r à r<br>
 +
ligne = E(y)<br>
 +
 +
Nous pouvons ainsi obtenir le numéro de la led à allumer :<br>
 +
 +
n°led = (colonne + 8 * ligne) +32 <br>
 +
(le +32 sert à travailler dans la partie supérieure de la matrice)<br>
  
  
Ligne 63 : Ligne 93 :
  
 
=== Partie électronique ===
 
=== Partie électronique ===
 +
Nous revenons à nous intéresser au signal PWM qui apportera la consigne en position au servomoteur.
 +
En réétudiant notre schéma, nous nous rendons compte qu'il faut lui apporter quelques modifications telles que remplacer certains fils par des bus (les données utilisées sont sur 8 bits).
 +
 +
Ajustement du schéma sur Altium Designer :
 +
[[Fichier:montageFPGA2.jpg]]
  
 
=== Partie informatique ===
 
=== Partie informatique ===
Ligne 69 : Ligne 104 :
 
Durant cette seconde séance de projet, nous avons continué le prototype arduino. <br>
 
Durant cette seconde séance de projet, nous avons continué le prototype arduino. <br>
 
Voici ci-dessous notre avancement (sans matrice RGB pour le moment) :
 
Voici ci-dessous notre avancement (sans matrice RGB pour le moment) :
int pos = 90;
+
 
int pas = 1;
+
[[Fichier:ard1.png]]
 
+
[[Fichier:ard2.png]]
/* Servomoteur */
+
 
#include <Servo.h>
 
 
Servo myservo;  // create servo object to control a servo
 
// twelve servo objects can be created on most boards
 
 
/* SONAR*/
 
int trig = 7;
 
int echo = 9;
 
long lecture_echo;
 
long cm;
 
 
float theta;
 
float x;
 
float y;
 
int c;
 
int l;
 
int num_case;
 
 
//Define Colors we need
 
#define BLACK  0x00
 
#define RED    0xE0
 
 
 
//Define the SPI Pin Numbers
 
#define SLAVESELECT 10//ss
 
#define DATAOUT    11//MOSI
 
#define DATAIN      12//MISO
 
#define SPICLOCK    13//sck
 
 
 
const int num_matrix = 1;
 
char color_buffer[64*num_matrix];
 
 
 
char blank[]={
 
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
 
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
 
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
 
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
 
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
 
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
 
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
 
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK
 
};
 
 
void set_matrix(){
 
  digitalWrite(SLAVESELECT, LOW); //Activate the RGB Matrix
 
  spi_transfer(0x25); //command character % == 0x25
 
  spi_transfer(0x02); //set LED matrix to position in daisy chain, must be between 0x01-0x08
 
  digitalWrite(SLAVESELECT, HIGH); //Deactivate the RGB Matrix
 
}
 
 
int p = 0; //dot position
 
int xMAX = 8;//max number column in 1 subset
 
int yMAX = 8;//max number row in 1 subset
 
 
void clear_buffer(){
 
  //start clearing array moving down rows
 
  for(int y=0; y<yMAX; y++){
 
    //clear array from the highest subset in daisy chained array
 
    for(int i=num_matrix; i>0; i--){
 
      //clear array from right to left
 
      for(int x=0; x<xMAX; x++){
 
        //current position that is being cleared
 
        p = (yMAX*y) + (x + (i-1)*(xMAX*yMAX));
 
        //clear by saving what is in the blank sub-array to your final array
 
        color_buffer[p] = blank[x];
 
      }
 
    }
 
    }
 
  matrix_write();//write array of colors to matrix
 
  delay(10);//allow some time for the final matrix to be seen 
 
}
 
 
void setup() {
 
  // SERVO
 
  myservo.attach(3); 
 
 
  // SONAR
 
  pinMode(trig, OUTPUT);
 
  digitalWrite(trig, LOW);
 
  pinMode(echo, INPUT);
 
 
    //----------SPI BUS SETUP----------
 
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1);  //Enable SPI HW, Master Mode, divide clock by 16
 
 
  //Set the pin modes for the RGB matrix
 
  pinMode(DATAOUT, OUTPUT);
 
  pinMode(DATAIN, INPUT);
 
  pinMode(SPICLOCK,OUTPUT);
 
  pinMode(SLAVESELECT,OUTPUT);
 
 
  //Make sure the RGB matrix is deactivated
 
  digitalWrite(SLAVESELECT,HIGH);
 
 
 
Nous nous sommes rendu compte qu'il y avait un problème lorsque nous utilisions le moniteur série. En effet, les données transmises n'étaient pas précises. <br>
 
Nous nous sommes rendu compte qu'il y avait un problème lorsque nous utilisions le moniteur série. En effet, les données transmises n'étaient pas précises. <br>
 
Suite à l'intervention d'un autre étudiant, nous pensons désormais qu'il s'agirait du fait que le servomoteur nécessiterait une alimentation externe. Nous essaierons de le tester durant la prochaine séance. <br>
 
Suite à l'intervention d'un autre étudiant, nous pensons désormais qu'il s'agirait du fait que le servomoteur nécessiterait une alimentation externe. Nous essaierons de le tester durant la prochaine séance. <br>
Ligne 173 : Ligne 116 :
  
 
=== Partie électronique ===
 
=== Partie électronique ===
 +
En ce début de séance 3, nous avons dû reconsidérer le problème. En effet, avant de terminer la création du signal qui apportera la consigne au servomoteur, nous nous demandons quel signal envoyer exactement. Pour cela, une étude du fonctionnement du moteur est nécessaire.
 +
 +
[[Fichier:AOP suiveur.jpg|200px|légende]]Nous utilisons un amplificateur opérationnel monté en suiveur pour permettre l'adaptation d'impédance entre les deux parties du montage.
 +
 +
Le test réalisé est le suivant :<br>
 +
[[Fichier:test utilisation moteur.jpg]]<br>
 +
En faisant aller le moteur entre ses deux positions extrêmes, nous pouvons déterminer quel signal mettre en entrée afin de le commander en position.
  
 
=== Partie informatique ===
 
=== Partie informatique ===
 +
 +
Pour finir ce projet, nous avons décidé de mettre de côté la matrice LED pour nous concentrer sur l'interface web et la mise en place de la communication du port série.
 +
 +
== websock.c ==
 +
 +
Dans un premier temps, nous aborderons le problème à la racine (de la raspberry) avec le fichier websock.c. Ce fichier est à compiler en faisant : ''gcc -lwebsockets -o serveur websock.c'' .
 +
Ce fichier contient les fonctions pour ouvrir le port série, le configurer et le fermer. Mais il contient aussi des structures lié au serveur websocket pour transmettre les données acquise par la liaison série au serveur.
 +
Nous exécutons l’exécutable qui résulte du code et l'acquisition se réalise.
 +
 +
 +
== index.html ==
 +
 +
Ce fichier est disponible dans le dossier /var/www/ come tout le contenu web.
 +
Sur cette page web, accessible en écrivant 172.26.79.11 dans un moteur de recherche après avoir connecté la Raspberry, nous pouvons voir le contenu suivant:
 +
 +
[[Fichier:indexhtml.png]]
 +
 +
Nous avons repris le design des disques pour former notre matrice. Comme spécifié dans le fichier, nous avons recours au fichier disque2.js pour tout ce qui est fonction.
 +
 +
== disque2.js ==
 +
 +
Ce fichier comprend les couleurs initiales des LEDS sur la page web ainsi que la fonction pour dessiner les disque et la fonction changeCouleur qui ne nous sert pas dans notre projet mais nous ne tenions pas à nous en séparer...
 +
nous voulions aussi rajouter une fonction pour mettre à voir les leds mais par manque de temps, nous n'avons pas pu la mettre sur la raspberry. La voici:
 +
 +
[[Fichier:check1.png]]
 +
[[Fichier:check2.png]]
 +
 +
Nous avions pour idée de travailler en coordonnés polaire pour simplifier tous les cas. Malheureusement, les cosinus, sinus et partie entière posaient problème. On est donc resté sur une syntaxe "sure" même si cela restait fastidieux.
  
 
== Démonstration ==
 
== Démonstration ==
  
 
== Conclusion ==
 
== Conclusion ==
 +
 +
- Grâce à ce travail, nous avons pu étudier un projet complet regroupant plusieurs disciplines tels que l'electronique, la logique et l'informatique. De plus, cela nous a permis de découvrir la filière Système communiquant avec ses difficultés, ses plaisirs et son amplitude d'application.
 +
 +
- Malgrès le fait que nous n'avons su récupérer convenablement les données transmises par liaison série durant le temps imparti. Cependant, nous avons réalisé notre projet sur arduino et nous avons été sensibilisé aux liens entre les différents outils tels que La FPGA et la nanoboard, l'arduino, la raspberry, les servos moteurs, les capteurs ultra sons, les matrices leds, le langage javascript, html et enfin websocket.
 +
 +
- Nous sommes satisfait d'avoir eu un projet requérant une multitudes de compétences ce qui nous a permis de stimuler notre travail d'équipe. Cependant le travail demandé reste dense en vue du nombre d'heure dont nous disposons. Ce fût une belle sensibilisation au travail d'un étudiant de quatrième année en spécialité IMA.

Version actuelle datée du 31 décembre 2016 à 23:38

Projet IMA3-SC 2015/2016 : Détecteur de proximité

Cahier des charges

Dans le cadre de notre thème de l'année "la sécurité", notre projet en système communicant consistera à réaliser un détecteur de proximité pouvant détecter une présence dans un périmètre défini. Dès qu'un individu se rapprochera du détecteur, la matrice de leds représentera la zone balayée par le sonar et se colorera en fonction de la position de la cible. De plus, nous renverrons l'image de la matrice sur l'interface web. Deux détecteurs seront positionnés sur deux servomoteurs différents pour former un angle de détection de 360°.

Matériel :

2 sonars ultra-sons (On commencera par 1 sonar ultra-sons)

2 servomoteurs en position 180° ( On commencera par 1 servomoteur)

1 afficheur matrice led

1 Raspberry pi

1 Nanoboard


Interface web : topographie de la détection

Voici la répartition des leds allumées en fonction de leurs positions:

Mapping matrice LED.jpg


Dispositif:

Voici ci-dessous le schéma du dispositif complet :

Dispositif detecteur proximite.png

Séance 1

Partie électronique

Durant la première séance, nous nous sommes concentré (dans la partie électronique) sur la commande du servomoteur. Nous avons convenu que la FPGA commanderait de façon autonome le servomoteur, et renverrait tous les x secondes sa position à la Raspberry via le liaison série. Dans la partie électronique, il nous faut donc gérer un compteur qui augmente progressivement le duty cycle jusqu'à atteindre sa valeur maximale. Ainsi, nous pourrons produire en sortie un signal analogique à connecter directement au moteur. Une fois que nous aurons terminé ce travail, nous ajouterons la décrémentation du duty cycle pour pouvoir faire tourner le servomoteur de 0 à 180° puis de 180° à 0° et cela durant toute la durée de fonctionnement du détecteur.

Voici l'avancement de notre schéma sur Altium Designer après la première séance de projet:

Elec1.jpg

Prototype Arduino

Pendant la première séance de projet, nous avons pris connaissance de l'Arduino.

Nous avons également testé le servomoteur ainsi que la matrice de leds fournis.

Nous avons pu faire fonctionner notre servomoteur d'un angle de 0 à 180° et inversement.

Concernant la matrice de leds, nous avons pu sélectionner les leds que nous souhaitons utiliser (32 leds ici car on ne travaille que sur 180°) ainsi que modifier les couleurs de la matrice.
Jbad detecteur-arduino.png

Partie informatique

Nous considérons pour le moment que la partie électronique pourra gérer :
- la rotation du servomoteur
- l'envoi de sa position sur la liaison série
- le calcul de la distance à l'obstacle par le sonar
- l'envoi de cette information sur la liaison série

Nous nous intéressons désormais au programme à implémenter dans la raspberry afin de déterminer quelle led allumer sur la matrice.

Lors de nos essais pour tester l'allumage des leds sur la matrice, nous nous sommes rendu compte qu'elles étaient numérotées de la manière suivante : Matrice LED(1).jpg


L'idée est donc de déterminer le numéro de la led à allumer à partir des données (sur la liaison série):
- p la position du servomoteur
- r la distance mesurée par le sonar

Le problème est donc décrit en coordonnées polaires, nous nous plaçons en coordonnées cartésiennes de la manière suivante :
x = r * cos(téta)
y = r * sin(téta) avec téta la valeur ramenée en radiant de la position p du servomoteur


Dans le cas où l'on n'utilise qu'un seul servomoteur, on ne travaille que sur la moitié (supérieure) de la matrice. Il faut identifier la colonne et la ligne de la led à allumer :

colonne = E(x + r) car x va de -r à r
ligne = E(y)

Nous pouvons ainsi obtenir le numéro de la led à allumer :

n°led = (colonne + 8 * ligne) +32
(le +32 sert à travailler dans la partie supérieure de la matrice)


Objectifs pour la prochaine séance :

- Finir le prototype Arduino
- Configurer le Raspberry Pi

Séance 2

Partie électronique

Nous revenons à nous intéresser au signal PWM qui apportera la consigne en position au servomoteur. En réétudiant notre schéma, nous nous rendons compte qu'il faut lui apporter quelques modifications telles que remplacer certains fils par des bus (les données utilisées sont sur 8 bits).

Ajustement du schéma sur Altium Designer : MontageFPGA2.jpg

Partie informatique

Arduino :

Durant cette seconde séance de projet, nous avons continué le prototype arduino.
Voici ci-dessous notre avancement (sans matrice RGB pour le moment) :

Ard1.png Ard2.png

Nous nous sommes rendu compte qu'il y avait un problème lorsque nous utilisions le moniteur série. En effet, les données transmises n'étaient pas précises.
Suite à l'intervention d'un autre étudiant, nous pensons désormais qu'il s'agirait du fait que le servomoteur nécessiterait une alimentation externe. Nous essaierons de le tester durant la prochaine séance.

Enfin, nous avons commencé à configurer la Raspberry Pi.

Séance 3

Partie électronique

En ce début de séance 3, nous avons dû reconsidérer le problème. En effet, avant de terminer la création du signal qui apportera la consigne au servomoteur, nous nous demandons quel signal envoyer exactement. Pour cela, une étude du fonctionnement du moteur est nécessaire.

légendeNous utilisons un amplificateur opérationnel monté en suiveur pour permettre l'adaptation d'impédance entre les deux parties du montage.

Le test réalisé est le suivant :
Test utilisation moteur.jpg
En faisant aller le moteur entre ses deux positions extrêmes, nous pouvons déterminer quel signal mettre en entrée afin de le commander en position.

Partie informatique

Pour finir ce projet, nous avons décidé de mettre de côté la matrice LED pour nous concentrer sur l'interface web et la mise en place de la communication du port série.

websock.c

Dans un premier temps, nous aborderons le problème à la racine (de la raspberry) avec le fichier websock.c. Ce fichier est à compiler en faisant : gcc -lwebsockets -o serveur websock.c . Ce fichier contient les fonctions pour ouvrir le port série, le configurer et le fermer. Mais il contient aussi des structures lié au serveur websocket pour transmettre les données acquise par la liaison série au serveur. Nous exécutons l’exécutable qui résulte du code et l'acquisition se réalise.


index.html

Ce fichier est disponible dans le dossier /var/www/ come tout le contenu web. Sur cette page web, accessible en écrivant 172.26.79.11 dans un moteur de recherche après avoir connecté la Raspberry, nous pouvons voir le contenu suivant:

Indexhtml.png

Nous avons repris le design des disques pour former notre matrice. Comme spécifié dans le fichier, nous avons recours au fichier disque2.js pour tout ce qui est fonction.

disque2.js

Ce fichier comprend les couleurs initiales des LEDS sur la page web ainsi que la fonction pour dessiner les disque et la fonction changeCouleur qui ne nous sert pas dans notre projet mais nous ne tenions pas à nous en séparer... nous voulions aussi rajouter une fonction pour mettre à voir les leds mais par manque de temps, nous n'avons pas pu la mettre sur la raspberry. La voici:

Check1.png Check2.png

Nous avions pour idée de travailler en coordonnés polaire pour simplifier tous les cas. Malheureusement, les cosinus, sinus et partie entière posaient problème. On est donc resté sur une syntaxe "sure" même si cela restait fastidieux.

Démonstration

Conclusion

- Grâce à ce travail, nous avons pu étudier un projet complet regroupant plusieurs disciplines tels que l'electronique, la logique et l'informatique. De plus, cela nous a permis de découvrir la filière Système communiquant avec ses difficultés, ses plaisirs et son amplitude d'application.

- Malgrès le fait que nous n'avons su récupérer convenablement les données transmises par liaison série durant le temps imparti. Cependant, nous avons réalisé notre projet sur arduino et nous avons été sensibilisé aux liens entre les différents outils tels que La FPGA et la nanoboard, l'arduino, la raspberry, les servos moteurs, les capteurs ultra sons, les matrices leds, le langage javascript, html et enfin websocket.

- Nous sommes satisfait d'avoir eu un projet requérant une multitudes de compétences ce qui nous a permis de stimuler notre travail d'équipe. Cependant le travail demandé reste dense en vue du nombre d'heure dont nous disposons. Ce fût une belle sensibilisation au travail d'un étudiant de quatrième année en spécialité IMA.