Índice:
- Etapa 1: esboço de papel
- Etapa 2: Lista de Hardware
- Etapa 3: Projeto do circuito
- Etapa 4: Conexão de Hardware
- Etapa 5: Design de software
- Etapa 6: depurar no breadboard
- Etapa 7: Montagem de Hardware
- Etapa 8: Projeto de habitação de eletrônicos no Adobe Illustrator
- Etapa 9: Protótipo de papelão
- Etapa 10: Protótipo de Contraplacado de Bétula
2025 Autor: John Day | [email protected]. Última modificação: 2025-01-13 06:58
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
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
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
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
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
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
Etapa 7: Montagem de Hardware
Etapa 8: Projeto de habitação de eletrônicos no Adobe Illustrator
Etapa 9: 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
Este foi o protótipo inicial. Um orifício quadrado para conectar a um carregador foi finalmente adicionado a uma das peças.