Cadenas connecté : Différence entre versions
(→3ème séance) |
(→6ème séance) |
||
(11 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 9 : | Ligne 9 : | ||
==Description du projet== | ==Description du projet== | ||
− | Nous avons choisi de créer un cadenas connecté. Pour le déverrouiller, il faut indiquer le bon mot de passe composé de | + | Nous avons choisi de créer un cadenas connecté. Pour le déverrouiller, il faut indiquer le bon mot de passe composé de 4 chiffres. |
Il sera possible de localiser le cadenas ainsi donc la valise qui porte le cadenas par localisation GPS. | Il sera possible de localiser le cadenas ainsi donc la valise qui porte le cadenas par localisation GPS. | ||
Ligne 22 : | Ligne 22 : | ||
* Module GSM | * Module GSM | ||
* Carte Arduino | * Carte Arduino | ||
− | |||
− | |||
* Servomoteur | * Servomoteur | ||
Ligne 56 : | Ligne 54 : | ||
Nous avons commencé par les plus simples à tester notamment la carte Arduino, la plaque ensuite le servmoteur, la puce GPS, le module GSM et pour finir l'afficheur à sept segments. | Nous avons commencé par les plus simples à tester notamment la carte Arduino, la plaque ensuite le servmoteur, la puce GPS, le module GSM et pour finir l'afficheur à sept segments. | ||
+ | |||
+ | ==4ème séance== | ||
+ | Lors de cette séance, nous avons commencé à programmer sur Arduino. Nous avons testé les composants si tout fonctionner. | ||
+ | |||
+ | Nous avons commencé par tester le servomoteur. Nous avons donc utilisé des exemples de code (fournis par l'IDE Arduino) et branché le servomoteur sur le pin 9. | ||
+ | |||
+ | Puis nous avons décidé par continuer avec le GPS. Cependant, celui-ci ne fonctionnait plus et il était nécessaire de le changer (ainsi que le modèle du GPS). Par la suite, nous avons testé le GPS avec un code de Adafruit_GPS (une librairie trouvée sur internet). | ||
+ | |||
+ | Ensuite, il ne reste plus que le module GSM et l'afficheur 7-segment. Concernant le GSM, il est nécessaire d'avoir une carte SIM pour le tester. Nous avons donc passé au 7-segment. | ||
+ | |||
+ | Avec un code trouvé sur internet, nous avons pu tester l'afficheur. Il fonctionnait correctement. | ||
+ | |||
+ | ==5ème séance== | ||
+ | Lors de cette séance, il ne restait plus qu'à tester le GSM mais nous n'avons pas de carte SIM. De plus, il était nécessaire aussi de programmer et monter les boutons poussoirs pour l'afficheur 7-segment. Ainsi nous avons commencé par cela. | ||
+ | |||
+ | Ensuite, nous nous sommes occupés avec le programme finale ainsi que le montage de tous les composants sur la carte Arduino. | ||
+ | |||
+ | A la fin de la séance, nous avons réussi à connecter tous les composants mais aussi à programmer le servomoteur, les boutons poussoirs ainsi que l'afficheur 7-segment. Il ne reste plus qu'à programmer le GPS et GSM. | ||
+ | |||
+ | ==6ème séance== | ||
+ | Dans cette dernière séance, nous avons programmé le reste du programme principal. Nous avons détecté un problème : la compatibilité des librairies. En effet, les librairies Adafruit_GPS, GSM et SoftwareSerial sont imcompatibles car GSM redéfinit SoftwareSerial et ainsi le redéfinit. | ||
+ | |||
+ | Notre code final fonctionne donc sans l'envoi de SMS (code mis en commentaire). De plus, nous n'avons pas de carte SIM pour tester le programme final. | ||
+ | |||
+ | |||
+ | Voici le '''code''' de notre programme principal : | ||
+ | |||
+ | //#include <GSM.h> | ||
+ | #include <Adafruit_GPS.h> | ||
+ | #include <Servo.h> | ||
+ | #include <SoftwareSerial.h> | ||
+ | |||
+ | #define NOMBRE_ESSAI_MAX (3) | ||
+ | #define NUMTEL "" | ||
+ | #define GPSSerial Serial1 | ||
+ | |||
+ | String buffer1; | ||
+ | String buffer2; | ||
+ | String buffer3; | ||
+ | String buffer4; | ||
+ | String tempString; | ||
+ | String codeString; | ||
+ | int nombreEssaiEnCours; | ||
+ | const String CODE = "1011"; | ||
+ | int code[4]; | ||
+ | |||
+ | // BP | ||
+ | const int BP1 = 2; | ||
+ | const int BP2 = 3; | ||
+ | const int BP3 = 4; | ||
+ | const int BP4 = 5; | ||
+ | const int BPV = 6; | ||
+ | |||
+ | //s7s | ||
+ | const int softwareTx = 8; | ||
+ | const int softwareRx = 7; | ||
+ | SoftwareSerial s7s(7,8); | ||
+ | |||
+ | //servomoteur | ||
+ | const int servo = 9; | ||
+ | Servo myservo; | ||
+ | |||
+ | //GSM | ||
+ | #define PINNUMBER "0000" | ||
+ | /* | ||
+ | // initialize the library instance | ||
+ | GSM gsmAccess; | ||
+ | GSM_SMS sms;*/ | ||
+ | |||
+ | //GPS | ||
+ | Adafruit_GPS GPS(&GPSSerial); | ||
+ | |||
+ | void setup() { | ||
+ | nombreEssaiEnCours = 0; | ||
+ | Serial.begin(9600); | ||
+ | |||
+ | /* Initialisation s7s */ | ||
+ | s7s.begin(9600); | ||
+ | s7s.print("0000"); | ||
+ | |||
+ | /* Initialisation BP */ | ||
+ | pinMode(BP1, INPUT_PULLUP); | ||
+ | pinMode(BP2, INPUT_PULLUP); | ||
+ | pinMode(BP3, INPUT_PULLUP); | ||
+ | pinMode(BP4, INPUT_PULLUP); | ||
+ | pinMode(BPV, INPUT_PULLUP); | ||
+ | |||
+ | /* Initialisation servomoteur */ | ||
+ | myservo.attach(9); | ||
+ | |||
+ | /* Initialisation GSM *//* | ||
+ | // initialize serial communications and wait for port to open: | ||
+ | |||
+ | while (!Serial) { | ||
+ | ; // wait for serial port to connect. Needed for native USB port only | ||
+ | } | ||
+ | |||
+ | Serial.println("SMS Messages Sender"); | ||
+ | |||
+ | // connection state | ||
+ | boolean notConnected = true; | ||
+ | |||
+ | // Start GSM shield | ||
+ | // If your SIM has PIN, pass it as a parameter of begin() in quotes | ||
+ | while (notConnected) { | ||
+ | if (gsmAccess.begin(PINNUMBER) == GSM_READY) { | ||
+ | notConnected = false; | ||
+ | } else { | ||
+ | Serial.println("Not connected"); | ||
+ | delay(1000); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | Serial.println("GSM initialized"); | ||
+ | */ | ||
+ | |||
+ | /* Initialisation GPS */ | ||
+ | GPS.begin(9600); | ||
+ | GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); | ||
+ | GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); | ||
+ | GPS.sendCommand(PGCMD_ANTENNA); | ||
+ | delay(1000); | ||
+ | GPSSerial.println(PMTK_Q_RELEASE); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | if(!digitalRead(BPV)) { | ||
+ | if(codeString.equals(CODE)) { | ||
+ | Serial.println("cadenas ouvert"); | ||
+ | int pos; | ||
+ | for (pos = 0; pos <= 180; pos += 1) { | ||
+ | myservo.write(pos); // tell servo to go to position in variable 'pos' | ||
+ | delay(15); // waits 15ms for the servo to reach the position | ||
+ | } | ||
+ | } | ||
+ | else { | ||
+ | if(nombreEssaiEnCours<NOMBRE_ESSAI_MAX) { | ||
+ | nombreEssaiEnCours = nombreEssaiEnCours+1; | ||
+ | Serial.println(nombreEssaiEnCours); | ||
+ | delay(200); | ||
+ | } | ||
+ | else if(nombreEssaiEnCours==NOMBRE_ESSAI_MAX) { | ||
+ | s7s.print("0000"); | ||
+ | // envoi MSM | ||
+ | String txtMsg = ""; | ||
+ | char c = GPS.read(); | ||
+ | if (GPS.newNMEAreceived()) { | ||
+ | if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false | ||
+ | return; | ||
+ | } | ||
+ | Serial.println("cadenas verrouille"); | ||
+ | if (GPS.fix) { | ||
+ | txtMsg = "Localisation:\n" + | ||
+ | txtMsg = "Latitude: " + String(GPS.latitude) + "\n"; | ||
+ | txtMsg = "Longitude: " + String(GPS.longitude) + "\n"; | ||
+ | txtMsg = "Altitude: " + String(GPS.altitude) + "\n"; | ||
+ | Serial.println(txtMsg); | ||
+ | /* Envoi du message */ | ||
+ | /*sms.beginSMS(NUMTEL); | ||
+ | sms.print(txtMsg); | ||
+ | sms.endSMS();*/ | ||
+ | } | ||
+ | while(1) {}; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | else { | ||
+ | if(!digitalRead(BP1)) { | ||
+ | if(code[0]==9) | ||
+ | code[0]=0; | ||
+ | else | ||
+ | code[0]++; | ||
+ | } | ||
+ | else if(!digitalRead(BP2)) { | ||
+ | if(code[1]==9) | ||
+ | code[1]=0; | ||
+ | else | ||
+ | code[1]++; | ||
+ | else if(!digitalRead(BP3)) { | ||
+ | if(code[2]==9) | ||
+ | code[2]=0; | ||
+ | else | ||
+ | code[2]++; | ||
+ | } | ||
+ | else if(!digitalRead(BP4)) { | ||
+ | if(code[3]==9) | ||
+ | code[3]=0; | ||
+ | else | ||
+ | code[3]++; | ||
+ | } | ||
+ | } | ||
+ | buffer1 = String(code[0]); | ||
+ | buffer2 = String(code[1]); | ||
+ | buffer3 = String(code[2]); | ||
+ | buffer4 = String(code[3]); | ||
+ | tempString = buffer3 + buffer4 +buffer1 +buffer2; | ||
+ | codeString = buffer1 + buffer2 + buffer3 + buffer4; | ||
+ | s7s.print(tempString); | ||
+ | delay(200); | ||
+ | } | ||
+ | |||
+ | |||
+ | Ainsi que le '''montage''' : | ||
+ | <center> | ||
+ | [[Fichier:50474545 218648039087498 4010548213697216512 n.jpg|sans_cadre]] | ||
+ | [[Fichier:50271434 540525579779853 4212485794859843584 n.jpg|sans_cadre]] | ||
+ | </center> | ||
+ | |||
+ | |||
+ | Nous avons fini avec la création du '''poster''' : | ||
+ | <center> | ||
+ | [[Fichier:Poster Cadenas.png|sans_cadre]] | ||
+ | </center> | ||
+ | |||
+ | |||
+ | '''Améliorations :''' | ||
+ | |||
+ | Création d'une application mobile permettant la gestion du cadenas à savoir : | ||
+ | *Verrouillage et déverrouillage à distance du cadenas | ||
+ | *Localisation GPS avec une carte map (plus de coordonnées) |
Version actuelle datée du 21 janvier 2019 à 17:49
Sommaire
Présentation du sujet
Contexte
L'option Internet des Objets est un module qui se place dans le cadre de notre formation Ingénieur.
Le but du projet est de réaliser un objet connecté en 24h.
Description du projet
Nous avons choisi de créer un cadenas connecté. Pour le déverrouiller, il faut indiquer le bon mot de passe composé de 4 chiffres.
Il sera possible de localiser le cadenas ainsi donc la valise qui porte le cadenas par localisation GPS.
De plus, au bout de la 3ème tentative ratée, le cadenas se bloque et envoit un message au propriétaire pour lui indiquer que quelqu'un essaye de déverrouiller le cadenas.
Réalisation
Matériel utilisé
- Cadenas
- Puce GPS
- Module GSM
- Carte Arduino
- Servomoteur
1ère séance
Nous avons commencé par chercher l'objet connecté à réaliser. Dans un premier temps, nous sommes partis sur un stylo connecté permettant de connaître le niveau d'encre.
Cependant, la réalisation est bien trop compliquée : si le stylo est vide, que faire ? Si nous le jetons, nous jetons toute la technologie, ce qui n'est pas envisageable. De plus, le niveau d'encre est connu seulement en regarder le stylo qui peut-être transparant. Ainsi, l'idée en question est mauvaise.
Par la suite, nous avons décidé de créer un cadenas connecté.
Pour réaliser le projet, nous avons besoin de plusieurs matériels :
- cadenas
- puce GPS, deux antennes (émetteur et récepteur) pour la localisation du cadenas.
- carte Arduino, batterie et capteur de position pour déterminer si le code est bon ou non et envoyer un message au bout de la 3ème tentative ratée.
2ème séance
Nous avons commencé par créer un site web pour recevoir les alertes et la localisation du cadenas.
Cependant, après discussion avec les tuteurs, le site web n'est pas adapté à cette situation. En effet, le mieux est d'envoyer à l'utilisateur un SMS sur son téléphone portable. Avec un site web, l'utilisateur devra impérativement le consulter afin de voir si une alerte est présente. Nous avons donc besoin d'un module GSM pour envoyer les SMS.
Ainsi, l'envoie des données : GPS et alerte se feront par SMS. Par la suite, l'envoi de la localisation GPS sera fait en fonction du accéléromètre. En effet, si l'arduino est constamment en attente du message pour envoyer les coordonnées, cela risque d'utiliser trop rapidement la batterie et ce qui n'est pas adaptée dans notre cas. Nous avons donc choisi d'envoyer les coordonnées à chaque fois que le cadenas sera en mouvement (en utilisant l'accéléromètre).
Pour la conception de l'ouverture d'un cadenas, nous utiliserons un servomoteur qui sera connecté à la carte Arduino. Si le code est bon, le servomoteur sera actionné et ouvrira le verrou.
3ème séance
Dans cette séance nous avons pu déterminer tous les composants nécessaires pour concevoir notre objet connecté.
Ainsi le tuteur nous a fait parvenir du matériel.
Après avoir récupéré toutes les pieces, nous avons entamé à tester ces composants en utilisant des programmes existants sur Arduino, ou des programmes trouvés sur internet.
Nous avons commencé par les plus simples à tester notamment la carte Arduino, la plaque ensuite le servmoteur, la puce GPS, le module GSM et pour finir l'afficheur à sept segments.
4ème séance
Lors de cette séance, nous avons commencé à programmer sur Arduino. Nous avons testé les composants si tout fonctionner.
Nous avons commencé par tester le servomoteur. Nous avons donc utilisé des exemples de code (fournis par l'IDE Arduino) et branché le servomoteur sur le pin 9.
Puis nous avons décidé par continuer avec le GPS. Cependant, celui-ci ne fonctionnait plus et il était nécessaire de le changer (ainsi que le modèle du GPS). Par la suite, nous avons testé le GPS avec un code de Adafruit_GPS (une librairie trouvée sur internet).
Ensuite, il ne reste plus que le module GSM et l'afficheur 7-segment. Concernant le GSM, il est nécessaire d'avoir une carte SIM pour le tester. Nous avons donc passé au 7-segment.
Avec un code trouvé sur internet, nous avons pu tester l'afficheur. Il fonctionnait correctement.
5ème séance
Lors de cette séance, il ne restait plus qu'à tester le GSM mais nous n'avons pas de carte SIM. De plus, il était nécessaire aussi de programmer et monter les boutons poussoirs pour l'afficheur 7-segment. Ainsi nous avons commencé par cela.
Ensuite, nous nous sommes occupés avec le programme finale ainsi que le montage de tous les composants sur la carte Arduino.
A la fin de la séance, nous avons réussi à connecter tous les composants mais aussi à programmer le servomoteur, les boutons poussoirs ainsi que l'afficheur 7-segment. Il ne reste plus qu'à programmer le GPS et GSM.
6ème séance
Dans cette dernière séance, nous avons programmé le reste du programme principal. Nous avons détecté un problème : la compatibilité des librairies. En effet, les librairies Adafruit_GPS, GSM et SoftwareSerial sont imcompatibles car GSM redéfinit SoftwareSerial et ainsi le redéfinit.
Notre code final fonctionne donc sans l'envoi de SMS (code mis en commentaire). De plus, nous n'avons pas de carte SIM pour tester le programme final.
Voici le code de notre programme principal :
//#include <GSM.h> #include <Adafruit_GPS.h> #include <Servo.h> #include <SoftwareSerial.h> #define NOMBRE_ESSAI_MAX (3) #define NUMTEL "" #define GPSSerial Serial1 String buffer1; String buffer2; String buffer3; String buffer4; String tempString; String codeString; int nombreEssaiEnCours; const String CODE = "1011"; int code[4]; // BP const int BP1 = 2; const int BP2 = 3; const int BP3 = 4; const int BP4 = 5; const int BPV = 6; //s7s const int softwareTx = 8; const int softwareRx = 7; SoftwareSerial s7s(7,8); //servomoteur const int servo = 9; Servo myservo; //GSM #define PINNUMBER "0000" /* // initialize the library instance GSM gsmAccess; GSM_SMS sms;*/ //GPS Adafruit_GPS GPS(&GPSSerial); void setup() { nombreEssaiEnCours = 0; Serial.begin(9600); /* Initialisation s7s */ s7s.begin(9600); s7s.print("0000"); /* Initialisation BP */ pinMode(BP1, INPUT_PULLUP); pinMode(BP2, INPUT_PULLUP); pinMode(BP3, INPUT_PULLUP); pinMode(BP4, INPUT_PULLUP); pinMode(BPV, INPUT_PULLUP); /* Initialisation servomoteur */ myservo.attach(9); /* Initialisation GSM *//* // initialize serial communications and wait for port to open: while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.println("SMS Messages Sender"); // connection state boolean notConnected = true; // Start GSM shield // If your SIM has PIN, pass it as a parameter of begin() in quotes while (notConnected) { if (gsmAccess.begin(PINNUMBER) == GSM_READY) { notConnected = false; } else { Serial.println("Not connected"); delay(1000); } } Serial.println("GSM initialized"); */ /* Initialisation GPS */ GPS.begin(9600); GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); GPS.sendCommand(PGCMD_ANTENNA); delay(1000); GPSSerial.println(PMTK_Q_RELEASE); } void loop() { if(!digitalRead(BPV)) { if(codeString.equals(CODE)) { Serial.println("cadenas ouvert"); int pos; for (pos = 0; pos <= 180; pos += 1) { myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } } else { if(nombreEssaiEnCours<NOMBRE_ESSAI_MAX) { nombreEssaiEnCours = nombreEssaiEnCours+1; Serial.println(nombreEssaiEnCours); delay(200); } else if(nombreEssaiEnCours==NOMBRE_ESSAI_MAX) { s7s.print("0000"); // envoi MSM String txtMsg = ""; char c = GPS.read(); if (GPS.newNMEAreceived()) { if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false return; } Serial.println("cadenas verrouille"); if (GPS.fix) { txtMsg = "Localisation:\n" + txtMsg = "Latitude: " + String(GPS.latitude) + "\n"; txtMsg = "Longitude: " + String(GPS.longitude) + "\n"; txtMsg = "Altitude: " + String(GPS.altitude) + "\n"; Serial.println(txtMsg); /* Envoi du message */ /*sms.beginSMS(NUMTEL); sms.print(txtMsg); sms.endSMS();*/ } while(1) {}; } } } else { if(!digitalRead(BP1)) { if(code[0]==9) code[0]=0; else code[0]++; } else if(!digitalRead(BP2)) { if(code[1]==9) code[1]=0; else code[1]++; else if(!digitalRead(BP3)) { if(code[2]==9) code[2]=0; else code[2]++; } else if(!digitalRead(BP4)) { if(code[3]==9) code[3]=0; else code[3]++; } } buffer1 = String(code[0]); buffer2 = String(code[1]); buffer3 = String(code[2]); buffer4 = String(code[3]); tempString = buffer3 + buffer4 +buffer1 +buffer2; codeString = buffer1 + buffer2 + buffer3 + buffer4; s7s.print(tempString); delay(200); }
Ainsi que le montage :
Nous avons fini avec la création du poster :
Améliorations :
Création d'une application mobile permettant la gestion du cadenas à savoir :
- Verrouillage et déverrouillage à distance du cadenas
- Localisation GPS avec une carte map (plus de coordonnées)