Este año queremos apoyar al Conejo de Pascua para ocultar los huevos de Pascua, que se van a buscar. Para esto lo equipamos (y después a los buscadores) con un receptor GPS. Ocultar y leer la posición es muy fácil, porque los valores se presentan en nuestra pantalla y sólo se tienen que anotar. Pero para esto también tenemos que dar al Conejo de Pascua y a los buscadores un manejo básico de nuestra Tierra, así que, Conejo de Pascua: presta atención.
La próxima vez, la búsqueda nos mostrará los desafíos más grandes, porque primero debemos determinar la posición actual y luego calcular el curso y la distancia al destino. Esto requiere un grado de conocimiento de las matemáticas, pero en el cual podemos hacer algunas simplificaciones en Alemania o en Europa Central debido a distancias cortas.
En caso de que ya no necesitemos el receptor GPS para la búsqueda de los huevos de Pascua o para geocaching, construiremos un sistema de seguimiento en la tercera parte, ya que tenemos un módulo combinado GPS / GSM, con el que también podemos enviar la posición a través de SMS a un teléfono inteligente.
¿Qué necesitamos?
Número | Componente |
---|---|
1 | Micro controlador, por ejemplo. El MC compatible con UNO R3 |
1 | LCD, por ejemplo, Lcd-keypad-shield |
1 | Módulo SIM 808 GPS / GSM (en la tercera parte con tarjeta SIM) |
Batería o batería |
Para no explotar el marco de la contribución, me refiero a los E-Books para los detalles SIM 808 y Keypad-Shield, que están vinculados en la página del correspondiente producto.
Quién sabe exactamente lo que significa 54° 30'N 009 ° 15'E puede volar sobre los siguientes párrafos. Quién no lo sabe, ahora aprenderá nuestro sistema de coordenadas en la Tierra.
La Tierra se parece a una naranja (solo azul en lugar de naranja), casi esférica, a los polos mínimamente aplanados. Para determinar un punto en la superficie, las personas inteligentes finalmente acordaron un sistema de coordenadas uniformes. La Tierra gira un día una vez alrededor de su propio eje. Definimos este eje de rotación como el eje de la Tierra a través de los dos polos y dividimos la bola por la mitad con una línea imaginaria con el nombre de ecuador. Luego definimos el ancho geográfico como el ángulo en el centro de la Tierra entre el ecuador y nuestro lugar. Alemania está entre 47° 16'18" y 55° 03'31.1" ° Latitud Norte. Los polos son entonces 90° Norte o Sur; la Latitud Sur a menudo se muestra con signos menos. La determinación de la longitud geográfica era difícil porque cada rey quería tener la línea cero a través de su trono (por ejemplo, la línea rosa en el "Código Da Vinci" de Dan Brown). Finalmente, el observatorio en Greenwich cerca de Londres se fijó como un meridiano de referencia. Una vez que la Tierra se encuentra a 360°, cada 180° hacia el este y el oeste; Las longitudes occidentales posiblemente nuevamente con signos menos. Alemania está entre 005° 52' 01" y 015° 02' 37" Longitud Oriental. La línea de fechas (generalmente a 180 ° E / W) corre a través del Océano Pacífico.
Imagen: Globo de la Tierra con longitud y círculos de ancho.
Las líneas de longitud son círculos grandes que se extienden desde un polo a otro. Los círculos grandes son círculos en el globo terráqueo alrededor del centro de la Tierra; la ruta más corta entre dos puntos se ejecuta en el círculo extendido a través de estos puntos. El ecuador es la única línea latitud que es un gran círculo, el radio de la dirección del polo o perímetro de la latitud se vuelve más pequeña. ¿Quién sabe la función de ángulo, que es a 0 ° máximo (= 1) y a 90 ° mínimamente (= 0)? Se explica más adelante, cuando necesitemos conocer más sobre trigonometría. La navegación tiene mucho que ver con las matemáticas.
Para una mejor comprensión del planeta Tierra, puede observar a un globo (mejor con la iluminación interior), pero para la navegación, mejor utilizamos un mapa, un pedazo de papel plano con el área en la que nos movemos. En la marinería: siempre tome el mapa con la mayor escala disponible, pero ¿qué es más grande? 1: 2,000,000 o 1: 50,000? El primer mapa coincide con 10 cm - 200 km en realidad, en el segundo, 10 cm es solo 5 km. Por lo tanto, el segundo es más detallado. Las pequeñas escalas (convergentes) se utilizan para la planificación de rutas, el conjunto de mapas con las escalas más grandes en la realización del recorrido. Hoy en día se hace con una pantalla táctil, donde se cambia la escala con dos dedos.
Para obtener una tarjeta, una imagen bidimensional de la superficie de la Tierra, utilizamos (pero también Google Maps et al.) Los métodos de la crema de Gheert, mejor conocidos como Gerhard Mercator (1512 - 1594) y Johann Heinrich Lambert (1728 - 1777). Mercator ha descrito la llamada proyección del cilindro, la proyección de cono (corte) de Lambert.
En la proyección de Mercator, se empuja un cilindro sobre la bola, en nuestro ancho eje paralelo. Los polos no están mapeados y la isla de Groenlandia se ve más grande que el continente Africano. Por lo tanto, la imagen no es de longitud ni de espacio y es inutilizable cerca de los polos. Pero nos guiará lo suficientemente bien en Europa Central con distancias cortas y medias.
Tipos de proyección: Cilindro izquierdo Proj. (Mercator), correcto (corte) Cono-Proyecto. (Lambert)
En la proyección de cono de corte de Lambert, un cono está unido al polo, que corta la bola, por ejemplo, en 60° Latitud Norte, es decir, se extiende dentro de la bola, y nuevamente a 30 grados Latitud Norte. Esto es (especialmente cerca de las latitudes / líneas de corte) el mejor compromiso con respecto a la longitud, la superficie y la lealtad angular, pero nada es verdadero del 100%. El mapa ideal para pilotos, que suelen ser rutas más grandes que el geocacher.
En estas imágenes de la superficie de la Tierra, pintamos nuestras líneas auxiliares y, por lo tanto, podemos determinar cada lugar con su latitud geográfica (¿cuántos grados al norte del ecuador?) y la longitud (¿cuántos grados al este del observatorio en Greenwich?) O viceversa de las figuras.
Las dificultades reales comienzan en detalle, porque hay diferentes formatos; y queremos tener la ubicación lo más exactamente posible. El ángulo en pasos de 1° significa una precisión de 111 km, en algún lugar entre Würzburg y Nuremberg. Luego se hizo una subdivisión más fina con los minutos de arco. El minuto de la palabra sugiere que el número 60 entra en juego. 1° (Diga: Grado) es igual a 60 '(Diga: (arco) minutos).
Aquí debemos recordar que un minuto de arco en el Meridiano (círculo de longitud) corresponde a una milla náutica o 1.852 km.
Aún demasiado inexacto para nuestra búsqueda. Así que se divide más en (arco) segundos (nuevamente con un factor 60) o después del sistema decimal. Ambos son posibles y de costumbre, solo tiene que controlar la conversión. Los Geocachers prefieren el formato DDMM.mmmm, por lo que el número de grado (grados) de doble dígito, luego los minutos del doble dígito y las fracciones como decimal de los minutos aquí con una "m" pequeña que se muestra. Alternativamente, hay DDMMSSss, lo que representa: grados (DD), minutos (MM), segundos (SS) y décimas de segundo (ss). Para la conversión, solo necesitamos el número 60 ya mencionado, es decir, por ejemplo, los segundos de 30 hojas corresponden a 30/60 = ½ minuto de arco. De lo contrario, 0.8 minutos de arco corresponden a 0.8 * 60 = 48 segundos de arco.
El siguiente sketch debe seleccionar los correctos de la variedad de datos que recibe nuestro receptor GPS. Si conectamos nuestro receptor GPS a un programa de terminal, la siguiente información se obtiene en segundos:
Reconocemos rápidamente que los datos interesantes se ubican en las líneas que comienzan con $ GPGGA y "GPRMC:
$ GPGGA, 080635.000,5351.2345, N, 00951.2345, E, 1,9,1.02.32.1, M, 45.6, M, * 67
$ GPRMC, 080635.000, A, 5351.2345, N, 00951.2345, E, 0.20,159.92,140321 , A * 69
La librería del programa utilizada por nosotros en el sketch evalúa la línea en negrita, que comienza con GPRMC. Sin embargo, la información esencial también está en la otra línea. GP significa Sistema de Posicionamiento Global (GPS) y RMC significa Información de Navegación Mínima Recomendada. (Fuente: https://de.wikipedia.org/wiki/NMEA_0183, http://www.nmea.de/nmea0183datensaetze.html#rmc)
A continuación sigue:
1) Tiempo Coordinado Universal (UTC) (previamente conocido como Hora del Meridiano de Greenwich (GMT))
2) Latitud (formato DDMM.MMMMM)
3) N O S (Norte o Sur)
4) Longitud (formato DDDMM.MMMMM)
5) E o W (Este u Oeste)
6) Indicador de calidad GPS, 0 - Arreglo no disponible, 1 - Corrección de GPS,
2 - Corrección de GPS diferencial
7) Número de satélites a la vista, 00 - 12
8) Dilución horizontal de precisión.
9) Altitud de la antena arriba / debajo del nivel medio del mar (geid)
10) Unidades de altitud de la antena, metros.
En el caso del hardware, había decidido el Lcd-Keypad-Shield, en el que puede cambiar rápidamente entre diferentes vistas utilizando los botones del teclado. Utilizamos el botón izquierdo para la posición en el formato DDMM.mmmm, DOWN para la fecha y la hora en el Tiempo Coordinado Universal (UTC), UP para nuestra zona horaria y a la derecha para la posición en el formato DDMMSS.s; utilizamos el botón “Select” la próxima vez para el rumbo y la distancia.
Observaciones preliminares en el sketch:
- Para el receptor GPS, utilice el software en serie a A3 = GPIO 17 y A4 = GPIO 18.
- La librería utilizada para la conversión de segundos de arco en decimal de los minutos de arco y viceversa tiene un error. No lo utilice.
- La librería también es muy importante. La consulta If (sim808.getgps ()) tal vez puede convertirse en un obstáculo.
- Los nombres de las variables que comienzan con LAT se relacionan con el Geo. Latitud;
Los nombres de las variables que comienzan con LON se relacionan con el Geo. Longitud.
- Para MEZ / MESZ, se debe ingresar offset. Al convertir el tiempo, el cambio de fecha se tiene en cuenta, pero no el mes y el año (tiempo y esfuerzo).
#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>
#define PIN_TX 17
#define PIN_RX 18
// LCD has no I2C-Adapter, data transfer with Pins D4 to D7
#include <LiquidCrystal.h>
//LCD pin to Arduino
//const int pin_BL = 15;
const int pin_EN = 9;
const int pin_RS = 8;
const int pin_D4 = 4;
const int pin_D5 = 5;
const int pin_D6 = 6;
const int pin_D7 = 7;
LiquidCrystal lcd( pin_RS, pin_EN, pin_D4, pin_D5, pin_D6, pin_D7);
// Offset for Time, here UTC zu MEZ / MESZ
// Summertime MESZ: 2, Wintertime MEZ: 1
#define Offset 1
SoftwareSerial mySerial(PIN_TX,PIN_RX);
DFRobot_SIM808 sim808(&mySerial); //Connect RX,TX,PWR
// unterbrechungsfreie Zeitsteuerung
unsigned long previousMillis = 0;
const long interval = 10;
// Buttons
int buttonInput = -1;
int buttonSelect = 0;
void setup() {
mySerial.begin(9600);
Serial.begin(9600);
lcd.begin(16,2); // initialize the lcd
lcd.clear();
lcd.setCursor(0,0); //Zählung beginnt bei Null, erst Zeichen, dann Zeile
lcd.print("AZ-Delivery.com");
lcd.setCursor(0,1); // 0=Erstes Zeichen, 1=zweite Zeile
//******** Initialize sim808 module *************
while(!sim808.init()) {
delay(1000);
Serial.print("Sim808 init error\r\n");
}
//************* Turn on the GPS power************
if( sim808.attachGPS())
Serial.println("Open the GPS power success");
else
Serial.println("Open the GPS power failure");
}void loop() {
buttonInput = Button();
switch (buttonInput) {
case 0: Serial.println("0");buttonSelect=0; break;
case 1: Serial.println("1");buttonSelect=1; break;
case 2: Serial.println("2");buttonSelect=2; break;
case 3: Serial.println("3");buttonSelect=3; break;
case 4: Serial.println("4");buttonSelect=4; break;
default: break;
}
if (millis() - previousMillis >= interval) {
//************** Get GPS data *******************
if (sim808.getGPS()) {
int MONTH = sim808.GPSdata.month;
int DAY = sim808.GPSdata.day;
int DAYLCL = DAY;
int HOUR = sim808.GPSdata.hour;
int HOURLCL = HOUR + Offset;
int MINUTE = sim808.GPSdata.minute;
int SECOND = sim808.GPSdata.second;
if (HOURLCL>24) {
HOURLCL = HOURLCL-24;
DAYLCL = DAYLCL + 1; }
Serial.print(sim808.GPSdata.year);
Serial.print("/");
Serial.print(MONTH);
Serial.print("/");
Serial.print(DAY);
Serial.print(" ");
Serial.print(HOUR);
Serial.print(":");
Serial.print(MINUTE);
Serial.print(":");
Serial.println(SECOND);
float LAT = sim808.GPSdata.lat;
int LATDD = int(LAT);
float LATMMmmmm = (LAT - LATDD)*100;
float LON = sim808.GPSdata.lon;
int LONDDD = int(LON);
float LONMMmmmm = (LON - LONDDD)*100;
Serial.print("latitude: ");
Serial.print(LATDD);
Serial.print("°");
Serial.print(LATMMmmmm,4);
Serial.println("'N");
Serial.print("longitude: ");
if (LON<100.0) Serial.print("0");
if (LON<10.0) Serial.print("0");
Serial.print(LONDDD);
Serial.print("°");
Serial.print(LONMMmmmm,4);
Serial.println("'E");
float SPEED = sim808.GPSdata.speed_kph;
if (SPEED >= 3.0) {
Serial.print("speed_kph: ");
Serial.println(SPEED);
Serial.print("heading: ");
Serial.println(sim808.GPSdata.heading); }
else {
Serial.print("speed_kph :");
Serial.println("below 3");
Serial.print("heading :");
Serial.println("not determined"); }
if (buttonSelect==0) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(LATDD);
lcd.print("\xDF");
int LATMM = int(LATMMmmmm);
float LATSSs = (LATMMmmmm-LATMM)*60;
lcd.print(LATMM);
lcd.print("'");
lcd.print(LATSSs,1);
lcd.print("\x22\ N");
lcd.setCursor(0,1);
if (LON<100.0) lcd.print("0");
if (LON<10.0) lcd.print("0");
lcd.print(LONDDD);
lcd.print("\xDF");
int LONMM = int(LONMMmmmm);
float LONSSs = (LONMMmmmm-LONMM)*60;
if (LONMM<10) lcd.print("0");
lcd.print(LONMM);
lcd.print("'");
if (LONSSs<10.0) lcd.print("0");
lcd.print(LONSSs,1);
lcd.print("\x22\ E"); }
else if (buttonSelect==1) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("EUR: ");
if (DAYLCL<10) lcd.print("0");
lcd.print(DAYLCL);
lcd.print(".");
if (MONTH<10) lcd.print("0");
lcd.print(MONTH);
lcd.print(".");
lcd.print(sim808.GPSdata.year);
lcd.setCursor(5,1);
if (HOURLCL<10) lcd.print("0");
lcd.print(HOURLCL);
lcd.print(":");
if (MINUTE<10) lcd.print("0");
lcd.print(MINUTE);
lcd.print(":");
if (SECOND<10) lcd.print("0");
lcd.print(SECOND);
}
else if (buttonSelect==2) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("UTC: ");
lcd.print(sim808.GPSdata.year);
lcd.print("/");
if (MONTH<10) lcd.print("0");
lcd.print(MONTH);
lcd.print("/");
if (DAY<10) lcd.print("0");
lcd.print(DAY);
lcd.setCursor(5,1);
if (HOUR<10) lcd.print("0");
lcd.print(HOUR);
lcd.print(":");
if (MINUTE<10) lcd.print("0");
lcd.print(MINUTE);
lcd.print(":");
if (SECOND<10) lcd.print("0");
lcd.print(SECOND);
}
else if (buttonSelect==3) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(LATDD);
lcd.print("\xDF");
lcd.print(LATMMmmmm,4);
lcd.print("' N");
lcd.setCursor(0,1);
if (LON<100.0) lcd.print("0");
if (LON<10.0) lcd.print("0");
lcd.print(LONDDD);
lcd.print("\xDF");
if (LONMMmmmm<10.0) lcd.print("0");
lcd.print(LONMMmmmm,4);
lcd.print("' E"); }
else if (buttonSelect==4) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AZ-Delivery.com"); }
//
// //************* Turn off the GPS power ************
// sim808.detachGPS();
previousMillis = millis();
}
}
}
int Button() {
int A0;
// all buttons are connected to A0 via voltage divider
// Values of ADC are between 0 and 1023
// if necessary, values must be changed slightly
A0 = analogRead(0); //
if (A0 < 60) {
return 0;
}
else if (A0 >= 60 && A0 < 250) {
return 1;
}
else if (A0 >= 250 && A0 < 450){
return 2;
}
else if (A0 >= 450 && A0 < 700){
return 3;
}
else if (A0 >= 700 && A0 < 900){
return 4;
}
else {
return -1;
}
} //end Button()
Entonces, querido Conejo de Pascua, con este sketch puede ocultar los huevos de Pascua y darle a los niños pistas donde deben buscar. Los buscadores deben ser pacientes hasta el próximo sketch, cuando programaremos la dirección y la distancia a los waypoints.
9 comentarios
Bernd Albrecht
Die Wahl fiel auf das SIM808, weil hier GPS und GSM vereint sind. Im Blog-Beitrag (Teil 3) zeige ich, wie man per SMS die Positionsmeldung triggern kann.
https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/positionsmeldung-mit-gps-und-sms-gps-gsm-sim-808-teil-3
Klaus
Inetessantes Projekt, würde es gern meinem Hund anhängen, wenn die Akkus nicht zu schwer würden.
Kann das Projekt auch mit dem SIM900 realisiert werden? Auch bis zum 3. Teil? Wenn ja, warum fiel die Wahl auf SIM808?
Welches ist neuer, welches stromsparender?
Würde mich über eine Antwort freuen, weil fertige Produkte nur mit der Cloud des Herstellers funktionieren und ein meist teures Abo voraussetzen.
Dirk Harms
Sehr schönes Projekt, meine Kinder freuen sich schon ;-)
Falls auf dem Display nichts erscheint – einfach mal den Kontrast am Poti verändern.
Bernd Albrecht
Danke an Ingo für den Hinweis und die Lösung des Problems. Ich hatte schon die Sim-Karte eingesteckt für den dritten Teil der Blog-Reihe. Deshalb ist mir diese unüberwindliche Hürde nicht aufgefallen. Tatsächlich funktioniert der Sketch mit den folgenden Zeilen nur, wenn eine Sim-Karte eingesteckt ist.
//******** Initialize sim808 module *************
while(!sim808.init()) {
delay(1000);
Serial.print(“Sim808 init error\r\n”);
}
Deshalb: Wer den Sketch ohne Sim-Karte benutzen möchte, diese Zeilen bitte auskommentieren.
Reinhard Völler
Ich bekomme leider das LCD Display Shield nicht zum laufen. Habe im Sketch mal alles auskommentiert, was nichts mit dem LCD zu tun hat, aber “AZ-Delivery” erscheint bei mir nicht. Auch die angepassten Beispiele aus der Liquidcrystal Library funktionieren bei mir nicht. Ich habe D4-D7 auf 4-7 gesetzt, EN=9, RS=8. Hintergrundbeleuchtung ist an. Was mache ich da falsch?
Ingo
Ich habe das ganze mal bei mir aufgebaut. Bekomme aber immer Sim808 init error. Kann es sein das die Funktion while(!sim808.init()) { nur funktioniert wenn eine SIM Karte eingelegt ist? Wenn ich diesen Teil auskommentiere läuft alles einwandfrei.
Viele Grüße Ingo
Juergen
Hallo,
schöner Bericht, danke dafür.
Es wäre noch ganz hilfreich wenn man einen Anschlussplan bekommen könnte, um zu wissen wie die Komponenten verbunden werden sollen.
mfg
Jürgen
So etwas in der Art stand schon lange auf meiner ToDo-Liste.
Ich denke, ich werde, das mit dieser Superunterstützung jetzt
auch mal in Micropython versuchen.
Schönen Gruß
Jürgen
Reinhard Völler
Witziges Projekt, habe ich gleich mal geordert.
Ein Hinweis, dass man die Library auf github findet, wäre vielleicht hilfreich:
https://github.com/DFRobot/DFRobot_SIM808
Gruß an den Osterhasen :-)