P5 IOT 2017 : Différence entre versions
(→Détail du travail de la quatrième séance) |
(→Détail du travail de la troisième séance) |
||
(19 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 70 : | Ligne 70 : | ||
* Test du capteur optique LI-DAR Lite et codage du programme pour le calcul de distance. | * Test du capteur optique LI-DAR Lite et codage du programme pour le calcul de distance. | ||
− | + | <pre> | |
+ | |||
+ | LIDARLite Arduino Library | ||
+ | GetDistanceI2c | ||
+ | |||
+ | This example shows how to initialize, configure, and read distance from a | ||
+ | LIDAR-Lite connected over the I2C interface. | ||
+ | |||
+ | Connections: | ||
+ | LIDAR-Lite 5 Vdc (red) to Arduino 5v | ||
+ | LIDAR-Lite I2C SCL (green) to Arduino SCL | ||
+ | LIDAR-Lite I2C SDA (blue) to Arduino SDA | ||
+ | LIDAR-Lite Ground (black) to Arduino GND | ||
+ | |||
+ | (Capacitor recommended to mitigate inrush current when device is enabled) | ||
+ | 680uF capacitor (+) to Arduino 5v | ||
+ | 680uF capacitor (-) to Arduino GND | ||
+ | |||
+ | See the Operation Manual for wiring diagrams and more information: | ||
+ | http://www.robotshop.com/media/files/pdf2/pli-06-instruction.pdf | ||
+ | |||
+ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
+ | |||
+ | #include <Wire.h> | ||
+ | #include <LIDARLite.h> | ||
+ | |||
+ | LIDARLite myLidarLite; | ||
+ | int distance_reelle ; | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | Serial.begin(9600); // Initialize serial connection to display distance readings | ||
+ | |||
+ | myLidarLite.begin(0, true); // Set configuration to default and I2C to 400 kHz | ||
+ | |||
+ | myLidarLite.configure(0); // Change this number to try out alternate configurations | ||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | |||
+ | // Take a measurement with receiver bias correction and print to serial terminal | ||
+ | distance_reelle = (myLidarLite.distance()); | ||
+ | if(distance_reelle < 1) | ||
+ | { | ||
+ | Serial.println('O'); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | Serial.println('N'); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | </pre> | ||
==Détail du travail de la troisième séance== | ==Détail du travail de la troisième séance== | ||
* Poursuite de la création du circuit (shield) pour la matrice LED. | * Poursuite de la création du circuit (shield) pour la matrice LED. | ||
− | Cela n'a pas été une tâche facile en raison de la | + | Cela n'a pas été une tâche facile en raison de la position des différentes entrées/sorties dont nous avions besoin et des liaisons à effectuer. |
* Test du GPS et codage du programme de calcul de vitesse. | * Test du GPS et codage du programme de calcul de vitesse. | ||
Ligne 86 : | Ligne 140 : | ||
Nous avons rencontré un problème avec le logiciel nous avons donc dû refaire entièrement le circuit, cela nous a pas mal retardé dans notre projet. | Nous avons rencontré un problème avec le logiciel nous avons donc dû refaire entièrement le circuit, cela nous a pas mal retardé dans notre projet. | ||
− | + | ||
+ | [[Fichier:Circuitp5.jpg|200px|]] | ||
+ | [[Fichier:circuit_bottom.jpg|200px|]] | ||
* Test du GPS et résolution des problèmes. | * Test du GPS et résolution des problèmes. | ||
− | Nous avons rencontré beaucoup de problèmes avec le GPS, celui-ci se connectait bien aux satellites mais ne nous | + | Nous avons rencontré beaucoup de problèmes avec le GPS, celui-ci se connectait bien aux satellites mais ne nous renvoyait que des données nulles ou bien un message d'erreur. |
− | Il s'est en faite avéré que selon la position du | + | Il s'est en faite avéré que selon la position du GPS receiver sur le shield celui-ci affichait ou non les données. |
− | Le problème a donc été résolu. | + | Le problème a donc été résolu. Voici le code: |
− | ' | + | |
+ | <pre>} | ||
+ | |||
+ | #include <TinyGPS++.h> | ||
+ | #include <SoftwareSerial.h> | ||
+ | #include <Wire.h> | ||
+ | /* | ||
+ | This example uses software serial and the TinyGPS++ library by Mikal Hart | ||
+ | Based on TinyGPSPlus/DeviceExample.ino by Mikal Hart | ||
+ | Modified by acavis | ||
+ | */ | ||
+ | |||
+ | // Choose two Arduino pins to use for software serial | ||
+ | // The GPS Shield uses D2 and D3 by default when in DLINE mode | ||
+ | int RXPin = 50; | ||
+ | int TXPin = 3; | ||
+ | |||
+ | // The Skytaq EM-506 GPS module included in the GPS Shield Kit | ||
+ | // uses 4800 baud by default | ||
+ | int GPSBaud = 4800; | ||
+ | |||
+ | // Create a TinyGPS++ object called "gps" | ||
+ | TinyGPSPlus gps; | ||
+ | |||
+ | // Create a software serial port called "gpsSerial" | ||
+ | SoftwareSerial gpsSerial(RXPin, TXPin); | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | // Start the Arduino hardware serial port at 9600 baud | ||
+ | Serial.begin(9600); | ||
+ | |||
+ | // Start the software serial port at the GPS's default baud | ||
+ | gpsSerial.begin(GPSBaud); | ||
+ | |||
+ | Serial.println(F("DeviceExample.ino")); | ||
+ | Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module")); | ||
+ | Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion()); | ||
+ | Serial.println(F("by Mikal Hart")); | ||
+ | Serial.println(); | ||
+ | |||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | // This sketch displays information every time a new sentence is correctly encoded. | ||
+ | while (gpsSerial.available() > 0) | ||
+ | if (gps.encode(gpsSerial.read())) | ||
+ | displayInfo(); | ||
+ | |||
+ | // If 5000 milliseconds pass and there are no characters coming in | ||
+ | // over the software serial port, show a "No GPS detected" error | ||
+ | if (millis() > 5000 && gps.charsProcessed() < 10) | ||
+ | { | ||
+ | Serial.println(F("No GPS detected")); | ||
+ | while(true); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void displayInfo() | ||
+ | { | ||
+ | Serial.print(F("Speed: ")); | ||
+ | if (gps.speed.isValid()) | ||
+ | { | ||
+ | Serial.print(gps.speed.kmph(), 6); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | Serial.print(F("INVALID")); | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Serial.println(); | ||
+ | |||
+ | secure_dist = (gps.speed.kmph()/10)*6; | ||
+ | Serial.print("distance de sécurite (en m)= "); | ||
+ | Serial.print(secure_dist); | ||
+ | Serial.println(); | ||
+ | |||
+ | } | ||
+ | |||
+ | </pre> | ||
==Détail du travail de la cinquième séance== | ==Détail du travail de la cinquième séance== | ||
* Soudage des barrettes et des ponts sur le circuit pour la Matrice LED (Shield) | * Soudage des barrettes et des ponts sur le circuit pour la Matrice LED (Shield) | ||
− | |||
* Test de la matrice LED et codage du programme pour l'affichage d'un message personnalisé coloré | * Test de la matrice LED et codage du programme pour l'affichage d'un message personnalisé coloré | ||
Message choisi: Ne me collez pas au cul, PUTAIN!! | Message choisi: Ne me collez pas au cul, PUTAIN!! | ||
+ | Voici le code pour l'affichage du message. Celle-ci se fait grâce à un liaison série entre la raspberry Pi (RPI) et la matrice de de LED connectée à l’arduino Mega à travers le shield. | ||
− | + | Voici le résultat: | |
+ | |||
+ | [[Fichier:Panneau.jpg|200px|]] | ||
* Configuartion de la RPI | * Configuartion de la RPI | ||
− | |||
− | ''[ | + | La raspberry pi (RPI) est chargé de recueillir la confirmation de l'utilisateur à travers l'application mobile, une fois ceci fait, elle lit les données envoyées provenant du traitement d'information sur la distance de sécurité et celle réelle avant de les envoyé vers le programme traitant de l'affichage du message. En fonction du message envoyé (dans notre cas c'est un caractère: 'O' ou 'o' si le message doit être envoyé et 'n' ou 'N' si c'est le contraire). Voici le code: |
+ | |||
+ | <pre> | ||
+ | |||
+ | |||
+ | 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) | ||
+ | |||
+ | ser0 = serial.Serial('/dev/ttyACM0') | ||
+ | Ser1 = serial.SERIAL('/dev/ttyACM1') | ||
+ | |||
+ | try: | ||
+ | while True: | ||
+ | data = "" | ||
+ | client_sock.recv(data) | ||
+ | data2 = ser1.read(); | ||
+ | if data2 == 'O' | ||
+ | ser0.write('o') | ||
+ | if data2 == 'N' | ||
+ | ser0.write('n') | ||
+ | except IOError: | ||
+ | pass | ||
+ | |||
+ | print("disconnected") | ||
+ | |||
+ | client_sock.close() | ||
+ | server_sock.close() | ||
+ | print("all done") | ||
+ | </pre> | ||
* Codage de l'application Mobile | * Codage de l'application Mobile | ||
− | '' | + | Elle a pour but de permettre à l'utilisateur de se connecter, via bluetooth, à la RPI et de lui envoyer sa confirmation. Celui-ci peut également se déconnecter, s'il le souhaite. |
− | + | [[Fichier:Appli iot.PNG|200px|]] | |
− | |||
==Détail du travail de la sixième séance== | ==Détail du travail de la sixième séance== | ||
* Test du fonctionnement du système complet | * Test du fonctionnement du système complet | ||
Problèmes rencontrés: | Problèmes rencontrés: | ||
+ | on a eu plusieurs bugs sur la partie RPI. On a eu du mal à faire les liaisons série entre les deux arduino. | ||
− | |||
− | |||
− | |||
* Préparation de l'oral et finition du poster | * Préparation de l'oral et finition du poster | ||
Ligne 134 : | Ligne 320 : | ||
==Fichiers rendus== | ==Fichiers rendus== | ||
− | Notre application : [[Media: | + | Notre application : [[Media:Rendu.zip]] |
Version actuelle datée du 7 avril 2018 à 14:19
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
Nous effectuons ce projet dans le cadre du module internet des objets (Internet of things).
L'objectif de ce module est de créer l'objet connecté de notre choix.
Nous avons donc choisi de créer un objet en rapport avec la sécurité routière: le système Safe&Drive.
Description du projet
Pour veiller au respect des distances de sécurité, le système S&D va tout d'abord évaluer la distance entre votre voiture et celle qui vous suit.
Grâce au GPS intégré, la distance de sécurité à respecter sera calculée en fonction de votre vitesse de circulation.
Si cette distance de sécurité n'est pas respectée, un message de mise en garde sera affiché sur votre pare-brise arrière à destination du conducteur qui vous suit de trop prêt.
Bien évidemment, ce message ne sera envoyé qu'après confirmation de l'utilisateur depuis l'application mobile du système Safe&Drive.
En mode marche arrière, le système devient une aide à la manœuvre avec une caméra de recul et un détecteur d'obstacle.
Réalisation
Matériel utilisé
- Raspberry Pi
- Arduino Uno
- Arduino Mega2560
- SparkFun GPS Shield
- Adafruit 64x32 RGB LED Matrix - 5mm pitch
- Garmin LIDAR-Lite v3
Suivi de réalisation
Séance 1 (08/01/2018) | Choix de l'objet + Choix du matériel |
---|---|
Séance 2 (09/01/2018) | Circuit shield pour la matrice LED + Test Li-DAR Lite |
Séance 3 (16/01/2018) | Circuit shield pour la matrice LED + Test du shield GPS |
Séance 4 (17/01/2018) | Circuit shield pour la matrice LED + Test Shield GPS |
Séance 5 (22/01/2018) | Soudage circuit shield pour la matrice LED + Test LED Matrix + RaspberryPI + Application mobile |
Séance 6 (24/01/2018) | Finitions + Resolutions des problèmes + Préparation orale (+poster) |
Détail du travail de la première séance
Pour choisir notre projet nous avons débuté en faisant un pseudo-brainstorming duquel est ressorti 4 projets.
Nous donc dû réduire notre choix à un seul de ces quatre possibilités.
Notre choix final s'est donc porté sur le système Safe&Drive.
Après avoir affiné les divers fonctionnalités de notre projet, nous avons commencé à réunir le matériel dont nous aurions besoin.
Détail du travail de la deuxième séance
- Début de la création du shield de la matrice de LED qui viendra se positionner sur l’Arduino Mega2560.
- Test du capteur optique LI-DAR Lite et codage du programme pour le calcul de distance.
LIDARLite Arduino Library GetDistanceI2c This example shows how to initialize, configure, and read distance from a LIDAR-Lite connected over the I2C interface. Connections: LIDAR-Lite 5 Vdc (red) to Arduino 5v LIDAR-Lite I2C SCL (green) to Arduino SCL LIDAR-Lite I2C SDA (blue) to Arduino SDA LIDAR-Lite Ground (black) to Arduino GND (Capacitor recommended to mitigate inrush current when device is enabled) 680uF capacitor (+) to Arduino 5v 680uF capacitor (-) to Arduino GND See the Operation Manual for wiring diagrams and more information: http://www.robotshop.com/media/files/pdf2/pli-06-instruction.pdf ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- #include <Wire.h> #include <LIDARLite.h> LIDARLite myLidarLite; int distance_reelle ; void setup() { Serial.begin(9600); // Initialize serial connection to display distance readings myLidarLite.begin(0, true); // Set configuration to default and I2C to 400 kHz myLidarLite.configure(0); // Change this number to try out alternate configurations } void loop() { // Take a measurement with receiver bias correction and print to serial terminal distance_reelle = (myLidarLite.distance()); if(distance_reelle < 1) { Serial.println('O'); } else { Serial.println('N'); } }
Détail du travail de la troisième séance
- Poursuite de la création du circuit (shield) pour la matrice LED.
Cela n'a pas été une tâche facile en raison de la position des différentes entrées/sorties dont nous avions besoin et des liaisons à effectuer.
- Test du GPS et codage du programme de calcul de vitesse.
Nous avons rencontré des problèmes avec le GPS, celui-ci ne renvoyait des message d'erreurs "NO GPS DETECTED" ou bien des données nulles du type "Date: 00/00/0000".
Détail du travail de la quatrième séance
- Finition du circuit (shield) pour la matrice LED et envoi de la demande de fabrication
Nous avons rencontré un problème avec le logiciel nous avons donc dû refaire entièrement le circuit, cela nous a pas mal retardé dans notre projet.
- Test du GPS et résolution des problèmes.
Nous avons rencontré beaucoup de problèmes avec le GPS, celui-ci se connectait bien aux satellites mais ne nous renvoyait que des données nulles ou bien un message d'erreur.
Il s'est en faite avéré que selon la position du GPS receiver sur le shield celui-ci affichait ou non les données.
Le problème a donc été résolu. Voici le code:
} #include <TinyGPS++.h> #include <SoftwareSerial.h> #include <Wire.h> /* This example uses software serial and the TinyGPS++ library by Mikal Hart Based on TinyGPSPlus/DeviceExample.ino by Mikal Hart Modified by acavis */ // Choose two Arduino pins to use for software serial // The GPS Shield uses D2 and D3 by default when in DLINE mode int RXPin = 50; int TXPin = 3; // The Skytaq EM-506 GPS module included in the GPS Shield Kit // uses 4800 baud by default int GPSBaud = 4800; // Create a TinyGPS++ object called "gps" TinyGPSPlus gps; // Create a software serial port called "gpsSerial" SoftwareSerial gpsSerial(RXPin, TXPin); void setup() { // Start the Arduino hardware serial port at 9600 baud Serial.begin(9600); // Start the software serial port at the GPS's default baud gpsSerial.begin(GPSBaud); Serial.println(F("DeviceExample.ino")); Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module")); Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion()); Serial.println(F("by Mikal Hart")); Serial.println(); } void loop() { // This sketch displays information every time a new sentence is correctly encoded. while (gpsSerial.available() > 0) if (gps.encode(gpsSerial.read())) displayInfo(); // If 5000 milliseconds pass and there are no characters coming in // over the software serial port, show a "No GPS detected" error if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println(F("No GPS detected")); while(true); } } void displayInfo() { Serial.print(F("Speed: ")); if (gps.speed.isValid()) { Serial.print(gps.speed.kmph(), 6); } else { Serial.print(F("INVALID")); } Serial.println(); secure_dist = (gps.speed.kmph()/10)*6; Serial.print("distance de sécurite (en m)= "); Serial.print(secure_dist); Serial.println(); }
Détail du travail de la cinquième séance
- Soudage des barrettes et des ponts sur le circuit pour la Matrice LED (Shield)
- Test de la matrice LED et codage du programme pour l'affichage d'un message personnalisé coloré
Message choisi: Ne me collez pas au cul, PUTAIN!! Voici le code pour l'affichage du message. Celle-ci se fait grâce à un liaison série entre la raspberry Pi (RPI) et la matrice de de LED connectée à l’arduino Mega à travers le shield.
Voici le résultat:
- Configuartion de la RPI
La raspberry pi (RPI) est chargé de recueillir la confirmation de l'utilisateur à travers l'application mobile, une fois ceci fait, elle lit les données envoyées provenant du traitement d'information sur la distance de sécurité et celle réelle avant de les envoyé vers le programme traitant de l'affichage du message. En fonction du message envoyé (dans notre cas c'est un caractère: 'O' ou 'o' si le message doit être envoyé et 'n' ou 'N' si c'est le contraire). Voici le code:
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) ser0 = serial.Serial('/dev/ttyACM0') Ser1 = serial.SERIAL('/dev/ttyACM1') try: while True: data = "" client_sock.recv(data) data2 = ser1.read(); if data2 == 'O' ser0.write('o') if data2 == 'N' ser0.write('n') except IOError: pass print("disconnected") client_sock.close() server_sock.close() print("all done")
- Codage de l'application Mobile
Elle a pour but de permettre à l'utilisateur de se connecter, via bluetooth, à la RPI et de lui envoyer sa confirmation. Celui-ci peut également se déconnecter, s'il le souhaite.
Détail du travail de la sixième séance
- Test du fonctionnement du système complet
Problèmes rencontrés: on a eu plusieurs bugs sur la partie RPI. On a eu du mal à faire les liaisons série entre les deux arduino.
- Préparation de l'oral et finition du poster
Rendu
Poster
Version électronique du poster :
Fichiers rendus
Notre application : Media:Rendu.zip