GPS-Tracker von Außen„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-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

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.

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

„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.

Bauteil Preis Stk. Bemerkung
ARDUINO Nano V3 ab 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 Controller ca. 11€  1 Am 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 Shield ca. 2,50€  1
SanDisk Ultra Android microSDHC 16GB bis zu 80 MB/Sek Class 10 Speicherkarte + SD-Adapter ca. 8€  1
sonstiges
Batterie-Halter Tasche  ca. 2,50€  1
CP2102 Modul mit DTR Pin STC / USB zu TTL  ca. 6€  1 Praktisch zum Testen und Konfigurieren des GPS-Empfängers.
Aufputzdose ca. 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 kOhm ca. 3€ 21 für Ansteuerung  GPS-Empfänger  und Button.Gibt es meistens im Set mit vielen weiteren unterschiedlichen Wiederständen.
Patchkabel ca. 1m ca. 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.
Gesamt ca. 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ß) Kabelfarbe Peripherie (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
D2 braun/weiß data
orange/weiß VCC von Platine
braun GND von Platine

Fotos

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. GPS-Tracker von Außen GPS-Tracker Innenleben GPS-Tracker Innenleben GPS-Tracker von Außen GPS-Tracker Platine GPS-Tracker Platine  

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 😉


#include <TinyGPS++.h>
#include

#include
#include

#include
#include

#include

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);
}
GPS Speedometer/Tracker mit Arduino Nano
Tagged on: