GPS Speedometer/Tracker mit Arduino Nano

gps tracker arduino nano u blox neo 6m 2111

„Selbst ist der Mann“ oder „Do it yourself (DIY)“! Heißt es wenn man das Rad neu erfinden möchte um nicht auf aktuelle oder teure Produkte zurückgreifen möchte. Neben der nominellen Kostenersparnis kann man bei DIY Projekten wunderbar sein Wissen erweitern, auch wenn dabei sehr viel Geduld und Zeit gefragt ist. Gerade am Anfang. Doch sind erst einmal die anfänglichen Hürden gefallen, sämtliche Probleme behoben entsteht meist etwas Einzigartiges auf das man stolz sein kann.

In meinem aktuellen Fall benötigte ich einen GPS-Speedometer/Tracker für die 470er Jolle um auch unterwegs die Geschwindigkeit ermitteln zu können bzw. um zu sehen wie sich verschiedene Segel- und Bootstrimmungen auf die Geschwindigkeit auswirken. Zudem wollte ich im Nachhinein die gesegelte Strecke auslesen und auswerten könne. Ja klar gibt es sowas auch als App für das smartphone, doch wer möchte sein smartphone schon dem Risiko des Wasserkontaktes oder der Kenterung aussetzen? (trotz Schutzhülle)
… und 100€ oder mehr für GPS-Tracker von Garmin und Co. auszugeben ist es mir einfach nicht wert.

Unter dem folgende Link findet ihr ein Video zu dem GPS-Tracker (Youtube)

SOLL Zustand – Was soll das GPS Speedometer/Tracker können?

Energieversorgung: Auf einer Jolle hat meistens nicht den Luxus einer Stromversorgerung, weshalb der GPS-Tracker unbedingt und möglichst mehrere Stunden auf Batterie laufen muss. Zwei Sachen sind dabei von Bedeutung: Zum Einen muss der Computer möglichst wenig Strom benötigen und zum Anderen brauchen wir eine Energiequelle, die möglichst lange Energie bietet. Dabei hatte ich die Wahl zwischen USB-Powerbank, konservativen R6 Batterien(/-Akkus) oder der alt bewährten 9V Blockbatterie die wir alle aus unserer LEGO-Zeit kennen.

Bauweise: Auf der Jolle ist nicht viel Platz und außerdem sieht ein klobiger Kasten am Mast auch nicht sonderlich schön aus. Somit muss der GPS-Tracker möglichst kompakt daherkommen und zudem wenigstens geschützt vor Spritzwasser oder sogar Wasserdicht sein.

GPS-Tracking: Der Arduino Nano glänzt nun nicht mit viel Speicherplatz. Der Speicher reicht gerade mal für ein paar Zeilen Code aus. Somit muss ein externes Speichermedium wie zum Beispiel eine SD-Karte her.

Welche Plattform? RASPERRY PI oder ARDUINO

Ursprünglich wollte ich das Projekt basierend auf meinen bisherigen Erfahrungen mit einem Rasperry Pi umsetzen. Doch aufgrund der Stromverbrauches und der „zu großen“ Bauform, bin ich nach einigen Recherchen beim fast kleinsten Arduino, dem Arduino Nano gelandet. Im Vergleich zum Rasperry PI kommt der Arduino nur mit einem Bootloader und ein paar Zeilen C Code aus, was ihn auch Softwareseitig schlanker scheinen lässt. Nach der Umsetzung und den anfänglichen Startschwierigkeiten mit C etc. kann ich euch die Umsetzung solcher DIY Projekte mit dem ARDUINO empfehlen. Werden die Projekte umfangreicher zum Beispiel, mit WLAN, Netzwerkdiensten  (Webserver, Datenbank, FTP,…), solltet ihr der Einfachheit halber auf RASPERRY PI und Co zurückgreifen, da die dafür einfach besser geeignet sind.

Zusammenfassung

  • möglichst kompakte Bauform
    – geschützt vor Spritzwasser
  • Batterie betrieben
  • Display zum Ablesen der Geschwindigkeit in Knoten
  • Uhrzeit
  • möglichst günstig und einfach reproduzierbar

Umsetzung

Teileliste vom GPS Speedometer/Tracker

„Im Einkauf wird der Gewinn gemacht“ – Ein originaler ARDUINO NANO bzw. GENUINO Macro kostet in den offiziellen Shop über 20€. Wem die allerdings die Marke egal ist kann über Amazon ARDUINO/GENUINO Geräte sehr günstig für unter 10€ aus China ordern. Einziger Nachteil ist lediglich die Lieferzeit von meistens 2-4 Wochen. Das Gleiche gilt auch bei den anderen Elektronikbauteilen wie Transistoren, Widerständen oder Bauteilen wie Display, I2C-Converter und SC-Card-Reaser/Writer. Rechtzeitiges bestellen lohnt sich 😉

Ich setze einfach mal voraus das ihr bereits ein Steckbrettchen und die dafür benötigen Kabel habt. Denn bevor alles fest verlötet wird, sollte man die Schaltung immer erst auf dem Steckbrett testen. Für die feste Verkabelung habe ich mich letztendlich für die im Patchkabel enthaltenen Adern entschieden. Erstens hatte ich noch eines hier herumliegen und zweitens enthält ein Patchkabel 8 unterschiedlich gekennzeichnete Adern womit sich die Kabel wunderbar identifizieren lassen.

BauteilPreisStk.Bemerkung
ARDUINO Nano V3ab 3 €1 
Display
 HD44780 1602 LCD Module Display Anzeigen 2X16 Zeichen ca. 2,50€ 1 
 IIC / I2C / Schnittstellen LCD1602 2004 LCD-Adapterplatte ca. 1,85€ 1 Der Betrieb des Displays über I2C spart jede Menge Kabelei ein. Es werden nur 4 Kabel benötigt!
GPS
Ublox NEO 6M GPS/Gy-GPS6MV2 Modul Aircraft Flight Controllerca. 11€ 1Am besten zwei bestellen falls einer defekt ist. Garantieabwicklung mit Chinesischen Lieferanten ist wenig Erfolg versprechend.
SD-Card
SPI Reader Micro Speicher SD TF Karte Memory Card Shieldca. 2,50€ 1 
SanDisk Ultra Android microSDHC 16GB bis zu 80 MB/Sek Class 10 Speicherkarte + SD-Adapterca. 8€ 1 
sonstiges
Batterie-Halter Tasche ca. 2,50€ 1 
CP2102 Modul mit DTR Pin STC / USB zu TTL ca. 6€ 1Praktisch zum Testen und Konfigurieren des GPS-Empfängers.
Aufputzdoseca. 1,50€ gibt es in jedem Baumarkt
Elektronik Kleinkram   
5 Leiterplatten Platinen PCB Board Lochrasterplatine (Set) ca. 2,50€  
Resistors Switch Button ca. 2,50€  
Snap 9V Batterie Clip Anschluss I-Typ mit Kabel (10er Pack) ca. 2,00€  
AC 125V 6A Amps ON / ON 2 ca. 4,00€  
Widerstand 10 kOhmWiderstand 4,7 kOhmca. 3€21für Ansteuerung  GPS-Empfänger  und Button.Gibt es meistens im Set mit vielen weiteren unterschiedlichen Wiederständen.
Patchkabel ca. 1mca. 5€ Die Adern werden für die Verkabelung des Arduinos mit seinen Komponenten verwendet. Patchkabel eignen sich ganz dafür, da 8 verschiedenfarben Kabel Adern enthalten sind und sich dadurch eindeutige Kabelbäume bauen lassen.
Gesamtca. 58€ Die ganzen Teile kleckern sich schnell zusammen. Ich hätte nicht gedacht das sich die hohe Summer ergibt. Naja…Hobby, macht Spaß, was soll’s 😉

Ist der Kram endlich vollständig, kann der Zusammenbau beginnen. Normalerweise als erstes auf dem Steckbrettchen, um daraus einen Schaltplan entwickeln zu können und den Aufbau zu testen. Funktioniert alles wie gewünscht, kann der Festaufbau beginnen.

Schaltplan

Dieser Plan basiert auf der Testverkabelung auf dem Steckbrett. Für die endgültiger Verkabelung habe ich ein anderes Farbschema verwendet. siehe Belegungsplan

GPS-Tracker mit Arduino Nano, u-Blox NEO-6m Schaltplan

Belegungsplan

Arduino Nano (Anschluß)KabelfarbePeripherie (Anschluß)Bemerkung
 GND braun Platine 
 3.3V orange 3.3V 
 5V orange/weiß 5V 
 GPS u-Blox Neo 6M   
 D3 grün RX 
 D4 grün/weiß TX 
  orange/weiß VCC von Platine
  braun GND von Platine
 Display mit I2C-Adapter   
 A4 blau SDA 
 A5 blau/weiß SCL 
  orange/weiß VCC von Platine
  braun GND von Platine
 SC-Card Reader   
 D5 rot CS 
 D13 blau/weiß SCK 
 D11 blau MOSI 
 D12 weiß MISO 
  orange/weiß VCC von Platine
  braun GND von Platine
 Button   
D2braun/weißdata 
 orange/weißVCCvon Platine
 braunGNDvon Platine
    

Fotos vom GPS-Speedometer/Tracker

Mit der Heißklebepistole habe ich versucht sämtliche Öffnungen abzudichten, sodass nicht so schnell Wasser eindringen kann. Beim Test des vorherigen Prototypens war dummerweise das Boot gekentert und des reichten kleinste Mengen Seewasser (10ml) aus um die Elektronik ganz schnell rosten zu lassen. Dank Isopropanol, welches ich aus der nächsten Apotheke für knapp 10€ erstanden habe, konnte ich die Kontakte und Elektronik noch retten.

Arduino Code

Lasst mich kurz zu dem Code anmerken dass ich C zuletzt in der Ausbildung um 2001 programmiert habe. Es geht sicherlich noch schöner und noch besser 😉 und ich hoffe dass der Code durch die Umstellung valide geblieben ist. Die Code-Darstellung in WordPress ist zudem doch etwas rudimentär…

#include <TinyGPS++.h> 

const int buttonPin = 2; 
const int debugmode=1; //set debugmode 1= output to serial 

// Variables will change: 
int buttonPushCounter = 0; 
int buttonState = 0; 
int lastButtonState = 0; 
int display_page=0; 
int display_maxpages=3; 
int loopcounter=0; 
int modresult=0; 
File myFile; 
int gps_rx_pin = 4, gps_tx_pin = 3; 
String dataString; 
char gps_time[8]; 
int gps_hour; 
TinyGPSPlus gps; 

SoftwareSerial ss(gps_rx_pin, gps_tx_pin);// The serial connection to the GPS device 

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address 

void setup() { 
ss.begin(9600); 
Serial.begin(9600); 
pinMode(buttonPin, INPUT); 
lcd.begin(16,2); 
lcd.backlight(); 
//lcd.clear(); 
pinMode(5, OUTPUT); 
SD.begin(5); 
myFile = SD.open("gpstrack.txt", FILE_WRITE); 
myFile.println("#"); 
myFile.println("#date;time;lat;lng;kmph;knots;course;course_deg;satellites"); 
myFile.close(); 
} 

void loop() { 
// output to serial 
if(debugmode==1){ 
Serial.print(" time="); 
Serial.print(gps.time.value()); 
Serial.print(" lat=");
printFloat(gps.location.lat(), gps.location.isValid(), 11, 6); 
Serial.print(" lng=");
printFloat(gps.location.lng(), gps.location.isValid(), 11, 6);
Serial.println();
} 

buttonState = digitalRead(buttonPin);

// read the pushbutton input pin: 
if (buttonState != lastButtonState) { 
if (buttonState == HIGH) { 
lcd.clear(); 
if(display_page<display_maxpages){ 
buttonPushCounter++; 
display_page++; 
}else{ 
display_page=0; 
}
}
}

switch (display_page){ 
case 1: // page 1 gps speed 
//lcd.clear(); 
lcd.setCursor(0,0);
lcd.print("knots: ");
lcd.setCursor(8,0);
lcd.print(gps.speed.knots());
lcd.setCursor(0,1);
lcd.print("km/h: "); 
lcd.setCursor(8,1);
lcd.print(gps.speed.kmph());
break;
 
case 2: // page 2 gps time 
gps_hour=(2+gps.time.hour()); //summertime 
sprintf(gps_time, "%02d:%02d:%02d ", gps_hour, gps.time.minute(), gps.time.second()); 
//lcd.clear(); 
lcd.setCursor(0,0); 
lcd.print("time:"); 
lcd.setCursor(5,0); 
lcd.print(gps_time);
break; 

case 3: // page 4 position 
//lcd.clear(); 
lcd.setCursor(0,0); 
lcd.print("lat: "); 
lcd.setCursor(4,0); 
lcd.print(gps.location.lat()); 
lcd.setCursor(0,1); 
lcd.print("lng: "); 
lcd.setCursor(4,1); 
lcd.print(gps.location.lng());
break; 

default: 
lcd.setCursor(0,0); 
lcd.print("satellites:");
lcd.setCursor(11,0);
lcd.print(gps.satellites.value());
if (gps.satellites.value() < 1){ 
lcd.setCursor(0,1); 
lcd.print("waiting for gps..."); 
}else{ 
lcd.setCursor(0,1); 
lcd.print("gps OK "); 
} 
break; 
} 

//sdcard 
modresult=loopcounter%10; 
if(modresult==0){ 
if(debugmode==1){ 
Serial.println("write to sdcard");
}

myFile = SD.open("gpstrack.txt", FILE_WRITE);
myFile.print(gps.date.value()); 
myFile.print(";"); 
myFile.print(gps.time.value()); 
myFile.print(";"); 
myFile.print(gps.location.lat()); 
myFile.print(";"); 
myFile.print(gps.location.lng()); 
myFile.print(";"); 
myFile.print(gps.speed.kmph()); 
myFile.print(";"); 
myFile.print(gps.speed.knots()); 
myFile.print(";"); 
myFile.print(gps.course.value()); 
myFile.print(";"); 
myFile.print(gps.course.deg()); 
myFile.print(";"); 
myFile.println(gps.satellites.value()); 
myFile.close();
}

lastButtonState = buttonState; 
loopcounter++; 
smartDelay(0); 
}
static void smartDelay(unsigned long ms) { 
unsigned long start = millis(); 

do { 
while (ss.available()) gps.encode(ss.read()); 
} 

while (millis() - start < ms);
} 

static void printFloat(float val, bool valid, int len, int prec) { 
if (!valid) { 
while (len-- > 1) Serial.print('*'); 
Serial.print(' '); 
} else { 
Serial.print(val, prec);
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1); // . and - flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1; 

for (int i=flen; i<len; ++i) Serial.print(' '); 
} 
smartDelay(0); 
}

weitere DIY Projekte ähnlich GPS Speedometer/Tracker mit Arduino Nano