Projet IMA3 P2, 2015/2016, TD2 : Différence entre versions
(→Partie informatique) |
(→Arduino :) |
||
Ligne 99 : | Ligne 99 : | ||
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; | |
− | + | ||
− | + | /* Servomoteur */ | |
− | + | #include <Servo.h> | |
− | + | #include <Serial.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; | ||
+ | |||
+ | |||
+ | void setup() { | ||
+ | // SERVO | ||
+ | myservo.attach(3); | ||
+ | |||
+ | // SONAR | ||
+ | pinMode(trig, OUTPUT); | ||
+ | digitalWrite(trig, LOW); | ||
+ | pinMode(echo, INPUT); | ||
− | + | Serial.begin(9600); | |
− | + | ||
− | + | } | |
− | + | ||
− | + | void loop() | |
− | + | ||
− | + | { | |
− | + | // put your main code here, to run repeatedly: | |
− | + | pos += pas; | |
− | + | ||
+ | if (pos>= 180) | ||
+ | { | ||
+ | pas = -1; | ||
+ | } | ||
+ | if (pos <=0) | ||
+ | { | ||
+ | pas = 1; | ||
+ | } | ||
− | + | myservo.write(pos); | |
− | + | ||
− | + | // ** envoie su la liaison srie la position de degres. | |
− | + | // On commence donc par écrire la position avant la distance. | |
− | + | //Serial.print("Position_degres : "); // debug | |
− | + | //Serial.println(pos); | |
− | + | Serial.write(pos); | |
− | + | ||
− | + | // **** Capteur Ultrason **** | |
− | + | digitalWrite(trig, HIGH); | |
− | + | delayMicroseconds(10); | |
− | + | digitalWrite(trig, LOW); | |
− | + | lecture_echo = pulseIn(echo, HIGH); | |
− | + | cm = lecture_echo / 58; | |
− | + | ||
− | + | //** envoie su la liaison srie la distance | |
− | + | //Serial.print("Distance_cm : "); | |
− | + | //Serial.println(cm); | |
− | + | Serial.write(cm); | |
− | + | ||
− | + | //** si on detecte une transmission | |
− | + | delay(500); // pause de 500ms | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | } | |
− | + | ||
+ | |||
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> |
Version du 16 juin 2016 à 21:51
Sommaire
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:
Dispositif:
Voici ci-dessous le schéma du dispositif complet :
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:
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.
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 :
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
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>
- include <Serial.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;
void setup() {
// SERVO myservo.attach(3);
// SONAR pinMode(trig, OUTPUT); digitalWrite(trig, LOW); pinMode(echo, INPUT); Serial.begin(9600);
}
void loop()
{
// put your main code here, to run repeatedly:
pos += pas;
if (pos>= 180) {
pas = -1;
} if (pos <=0) {
pas = 1;
}
myservo.write(pos);
// ** envoie su la liaison srie la position de degres. // On commence donc par écrire la position avant la distance. //Serial.print("Position_degres : "); // debug //Serial.println(pos); Serial.write(pos);
// **** Capteur Ultrason **** digitalWrite(trig, HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); lecture_echo = pulseIn(echo, HIGH); cm = lecture_echo / 58;
//** envoie su la liaison srie la distance //Serial.print("Distance_cm : "); //Serial.println(cm); Serial.write(cm);
//** si on detecte une transmission delay(500); // pause de 500ms
}
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.