Introduction: Le Vélo Explorateur

Nous sommes 4 étudiantes en L3 Génie Urbain à l'Université Gustave Eiffel et nous sommes ravies de vous présenter notre projet de vélo explorateur, une fusion passionnante entre l'innovation en techniques urbaines et l'enthousiasme du sport, en particulier à l'approche des Jeux Olympiques. Notre équipe a conçu et réalisé un vélo explorateur qui offre une expérience unique et immersive pour les amateurs de cyclisme urbain et de découvertes. Laissez-nous vous guider à travers les caractéristiques clés et les composants innovants de notre projet.

Notre projet de vélo explorateur combine habilement des techniques urbaines innovantes avec le thème du sport, inspiré par l'approche des Jeux Olympiques. Grâce à l'utilisation intelligente de la technologie, nous offrons aux cyclistes urbains une expérience immersive et enrichissante, tout en encourageant l'exploration et la découverte de nouveaux lieux. Nous sommes impatients de continuer à développer ce projet et d'explorer de nouvelles possibilités pour rendre nos villes plus dynamiques et engageantes pour les passionnés de sport et d'aventure.

Nous avons réalisé un prototype qui peut être utilisé afin de visiter le campus de l'Université Gustave Eiffel et ses écoles partenaires en utilisant une mobilité douce grâce à 5 points :

  • Le FabLab Descartes
  • Le bâtiment Lavoisier
  • La Maison de l'Étudiant
  • L'École des Ponts
  • L'ESIEE Paris

Supplies

Notre vélo explorateur est équipé de plusieurs composants technologiques qui fonctionnent de concert pour créer une expérience dynamique et interactive. Voici les principaux éléments de notre projet :


1. Capteur GPS : Nous avons intégré un capteur GPS (Module GPS Grove 109020022) au niveau du guidon du vélo. Ce capteur permet de suivre avec précision un parcours préétabli parsemé de check-points modélisés par des coordonnées géographiques.


2. Carte Arduino Mega : La carte Arduino Mega constitue le cerveau de notre système. Elle est programmée pour recevoir les données du capteur GPS, contrôler les LED. Il y a un shield dessus afin de connecter les composants électroniques.


3. Buzzer : Connecté à la carte Arduino Mega, il permet d'émettre un son au passage de chaque balise, ce qui rend l'expérience interactive.

4. LED : Des LED sont placées le long du parcours pour indiquer visuellement la progression du cycliste. Chaque LED s'éteint au passage d'un check-point, offrant ainsi une rétroaction visuelle en temps réel.

5. Des câbles femelle-femelle pour connecter les composants.

6.Boîtier avec écran : Nous avons conçu un boîtier intégrant la carte Arduino, le capteur GPS et les autres composants du projet. Un écran, gravé au laser, est installé sur ce boîtier pour afficher le parcours et les points de contrôle à venir, offrant ainsi une interface utilisateur claire et intuitive.

7. Une batterie pour alimenter le système (ici nous utilisons une batterie de 4V) ainsi qu'une prise jack pour le relier à la carte Arduino

Step 1: Simulation De Programme

Au départ, nous n'avions pas encore reçu notre capteur GPS, nous avons donc simulé notre programme avec un capteur de distance que nous avions à disposition ainsi qu'un buzzer qui permet d'émettre un son en fonction des données reçues par le capteur.

Le code est le suivant :

#define TRIGGER_PIN 2 // Fil de déclenchement du capteur de distance

#define ECHO_PIN 3  // Fil d'écho du capteur de distance


#define LED_PIN_1 4 // Fil de la première LED

#define LED_PIN_2 5 // FIl de la deuxième LED

#define LED_PIN_3 6 // Fil de la troisième LED

#define LED_PIN_4 7 // Fil de la quatrième LED


#define BUZZER_PIN 8 // Fil du buzzer


#define DISTANCE_THRESHOLD 10 // Seuil de distance entre chaque point


void setup() {

 Serial.begin(9600);


 pinMode(TRIGGER_PIN, OUTPUT);

 pinMode(ECHO_PIN, INPUT);


 pinMode(LED_PIN_1, OUTPUT);

 pinMode(LED_PIN_2, OUTPUT);

 pinMode(LED_PIN_3, OUTPUT);

 pinMode(LED_PIN_4, OUTPUT);


 pinMode(BUZZER_PIN, OUTPUT);


 // Allumer toutes les LEDs au début

 digitalWrite(LED_PIN_1, HIGH);

 digitalWrite(LED_PIN_2, HIGH);

 digitalWrite(LED_PIN_3, HIGH);

 digitalWrite(LED_PIN_4, HIGH);

}


void loop() {

 // Mesurer la distance

 long duration, distance;

 digitalWrite(TRIGGER_PIN, LOW);

 delayMicroseconds(2);

 digitalWrite(TRIGGER_PIN, HIGH);

 delayMicroseconds(10);

 digitalWrite(TRIGGER_PIN, LOW);

 duration = pulseIn(ECHO_PIN, HIGH);

 distance = duration * 0.034 / 2;

 Serial.println(distance);


 // Allumer ou éteindre les LEDs en fonction de la distance

 if (distance < 6) {


  digitalWrite(LED_PIN_1, LOW);  // Éteindre la LED 1

  digitalWrite(BUZZER_PIN, HIGH); // Activer le buzzer

  delay(100);           // Attendre un court moment

  digitalWrite(BUZZER_PIN, LOW); // Désactiver le buzzer

  delay(1000);          // Attendre un court moment

 }

 if (distance < 10 && distance > 6) {


  digitalWrite(LED_PIN_2, LOW);  // Éteindre la LED 2

  digitalWrite(BUZZER_PIN, HIGH); // Activer le buzzer

  delay(100);           // Attendre un court moment

  digitalWrite(BUZZER_PIN, LOW); // Désactiver le buzzer

  delay(50);           // Attendre un court moment

  digitalWrite(BUZZER_PIN, HIGH); // Activer le buzzer

  delay(100);           // Attendre un court moment

  digitalWrite(BUZZER_PIN, LOW); // Désactiver le buzzer

  delay(1000);          // Attendre un court moment

 }

 if (distance < 18 && distance > 10) {



  digitalWrite(LED_PIN_3, LOW);  // Éteindre la LED 3

  delay(100);           // Attendre un court moment

  digitalWrite(BUZZER_PIN, LOW); // Désactiver le buzzer

  delay(50);           // Attendre un court moment digitalWrite(LED_PIN_1, LOW); // Éteindre la LED 1

  digitalWrite(BUZZER_PIN, HIGH); // Activer le buzzer

  delay(100);           // Attendre un court moment

  digitalWrite(BUZZER_PIN, LOW); // Désactiver le buzzer

  delay(50);           // Attendre un court moment digitalWrite(LED_PIN_1, LOW); // Éteindre la LED 1

  digitalWrite(BUZZER_PIN, HIGH); // Activer le buzzer

  delay(100);           // Attendre un court moment

  digitalWrite(BUZZER_PIN, LOW); // Désactiver le buzzer

  delay(1000);          // Attendre un court moment

 }

 if (distance < 23 && distance > 18) {


  digitalWrite(LED_PIN_4, LOW); // Éteindre la LED 4


  digitalWrite(BUZZER_PIN, HIGH); // Activer le buzzer

  delay(100);           // Attendre un court moment

  digitalWrite(BUZZER_PIN, LOW); // Désactiver le buzzer

  delay(50);           // Attendre un court moment digitalWrite(LED_PIN_1, LOW); // Éteindre la LED 1

  digitalWrite(BUZZER_PIN, HIGH); // Activer le buzzer

  delay(100);           // Attendre un court moment

  digitalWrite(BUZZER_PIN, LOW); // Désactiver le buzzer

  delay(50);           // Attendre un court moment digitalWrite(LED_PIN_1, LOW); // Éteindre la LED 1

  digitalWrite(BUZZER_PIN, HIGH); // Activer le buzzer

  delay(100);           // Attendre un court moment

  digitalWrite(BUZZER_PIN, LOW); // Désactiver le buzzer

  delay(50);           // Attendre un court moment digitalWrite(LED_PIN_1, LOW); // Éteindre la LED 1

  digitalWrite(BUZZER_PIN, HIGH); // Activer le buzzer

  delay(100);           // Attendre un court moment

  digitalWrite(BUZZER_PIN, LOW); // Désactiver le buzzer

  delay(1000);          // Attendre un court moment

 }


 // Activer le buzzer selon le nombre de LEDs éteintes

 /*for (int i = 0; i < numLEDsOff; i++) {

  digitalWrite(BUZZER_PIN, HIGH); // Activer le buzzer

  delay(10); // Attendre un court moment

  digitalWrite(BUZZER_PIN, LOW); // Désactiver le buzzer

  delay(100); // Attendre un court moment

 }*/

 if (distance > 60) {

  digitalWrite(LED_PIN_1, HIGH);

  digitalWrite(LED_PIN_2, HIGH);

  digitalWrite(LED_PIN_3, HIGH);

  digitalWrite(LED_PIN_4, HIGH);

 }


 delay(500); // Attendre un court délai avant la prochaine mesure

}


Ce code peut être une alternative au capteur GPS à plus petite échelle spatiale.

À notre échelle, nous avons préféré utiliser un capteur GPS, dont le code est détaillé plus loin.

Step 2: Réalisation Du Boîtier

Notre boîtier a été pensé pour maintenir la carte Arduino ainsi que les câbles connectés au LED, le capteur GPS et la batterie et être apposé sur le guidon du vélo. Il doit maintenir aussi notre écran comportant les LED.

On a tout d'abord réalisé un croquis, puis une maquette en carton qui nous a permis d'avoir les mesures adéquates.

Le boîtier a été modélisé en 3D grâce à l'utilisation du logiciel Fusion360.

Dans son aspect technique, le boîtier doit :

  • Pouvoir loger les composés électroniques en les maintenant suffisamment mais aussi comporter une ouverture latérale afin d'y brancher la batterie et une sur le dessus afin de connecter les LED.
  • Contenir des attaches afin d'être maintenu au guidon du vélo : nous avons réalisé des ailerons sur les côtés afin d'y faire passer des fermeture autoagrippante (Velcro).
  • Pouvoir être ouvert afin d'accéder aux composants électroniques.
  • Pouvoir être un support pour l'écran.

Le boîtier se compose de deux parties (cf photo) :

  • La partie basse qui maintient les composants électroniques et comprend une ouverture afin de connecter la carte Arduino à l’ordinateur et à la batterie.
  • La partie haute qui vient fermer le boîtier et contient une ouverture pour les câbles de LED.

Les mesures du boîtier sont indiquées dans la dernière image.

Step 3: Réalisation De L'écran

L'écran permet d'afficher le parcours avec les différents arrêts. Chaque arrêt est représenté par une LED allumée au départ du parcours et qui s'éteint au passage de celui-ci. Nous nous sommes inspirées de l'affichage du métro parisien.

Pour le réaliser, nous avons tout d'abord modélisé notre parcours sur Canva à l'aide d'une carte tirée de Google Maps.

Nous l'avons ensuite gravé sur une planche de bois cartonné de 14 centimètres de longueur et 9 centimètres de hauteur. Chaque arrêt comporte un trou de 6 millimètres de diamètre afin d'y insérer les LED.

L'écran comportera des QR code afin de lire les pistes audios donnant des informations sur chaque bâtiment.

Step 4: Code Final GPS

Nous avons finalement reçu notre capteur GPS, le Module GPS Grove 109020022.

Sur la carte Arduino, les LED sont connectées ainsi :

  • Le bâtiment Lavoisier = LED 1 = D4
  • La Maison de l'Étudiant = LED 2 = D5
  • L'École des Ponts = LED 3 = D6
  • L'ESIEE Paris = LED 4 = D7
  • Le FabLab Descartes = LED 5 = D8

Les autres composants sont connectés ainsi :

  • Capteur GPS = D2
  • Buzzer = D3

Concernant les coordonnées GPS, nous avons veillé à prendre des coordonnées assez larges qui balayent la zone autour du bâtiment.

Voici le code final :

#include <TinyGPSPlus.h>

#include <SoftwareSerial.h>


SoftwareSerial SoftSerial(2, 3);


#define GPS_RX_PIN 2 // Broche RX du module GPS connectée à la broche 2 de l'Arduino

#define GPS_TX_PIN 3 // Broche TX du module GPS connectée à la broche 3 de l'Arduino


SoftwareSerial gpsSerial(GPS_RX_PIN, GPS_TX_PIN); // Initialisation de la communication série avec le module GPS


#define LED_PIN_1 4 // Fil de la première LED

#define LED_PIN_2 5 // Fil de la deuxième LED

#define LED_PIN_3 6 // Fil de la troisième LED

#define LED_PIN_4 7 // Fil de la quatrième LED

#define LED_PIN_5 8 // Fil de la cinquième LED


TinyGPSPlus gps; // Déclarer l'objet GPS


void setup() {

 Serial.begin(9600);

 SoftSerial.begin(9600); // Initialisation de la communication avec le module GPS

 pinMode(LED_PIN_1, OUTPUT);

 pinMode(LED_PIN_2, OUTPUT);

 pinMode(LED_PIN_3, OUTPUT);

 pinMode(LED_PIN_4, OUTPUT);

 pinMode(LED_PIN_5, OUTPUT);


 // Allumer toutes les LEDs au début

 digitalWrite(LED_PIN_1, HIGH);

 digitalWrite(LED_PIN_2, HIGH);

 digitalWrite(LED_PIN_3, HIGH);

 digitalWrite(LED_PIN_4, HIGH);

 digitalWrite(LED_PIN_5, HIGH);

}


void loop() {

 // Lire les données GPS

 while (SoftSerial.available() > 0) {

  if (gps.encode(SoftSerial.read())) {

   // Récupérer les coordonnées GPS

   float latitude = gps.location.lat();

   float longitude = gps.location.lng();

   // Afficher les coordonnées GPS sur le moniteur série

   Serial.print("Latitude: ");

   Serial.print(latitude, 5);

   Serial.print(", Longitude: ");

   Serial.println(longitude, 5);

   // Allumer ou éteindre les LEDs en fonction des coordonnées GPS

   if (latitude > 48.838 && latitude < 48.839 && longitude > 2.592 && longitude < 2.593) {

    digitalWrite(LED_PIN_1, LOW); // Éteindre la LED 1

   } else if (latitude > 48.839 && latitude < 48.840 && longitude > 2.590 && longitude < 2.591) {

    digitalWrite(LED_PIN_2, LOW); // Éteindre la LED 2

   } else if (latitude > 48.840 && latitude < 48.841 && longitude > 2.588 && longitude < 2.589) {

    digitalWrite(LED_PIN_3, LOW); // Éteindre la LED 3

   } else if (latitude > 48.839 && latitude < 48.840 && longitude > 2.583 && longitude < 2.584) {

    digitalWrite(LED_PIN_4, LOW); // Éteindre la LED 4

   } else if (latitude > 48.837 && latitude < 48.838 && longitude > 2.586 && longitude < 2.587) {

    digitalWrite(LED_PIN_5, LOW); // Éteindre la LED 5

   }

  }

 }

 delay(100); // Attendre un court délai avant la prochaine lecture GPS

}

Step 5: Code Avec Buzzer

Nous avions initialement prévu d'utiliser un speaker mais par manque de moyens et de temps, nous l'avons remplacé par un buzzer. Les pistes audio décrivant chaque bâtiment sont ainsi contenues dans un QR code qui permet de lire les pistes grâce à un smartphone.

Le code est le suivant :

#include <TinyGPSPlus.h>

#include <SoftwareSerial.h>


SoftwareSerial SoftSerial(2, 3);


#define GPS_RX_PIN 2 // Broche RX du module GPS connectée à la broche 2 de l'Arduino

#define GPS_TX_PIN 3 // Broche TX du module GPS connectée à la broche 3 de l'Arduino

#define BUZZER_PIN 9 // Broche à laquelle le buzzer est connecté


SoftwareSerial gpsSerial(GPS_RX_PIN, GPS_TX_PIN); // Initialisation de la communication série avec le module GPS


#define LED_PIN_1 4 // Fil de la première LED

#define LED_PIN_2 5 // Fil de la deuxième LED

#define LED_PIN_3 6 // Fil de la troisième LED

#define LED_PIN_4 7 // Fil de la quatrième LED

#define LED_PIN_5 8 // Fil de la cinquième LED

int point1 = 1;

int point2 = 1;

int point3 = 1;

int point4 = 1;

int point5 = 1;


TinyGPSPlus gps; // Déclarer l'objet GPS


void setup() {

 Serial.begin(9600);

 SoftSerial.begin(9600); // Initialisation de la communication avec le module GPS

 pinMode(LED_PIN_1, OUTPUT);

 pinMode(LED_PIN_2, OUTPUT);

 pinMode(LED_PIN_3, OUTPUT);

 pinMode(LED_PIN_4, OUTPUT);

 pinMode(LED_PIN_5, OUTPUT);

 pinMode(BUZZER_PIN, OUTPUT); // Initialisation de la broche du buzzer


 // Allumer toutes les LEDs au début

 digitalWrite(LED_PIN_1, HIGH);

 digitalWrite(LED_PIN_2, HIGH);

 digitalWrite(LED_PIN_3, HIGH);

 digitalWrite(LED_PIN_4, HIGH);

 digitalWrite(LED_PIN_5, HIGH);

 controlBuzzer(false); // Désactiver le buzzer

}


void controlBuzzer(bool state) {

 digitalWrite(BUZZER_PIN, state);

}


void loop() {

 // Lire les données GPS

 while (SoftSerial.available() > 0) {

  if (gps.encode(SoftSerial.read())) {

   // Récupérer les coordonnées GPS

   float latitude = gps.location.lat();

   float longitude = gps.location.lng();

   // Afficher les coordonnées GPS sur le moniteur série

   Serial.print("Latitude: ");

   Serial.print(latitude, 5);

   Serial.print(", Longitude: ");

   Serial.println(longitude, 5);

   // Allumer ou éteindre les LEDs en fonction des coordonnées GPS

   if (latitude > 48.838 && latitude < 48.839 && longitude > 2.592 && longitude < 2.593 && point1 == 1) {

    digitalWrite(LED_PIN_1, LOW); // Éteindre la LED 1

    controlBuzzer(true); // Activer le buzzer

    delay(500);

    controlBuzzer(false); // Désactiver le buzzer

    point1 =0;

   } else if (latitude > 48.839 && latitude < 48.840 && longitude > 2.590 && longitude < 2.591 && point2 == 1) {

    digitalWrite(LED_PIN_2, LOW); // Éteindre la LED 2

    controlBuzzer(true); // Activer le buzzer

    delay(500);

    controlBuzzer(false); // Désactiver le buzzer

    point2 =0;

   } else if (latitude > 48.840 && latitude < 48.841 && longitude > 2.588 && longitude < 2.589 && point3 == 1) {

    digitalWrite(LED_PIN_3, LOW); // Éteindre la LED 3

    controlBuzzer(true); // Activer le buzzer

    delay(500);

    controlBuzzer(false); // Désactiver le buzzer

    point3 =0;

   } else if (latitude > 48.840 && latitude < 48.841 && longitude > 2.584 && longitude < 2.585 && point4 == 1) {

    digitalWrite(LED_PIN_4, LOW); // Éteindre la LED 4

    controlBuzzer(true); // Activer le buzzer

    delay(500);

    controlBuzzer(false); // Désactiver le buzzer

    point4 =0;

   } else if (latitude > 48.837 && latitude < 48.838 && longitude > 2.586 && longitude < 2.587 && point5 == 1) {

    digitalWrite(LED_PIN_5, LOW); // Éteindre la LED 5

    controlBuzzer(true); // Activer le buzzer

    delay(500);

    controlBuzzer(false); // Désactiver le buzzer

    point5 =0;

   } 

   /*else {

    digitalWrite(LED_PIN_1, HIGH); // Allumer la LED 1

    digitalWrite(LED_PIN_2, HIGH); // Allumer la LED 2

    digitalWrite(LED_PIN_3, HIGH); // Allumer la LED 3

    digitalWrite(LED_PIN_4, HIGH); // Allumer la LED 4

    digitalWrite(LED_PIN_5, HIGH); // Allumer la LED 5

    controlBuzzer(false); // Désactiver le buzzer si aucune condition n'est remplie

   }*/

  }

 }

 delay(100); // Attendre un court délai avant la prochaine lecture GPS

}


Step 6: Assemblage

Pour terminer nous avons assemblé tous nos composants entre eux :

Premièrement, le boîtier contenant les composants électroniques :

  • La batterie au fond connectée par une prise jack à la carte Arduino
  • La carte Arduino contenant le capteur et buzzer et les câbles pour les LED

Les parties haute et basse du boîtier s'assemblent entre elles grâce à de la Patafix. Nous avons préféré pouvoir rouvrir le boîtier afin d'accéder aux composants électroniques en cas de besoin.

Le boîtier se maintient au guidon du vélo grâce à une fermeture auto-agrippante comme sur la photo.


Step 7: Phase De Test

Nous avons testé nous-même le parcours afin de corriger les éventuelles erreurs.

Les LED s'éteignent bien au passage de chaque bâtiment, les zones balayées sont suffisamment larges pour être détectées.

Notre dispositif peut ainsi être utilisé afin de visiter différents lieux de votre choix selon le parcours que vous désirez.

Step 8: Remerciements

Nous tenons à remercier Madame Flavie Ferchaud ainsi que toute l'équipe du FabLab, Antoine et Thomas de nous avoir accompagnées, conseillées, orientées et soutenues.

Réalisé par :

Célia AIT HABIB, Camy EL SAYED, Garance ONGBIANDE, Ruthiga RAJENDRAN ; étudiantes en L3 Génie Urbain à l' Université Gustave Eiffel.