Zone de sécurité pour vélo : Différence entre versions
Ligne 59 : | Ligne 59 : | ||
=== Analyse fonctionnelle === | === Analyse fonctionnelle === | ||
+ | |||
+ | [[Fichier:P6_2016_AF.PNG|200px|thumb|center|Analyse fonctionnelle du système]] | ||
=== Représentation UML === | === Représentation UML === |
Version du 10 mai 2016 à 09:27
Sommaire
Projet « Zone de sécurité pour vélo »
Objectifs
Réaliser un système permettant d'améliorer la sécurité des cyclistes.
Description
La sécurité des personnes à vélo dépend pour beaucoup des autres utilisateurs et notamment des conducteurs d'engins mécanisés.
Ce projet propose d'aider les autres conducteurs à respecter une zone de sécurité lorsqu'ils doublent ou suivent un vélo. Pour cela, après détection d'un véhicule qui suit ou double, un rayon laser doit délimiter au sol la zone d'environ 1m autour du cycliste.
Par ailleurs, lorsque le cycliste tourne, un autre laser doit dessiner une flèche au sol.
En combinaison avec par exemple un téléphone muni d'un GPS, il serait intéressant de prévenir du changement de direction lorsque le GPS le signale.
Cahier des charges
Présentation initiale
Le système doit :
- détecter les autres véhicules à proximité (voitures, motos...)
- détecter lorsqu'un véhicule souhaite doubler
- détecter lorsqu'un véhicule nous suit
- affichage d'une ligne via un laser
- affichage d'une flèche en fonction de la direction souhaitée.
- connexion avec un smartphone ou tablette et utilisation de leur GPS.
(ajouts supplémentaires)
- afficher des indications via bluetooth sur smartphone ou tablette pour indiquer lorsque l'on est entrain d'être doublé, ou suivi..
- calcul et affichage de la vitesse (via compte-tours sur la roue)
- allumer des feux stop lorsque l'utilisateur freine ou lorsqu'un véhicule suit de trop près
- détection crevaison
- système d'antivol connecté
Modélisation du cahier des charges
Analyse "bête à cornes"
Diagramme pieuvre
Analyse fonctionnelle
Représentation UML
Architecture matériel
Matériels
Quantité | Référence | Fournisseur | Prix unitaire | Commentaire | Commandé | Reçu | |
---|---|---|---|---|---|---|---|
Raspberry pi 2 | 1 | X | Polytech Lille | X | aucun | Oui | Oui |
Diode Laser ligne | 3 | LN60-650 <1mW | Apinex | 13.50€ | Projection de la ligne | Oui | Oui |
Batterie (accus) | 1 | Accu modélisme NiMh 7,2V 3Ah | GoTronic | 54,90 € | Alimentation du dispositif. Rechargé par dynamo. | Oui | Oui |
Module USB Bluetooth | 1 | Dongle Bluetooth BLED112-V1 | RS | 12.02€ | Permet la communication entre le dispositif et un smartphone/tablette | Oui | Oui |
Dynamo | 1 | Bicycle Dynamo - 6V 3W | Mouser | 6,31€ | aucun | Oui | Oui |
LED rouge | 20 | X | Polytech Lille | X | Feu stop arrière | Oui | Oui |
LED orange | 10 | X | Polytech Lille | X | 2x Clignotants | Oui | Oui |
Webcam (pour Raspberry Pi) | 1 | Module camera - RasberryPi | RS | 22.07€ | Détection du véhicule | Oui | Oui |
Capteur de distance (ultrasons) | 1 | Capteur US HC-SR04 | GoTronic | 3.90€ | Mesure distance vélo/véhicule | Oui | Oui |
Téléphone sous Android | 1 | X | Polytech Lille | X | A synchroniser avec le système | Oui | Oui |
Vélo | 1 | X | X | X | Nécessaire pour les tests | Non | Non |
Réunion n°1, le 06/11/2015 : Réflexion sur le sujet
Présents : Claverie Martin, Charnet Victor
Lors de cette réunion, concertation sur le sujet, différentes idées et solutions techniques à aborder pour la réalisation. Le choix de l’installation du système à l’arrière a été privilégié ; en type « Porte-bagage ».
S’inspirer du moyen de fixation d’un porte-bagage existant pour l’adapter au système. (Repartir d’un modèle existant, ou alors impression 3D ?).
Utilisation d’une carte Raspery Pi ou Arduino pour le système.
Mise au point sur le déclenchement des lasers :
- Laser arrière si véhicule détecté derrière
- Laser coté si véhicule en train de doubler
Question de l’alimentation, utiliser une batterie. Penser à faire un système facile à recharger. Autonomie ? Dynamo ?
Positionner des matrices de LED sur le système ? Pour affichage du freinage, ou clignotants.
Installation d’un compte-tours sur les roues pour indiquer la vitesse à l’utilisateur. Fixation du téléphone sur le guidon du vélo comme moniteur.
Création d’un application Smartphone (Android ou iOs ?) connectée au système en Bluetooth.
Installation de capteurs à ultrasons sur le système type sonar puis réaliser un mappage de la zone visible (arrière/gauche en priorité) sur l’application smartphone.
Placer un repère sur le GPS quand la connexion Bluetooth avec le système est rompue pour retrouver la localisation du vélo.
Trouver une solution pour afficher les lignes lasers au sol (et la flèche ?) Utilisation d’un système laser + miroir motorisé pour créer un balayage, ou laser trait ou diode laser faible puissance. Exploiter la solution diffraction du faisceau. Problème de la visibilité en plein jour à solutionner.
Système d’antivol connecté ?
Trouver un vélo pour les tests.
Installation d’un capteur de pression pour les pneus ?
Réaliser le cahier des charges du système, planning, étude de coûts ?
Gestion de la communication bluetooth
Nous avons décidé de commencer la partie informatique sur la gestion de la communication bluetooth entre un smartphone et la Raspberry Pi.
Cela pour deux raisons: c'est un point important du projet et nous avions déjà le matériel nécessaire.
Introduction
Le but est de pouvoir allumer et éteindre des LED via une application android par communication bluetooth.
La première partie fut l'installation des paquets nécessaires sur la Raspberry Pi:
- le paquet bluetooth: pour les assistants de communication bluetooth
- le paquet WiringPi : pour la gestion des broches GPIO
Après de nombreuses recherches nous avons décidé d'établir une communication série via le bluetooth. Nous avons trouvé le paquet sdptool qui permet de réaliser avec rfcomm ce que nous voulions.
Procédure d'appairage
La procédure d'appairage est la suivante:
(dans un terminal de la Raspberry Pi)
hciconfig hci0 piscan // permet à la Raspberry Pi d'être détectable par un autre appareil.
bluetooth-agent 1234 & // permet de faire tourner le processus d'appairage en tâche de fond(dont le code est 1234): une fois kill la communication est arrêté.
sdptool add --channel=22 SP // permet d'ajouter un port d'écoute ici le 22
rfcomm listen /dev/rfcomm0 22 & // permet de créer une communication série sur /dev/rfcomm0
(sur le smartphone)
Général > Bluetooth > raspberryPi-0 > associer > code '1234'
=> Les deux appareils sont maintenant appairés
Envoi de données
(sur le Smartphone)
Dans un premier temps nous avons effectué nos tests avec une application android simulant un terminal bluetooth (Bluetooth Terminal).
On envoi un caractère correspondant à l'état souhaité des LED.
Une fois la communication établie et fonctionnelle, nous nous sommes mis à la création d'une application android.
Comme vous pouvez le voir sur la capture d'écran ci-dessus, l'application est composé de:
- 1x Button Connect : permettant de connecter l'application et la Raspberry Pi
- 2x Switch Led1 et Led2 : permettant de contrôler l'état des LED en envoyant la commande correspondante.
- 2x TextView : pour afficher l'état des LED.
Après de nombreuse recherches sur internet nous avons trouvé une classe java de gestion des sockets en bluetooth appelée BtInterface.
Cette classe contient 5 méthodes:
* public BluetoothDevice getDevice() Retourne un objet du type 'BluetoothDevice' de la liste des appareils appairés * public void connect() Permet d'ouvrir une connection socket avec l'appareil en handler du type 'BluetoothDevice' * public void close() Permet de se fermer la connection avec le handler * public void sendData(String data) Permet d'envoyer un string via la connexion établie
Ainsi qu'une classe de réception dans un Thread:
* private class ReceiverThread extends Thread {...} Lit en boucle le buffer de réception
On implémente l'interface View.OnClickListener à la classe MainActivity afin de pouvoir recevoir les interruptions relative à l'appuie d'un Button.
public class MainActivity extends Activity implements View.OnClickListener { /* ... Déclaration des différents widgets (Button, TextView...) ... */ private Button connect; private BtInterface bt; //Dans le constructeur protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /* ... Initialisation des widgets ... */ //Allocation et construction d'une BtInterface bt = new BtInterface(handlerStatus, handler); //Initialisation du bouton connect (que l'on récupère du fichier XML) connect = (Button)findViewById(R.id.connect); //On lui fixe un Listener -> interruption connect.setOnClickListener(this); client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); } //Dans la méthode onClick appeler lors d'un Button public void onClick(View v) { //On regarde quel bouton à été appuyé switch(v.getId()) { //Si c'est le bouton connect case R.id.connect: //Alors on appel la méthode connect de la class BtInterface bt.connect(); break; } }
Réception des données
(sur la Raspberry Pi)
Lecture en boucle dans le fichier /dev/rfcomm0
int main(void) { //Déclaration du handler qui est un descripteur de fichier FILE* bluetoothHandler; if (wiringPiSetup () == -1) return 1 ; init_gpio(); bluetoothHandler = fopen("/dev/rfcomm0", "a+"); if(bluetoothHandler != NULL) lectureBluetooth(bluetoothHandler); return 0; }
void lectureBluetooth(FILE* bluetoothHandler) { if (bluetoothHandler != NULL) { int caractereActuel; do { caractereActuel = fgetc(bluetoothHandler); // On lit le caractère switch(caractereActuel){ case 'a': //LED 0 éteinte digitalWrite(LED[0],0); break; case 'b': // LED 0 allumée digitalWrite(LED[0],1); break; /* idem pour les autres cas */ } }while(caractereActuel != EOF); fclose(bluetoothHandler); } }
Automatisation de l'appairage
Problèmes et améliorations possibles
Résultat
Fichier:Video CommunicationBluetooth.mp4
Gestion du capteur ultrason
Introduction
Le but de ce capteur est de détecter lorsqu'un automobiliste suit le cycliste.
Le capteur ultrason utilisé est le HC-SR04.
Ses caractéristiques techniques sont les suivantes:
– Alimentation : 5v
– Consommation en utilisation : 15 mA
– Gamme de distance : 2 cm à 5 m
– Résolution : 0.3 cm
– Angle de mesure : < 15°
Il faut envoyer une impulsion niveau haut sur la broche ‘Trig Input’ pour déclenché la mesure.
En retour la sortie ‘Echo’ va fournir une impulsion + 5v dont la durée est proportionnelle à la distance (si le module détecte un objet).
Afin de pouvoir calculer la distance en cm, on utilisera la formule suivante :
source: http://www.micropik.com/PDF/HCSR04.pdf [datasheet]
Programme sur la Raspberry Pi
Le fait que le fonctionnement de la Raspberry Pi n'est pas temps réel peut fausser la mesure. Néanmoins on obtient d'assez bon résultats que l'on peut exploiter pour notre projet.
Gestion des NeoPixels
Introduction
Notre système est composé de 4 Sticks NeoPixel - 8*5050 RGB LED permettant de former les feux stops et les clignotants.
(documentation et datasheet: https://www.adafruit.com/products/1426)
Chaque stick est composé de 8 broches (2*Vcc [5v], D+, D-, 2*Gnd). Les LEDs peuvent être branchées en série en connectant la sortie d'un stick dans l'entrée d'un autre. Il y a une seule broche de data avec un protocole de durée très spécifique.
Normalement ce type de matériel requière un micro-contrôleur temps réel comme Arduino, PIC, etc.. Cependant une librairie utilisant la PWM de la Raspberry Pi permet d'utiliser ces composants.
Cette librairie est codé en Python.