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

De Wiki d'activités IMA
m (Gestion de la communication bluetooth)
Ligne 314 : Ligne 314 :
 
Lecture en boucle dans le fichier /dev/rfcomm0
 
Lecture en boucle dans le fichier /dev/rfcomm0
  
<code>
+
<pre>
    1.  int main(void)
+
int main(void)
    2.  {
+
{
     3.      FILE* fichier;
+
     FILE* fichier;
    4.
+
 
     5.      <span style="color: green;">//Initialisation de la bibliotèque WiringPi</span>
+
     if (wiringPiSetup () == -1)
    6.      if (wiringPiSetup () == -1)
+
        return 1 ;
    7.      return 1 ;
+
 
    8.
+
     init_gpio();
    9.      <span style="color: green;">//Initialisation des GPIO</span>
+
 
    10.     init_gpio();
+
     fichier = fopen("/dev/rfcomm0", "a+");
    11.
+
 
    12.    <span style="color: green;">//Boucle infini de lecture du fichier /dev/rfcomm0 </span>
+
    if(fichier != NULL)
     13.    fichier = fopen("/dev/rfcomm0", "a+");
+
        lectureBluetooth();
     14.
+
 
     15.    if(fichier != NULL)
+
     return 0;
     16.      lectureBluetooth(fichier);
+
}
     17.
+
</pre>
     18.   return 0;
+
 
     19. }
+
<pre>
</code>
+
void lectureBluetooth(FILE* fichier)
 +
{
 +
     if (fichier != NULL)
 +
     {
 +
        int caractereActuel;
 +
 
 +
        do
 +
        {
 +
            caractereActuel = fgetc(fichier); // 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(fichier);
 +
     }
 +
}
 +
</pre>
 +
 
 +
(sur le smartphone)
 +
 
 +
dans le constructeur (méthode "void onCreate(...)")
 +
 
 +
<pre>
 +
     @Override
 +
    protected void onCreate(Bundle savedInstanceState) {
 +
        super.onCreate(savedInstanceState);
 +
        setContentView(R.layout.activity_main);
 +
 
 +
        /* ...
 +
          Initialisation des différents widgets (Button, TextView...)
 +
          ...
 +
        */
 +
 
 +
        bt = new BtInterface(handlerStatus, handler);
 +
     
 +
        connect = (Button)findViewById(R.id.connect);
 +
        connect.setOnClickListener(this);
 +
 
 +
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
 +
     }
 +
</pre>
  
 
==== Automatisation de l'appairage ====
 
==== Automatisation de l'appairage ====
 
==== Problèmes et amélioration possible ====
 
==== Problèmes et amélioration possible ====

Version du 26 mars 2016 à 13:29

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 Non Non
Batterie (accus) 1 Accu modélisme NiMh 7,2V 3Ah GoTronic 54,90 € Alimentation du dispositif. Rechargé par dynamo. Non Non
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 Non Non
LED rouge 20 X Polytech Lille X Feu stop arrière Non Non
LED orange 10 X Polytech Lille X 2x Clignotants Non Non
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 Non Non
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

Réception des données

(sur la Raspberry Pi)

Lecture en boucle dans le fichier /dev/rfcomm0

int main(void)
{
    FILE* fichier;

    if (wiringPiSetup () == -1)
        return 1 ;

    init_gpio();

    fichier = fopen("/dev/rfcomm0", "a+");

    if(fichier != NULL)
        lectureBluetooth();

    return 0;
}
void lectureBluetooth(FILE* fichier)
{
    if (fichier != NULL)
    {
        int caractereActuel;

        do
        {
            caractereActuel = fgetc(fichier); // 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(fichier);
    }
}

(sur le smartphone)

dans le constructeur (méthode "void onCreate(...)")

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /* ...
           Initialisation des différents widgets (Button, TextView...)
           ...
        */

        bt = new BtInterface(handlerStatus, handler);
       
        connect = (Button)findViewById(R.id.connect);
        connect.setOnClickListener(this);

        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
    }

Automatisation de l'appairage

Problèmes et amélioration possible