Índice:

FinduCar: uma chave de carro inteligente que guia as pessoas até onde o carro está estacionado: 11 etapas (com fotos)
FinduCar: uma chave de carro inteligente que guia as pessoas até onde o carro está estacionado: 11 etapas (com fotos)

Vídeo: FinduCar: uma chave de carro inteligente que guia as pessoas até onde o carro está estacionado: 11 etapas (com fotos)

Vídeo: FinduCar: uma chave de carro inteligente que guia as pessoas até onde o carro está estacionado: 11 etapas (com fotos)
Vídeo: TODAS AS FUNÇÕES E DISPOSITIVOS DO PAINEL DO CARRO #DirigirEuPosso #LegTransito 2024, Junho
Anonim
FinduCar: uma chave de carro inteligente que guia as pessoas até onde o carro está estacionado
FinduCar: uma chave de carro inteligente que guia as pessoas até onde o carro está estacionado

A fim de resolver os problemas acima, este projeto propõe o desenvolvimento de uma chave de carro inteligente que poderia direcionar as pessoas para onde estacionaram o carro. E meu plano é integrar um GPS na chave do carro. Não há necessidade de usar o aplicativo do smartphone para rastrear o carro, todas as orientações aparecerão apenas na chave do carro.

Etapa 1: esboço de papel

Desenho de Papel
Desenho de Papel

Quando as pessoas pressionam o botão para trancar o carro, as informações de localização podem ser gravadas no microcontrolador automaticamente. Então, quando as pessoas começam a navegar até o carro, o LED diferente é aceso para direcionar para a posição do carro e a frequência piscando mostra a distância até o carro. Eles podem facilmente seguir o LED piscando e encontrar rapidamente o carro.

Etapa 2: Lista de Hardware

Lista de Hardware
Lista de Hardware

Estes são os componentes usados neste projeto. Alguns são dos kits de partículas (breadboard, botão, cabeçalhos), outros são comprados no site oficial da Adafruit (Adafruit Feather M0, módulo GPS Adafruit Ultimate, bateria Lpoly e bateria de célula tipo moeda) e Amazon (NeoPixel Ring - 12 RGB LED).

Etapa 3: Projeto do circuito

Projeto de Circuito
Projeto de Circuito

Neopixel_LED está conectado ao PIN 6 do Feather M0

Button_Unlock está conectado ao PIN 12 do Feather M0

Button_Lock está conectado ao PIN 13 do Feather M0

Etapa 4: Conexão de Hardware

Conexão de Hardware
Conexão de Hardware
Conexão de Hardware
Conexão de Hardware
Conexão de Hardware
Conexão de Hardware

Solde os cabeçotes com Adafruit M0 Feather, Adafruit Ultimate GPS Featherwing. Empilhe as duas placas juntas. O GPS FeatherWing se conecta diretamente à sua placa Feather M0 sem mais fios.

Etapa 5: Design de software

Design de software
Design de software

Componentes de Teste

Leia um FIX

void setup () {

Serial.println ("Teste de eco GPS"); Serial.begin (9600); Serial1.begin (9600); // baud NMEA GPS padrão}

void loop () {

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

Pisca anel LED

Veja os exemplos de Adafruit NeoPixel.

Funções de cálculo de GPS

Calcule o azimute

// Calcule o azimute

azimute duplo (lat_a duplo, lon_a duplo, lat_b duplo, lon_b duplo) {

duplo 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 = sqrt (1-d * d); d = cos (lat_b) * sin (lon_b-lon_a) / d; d = asin (d) * 180 / PI; return d; }

Calcule a hora no relógio LED, que também é a direção do veículo

// Calcule o tempo no relógio LED

int led_time (ângulo duplo) {

sinalizador int = 0; if (ângulo = 15) {tempo_angulo = tempo_ângulo + 1; } if (sinalizador == 1) {tempo_angulo = 12 - tempo_angulo; } return angle_time; }

Calcule a distância entre a pessoa e seu veículo

// Calcule a distância

distância dupla (lat_a duplo, lon_a duplo, lat_b duplo, lon_b duplo) {

double EARTH_RADIUS = 6378137.0; radLat1 duplo = (lat_a * PI / 180,0); radLat2 duplo = (lat_b * PI / 180,0); double a = radLat1 - radLat2; b duplo = (lon_a - lon_b) * PI / 180,0; double s = 2 * asin (sqrt (pow (sin (a / 2), 2) + cos (radLat1) * cos (radLat2) * pow (sin (b / 2), 2))); s = s * EARTH_RADIUS / 10000000; return s; }

Funções de exibição de LED

Acenda LEDs em um círculo mostrando que ele começa a navegar

// A iluminação do anel LED, um por um, mostra que a navegação começa

void colorWipe (uint32_t c, uint8_t wait) {

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

Obtenha a frequência do LED com base na distância

// Obter frequência de LED

frequência interna (distância dupla) {

int f = distância (int) * 20; return f; }

Pisque um determinado LED indicando a direção do carro

// Exibir no LED

strip.clear ();

strip.show (); atraso (frequência (distância_carro_pessoal)); // atraso (500); strip.setPixelColor (angle_time, strip. Color (0, 0, 255)); strip.show (); atraso (frequência (distância_do_carro)); // atraso (500);

// Desativar 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 false

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

void setup () {

Serial.begin (115200); // Serial1.begin (9600); GPS.begin (9600); // padrão NMEA GPS baud strip.begin (); // descomente esta linha para ligar RMC (mínimo recomendado) e GGA (dados fixos) incluindo altitude GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); // Defina a taxa de atualização GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); // Taxa de atualização de 1 Hz // Solicita atualizações no status da antena, comente para ficar quieto // GPS.sendCommand (PGCMD_ANTENNA); atraso (1000);}

void loop () {// if (Serial.available ()) {

// char c = Serial.read (); // Serial1.write (c); //} // if (Serial1.available ()) {char c = GPS.read (); if (GPSECHO) if (c) Serial.print (c); // se uma frase for recebida, podemos verificar a soma de verificação, analisá-la … if (GPS.newNMEAreceived ()) {// uma coisa complicada aqui é se imprimirmos a frase NMEA, ou dados // acabamos não ouvindo e pegando outras frases! // portanto, tenha muito cuidado se usar OUTPUT_ALLDATA e tentar imprimir os dados Serial.println (GPS.lastNMEA ()); // isso também define o sinalizador newNMEAreceived () como falso if (! GPS.parse (GPS.lastNMEA ())) // isso também define o sinalizador newNMEAreceived () como falso return; // podemos falhar na análise de uma sentença, caso em que devemos apenas esperar por outra} // se millis () ou cronômetro encerrar, iremos redefini-lo if (timer> millis ()) timer = millis (); if (milis () - cronômetro> 2000) {cronômetro = milis (); // zera o cronômetro Serial.print ("\ nTime:"); Serial.print (GPS.hour, DEC); Serial.print (':'); Serial.print (GPS.minuto, DEC); Serial.print (':'); Serial.print (GPS.segundos, DEC); Serial.print ('.'); Serial.println (GPS.milliseconds); Serial.print ("Data:"); Serial.print (GPS.dia, DEC); Serial.print ('/'); Serial.print (GPS.month, DEC); Serial.print ("/ 20"); Serial.println (GPS.ano, DEC); Serial.print ("Fix:"); Serial.print ((int) GPS.fix); Serial.print ("qualidade:"); Serial.println ((int) GPS.fixquality); if (GPS.fix) {Serial.print ("Localização:"); Serial.print (GPS.latitude, 4); Serial.print (GPS.lat); Serial.print (","); Serial.print (GPS.longitude, 4); Serial.println (GPS.lon); Serial.print ("Localização (em graus, funciona com o Google Maps):"); Serial.print (GPS.latitudeDegrees, 4); Serial.print (","); Serial.println (GPS.longitudeDegrees, 4); Serial.print ("Velocidade (nós):"); Serial.println (GPS.speed); Serial.print ("Ângulo:"); Serial.println (GPS.angle); Serial.print ("Altitude:"); Serial.println (GPS.altitude); Serial.print ("Satélites:"); Serial.println ((int) GPS.satellites); // Salva o GPS do veículo if (button_lock.read ()) {car_lat = GPS.latitudeDegrees; car_lon = GPS.longitudeDegrees; // para depuração Serial.print ("carLatitude:"); Serial.println (car_lat); Serial.print ("carLongitude:"); Serial.println (car_lon); } // Comece a encontrar o carro 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 = distance (GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); // Calcular a distância // car_person_distance = distance (100.0005, 100.0005, 100.0, 100.0); // para depuração Serial.println (car_person_distance); move_direction = GPS.angle; // Registra a direção do movimento (ângulo) // move_direction = 100.0; // Grave o azimute (ângulo) car_azimuth = azimuth (GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); // car_azimuth = azimuth (100.0005, 100.0005, 100.0, 100.0); // Calcula o tempo no relógio LED car_person_angle = car_azimuth - move_direction; ângulo_tempo = tempo_dirigido (ângulo_pessoa_carro); // Exibir no LED strip.clear (); strip.show (); // atraso (frequência (distância_carro_pessoal)); atraso (500); strip.setPixelColor (angle_time, strip. Color (0, 0, 255)); strip.show (); // atraso (frequência (distância_carro_pessoal)); atraso (500); // Desativa o LED if (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_flag = 1; strip.clear (); strip.show (); }}} //}}}

Etapa 6: depurar no breadboard

Depurar no breadboard
Depurar no breadboard
Depurar no breadboard
Depurar no breadboard
Depurar no breadboard
Depurar no breadboard

Etapa 7: Montagem de Hardware

Montagem de Hardware
Montagem de Hardware
Montagem de Hardware
Montagem de Hardware
Montagem de Hardware
Montagem de Hardware

Etapa 8: Projeto de habitação de eletrônicos no Adobe Illustrator

Projeto Eletrônico de Habitação em Adobe Illustrator
Projeto Eletrônico de Habitação em Adobe Illustrator

Etapa 9: Protótipo de papelão

Protótipo de Papelão
Protótipo de Papelão
Protótipo de Papelão
Protótipo de Papelão

Esta etapa é usada para confirmar o tamanho da caixa e de cada peça do modelo, certificando-se de que o tamanho da caixa, a posição do botão e a posição do LED se ajustam aos componentes eletrônicos montados.

Etapa 10: Protótipo de Contraplacado de Bétula

Protótipo de Contraplacado de Bétula
Protótipo de Contraplacado de Bétula
Protótipo de Contraplacado de Bétula
Protótipo de Contraplacado de Bétula

Este foi o protótipo inicial. Um orifício quadrado para conectar a um carregador foi finalmente adicionado a uma das peças.

Recomendado: