Projet IMA3 P2, 2015/2016, TD2

De Wiki de Projets IMA
Révision datée du 1 juin 2016 à 21:29 par Dmarruch (discussion | contributions) (Prototype Arduino)

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 commanderai de façon autonome le servomoteur, et renverra 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 notre 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.jpg

Partie informatique

Objectifs pour la prochaine séance :

- Finir le prototype Arduino
- Configurer le Raspberry Pi

Séance 2

Partie électronique

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) :

int pos = 90;
int pas = 1;
 
/* 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.
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

Partie informatique

Démonstration

Conclusion