Binome2018-5

De Wiki de bureau d'études PeiP
Révision datée du 23 mai 2019 à 14:44 par Aleu (discussion | contributions) (Entrée 8 : 7 mars)

Objectif à atteindre

Dans ce bureau d'études, il nous est demandé de réaliser un robot dans une optique d'interaction chasseur-proie ; un robot (la proie) doit échapper à son poursuivant (le chasseur). Le robot doit être soit autonome, soit dirigé par une télécommande.

Nous sommes partis sur un robot prédateur autonome, car le frisson de la chasse est une sensation tellement ... irrésistible. Le nom du projet : Hunting Viper, ou la vipère chassante.

Le bureau d'étude peut se décomposer en 3 parties : une partie châssis, une autre électronique et une dernière programmation. La réalisation du châssis, le corps du robot, a été réalisé par Robin ; la seconde a été plus un travail collectif, tandis que la dernière fut exécuté par Alexandre (rédacteur principal du wiki).

AJOUTER D'AUTRES ELEMENTS : cahier des charges + photos des différents éléments + conclusion sur les apports du BE

Journal de bord

Entrée 1 : 14 janvier 2019

Au cours de cette séance, les encadrants nous ont expliqués les principales composantes de notre robot : la réalisation d'un châssis, la création d'une carte électronique et la programmation du mouvement de chasse. Pour notre projet, nous nous concentrerons sur la fabrication du cadre du robot par imprimante 3D. Pour les 2 dernières parties, nous utiliserons une carte Arduino à l'aide d'un shield pour réaliser les connexions entre les différents composants.

Entrée 2 : 31 janvier 2019

Durant cette séance, nous avons développé les premiers plans de notre machine ; nous sommes partis sur une reproduction d'un 4x4 de type exploration safari, souvent utilisé pour la chasse de bêtes exotiques.

Entrée 3 : 4 février 2019

Nous avons étudié l'architecture et la programmation de la carte Arduino afin de procéder à la gestion des capteurs nécessaires à l'évolution de notre prédateur dans son environnement.

Tout d'abord, nous avons téléchargé les fichiers présents sur le wiki, et étudié le bouclier du robot avec Fritzing. Nous avons aussi récupéré un robot pour "emprunter " ses pièces. Nous avons modélisé ces pièces pour les intégrer dans le plan 3D de la structure de notre robot.

Entrée 4 : 11 février

Robin a commencé la modélisation de certains composants pour notre robot, notamment les roues, la roue folle et le capteur à ultrason ; nous mettrons nos résultats sur cette page. Nous avons continué l'étude du shield du robot. Nous avons ajouté un second capteur ultrason pour le déplacement, et 3 capteurs IR pour détecter la présence ou non de la proie.

Entrée 5 : 25 février

Au cours de cette séance, nous avons continué la prise en main de Fritzing et des plans du bouclier de notre robot ; cela nécessitera des optimisations dans les schémas, ce que l'on continuera à faire au cours des prochaines séances. Nous avons également commencé la prise en main des capteurs IR ; nous allons, la prochaine séance, tester le code pour maitriser cette technologie.

Entrée 6 : 28 février

Après avoir (péniblement et avec l'aide des encadrants) réussi à récupérer la librairie de gestion des infrarouges, nous avons effectué quelques tests avec une télécommande. Nous avons constaté que, au moindre trou devant l'émetteur de rayons IR, le capteur annonçait des valeurs. Il faudra également, à la prochaine séance, se renseigner sur la librairie pour savoir sur quel port on peut brancher le capteur, pour avoir plusieurs capteurs IR sur notre robot.

Entrée 7 : 4 mars

De nouveaux essais pour les capteurs IR fructueux ! Nous avons réussi à capter un signal IR sur plusieurs ports PIN Arduino, en utilisant des ports avec interruptions externes. Nous avons utilisé une librairie issue de Adafruit (https://github.com/cyborg5/IRLib2), puis employé une fonction Rawrecv pour effectuer nos tests. Nous allons désormais nous consacrer à créer notre shield, en prenons en compte les différents éléments.

Entrée 8 : 7 mars

Après nos essais fructueux avec les capteurs infrarouges, nous avons essayé les détecteurs ultrason. Le code que nous avons récupéré fonctionne bien, et marche avec 2 capteurs. Mais dans une optique de robot chasseur, utiliser les ultrasons n'est pas une priorité ; ils ne seront donc pas nécessaire. Les prochaines séances seront consacrés à la finalisation du circuit imprimé de la carte Arduino. Il faudra la réaliser au plus vite, pour l'utiliser au plus vite.

Entrée 9 : 11 mars

Au cours de cette séance, nous nous sommes concentrés sur le bouclier de notre robot. Il faudra le terminer pour la prochaine séance, et le faire corriger pour que l'on puisse l'obtenir avant la fin du BE. Robin a également, à l'aide du logiciel Fusion, gratuit pour les étudiants, réalisé la conception 3D des composants de notre robot.


+ IMAGES

Entrée 10 : 14 mars

Au cours de cette séance, nous avons complétement réorganisé les connexions sur notre shield. Malheureusement, nous n'avons pas pu terminé la carte à la fin de cette séance. Nous allons donc la finir au cours de la prochaine séance, pour qu'elle puisse nous parvenir avant la fin du Bureau d'étude.

Entrée 11 : 18 mars

Toujours sur le bouclier ; nous avons ajouté les LED de contrôle, un bouton et une LED IR pour que les proies puissent nous repérer pour tenter de nous échapper.

Entrée 12 : 21 mars

Nous avons (enfin !) terminé le shield pour notre robot. Il nous reste désormais à réaliser le châssis (partie de Robin, grâce à l'utilisation du (superbe) logiciel Fusion 360) et obtenir du code, plutôt ma partie.

Entrée 13 : 25 mars

J'ai commencé à étudier le code pour le robot, notamment la gestion des capteurs en lien avec les moteurs.

Entrée 14 : 28 mars

Nous nous sommes concentrés sur le code pour Hunting Viper ; c'est un travail de longue haleine, et qui ne pourra se concrétiser qu'à la réalisation du support du robot.

Entrée 15 : 1 avril

Robin a commencé les soudures de notre shield. J'ai étudié avec Nathan, élève d'un autre binôme, le code pour le robot.

Entrée 16 : 4 avril

Les soudures sont finies. Cette séance ne fut guère productive ; le groupe a toujours été à moitié absent (CPP puis départ anticipé). Nous avons quand même réussi à avancer un peu sur le code.

Entrée 17 : 25 avril

Au cours de cette séance (double), nous avons pu déterminer un châssis de base pour le robot, et nous avons commencé à effectuer des tests pour la gestion de la librairie Infrarouge avec les caches ; ces derniers sont très efficaces, les capteurs n'étant capable que de signaler un retour que dans une très fine bande, à la hauteur du capteur. Nous allons essayer ce code pour les 3 capteurs en simultané. Nous lancerons également la construction du chassis au cours de la prochaine séance.

Entrée 18 : 29 avril

Les capteurs IR ne souhaitent pas fonctionner, du coup il faudra reprendre le code pour les faire fonctionner. Il faudra également voir le code pour les moteurs.

Entrée 19 : 2 mai

Robin a dû recommencer le châssis ; celui en 3D prenant trop de temps, il faut désormais réaliser un châssis avec la découpeuse 3D. De mon côté, j'ai essayé d'utiliser le code pour les IR avec 3 capteurs, malheureusement la librairie ne supportait pas d'utiliser 3 capteurs sur 3 PIN différentes ; je devrais donc utiliser une autre version de cette librairie pour l'utiliser comme prévu.

Entrée 20 : 6 mai

L'heure de la réussite est enfin arrivée : j'ai trouvé une librairie (https://github.com/Neco777/Arduino-IRremote) qui permet de gérer 3 capteurs IR en même temps sur 3 broches différentes, et elle fonctionne ! Le code peut donc entrer dans sa phase finale : dès que le capteur du milieu réagit à une impulsion, le robot chargera dans sa direction ; dans le cas contraire, il tournera pour rechercher le signal. De son côté, Robin a modélisé un châssis en bois et lui a fait prendre forme. Malheureusement, ce dernier est trop petit, il faudra donc en réaliser un de plus grande taille.

Entrée 21 : 9 mai

Au cours de cette séance, Robin a réalisé le nouveau châssis en bois plus grand ; il l'assemblera au cours de la séance suivante. De mon côté, j'ai terminé une première version du code ; il faudra le tester quand le robot sera assemblé.

#include "IRremote.h"
#include "CppList.h"
#include <SparkFun_TB6612.h>
#define AIN1 36
#define BIN1 40
#define AIN2 34
#define BIN2 42
#define PWMA 6
#define PWMB 5
#define STBY 38
const int offsetA = 1;
const int offsetB = 1;
Motor motor1 = Motor(AIN1, AIN2, PWMA, offsetA, STBY);
Motor motor2 = Motor(BIN1, BIN2, PWMB, offsetB, STBY);
bool _initialized = false;
int rcv_count;
IRrecv **all_rcv;
void setup() {
  if (_initialized) return;  
  Serial.begin(9600);
  pinMode(A0,OUTPUT);
  rcv_count = 3;
  all_rcv = (IRrecv **)malloc(rcv_count*sizeof(int));
  all_rcv[0] = new IRrecv(4);
  all_rcv[1] = new IRrecv(3);
  all_rcv[2] = new IRrecv(18);
  for (int i=0; i<rcv_count; ++i){
    all_rcv[i]->enableIRIn();
  }
  _initialized = true;
}
void loop() {
  digitalWrite(A0,HIGH);
  for (int i=0; i<rcv_count; ++i){
    decode_results results;
    if (all_rcv[i]->decode(&results)) {
      if (i==1) {
      forward(motor1, motor2, 150);
      delay(1000);
      brake(motor1, motor2);
      int btn = DecodeButton(results.value);
      Serial.print("Rcv_");
      Serial.print(i);
      Serial.print(":");
      Serial.println(btn);
      all_rcv[1]->resume(); 
      }       
      else if (i==0) {
      left(motor1,motor2,100);
      delay(100);
      brake(motor1, motor2);
      int btn = DecodeButton(results.value);
      Serial.print("Rcv_");
      Serial.print(i);
      Serial.print(":");
      Serial.println(btn);
      all_rcv[0]->resume();
      }
     else {
     right(motor1,motor2,100);
     delay(1000);
     brake(motor1, motor2);
     int btn = DecodeButton(results.value);
     Serial.print("Rcv_");
     Serial.print(i);
     Serial.print(":");
     Serial.println(btn);
     all_rcv[2]->resume();
     }
   }
   else {
     right(motor1, motor2, 10);
     delay(1);
     brake(motor1, motor2);
   }
   }
 digitalWrite(A0,LOW);
 for (int i=0; i<rcv_count; ++i){
       all_rcv[i]->resume();
  }
  }
const int BTN_EMPTY = 0;
const int BTN_POWER = 99;
const int BTN_0 = 10;
const int BTN_1 = 1;
const int BTN_2 = 2;
const int BTN_3 = 3;
const int BTN_4 = 4;
const int BTN_5 = 5;
const int BTN_STOP = 6;
const int BTN_DOWN = 7;
const int BTN_UP = 8;
const int BTN_BACK = 9;
const int BTN_FWD = 11;
const int BTN_EQ = 12;
const int BTN_REPEAT = 100;
const int BTN_UNKNOWN = 101;
const int BTN_ERROR = 102;
int DecodeButton(unsigned long param){
  int rez = BTN_UNKNOWN;
  switch (param){
  case 0x0: {
            rez = BTN_ERROR;
            break;
        }
  case 0x00FD00FF:
  case 0x00FF728D:
  case 0x20DF4EB1: {
            rez = BTN_POWER;
            break;
           }
  case 0x00FD30CF:{
            rez = BTN_0;
            break;
          }
  case 0x00FD08F7:{
            rez = BTN_1;
            break;
          }
  case 0x00FD8877:{
            rez = BTN_2;
            break;
          }
  case 0x00FD48B7:{
            rez = BTN_3;
            break;
          }
  case 0x00FD28D7:{
            rez = BTN_4;
            break;
          }
  case 0x00FDA857:{
            rez = BTN_5;
            break;
          }
  case 0x00FD40BF:{
            rez = BTN_STOP;
            break;
          }
  case 0x00FD10EF:{
            rez = BTN_DOWN;
            break;
          }
  case 0x00FD50AF:{
            rez = BTN_UP;
            break;
          }
  case 0x00FD20DF:{
            rez = BTN_BACK;
            break;
          }
  case 0x00FD609F:{
            rez = BTN_FWD;
            break;
          }
  case 0x00FDB04F:{
            rez = BTN_EQ;
            break;
          }
  case 0xFFFFFFFF:{
            rez = BTN_REPEAT;
            break;
           }
   }
  return rez;
}

Entrée 22 : 16 mai

J'ai terminé un autre code semblable mais un peu différent ; le travail de vérification ne pourra se faire que quand le Hunting Viper aura pris forme.

#include "IRremote.h"
#include "CppList.h"
#include <SparkFun_TB6612.h> 
#define AIN1 36
#define BIN1 40
#define AIN2 34
#define BIN2 42
#define PWMA 6
#define PWMB 5
#define STBY 38
const int offsetA = 1;
const int offsetB = 1;
Motor motor1 = Motor(AIN1, AIN2, PWMA, offsetA, STBY);
Motor motor2 = Motor(BIN1, BIN2, PWMB, offsetB, STBY);
bool _initialized = false;
int rcv_count;
IRrecv **all_rcv;
void setup() {
  if (_initialized) return; 
  Serial.begin(9600);
  pinMode(A0,OUTPUT);
  rcv_count = 3;
  all_rcv = (IRrecv **)malloc(rcv_count*sizeof(int));
  all_rcv[0] = new IRrecv(4);
  all_rcv[1] = new IRrecv(3);
  all_rcv[2] = new IRrecv(18); 
  for (int i=0; i<rcv_count; ++i){
    all_rcv[i]->enableIRIn();
  }
  _initialized = true;
}
void loop() {
  digitalWrite(A0,HIGH);
  for(int i=0;i<rcv_count;i++){
        decode_results results;
    while(all_rcv[i]->decode(&results)) {
      if(i==1) {
      forward(motor1, motor2, 150);
      delay(500);
      digitalWrite(A0,LOW);
      int btn = DecodeButton(results.value);
      Serial.print("Rcv_");
      Serial.print(i);
      Serial.print(":");
      Serial.println(btn);
      all_rcv[1]->resume(); 
    }
    if (i==0) {
      left(motor1,motor2,100);
      delay(100);
      brake(motor1, motor2);
      int btn = DecodeButton(results.value);
      digitalWrite(A0,LOW);
      Serial.print("Rcv_");
      Serial.print(i);
      Serial.print(":");
      Serial.println(btn);
      all_rcv[0]->resume();
      }
    else {
      right(motor1,motor2,100);
      delay(100);
      brake(motor1, motor2);
      digitalWrite(A0,LOW);
      int btn = DecodeButton(results.value);
      Serial.print("Rcv_");
      Serial.print(i);
      Serial.print(":");
      Serial.println(btn);
      all_rcv[2]->resume();
      }
    }
      else {
        right(motor1, motor2, 10);
        delay(1);
        brake(motor1, motor2);
        for (int i=0; i<rcv_count; ++i){
          all_rcv[i]->resume();
            }
      }
}
} 
const int BTN_EMPTY = 0;
const int BTN_POWER = 99;
const int BTN_0 = 10;
const int BTN_1 = 1;
const int BTN_2 = 2;
const int BTN_3 = 3;
const int BTN_4 = 4;
const int BTN_5 = 5;
const int BTN_STOP = 6;
const int BTN_DOWN = 7;
const int BTN_UP = 8;
const int BTN_BACK = 9;
const int BTN_FWD = 11;
const int BTN_EQ = 12;
const int BTN_REPEAT = 100;
const int BTN_UNKNOWN = 101;
const int BTN_ERROR = 102; 
int DecodeButton(unsigned long param){
  int rez = BTN_UNKNOWN;
  switch (param){
  case 0x0: {
            rez = BTN_ERROR;
            break;
        }
  case 0x00FD00FF:
  case 0x00FF728D:
  case 0x20DF4EB1: {
            rez = BTN_POWER;
            break;
           }
  case 0x00FD30CF:{
            rez = BTN_0;
            break;
          }
  case 0x00FD08F7:{
            rez = BTN_1;
            break;
          }
  case 0x00FD8877:{
            rez = BTN_2;
            break;
          }
  case 0x00FD48B7:{
            rez = BTN_3;
            break;
          }
  case 0x00FD28D7:{
            rez = BTN_4;
            break;
          }
  case 0x00FDA857:{
            rez = BTN_5;
            break;
          }
  case 0x00FD40BF:{
            rez = BTN_STOP;
            break;
          }
  case 0x00FD10EF:{
            rez = BTN_DOWN;
            break;
          }
  case 0x00FD50AF:{
            rez = BTN_UP;
            break;
          }
  case 0x00FD20DF:{
            rez = BTN_BACK;
            break;
          }
  case 0x00FD609F:{
            rez = BTN_FWD;
            break;
          }
  case 0x00FDB04F:{
            rez = BTN_EQ;
            break;
          }
  case 0xFFFFFFFF:{
            rez = BTN_REPEAT;
            break;
           }
   }
  return rez;
}

Entrée 23 (finale) : 23 mai

Cette dernière séance est consacrée à la finalisation du Hunting Viper et du wiki associé.

Conclusion et avis sur le Bureau d'Etude

Partie software : Alexandre

Ce Bureau d'Etude m'a permis de m'investir dans un grand projet, et de m'approprier des connaissances dans plusieurs domaines, et ce dans le cadre d'une utilisation directe. De plus, Même si je ne souhaite pas intégrer le département d'IMA de Lille, cela m'a donné une idée du travail que l'on peut faire en tant qu'ingénieur. Ce bureau d'études m'a permis d'apprendre, sans vraiment m'en rendre compte ; en plus, il s'agit de choses tout à fait inédite, que je n'aurais pas forcément appris en autodidacte. Le BE m'a également conforté dans mon choix de départment (Polytech Sorbonne, département Robotique) ; en effet, l'un des points forts de la robotique est sa polyvalence, ce que j'apprécie particulièrement.

Partie harware : Robin

Conclusion finale

Ce Bureau d'Etude a été un gain très important de connaissances et de réalisations pratiques dans plusieurs domaines. Il nous a permis de se projeter, durant plus de 40 heures, dans un travail d'ingénieur, et plus précisement dans le domaine de la robotique.