SmartWay: Complete kit voor trilmotor, RGB LED, GPS-module & Arduino MKR Fox 1200 projecten
Onderdelen en benodigdheden
| Draadbruggen (standaard) | 1 |
| Algemene NPN-transistor | 1 |
| Keramische condensator 0,1µF | 1 |
| Weerstand 1k ohm | 1 |
| Weerstand 221 ohm | 1 |
| RGB Diffused Common Cathode | 1 |
| GPS-module GY-NEO6MV2 | 1 |
| Trilmotorcel | 1 |
| UDOO 2AA-batterijhouder voor RTC | 1 |
| Arduino MKR Fox 1200 | 1 |
Nodige gereedschappen en machines
- Soldeerbout (standaard)
Apps en online diensten
- Arduino Web Editor
- Sigfox
Over dit project
Overzicht
Ouders maken zich altijd zorgen om hun kinderen. Ze willen dat hun kinderen op tijd op school komen en thuis zijn, via de afgesproken route.
SmartWay neemt deze zorgen weg. SmartWay monitort je kind op de weg naar en van school, zodat het altijd de juiste route volgt om veilig aan te komen.
SmartWay gebruikt GPS om de locatie te volgen en stuurt direct een e-mail als het kind afwijkt van de toegewezen route. Ook wordt een e-mail gestuurd wanneer het kind thuis of op school aankomt, of als het te laat is. Zo kunnen ouders rustig hun koffie drinken wetende dat hun kind veilig aankomt.

Functionaliteit
SmartWay monitort continu de geolocatie van je kind vanaf het opstaan tot de aankomst thuis. Het apparaat heeft een RGB LED en een trilmotor om het kind te waarschuwen als het de verkeerde weg opgaat of te laat is, en om te feliciteren bij aankomst op school.


- De eerste lus
if(off track)detecteert of het kind afwijkt van de route. Het systeem telt hoe vaak dit voorkomt. Bij de eerste afwijking waarschuwt het apparaat met rode LED en trilling, en het kind krijgt twee minuten om terug te keren. Blijft het kind afwijken, dan ontvangt de ouder elke twee minuten een e-mail met waarschuwing en geolocatie totdat het kind thuis of op school is. if(school time)enif(home time)controleren of het tijd is voor school of thuis, en of het kind aangekomen is. Bij tijdige aankomst wordt de LED groen en ontvangt de ouder een e-mail met aankomsttijd. Is het kind te laat, dan...
Het apparaat kan maximaal 12 bytes sturen, dus een compact pakket is nodig. Overige variabelen worden in de SigFox-backend geconfigureerd.



Er zijn vier pakketten die het apparaat kan sturen:
- Kind is afgedwaald - ("off course")
- Kind is thuis aangekomen - ("at home")
- Kind is op school aangekomen - ("at school")
- Kind is te laat - ("late")
Waarschuwingsysteem
Het kind wordt gewaarschuwd bij aankomst op school, thuis, te laat zijn, of afwijken van de route.



Het apparaat in actie



Voordelen
Ouders die dit apparaat gebruiken, profiteren van:
- Zekerheid dat hun kind veilig op school en thuis aankomt
- Zekerheid dat hun kind op tijd aankomt
- Zekerheid dat hun kind niet van de route afwijkt
- Energiebesparend en laag in kosten - langdurige batterijen
Het project bouwen
Stap 1: Benodigde apparatuur
Om te beginnen, verzamel de materialen:
- Draadbruggen
- 1 NPN-transistor
- 1 keramische condensator (0,1µF)
- 3 weerstanden (220Ω)
- 1 weerstand (1KΩ)
- 1 RGB LED
- 1 GPS-module
- 1 Trilmotorcel
- 1 Arduino MKR1200 Fox
- 1 2x AAA/AA batterijhouder
- 2 AA-batterijen

Stap 2: Het circuit aansluiten
De Fritzing-afbeeldingen hieronder laten zien hoe het circuit aangesloten wordt. Er zijn meerdere delen, dus ze zijn gesplitst in verschillende afbeeldingen.

Stap 3: De code begrijpen
De code bestaat uit meerdere functies, elk met een specifieke rol:
- Waarschuwingsysteem
- GPS ophalen
- RTC synchroniseren
- Locatie verwerken
- Pakket sturen
- Acties uitvoeren
Deze secties worden hieronder uitgelegd.
Waarschuwingsysteem
void setOutputs() {
pinMode(R, OUTPUT); pinMode(G, OUTPUT); pinMode(B, OUTPUT); pinMode(motorPin, OUTPUT);
}
void vibrateMotor() { digitalWrite(motorPin, HIGH); delay(1000); digitalWrite(motorPin, LOW); }
void ledGreen() { analogWrite(R, 0); analogWrite(G, 255); analogWrite(B, 0); }
void ledOrange() { analogWrite(R, 255); analogWrite(G, 45); analogWrite(B, 0); }
void ledRed() { analogWrite(R, 255); analogWrite(G, 0); analogWrite(B, 0); }
void resetLED() { analogWrite(R, 0); analogWrite(G, 0); analogWrite(B, 0); }
Deze code zit in functions.h. Het waarschuwt het kind via de RGB LED en trilmotor.
GPS ophalen
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("Error - GPS Module Responded with Error");
Serial.println(" Terminating Code");
Serial.println("________________________________________");
while(1) {};
}
}
Deze lus ontvangt locatie en tijd van de GPS-module. Wordt gebruikt in setup om GPS te synchroniseren, de onboard RTC te synchroniseren, en in de hoofdlus voor geolocatie.
RTC synchroniseren
void synchRTC() {
Serial.println("Synching RTC");
Serial.println("________________________________________");
Serial.println(" OK - Initialising RTC");
rtc.begin();
Serial.println(" OK - Synching Time");
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(" Success - RTC Synched");
Serial.println("________________________________________");
Serial.println(""); Serial.println(""); Serial.println("");
}
Deze code synchroniseert de onboard RTC met de GPS-tijd.
Locatie verwerken
bool processData() {
if(gps.location.isValid()) {
latitude = gps.location.lat();
longitude = gps.location.lng();
latitude = 53.355504; longitude = -6.258452; // voorbeeldcoördinaten
if(check.isOut()) {
if(check.track()) {
Serial.println("OUT OF BOUNDS");
warn.offTrackLoop();
}
}
if(check.isHomeTime() && arrivedSchool) {
if(check.isHome()) {
Serial.println("AT HOME");
warn.arrivedHomeLoop();
} else {
Serial.println("LATE -> HOME");
warn.lateLoop();
}
} else if(check.isSchoolTime() && arrivedHome) {
Serial.println(".");
if(check.isSchool()) {
Serial.println("AT SCHOOL");
warn.arrivedSchoolLoop();
} else {
Serial.println("LATE -> SCHOOL");
warn.lateLoop();
}
} else {
Serial.println("ON WAY");
}
}
}
Deze lus verwerkt de locatie en vergelijkt met de tijd om te bepalen wat te doen.
Acties uitvoeren
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;
}
};
Deze struct voert acties uit op basis van Locatie verwerken, waarschuwt het kind en stuurt een pakket naar SigFox indien nodig.
Pakket sturen
void parseData(int state) {
SigFox.beginPacket();
if(state == 0) { SigFox.print("off track"); }
else if(state == 1) { SigFox.print("late"); }
else if(state == 2) { SigFox.print("at home"); }
else { SigFox.print("at school"); }
SigFox.endPacket();
}
Deze functie stuurt data naar SigFox.
Variabelen instellen
De code bevat variabelen met "TODO" als commentaar; deze moeten aangepast worden aan de gebruiker:
- Schooltijd
- Reistijd van het kind
- Eindtijd school
- Debuggen?
- School geolocatie (LAT, LNG)
- Thuis geolocatie (LAT, LNG)
De onderstaande afbeeldingen begeleiden je bij het instellen.











Bibliotheken
- SigFox - copyright (c) 2016 Arduino LLC GNU LGPL
- ctype - copyright (c) 2006 Free Software Foundation GPL
- RTCZero - copyright (c) 2015 Arduino LLC LGPL
- String - copyright (c) 2009-10 Hernando Barragan, (c) 2011 Paul Stoffrengen LGPL
- TinyGPS++ - copyright (c) 2008-13 Mikal Hart LGPL
Opzetten
Zorg dat het circuit correct is aangesloten. Voor details over het opzetten van je MKR Fox, zie de Arduino-tutorial. Voor meer over de Arduino SigFox-bibliotheek, klik hier.
Backend-programma
Je moet een geregistreerde Arduino MKR1200 Fox hebben voor de backend.
- Open de SigFox-backend en log in.
- Klik op "Device Type" in het dropdownmenu bovenaan.
- Selecteer je Arduino MKR Fox en klik op bewerken.
- Selecteer "callbacks" in het linkermenu en navigeer naar de "new"-knop rechtsboven.
- Klik op "Custom Callbacks".
- Vul het formulier in om je callback te maken. Je bericht moet er zo uitzien:

Klik op OK en je bent klaar.
Eind
Upload de code hieronder, pas de "TODO"-variabelen aan, wacht tot het blauwe lichtje op de GPS-module knippert, haal de microcontroller van de computer en plaats batterijen in de houder. Klaar!
Ik ontwierp een behuizing met twee acrylaatplaten, randen gesmolten en gebogen op 90 graden. Het circuit zat erin, de batterijhouder eronder, en twee kabelbinders hielden het samen.


Ten slotte bedekte ik een deel van de bovenkant (transparante deksel) om alle draden te verbergen en alleen de "hersenen" van het project zichtbaar te maken.
Achtergrond
Ik weet zelf hoe stressvol het kan zijn om je kind naar school te sturen; iedereen maakt zich zorgen over wat er kan gebeuren op de weg.
Dit project is voor alle ouders die stress ervaren. SmartWay laat je ontspannen, wetend dat je kind veilig aankomt.

Code
SmartWay
De complete code
Aangepaste onderdelen en behuizingen
Niet standaard in Fritzing inbegrepen arduino_mkr_fox_1200_fixed_gwlzp1tuih_uh8ucYEGxI.fzpz
Schema's

overall_WZeRYkIUCF.fzz
Productieproces
- Raspoulette: Zonnestroom-gevoede Autonome Koeienpoort Systeem Prototype
- Simple Pi Robot – Bouw een 2-WD Autonome Rover met Raspberry Pi
- Lineaire motoren begrijpen: Van elektrische energie naar nauwkeurige lineaire beweging
- BLDC-motoren begrepen: professionele gids
- Tandwielmotorverteren Uitgelegd: Hoe Ze Werken en Waarom Ze Essentieel Zijn
- Servomotoren Uitgelegd: Hoe Ze Werken en Waarom Ze Belangrijk Zijn
- Servomotor vertragers begrijpen: Functies, voordelen en toepassingen
- Startmotor van de motor: werking en waarom het essentieel is
- Optimalisatie van bewegingsregeling met Parker K-reeks frameless servomotoren
- AC-commutatormotoren begrijpen: ontwerp, typen en toepassingen
- Stap-voor-Stap Gids voor Het Inspecteren en Diagnosticeren van DC-Motorproblemen