SmartWay : Kit complet pour moteur vibrant, LED RVB, module GPS et Arduino MKR Fox 1200
Composants et fournitures
| Fils de connexion (générique) | × | 1 |
| Transistor NPN usage général | × | 1 |
| Condensateur céramique 0,1 µF | × | 1 |
| Résistance 1k ohm | × | 1 |
| Résistance 221 ohm | × | 1 |
| LED RVB diffuse cathode commune | × | 1 |
| Module GPS GY-NEO6MV2 | × | 1 |
| Moteur vibrant | × | 1 |
| Support 2 piles AA pour RTC (UDOO) | × | 1 |
| Arduino MKR Fox 1200 | × | 1 |
Outils et machines nécessaires
- Fer à souder (générique)
Applications et services en ligne
- Arduino Web Editor
- Sigfox
À propos de ce projet
Vue d'ensemble
Les parents s'inquiètent toujours pour leurs enfants. Ils veulent que leurs enfants arrivent à l'école à l'heure et rentrent à la maison à temps, en empruntant le chemin prévu.
SmartWay vise à éliminer cette inquiétude du quotidien des parents. SmartWay surveillera votre enfant pendant qu'il va et revient de l'école, en s'assurant qu'il emprunte toujours le chemin approprié pour arriver à destination, l'école.
SmartWay surveillera la géolocalisation de votre enfant via GPS et enverra immédiatement un e-mail au parent si l'enfant s'écarte du chemin que vous lui avez assigné. SmartWay enverra également un e-mail au parent lorsque l'enfant arrive à la maison ou à l'école, ainsi que s'il est en retard. Ainsi, les parents peuvent siroter leur café en toute tranquillité, sachant que leur enfant arrive sain et sauf à l'école et à la maison.

Fonctionnalité
SmartWay surveillera en continu la géolocalisation de votre enfant depuis son réveil jusqu'à son arrivée à la maison. L'appareil est également équipé d'une LED RVB et d'un moteur vibrant pour avertir votre enfant s'il n'emprunte pas le bon chemin vers l'école ou s'il est en retard, et le féliciter lorsqu'il arrive à l'école.
L'appareil fonctionne à travers de nombreuses fonctions pour assurer la sécurité de votre enfant.


- La première boucle
if(off track)détecte si l'enfant s'est écarté du chemin assigné. L'appareil possède un système qui détecte le nombre de fois que cela se produit ; si votre enfant s'écarte la première fois, l'appareil l'avertira en allumant la LED en rouge et en vibrant le moteur, puis l'enfant aura deux minutes pour revenir sur le bon chemin. Si l'enfant reste hors parcours pendant deux minutes supplémentaires, le parent recevra un e-mail l'avertissant que son enfant est hors parcours avec sa géolocalisation. L'e-mail sera envoyé à intervalles de 2 minutes jusqu'à ce que l'enfant arrive à la maison ou à l'école. - Les boucles
if(school time)etif(home time)détectent si c'est l'heure de l'école ou de la maison. Ensuite, l'appareil vérifie si l'enfant est arrivé à l'école ou à la maison. S'il est arrivé à temps, la LED devient verte et l'appareil envoie un e-mail au parent l'informant que son enfant est arrivé à destination avec l'heure d'arrivée. Sinon, si c'est l'heure de commencer l'école et que l'enfant n'est pas à l'école, il enverra aussi une alerte.
L'appareil ne peut envoyer que 12 octets d'information, donc un paquet compact est nécessaire lors de l'envoi. D'autres variables seront configurées dans le backend SigFox.



Il y a quatre paquets que l'appareil peut envoyer :
- Enfant hors parcours – (« off course »)
- Enfant arrivé à la maison – (« at home »)
- Enfant arrivé à l'école – (« at school »)
- Enfant en retard – (« late »)
Système d'avertissement
L'enfant portant l'appareil sera alerté chaque fois qu'il arrive à l'école, arrive à la maison, est en retard à une destination, ou s'est écarté du parcours.



L'appareil en action



Avantages
Les parents utilisant cet appareil bénéficieront de :
- S'assurer que leur enfant arrive sain et sauf à l'école et en revient
- S'assurer que leur enfant arrive ponctuellement à ces endroits
- S'assurer que leur enfant ne s'écarte pas du parcours
- Économie d'énergie et faible coût – Batteries longue durée
Construction du projet
Étape 1 : Appareillage requis
Pour commencer le projet, nous devons rassembler notre matériel. Pour ce projet, vous aurez besoin :
- Fils de connexion
- 1 transistor NPN
- 1 condensateur céramique (0,1 µF)
- 3 résistances (220 Ω)
- 1 résistance (1 kΩ)
- 1 LED RVB
- 1 module GPS
- 1 moteur vibrant
- 1 Arduino MKR Fox 1200
- 1 boîtier 2 piles AA/AAA
- 2 piles AA

Étape 2 : Connexion du circuit
L'étape suivante consiste à connecter le circuit ; les images Fritzing ci-dessous illustreront comment cela est fait. Il y a plusieurs parties au câblage, elles sont donc divisées en différentes images.

Étape 3 : Comprendre le code
Le code se compose de plusieurs fonctions, chacune remplissant un rôle spécifique dans la composition du projet :
- Système d'avertissement (Warn System)
- Obtenir GPS (Get GPS)
- Synchroniser RTC (Synch RTC)
- Traiter la position (Process Location)
- Envoyer le paquet (Send Package)
- Exécuter les actions (Do Actions)
Ces sections sont expliquées ci-dessous.
Système d'avertissement
void setOutputs() {
pinMode(R, OUTPUT);
pinMode(G, OUTPUT);
pinMode(B, OUTPUT);
pinMode(motorPin, OUTPUT);
}
void vibrateMotor() { // vibrer le moteur
digitalWrite(motorPin, HIGH);
delay(1000);
digitalWrite(motorPin, LOW);
}
void ledGreen() { // LED verte
analogWrite(R, 0);
analogWrite(G, 255);
analogWrite(B, 0);
}
void ledOrange() { // LED orange
analogWrite(R, 255);
analogWrite(G, 45);
analogWrite(B, 0);
}
void ledRed() { // LED rouge
analogWrite(R, 255);
analogWrite(G, 0);
analogWrite(B, 0);
}
void resetLED() { // Éteindre LED
analogWrite(R, 0);
analogWrite(G, 0);
analogWrite(B, 0);
}
Cette section du code se trouve dans le fichier functions.h. Le code notifiera l'enfant portant l'appareil sur l'état actuel. Globalement, ces boucles contrôlent la LED RVB et le moteur vibrant.
Obtenir GPS
bool getGPS(int run) {
while (Serial1.available() > 0) {
if (gps.encode(Serial1.read())) {
if (run == 1) {
processData();
} else if (run == 2) {
synchRTC();
}
if (gps.location.isValid() && gps.time.isValid() && gps.date.isValid()) {
return true;
} else {
return false;
}
}
}
if (millis() > 10000 && gps.charsProcessed() < 10) {
Serial.println("Erreur - Module GPS a répondu avec une erreur");
Serial.println(" Arrêt du code");
Serial.println("________________________________________");
while (1) {};
}
}
Cette boucle est chargée de recevoir la position et l'heure du module GPS. Elle fait 3 choses : elle est utilisée dans la boucle setup pour synchroniser le GPS, puis pour synchroniser l'horloge temps réel (RTC) intégrée avec celle du GPS, et elle est utilisée dans la boucle principale pour obtenir la géolocalisation de l'appareil.
Synchroniser RTC
void synchRTC() {
Serial.println("Synchronisation RTC");
Serial.println("________________________________________");
Serial.println(" OK - Initialisation RTC");
rtc.begin();
Serial.println(" OK - Synchronisation de l'heure");
// Il faut rogner les 2 premiers chiffres de la variable (2018 -> 18)
uint16_t yearRAW = gps.date.year();
String yearString = String(yearRAW);
yearString.remove(0, 1);
uint16_t year = yearString.toInt();
rtc.setTime(gps.time.hour(), gps.time.minute(), gps.time.second());
rtc.setDate(gps.date.day(), gps.date.month(), year);
Serial.println(" Succès - RTC synchronisé");
Serial.println("________________________________________");
Serial.println("");
Serial.println("");
Serial.println("");
}
Cette section de code synchronise l'horloge temps réel (RTC) intégrée avec l'heure reçue du module GPS. Elle lit d'abord les données du module GPS puis les traite. La boucle définit ensuite l'heure actuelle du RTC intégré sur l'heure reçue et démarre le RTC.
Traiter la position
bool processData() {
if (gps.location.isValid()) {
latitude = gps.location.lat();
longitude = gps.location.lng();
latitude = 53.355504;
longitude = -6.258452;
if (check.isOut()) {
if (check.track()) {
Serial.println("HORS LIMITES");
warn.offTrackLoop();
}
}
if (check.isHomeTime() && arrivedSchool) {
if (check.isHome()) {
Serial.println("À LA MAISON");
warn.arrivedHomeLoop();
} else {
Serial.println("EN RETARD -> MAISON");
warn.lateLoop();
}
} else if (check.isSchoolTime() && arrivedHome) {
Serial.println(".");
if (check.isSchool()) {
Serial.println("À L'ÉCOLE");
warn.arrivedSchoolLoop();
} else {
Serial.println("EN RETARD -> ÉCOLE");
warn.lateLoop();
}
} else {
Serial.println("EN ROUTE");
}
}
}
Cette boucle traitera la position de l'appareil et la comparera à l'heure actuelle pour voir où l'enfant devrait être à ce moment. Elle effectuera ensuite l'action appropriée en fonction du résultat.
Exécuter les actions
struct Do {
void offTrackLoop() {
if (offTrackVar) {
parseData(0);
}
vibrateMotor();
ledRed();
delay(1000);
vibrateMotor();
resetLED();
offTrackVar = true;
delay(120000);
}
void lateLoop() {
if (!lateVar) {
parseData(1);
}
vibrateMotor();
ledOrange();
delay(1000);
resetLED();
lateVar = true;
}
void arrivedHomeLoop() {
lateVar = false;
offTrackVar = false;
vibrateMotor();
ledGreen();
delay(1000);
resetLED();
parseData(2);
arrivedHome = true;
arrivedSchool = false;
}
void arrivedSchoolLoop() {
lateVar = false;
offTrackVar = false;
vibrateMotor();
ledGreen();
delay(1000);
resetLED();
parseData(3);
arrivedHome = false;
arrivedSchool = true;
}
};
Cette structure est appelée pour agir sur la réponse donnée par Traiter la position. Elle avertira l'enfant en basculant la LED RVB et le moteur vibrant. Elle enverra également un paquet à SigFox si nécessaire.
Envoyer le paquet
void parseData(int state) {
SigFox.beginPacket(); // commencer le processus d'envoi du message
if (state == 0) // hors parcours
SigFox.print("off track");
else if (state == 1) // en retard
SigFox.print("late");
else if (state == 2) // arrivé à la maison
SigFox.print("at home");
else // arrivé à l'école
SigFox.print("at school");
SigFox.endPacket();
}
Cette fonction envoie les données à SigFox. L'envoi du paquet commence, puis la valeur appropriée est analysée.
Configuration des variables
Le code contiendra plusieurs variables avec « TODO » écrit en commentaire après elles. Ces variables doivent être personnalisées pour s'adapter au client. Le client sera invité à configurer :
- Heure de l'école
- Temps de trajet de l'enfant
- Heure de fin de l'école
- Mode débogage ?
- Géolocalisation de l'école (LAT, LNG)
- Géolocalisation de la maison (LAT, LNG)
Le guide ci-dessous vous guide à travers la configuration des variables.











Bibliothèques
- SigFox – copyright (c) 2016 Arduino LLC GNU Lesser General Public Licence – domaine public
- ctype – copyright (c) 2006 Free Software Foundation sous GNU General Public Licence – domaine public
- RTCZero – copyright (c) 2015 Arduino LLC sous GNU Lesser General Public Licence – domaine public
- String – copyright (c) 2009-10 Hernando Barragan, copyright (c) 2011 Paul Stoffregen sous GNU Lesser General Public Licence – domaine public
- TinyGPS++ – copyright (c) 2008-13 Mikal Hart sous GNU Lesser General Public Licence – domaine public
Configuration
Assurez-vous que le circuit est correctement câblé. Pour les détails sur la configuration de votre MKR Fox, cliquez ici pour le tutoriel Arduino. Si vous souhaitez en savoir plus sur la bibliothèque Arduino SigFox, cliquez ici.
Programme Backend
Vous devez avoir un Arduino MKR Fox 1200 enregistré pour programmer le backend.
- Ouvrez le backend SigFox et connectez-vous à votre compte.
- Cliquez sur « Device Type » dans le menu déroulant en haut de la page.
- Sélectionnez votre Arduino MKR Fox et cliquez sur modifier.
- Sélectionnez « callbacks » dans le menu de gauche et naviguez vers le bouton « new » en haut à droite.
- Après avoir cliqué sur new, vous serez présenté avec plusieurs options de configuration de callback. Cliquez sur « Custom Callbacks ».
- Une fenêtre s'ouvrira. Vous devez remplir le formulaire donné pour créer votre callback. À la fin, votre message devrait ressembler à ceci.
- Cliquez sur OK et c'est tout configuré.
Finalisation
La dernière chose à faire est de téléverser le code ci-dessous. Assurez-vous d'avoir personnalisé les variables marquées « TODO » selon vos préférences. Attendez que la lumière bleue du module GPS clignote, puis déconnectez le microcontrôleur de votre ordinateur et placez les piles dans le boîtier. Vous êtes prêt.
J'ai conçu un boîtier pour protéger l'appareil et le rendre attrayant. J'ai utilisé deux pièces d'acrylique et fondu les bords en les courbant à 90 degrés. J'ai placé tout le circuit à l'intérieur et le boîtier de piles en dessous, puis j'ai attaché les deux pièces de plastique ensemble avec deux colliers de serrage.


À la fin, j'ai couvert une partie du dessus (couverture transparente) pour cacher tous les fils de la vue et ne laisser visible que le cerveau du projet.
Contexte
Je sais personnellement à quel point il peut être stressant d'accomplir la simple tâche d'envoyer votre enfant à l'école. Tout le monde s'inquiète de toutes les choses qui peuvent arriver à son enfant pendant qu'il fait son chemin vers l'école.
Ce projet s'adresse à toutes les personnes qui se sentent stressées quand elles envoient leur enfant à l'école. SmartWay vous permettra de vous détendre, sachant que votre enfant arrivera sain et sauf à l'école.

Code
SmartWay
Le code complet
Pièces personnalisées et boîtiers
Non inclus dans Fritzing par défaut
arduino_mkr_fox_1200_fixed_gwlzp1tuih_uh8ucYEGxI.fzpz
Schémas

overall_WZeRYkIUCF.fzz
Processus de fabrication
- Comprendre les moteurs à collecteur à courant alternatif : conception, types et applications
- Raspoulette : Prototype de système autonome de porte de poulailler à énergie solaire
- Simple Pi Robot – Construire un rover autonome 2 roues motrices avec Raspberry Pi
- Guide Étape par Étape pour l'Inspection et le Diagnostic des Problèmes de Moteurs CC
- Comprendre les moteurs linéaires : de l'énergie électrique au mouvement linéaire précis
- Comprendre les moteurs BLDC : guide professionnel
- Réducteurs de motoréducteurs expliqués : fonctionnement et importance
- Servomoteurs expliqués : fonctionnement et importance
- Comprendre les réducteurs de servomoteurs : fonctions, avantages et applications