Tabla de contenido:

FinduCar: una llave inteligente para el automóvil que guía a las personas hacia dónde está estacionado el automóvil: 11 pasos (con imágenes)
FinduCar: una llave inteligente para el automóvil que guía a las personas hacia dónde está estacionado el automóvil: 11 pasos (con imágenes)

Video: FinduCar: una llave inteligente para el automóvil que guía a las personas hacia dónde está estacionado el automóvil: 11 pasos (con imágenes)

Video: FinduCar: una llave inteligente para el automóvil que guía a las personas hacia dónde está estacionado el automóvil: 11 pasos (con imágenes)
Video: Голубая стрела (1958) фильм 2024, Mayo
Anonim
FinduCar: una llave inteligente para el automóvil que guía a las personas hacia dónde está estacionado el automóvil
FinduCar: una llave inteligente para el automóvil que guía a las personas hacia dónde está estacionado el automóvil

Para resolver los problemas anteriores, este proyecto propone desarrollar una llave de automóvil inteligente que podría dirigir a las personas al lugar donde estacionaron el automóvil. Y mi plan es integrar un GPS en la llave del auto. No es necesario utilizar la aplicación del teléfono inteligente para rastrear el automóvil, toda la guía solo se mostrará en la llave del automóvil.

Paso 1: boceto en papel

Bosquejo de papel
Bosquejo de papel

Cuando las personas presionan el botón para bloquear el automóvil, la información de ubicación se puede registrar en el microcontrolador automáticamente. Luego, cuando las personas comienzan a navegar hacia el automóvil, el LED diferente se enciende para dirigir a la posición del automóvil y la frecuencia de parpadeo muestra la distancia al automóvil. Pueden seguir fácilmente el LED parpadeante y encontrar rápidamente el automóvil.

Paso 2: Lista de hardware

Lista de hardware
Lista de hardware

Estos son los componentes utilizados en este proyecto. Algunos son de los kits de partículas (tablero, botón, encabezados), otros se compran en el sitio web oficial de Adafruit (Adafruit Feather M0, módulo GPS Adafruit Ultimate, batería Lpoly y batería Coin Cell) y Amazon (NeoPixel Ring - 12 LED RGB).

Paso 3: diseño del circuito

Diseño de circuito
Diseño de circuito

Neopixel_LED está conectado al PIN 6 de Feather M0

Button_Unlock está conectado al PIN 12 de Feather M0

Button_Lock está conectado al PIN 13 de Feather M0

Paso 4: Conexión de hardware

Conexión de hardware
Conexión de hardware
Conexión de hardware
Conexión de hardware
Conexión de hardware
Conexión de hardware

Suelde los cabezales con Adafruit M0 Feather, Adafruit Ultimate GPS Featherwing. Apile las dos tablas juntas. El GPS FeatherWing se conecta directamente a su placa Feather M0 sin más cables.

Paso 5: Diseño de software

Diseño de software
Diseño de software

Componentes de prueba

Leer un FIX

configuración vacía () {

Serial.println ("prueba de eco GPS"); Serial.begin (9600); Serial1.begin (9600); // baudios de GPS NMEA predeterminados}

bucle vacío () {

if (Serial.available ()) {char c = Serial.read (); Serial1.write (c); } if (Serial1.available ()) {char c = Serial1.read (); Serial.write (c); }}

Anillo LED parpadeante

Consulte los ejemplos de Adafruit NeoPixel.

Funciones de cálculo de GPS

Calcular el acimut

// Calcular el acimut

doble azimut (doble lat_a, doble lon_a, doble lat_b, doble lon_b) {

doble d = 0; lat_a = lat_a * PI / 180; lon_a = lon_a * PI / 180; lat_b = lat_b * PI / 180; lon_b = lon_b * PI / 180; d = sin (lat_a) * sin (lat_b) + cos (lat_a) * cos (lat_b) * cos (lon_b-lon_a); d = raíz cuadrada (1-d * d); d = cos (lat_b) * sin (lon_b-lon_a) / d; d = asin (d) * 180 / PI; return d; }

Calcule el tiempo en el reloj LED, que también es la dirección del vehículo

// Calcula el tiempo en el reloj LED

int led_time (doble ángulo) {

int bandera = 0; si (ángulo = 15) {ángulo_tiempo = ángulo_tiempo + 1; } if (bandera == 1) {angle_time = 12 - angle_time; } return tiempo_ángulo; }

Calcule la distancia entre la persona y su vehículo

// Calcula la distancia

doble distancia (doble lat_a, doble lon_a, doble lat_b, doble lon_b) {

doble EARTH_RADIUS = 6378137.0; doble radLat1 = (lat_a * PI / 180.0); doble radLat2 = (lat_b * PI / 180.0); doble a = radLat1 - radLat2; doble b = (lon_a - lon_b) * PI / 180.0; doble s = 2 * asin (sqrt (pow (sin (a / 2), 2) + cos (radLat1) * cos (radLat2) * pow (sin (b / 2), 2))); s = s * EARTH_RADIUS / 10000000; devoluciones; }

Funciones de la pantalla LED

Enciende los LED en un círculo que muestra que comienza a navegar

// La iluminación del anillo LED uno a uno muestra que comienza la navegación

void colorWipe (uint32_t c, uint8_t espera) {

for (uint16_t i = 0; i strip.setPixelColor (i, c); strip.show (); delay (wait);}}

Obtenga la frecuencia del LED sobre la base de la distancia

// Obtener la frecuencia del LED

int frecuencia (doble distancia) {

int f = (int) distancia * 20; return f; }

Parpadea el LED que indica la dirección del coche

// Pantalla en LED

strip.clear ();

strip.show (); retraso (frecuencia (distancia_persona_carro)); // retraso (500); strip.setPixelColor (angle_time, strip. Color (0, 0, 255)); strip.show (); retraso (frecuencia (distancia_persona_carro)); // retraso (500);

// Deshabilitar LED

if (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_flag = 1; strip.clear (); strip.show (); }

Principal

#include Adafruit_GPS.h #include Adafruit_NeoPixel.h #include HardwareSerial.h #include Button.h #include math.h

#define Neopixel_LED_PIN 6

#define Neopixel_LED_NUM 12 #define Button_Lock_PIN 13 #define Button_Unlock_PIN 12 #define GPSSerial Serial1

#define GPSECHO falso

Adafruit_GPS GPS (& GPSSerial); Adafruit_NeoPixel strip = Adafruit_NeoPixel (Neopixel_LED_NUM, Neopixel_LED_PIN, NEO_GRB + NEO_KHZ800); Botón button_lock (Button_Lock_PIN); Botón button_unlock (Button_Unlock_PIN); int button_flag = 0; int led_flag = 1; uint32_t temporizador = millis (); doble car_lat, car_lon; double car_person_distance; double move_direction; doble car_azimuth; double car_person_angle; int angle_time;

configuración vacía () {

Serial.begin (115200); // Serial1.begin (9600); GPS.begin (9600); // banda de baudios GPS NMEA predeterminada.begin (); // Quite el comentario de esta línea para activar RMC (mínimo recomendado) y GGA (fijar datos), incluida la altitud GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); // Establecer la tasa de actualización GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); // Frecuencia de actualización de 1 Hz // Solicitar actualizaciones sobre el estado de la antena, comentar para guardar silencio // GPS.sendCommand (PGCMD_ANTENNA); retraso (1000);}

bucle vacío () {// if (Serial.available ()) {

// char c = Serial.read (); // Serial1.write (c); //} // if (Serial1.available ()) {char c = GPS.read (); if (GPSECHO) if (c) Serial.print (c); // si se recibe una sentencia, podemos comprobar la suma de comprobación, analizarla … if (GPS.newNMEAreceived ()) {// algo complicado aquí es si imprimimos la sentencia NMEA, o los datos // terminamos sin escuchar y captando otras frases! // así que tenga mucho cuidado si usa OUTPUT_ALLDATA e intenta imprimir datos Serial.println (GPS.lastNMEA ()); // esto también establece el indicador newNMEAreceived () en falso if (! GPS.parse (GPS.lastNMEA ())) // esto también establece el indicador newNMEAreceived () en falso retorno; // podemos fallar al analizar una oración, en cuyo caso deberíamos esperar otra} // si millis () o el temporizador se reinicia, simplemente lo restableceremos if (timer> millis ()) timer = millis (); if (millis () - temporizador> 2000) {temporizador = millis (); // reinicia el temporizador Serial.print ("\ nTime:"); Serial.print (GPS.hour, DEC); Serial.print (':'); Serial.print (GPS.minute, DEC); Serial.print (':'); Serial.print (GPS.seconds, DEC); Serial.print ('.'); Serial.println (GPS.milliseconds); Serial.print ("Fecha:"); Serial.print (GPS.day, DEC); Serial.print ('/'); Impresión de serie (GPS.mes, DEC); Serial.print ("/ 20"); Serial.println (GPS.year, DEC); Serial.print ("Arreglar:"); Serial.print ((int) GPS.fix); Serial.print ("calidad:"); Serial.println ((int) GPS.fixquality); if (GPS.fix) {Serial.print ("Ubicación:"); Impresión serial (GPS.latitude, 4); Serial.print (GPS.lat); Serial.print (","); Impresión serial (longitud GPS, 4); Serial.println (GPS.lon); Serial.print ("Ubicación (en grados, funciona con Google Maps):"); Serial.print (GPS.latitudeDegrees, 4); Serial.print (","); Serial.println (GPS.longitudeDegrees, 4); Serial.print ("Velocidad (nudos):"); Serial.println (GPS.speed); Serial.print ("Ángulo:"); Serial.println (GPS.angle); Serial.print ("Altitud:"); Serial.println (GPS.altitude); Serial.print ("Satélites:"); Serial.println ((int) GPS.satellites); // Guarda el GPS del vehículo if (button_lock.read ()) {car_lat = GPS.latitudeDegrees; car_lon = GPS.longitudeDegrees; // para depurar Serial.print ("carLatitude:"); Serial.println (car_lat); Serial.print ("carLongitude:"); Serial.println (car_lon); } // Empieza a buscar el coche if (button_flag == 0) {button_flag = button_unlock.read (); } if (button_flag == 1 && led_flag == 1) {colorWipe (strip. Color (0, 255, 0), 500); led_flag = 0; } if (button_flag == 1) {car_person_distance = distancia (GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); // Calcula la distancia // car_person_distance = distancia (100.0005, 100.0005, 100.0, 100.0); // para depurar Serial.println (car_person_distance); move_direction = GPS.angle; // Registra la dirección de movimiento (ángulo) // move_direction = 100.0; // Registrar el azimut (ángulo) car_azimuth = azimuth (GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); // coche_azimut = azimut (100.0005, 100.0005, 100.0, 100.0); // Calcula el tiempo en el reloj LED car_person_angle = car_azimuth - move_direction; ángulo_tiempo = led_time (automóvil_persona_angle); // Visualización en LED strip.clear (); strip.show (); // retraso (frecuencia (distancia_persona_carro)); retraso (500); strip.setPixelColor (angle_time, strip. Color (0, 0, 255)); strip.show (); // retraso (frecuencia (distancia_persona_carro)); retraso (500); // Desactivar LED si (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_flag = 1; strip.clear (); strip.show (); }}} //}}}

Paso 6: depurar en protoboard

Depurar en protoboard
Depurar en protoboard
Depurar en protoboard
Depurar en protoboard
Depurar en protoboard
Depurar en protoboard

Paso 7: Montaje de hardware

Ensamblaje de hardware
Ensamblaje de hardware
Ensamblaje de hardware
Ensamblaje de hardware
Ensamblaje de hardware
Ensamblaje de hardware

Paso 8: Diseño de la carcasa de la electrónica en Adobe Illustrator

Diseño de carcasa de electrónica en Adobe Illustrator
Diseño de carcasa de electrónica en Adobe Illustrator

Paso 9: Prototipo de cartón

Prototipo de cartón
Prototipo de cartón
Prototipo de cartón
Prototipo de cartón

Este paso se utiliza para confirmar el tamaño de la carcasa y cada pieza del modelo, asegurándose de que el tamaño de la caja, la posición del botón y la posición del LED se ajusten a los componentes electrónicos ensamblados.

Paso 10: Prototipo de contrachapado de abedul

Prototipo de contrachapado de abedul
Prototipo de contrachapado de abedul
Prototipo de contrachapado de abedul
Prototipo de contrachapado de abedul

Este fue el prototipo inicial. Finalmente, se agregó un orificio cuadrado para enchufar a un cargador a una de las piezas.

Recomendado: