„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.
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
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 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
- altes RC Auto von 40Mhz auf 2.4 Ghz umstellen
- Federgabel vom Fahrrad austauschen
- Xiaomi Mi 11 lite Power Button selber reparieren austauschen
- Hochbeet und Hängegarten für den Balkon bauen
- LED an Wechselstrom flackerfrei betreiben
- Fujitsu Lifebook – E734 Austausch der internen SSD
- Sphero Mini – how to replace defective battery
- Sphero Mini – defekte Batterie austauschen
- riesen Schneemann aus Bechern basteln Anleitung
- Anleitung Kuscheltiergefängnis bauen
- Pokale selber bauen