P2 IOT 2017

De Wiki d'activités IMA

Présentation du sujet

Contexte

Les maux de tête est un mal courant de nos jours, causés principalement par la surexposition des nos sens. Notamment la vue et l'ouïe. Des recommandations existent comme se reposer après un certain temps de travail mais ces dernières sont peu suivies. En effet, l'absorption dans une tâche très passionnante fait oublier le temps ! Nous voulons ainsi proposer des lunettes alertant l'utilisateur qu'il faut faire une pause pour qu'il garde le sentiment de bien-être tout au long de sa journée !

Description du projet

Lunettes avec les capteurs de : - luminosité - décibels - oculaire

Fonctionnement : les capteurs enregistrent le temps passé à une certaine luminosité et envoie un signal via une application une fois un certain temps écoulé pour faire une pause. Parallèlement, le capteur oculaire enregistre les clignement des yeux pour voir l'état de fatigue et envoie un signal. La capteur de décibels enregistre le son ambiant et envoie un signal quand le temps passé à un certain volume devient dangereux.

Réalisation

Matériel utilisé

  • Lunettes
  • Capteurs (de luminosité, webcam, décibel)
  • Raspberry Pi 3 + alimentation + câble série
  • Arduino + câble USB
  • Piles
  • Colle/résine
  • Android Studio (programmation application android)
  • Smartphone
  • Ordinateur

Suivi de réalisation

Séance 1 (08/01/2018) Recherche de l'idée du projet. Définition du besoin. Cahier des charges. Rassemblement des pièces nécessaires.
Séance 2 (09/01/2018) Test de fonctionnement sur le capteur de couleur RGB TCS34725. Test de fonctionnement sur le micro MAX 4463. Recherche sur la création d'une application android.
Séance 3 (16/01/2018) Reprogrammation de la Raspberry Pi 3 connectée à la caméra (défaut présent sur la carte SD). Ébauche du poster de présentation. Téléchargement logiciel Android Studio.
Séance 4 (17/01/2018) Essais de la caméra. Communication entre la RPi3 et Arduino nano.
Séance 5 (22/01/2018) Test programme capteurs ensembles. Essais de fonctionnement avec l'application mobile. Suite mise en page du poster. Mise en ligne des scriptes de programmation.
Séance 6 (24/01/2018) Montage des lunettes. Test de fonctionnement sans ordi. Mise en ligne du poster.

Détail du travail de la première séance

Définition du besoin et de l'objet connecté. Rassemblement du matériel nécessaire au fonctionnement.

Détail du travail de la deuxième séance

Précision de la fonction des capteurs.

Schéma explicatif des capteur et de leur utilité

Le capteur de la luminosité seule a été remplacé par un capteur de couleurs. Ce dernier peut également détecter le niveau de la lumière en plus des couleurs et de la température.

Site internet pour créer une application android :App Invertor API

Configuration de la Raspberry Pi

Nous avons besoin d'une liaison Bluetooth entre le système embarqué et l'application mobile android, afin d'envoyer une alerte à l'utilisateur dès qu'il y a un problème; Pour cela nous allons utiliser une Raspberry pi 3, cette carte est déjà équipée d'un module Bluetooth.

Pour commencer, nous avons télécharger la dénier version de la distribution Linux pour Raspberry pi. Comme nous n'avons pas besoin de l'interface graphique, il est préférable de choisir la distribution "Raspbian Stretch Lite" plus légère en terme d'espace disque.

Une fois l'archive zippée de la distribution récupérée nous l'avions installée sur la carte SD après l'avoir décompressée en utilisant la commande dd :

dd if=2017-11-29-raspbian-stretch-lite.img of=/dev/sdb

Ensuite nous avons monté la première partition de la carte SD Raspian Lite avec la commande:

mount /dev/sdb1 /mnt 


puis nous avons examiné les fichiers cmdline.txt et config.txt pour vérifier que l'option console=serial0,115200 est bien présente dans la ligne du fichier cmdline.txt et ajoutez enable_uart=1 à la fin du fichier config.txt pour activer la liaison série.

Nous avons mis la carte SD sur la RPi, puis nous l'avons alimentée et lancé la commande suivante sur le PC:

minicom -D /dev/ttyUSB0 -b  115200  

Nous avons obtenu l'invite de connexion de la Raspberry:

Raspbian GNU/Linux 9 raspberrypi ttyS0                                          
raspberrypi login:

On se connecte avec l'identifiant pi et le mot de passe raspberry.

Configuration du périphérique Bluetooth

Tout d'abord il est important de modifier le fichier /lib/systemd/system/bluetooth.service en ajoutant les 2 lignes suivantes:

ExecStart=/usr/local/libexec/bluetooth/bluetoothd -C
ExecStartPost=/usr/bin/sdptool add SP 

Cela va nous permettre de faire du Bluetooth via une liaison série.

Ensuite il faut désactiver le plugin pnat de bluez en ajoutant à la fin du fichier /etc/bluetooth/main.conf la ligne suivante:

DisablePlugins = pnat

Détail du travail de la troisième séance

Résolution du problème de programmation sur la Raspberry P3 connectée à la caméra. Configuration du réseau de la PR3. Ébauche de l'affiche finale de présentation. Ébauche de l'application Android faite sur MIT App Inventor Test du fonctionnement de la caméra.

Détail du travail de la quatrième séance

Installation de la caméra. Prise de quelques photos?=. Communication entre la RP3 et Arduino. Le proxy de polytech a empêché l’installation des librairies. Essai de l'application créée sur MIT app inventor. Erreur 507 Unable to connect. Testé sur 4 téléphones. Essais d'une app exemple et essais d'une app modifié.

Détail du travail de la cinquième séance

Résolution du problème du Bluetooth sur la Rasberry. L'idée des la caméra est abandonnée. Test de capteurs (programme, réception des données, envoie des alertes quand il faut). Test de communication entre capteur et application mobile. Suite de la création de l'affiche A3.

Interface utilisateur de l'application et éléments présents
Codage de l'application
Description de la fonctionnalité des capteurs


Code de gestion de message Bluetooth côté Raspberry pi

from bluetooth import *                                                         
import time                                                                     
import serial                                                                   
                                                                               
server_sock=BluetoothSocket( RFCOMM )                                           
server_sock.bind(("",PORT_ANY))                                                 
server_sock.listen(1)                                                           
                                                                               
port = server_sock.getsockname()[1]                                             
                                                                               
uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"                                   
                                                                               
advertise_service( server_sock, "SampleServer",                                 
                  service_id = uuid,                                           
                  service_classes = [ uuid, SERIAL_PORT_CLASS ],               
                  profiles = [ SERIAL_PORT_PROFILE ],                          
#                   protocols = [ OBEX_UUID ]                                   
                   )                                                           
                                                                               
print("Waiting for connection on RFCOMM channel %d" % port)                     
                                                                               
client_sock, client_info = server_sock.accept()                                 
print("Accepted connection from ", client_info)
                                
ser = serial.Serial('/dev/ttyUSB0')                                             
                                                                               
try:                                                                            
   while True:                                                                 
       data = ser.readline()                                                   
       if len(data) == 0: break                                                
       #print("received [%s]" % data)                                          
       client_sock.send(data)                                                  
except IOError:                                                                 
   pass                                                                        
                                                                               
print("disconnected")                                                           
                                                                               
client_sock.close()                                                             
server_sock.close()                                                             
print("all done")

Code de gestion des capteurs et de la liaison série côté arduino

#include <Wire.h>
#include "Adafruit_TCS34725.h"
/* Example code for the Adafruit TCS34725 breakout library */
/* Connect SCL    to analog 5
  Connect SDA    to analog 4
  Connect VDD    to 3.3V DC
  Connect GROUND to common ground */
  
/* Initialise with default values (int time = 2.4ms, gain = 1x) */
// Adafruit_TCS34725 tcs = Adafruit_TCS34725();
/* Initialise with specific int time and gain values */
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_700MS, TCS34725_GAIN_1X);
const int sampleWindow = 50; // Sample window width in mS (50 mS = 20Hz)
unsigned int sample;
int count = 0;
void setup(void) {
  Serial.begin(9600);
 
  if (tcs.begin()) {
    //Serial.println("Found sensor");
  } else {
    Serial.println("No TCS34725 found ... check your connections");
    while (1);
  }
 
  // Now we're ready to get readings!
}
void loop(void) {
 
  uint16_t r, g, b,c,lux;
  tcs.getRawData(&r, &g, &b,&c);
  lux = tcs.calculateLux(r, g, b);
  //Serial.println(lux);
  int val = (r + g +b);
  int mini = 900;
  //int maxi = ;
 
  if(val >= mini){
    count ++;
   // Serial.println(count);
   
   if(count == 10) {
     Serial.print("Alert: il faut faire une pause!");
     Serial.print("\n");
     count = 0;
   }
  }
  else count = 0;
 
  if(lux <= 300){
     Serial.print("Alert: Vous n'etes pas une souve-souris? allummez la lumiere!");
     Serial.print("\n");
  }
 
 
  /*Serial.print("R: "); Serial.println(r); Serial.print(" ");
  Serial.print("G: "); Serial.println(g); Serial.print(" ");
  Serial.print("B: "); Serial.println(b); Serial.print(" ");
  */
  unsigned long startMillis= millis();  // Start of sample window
  unsigned int peakToPeak = 0;   // peak-to-peak level
  unsigned int signalMax = 0;
  unsigned int signalMin = 1024;
 
  // collect data for 50 mS
   while (millis() - startMillis < sampleWindow)
   {
     sample = analogRead(0);
     if (sample < 1024)  // toss out spurious readings
     {
        if (sample > signalMax)
        {
           signalMax = sample;  // save just the max levels
        }
        else if (sample < signalMin)
        {
           signalMin = sample;  // save just the min levels
        }
     }
  }
   peakToPeak = signalMax - signalMin;  // max - min = peak-peak amplitude
   double volts = (peakToPeak * 5.0) / 1024;  // convert to volts
  
   if(volts >= 3.9){
     Serial.print("Alert: trop de bruit!");
     Serial.print("\n");
   }
   //Serial.print("Volts: "); Serial.println(volts); Serial.print(" ");
   //Serial.println(" ");
}

Script: lancement du service au démarrage de la Raspberry Pi

#/bin/sh                                                                        
                                                                               
/usr/local/bin/hciconfig hci0 up      # start bluetooth module                                              
/usr/local/bin/hciconfig hci0 piscan  # put rpi bluetooth pairable and discoverable
# do it while a usb device is not connected on rpi 
                                       
while true ; do                                                                 
  ls -l /dev/ttyUSB0 > /dev/null 2> /dev/null                                   
  if [ $? -eq 0 ] ; then break; fi                                              
  sleep 1                                                                       
done
# launch the service
                                                                           
/usr/bin/python /home/pi/rfcomm-server.py &

Détail du travail de la sixième séance

Montage des lunettes. Test de la mise en marche des lunettes sans ordi. Mise en ligne du poster.

Rendu

Poster

Version électronique du poster :

Notre poster

Fichiers rendus

Notre application : Media:2017_IOT_P0_application.zip