P2 IOT 2017
Sommaire
- 1 Présentation du sujet
- 2 Réalisation
- 2.1 Matériel utilisé
- 2.2 Suivi de réalisation
- 2.3 Détail du travail de la première séance
- 2.4 Détail du travail de la deuxième séance
- 2.5 Détail du travail de la troisième séance
- 2.6 Détail du travail de la quatrième séance
- 2.7 Détail du travail de la cinquième séance
- 2.8 Détail du travail de la sixième séance
- 3 Rendu
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 Rasberry P3 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. Montage des lunettes. |
Séance 6 (24/01/2018) | activité ... |
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.
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.
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. Mise en ligne du poster.
Rendu
Poster
Version électronique du poster :
Fichiers rendus
Notre application : Media:2017_IOT_P0_application.zip