Table des matières:

FinduCar : une clé de voiture intelligente guidant les gens vers l'endroit où la voiture est garée : 11 étapes (avec photos)
FinduCar : une clé de voiture intelligente guidant les gens vers l'endroit où la voiture est garée : 11 étapes (avec photos)

Vidéo: FinduCar : une clé de voiture intelligente guidant les gens vers l'endroit où la voiture est garée : 11 étapes (avec photos)

Vidéo: FinduCar : une clé de voiture intelligente guidant les gens vers l'endroit où la voiture est garée : 11 étapes (avec photos)
Vidéo: Что ты выберешь: $100,000 или Секретный Ключ? 2024, Juillet
Anonim
FinduCar: une clé de voiture intelligente guidant les gens vers l'endroit où la voiture est garée
FinduCar: une clé de voiture intelligente guidant les gens vers l'endroit où la voiture est garée

Afin de résoudre les problèmes ci-dessus, ce projet propose de développer une clé de voiture intelligente qui pourrait diriger les gens vers l'endroit où ils ont garé la voiture. Et mon plan est d'intégrer un GPS dans la clé de la voiture. Il n'est pas nécessaire d'utiliser l'application pour smartphone pour suivre la voiture, tous les conseils s'afficheront simplement sur la clé de la voiture.

Étape 1: Croquis papier

Croquis de papier
Croquis de papier

Lorsque les gens appuient sur le bouton pour verrouiller la voiture, les informations de localisation peuvent être enregistrées automatiquement dans le microcontrôleur. Ensuite, lorsque les gens commencent à se diriger vers la voiture, les différentes LED s'allument pour se diriger vers la position de la voiture et la fréquence de clignotement indique la distance jusqu'à la voiture. Ils peuvent facilement suivre la LED clignotante et trouver rapidement la voiture.

Étape 2: Liste du matériel

Liste du matériel
Liste du matériel

Ce sont les composants utilisés dans ce projet. Certains proviennent des kits de particules (planche à pain, bouton, en-têtes), d'autres sont achetés sur le site officiel d'Adafruit (Adafruit Feather M0, module GPS Adafruit Ultimate, batterie Lpoly et pile bouton) et Amazon (anneau NeoPixel - 12 LED RGB).

Étape 3: Conception de circuits

Conception de circuits
Conception de circuits

Neopixel_LED est connecté au PIN 6 de Feather M0

Button_Unlock est connecté au PIN 12 de Feather M0

Button_Lock est connecté au PIN 13 de Feather M0

Étape 4: connexion matérielle

Connexion matérielle
Connexion matérielle
Connexion matérielle
Connexion matérielle
Connexion matérielle
Connexion matérielle

Soudez les embases avec Adafruit M0 Feather, Adafruit Ultimate GPS Featherwing. Empilez les deux planches ensemble. Le GPS FeatherWing se branche directement sur votre carte Feather M0 sans plus de fils.

Étape 5: Conception du logiciel

Conception de logiciels
Conception de logiciels

Tester les composants

Lire un CORRECTIF

void setup() {

Serial.println("Test d'écho GPS"); Serial.begin(9600); Serial1.begin(9600); // Baud GPS NMEA par défaut }

boucle vide() {

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

Anneau LED clignotant

Voir les exemples Adafruit NeoPixel.

Fonctions de calcul GPS

Calculer l'azimut

// Calculer l'azimut

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

double 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; retour d; }

Calculer l'heure sur l'horloge LED, qui est aussi la direction du véhicule

// Calculer l'heure sur l'horloge LED

int led_time(double angle){

indicateur int = 0; if (angle = 15) { angle_time = angle_time + 1; } if (drapeau == 1){ angle_time = 12 - angle_time; } return angle_time; }

Calculer la distance entre la personne et son véhicule

// Calculer la distance

double distance(double lat_a, double lon_a, double lat_b, double lon_b) {

double EARTH_RADIUS = 6378137.0; double radLat1 = (lat_a * PI / 180,0); double radLat2 = (lat_b * PI / 180,0); double a = radLat1 - radLat2; double b = (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; Retour; }

Fonctions d'affichage LED

Allumez les LED dans un cercle indiquant qu'il commence à naviguer

// L'éclairage annulaire à LED un par un indique que la navigation commence

void colorWipe (uint32_t c, uint8_t wait) {

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

Obtenez la fréquence LED sur la base de la distance

// Obtenir la fréquence LED

fréquence int(double distance){

int f = (int)distance * 20; retour f; }

Faire clignoter la certaine LED indiquant la direction de la voiture

//Affichage sur LED

strip.clear();

strip.show(); retard(fréquence(voiture_personne_distance)); // retard (500); strip.setPixelColor(angle_time, strip. Color(0, 0, 255)); strip.show(); retard(fréquence(voiture_personne_distance)); // retard (500);

//Désactiver la LED

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

Principale

#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); Bande Adafruit_NeoPixel = Adafruit_NeoPixel(Neopixel_LED_NUM, Neopixel_LED_PIN, NEO_GRB + NEO_KHZ800); Bouton button_lock(Button_Lock_PIN); Bouton button_unlock(Button_Unlock_PIN); int button_flag = 0; int led_flag = 1; uint32_t timer = millis(); double car_lat, car_lon; double car_person_distance; double move_direction; double car_azimut; double car_person_angle; int angle_temps;

void setup() {

Serial.begin(115200); // Serial1.begin(9600); GPS.begin(9600); // par défaut NMEA baud strip.begin(); // Décommentez cette ligne pour activer RMC (minimum recommandé) et GGA (données fixes) y compris l'altitude GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // Définir le taux de mise à jour GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // Taux de mise à jour de 1 Hz // Demander des mises à jour sur l'état de l'antenne, commenter pour garder le silence // GPS.sendCommand(PGCMD_ANTENNA); retard(1000);}

boucle vide() {// si (Serial.available()) {

// car c = Serial.read(); // Serial1.write(c); // } // if (Serial1.available()) { char c = GPS.read(); if (GPSECHO) if (c) Serial.print(c); // si une phrase est reçue, nous pouvons vérifier la somme de contrôle, l'analyser… if (GPS.newNMEAreceived()) { // une chose délicate ici est si nous imprimons la phrase NMEA, ou les données // nous finissons par ne pas écouter et attraper d'autres phrases! // soyez donc très prudent si vous utilisez OUTPUT_ALLDATA et essayez d'imprimer les données Serial.println(GPS.lastNMEA()); // cela définit également l'indicateur newNMEAreceived() sur false if (!GPS.parse(GPS.lastNMEA())) // cela définit également l'indicateur newNMEAreceived() sur false return; // nous pouvons échouer dans l'analyse d'une phrase, auquel cas nous devons simplement attendre une autre } // si millis() ou timer se termine, nous allons simplement le réinitialiser if (timer > millis()) timer = millis(); if (millis() - timer > 2000) { timer = millis(); // réinitialiser la minuterie Serial.print("\nTime: "); Serial.print(GPS.hour, DEC); Serial.print(':'); Impression.série(GPS.minute, DEC); Serial.print(':'); Serial.print(GPS.seconds, DEC); Serial.print('.'); Serial.println(GPS.milliseconds); Serial.print("Date: "); Serial.print(GPS.day, DEC); Serial.print('/'); Serial.print(GPS.month, DEC); Serial.print("/20"); Serial.println(GPS.year, DEC); Serial.print("Fix: "); Serial.print((int)GPS.fix); Serial.print(" qualité: "); Serial.println((int)GPS.fixquality); if (GPS.fix) { Serial.print("Emplacement: "); Serial.print(GPS.latitude, 4); Serial.print(GPS.lat); Serial.print(", "); Serial.print(GPS.longitude, 4); Serial.println(GPS.lon); Serial.print("Emplacement (en degrés, fonctionne avec Google Maps): "); Serial.print(GPS.latitudeDegrees, 4); Serial.print(", "); Serial.println(GPS.longitudeDegrees, 4); Serial.print("Vitesse (nœuds): "); Serial.println(GPS.speed); Serial.print("Angle: "); Serial.println(GPS.angle); Serial.print("Altitude: "); Serial.println(GPS.altitude); Serial.print("Satellite: "); Serial.println((int)GPS.satellites); // Sauvegarde le GPS du véhicule if (button_lock.read()) { car_lat = GPS.latitudeDegrees; car_lon = GPS.longitudeDegrees; //pour déboguer Serial.print("carLatitude: "); Serial.println(car_lat); Serial.print("voitureLongitude: "); Serial.println(car_lon); } // Commence à trouver la voiture 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); //Calculer la distance //voiture_person_distance = distance(100.0005, 100.0005, 100.0, 100.0); //pour déboguer Serial.println(car_person_distance); move_direction = GPS.angle;//Enregistrer la direction de déplacement (angle) //move_direction = 100.0; // Enregistrer l'azimut (angle) car_azimuth = azimut(GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); //voiture_azimut = azimut(100.0005, 100.0005, 100.0, 100.0); // Calculer l'heure sur l'horloge LED car_person_angle = car_azimuth - move_direction; angle_time = led_time(car_person_angle); //Affichage sur bande LED.clear(); strip.show(); // retard(fréquence(voiture_personne_distance)); retard (500); strip.setPixelColor(angle_time, strip. Color(0, 0, 255)); strip.show(); // retard(fréquence(voiture_personne_distance)); retard (500); //Désactiver la LED if (button_flag == 1 && car_person_distance < 5.0){ button_flag = 0; led_flag = 1; strip.clear(); strip.show(); } } } // } } }

Étape 6: Déboguer sur la planche à pain

Déboguer sur la planche à pain
Déboguer sur la planche à pain
Déboguer sur la planche à pain
Déboguer sur la planche à pain
Déboguer sur la planche à pain
Déboguer sur la planche à pain

Étape 7: Assemblage du matériel

Assemblage du matériel
Assemblage du matériel
Assemblage du matériel
Assemblage du matériel
Assemblage du matériel
Assemblage du matériel

Étape 8: Conception de boîtiers électroniques dans Adobe Illustrator

Conception de boîtiers électroniques dans Adobe Illustrator
Conception de boîtiers électroniques dans Adobe Illustrator

Étape 9: prototype en carton

Prototype en carton
Prototype en carton
Prototype en carton
Prototype en carton

Cette étape est utilisée pour confirmer la taille du boîtier et de chaque pièce du modèle, en s'assurant que la taille de la boîte, la position du bouton et la position de la LED correspondent aux composants électroniques assemblés.

Étape 10: Prototype de contreplaqué de bouleau

Prototype de contreplaqué de bouleau
Prototype de contreplaqué de bouleau
Prototype de contreplaqué de bouleau
Prototype de contreplaqué de bouleau

C'était le prototype initial. Un trou carré pour brancher un chargeur a finalement été ajouté à l'une des pièces.

Conseillé: