Zone de sécurité pour vélo : Différence entre versions

De Wiki d'activités IMA
(Gestion de la communication bluetooth)
Ligne 91 : Ligne 91 :
 
  | 13.50€
 
  | 13.50€
 
  | Projection de la ligne
 
  | Projection de la ligne
  | <span style="color:red">Non</span>
+
  | <span style="color:green">Oui</span>
  | <span style="color:red">Non</span>
+
  | <span style="color:green">Oui</span>
 
  |-
 
  |-
 
  ! scope="row" | Batterie (accus)
 
  ! scope="row" | Batterie (accus)
Ligne 100 : Ligne 100 :
 
  | 54,90 €
 
  | 54,90 €
 
  | Alimentation du dispositif. Rechargé par dynamo.  
 
  | Alimentation du dispositif. Rechargé par dynamo.  
  | <span style="color:red">Non</span>
+
  | <span style="color:green">Oui</span>
  | <span style="color:red">Non</span>
+
  | <span style="color:green">Oui</span>
 
  |-
 
  |-
 
  ! scope="row" | Module USB Bluetooth
 
  ! scope="row" | Module USB Bluetooth
Ligne 118 : Ligne 118 :
 
  | 6,31€
 
  | 6,31€
 
  | aucun
 
  | aucun
  | <span style="color:red">Non</span>
+
  | <span style="color:green">Oui</span>
  | <span style="color:red">Non</span>
+
  | <span style="color:green">Oui</span>
 
  |-
 
  |-
 
  ! scope="row" | LED rouge
 
  ! scope="row" | LED rouge
Ligne 127 : Ligne 127 :
 
  | X
 
  | X
 
  | Feu stop arrière
 
  | Feu stop arrière
  | <span style="color:red">Non</span>
+
  | <span style="color:green">Oui</span>
  | <span style="color:red">Non</span>
+
  | <span style="color:green">Oui</span>
 
  |-
 
  |-
 
  ! scope="row" | LED orange
 
  ! scope="row" | LED orange
Ligne 136 : Ligne 136 :
 
  | X
 
  | X
 
  | 2x Clignotants
 
  | 2x Clignotants
  | <span style="color:red">Non</span>
+
  | <span style="color:green">Oui</span>
  | <span style="color:red">Non</span>
+
  | <span style="color:green">Oui</span>
 
  |-
 
  |-
 
  ! scope="row" | Webcam (pour Raspberry Pi)
 
  ! scope="row" | Webcam (pour Raspberry Pi)
Ligne 154 : Ligne 154 :
 
  | 3.90€
 
  | 3.90€
 
  | Mesure distance vélo/véhicule
 
  | Mesure distance vélo/véhicule
  | <span style="color:red">Non</span>
+
  | <span style="color:green">Oui</span>
  | <span style="color:red">Non</span>
+
  | <span style="color:green">Oui</span>
 
  |-
 
  |-
 
  ! scope="row" | Téléphone sous Android
 
  ! scope="row" | Téléphone sous Android
Ligne 313 : Ligne 313 :
 
<pre>
 
<pre>
 
public class MainActivity extends Activity implements View.OnClickListener {
 
public class MainActivity extends Activity implements View.OnClickListener {
 +
   
 
     /* ...
 
     /* ...
 
       Déclaration des différents widgets (Button, TextView...)
 
       Déclaration des différents widgets (Button, TextView...)

Version du 27 mars 2016 à 12:27

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.


Presentation zone de securite a velo.png
Présentation du système de laser


Cahier des charges

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é


Architecture matériel

Architecture materiel.png
Schéma du dispositif



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.


Architecture1.jpg
Schéma du dispositif


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 WirinPi : 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.


Screen application.png
Screenshot de l'application


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élioration possible

Resultat

Fichier:Video CommunicationBluetooth.mp4

Schéma du dispositif