Оглавление:

FinduCar: умный автомобильный ключ, который направляет людей туда, где припаркован автомобиль: 11 шагов (с изображениями)
FinduCar: умный автомобильный ключ, который направляет людей туда, где припаркован автомобиль: 11 шагов (с изображениями)

Видео: FinduCar: умный автомобильный ключ, который направляет людей туда, где припаркован автомобиль: 11 шагов (с изображениями)

Видео: FinduCar: умный автомобильный ключ, который направляет людей туда, где припаркован автомобиль: 11 шагов (с изображениями)
Видео: Голубая стрела (1958) фильм 2024, Июль
Anonim
FinduCar: умный автомобильный ключ, который направляет людей туда, где припаркован автомобиль
FinduCar: умный автомобильный ключ, который направляет людей туда, где припаркован автомобиль

Для решения вышеуказанных проблем в этом проекте предлагается разработать интеллектуальный автомобильный ключ, который мог бы направлять людей туда, где они припарковали машину. И мой план - встроить GPS в ключ от машины. Нет необходимости использовать приложение для смартфона для отслеживания автомобиля, все указания будут отображаться на ключе от машины.

Шаг 1: набросок из бумаги

Бумажный Эскиз
Бумажный Эскиз

Когда люди нажимают кнопку, чтобы запереть автомобиль, информация о местоположении может быть автоматически записана в микроконтроллер. Затем, когда люди начинают движение к машине, загораются разные светодиоды, указывающие на ее местонахождение, а частота мигания показывает расстояние до машины. Они могут легко следить за миганием светодиода и быстро находить машину.

Шаг 2: Список оборудования

Список оборудования
Список оборудования

Эти компоненты используются в этом проекте. Некоторые из них взяты из комплектов частиц (макет, кнопка, заголовки), другие приобретены на официальном сайте Adafruit (Adafruit Feather M0, модуль Adafruit Ultimate GPS, Lpoly Battery и Coin Cell Battery) и Amazon (NeoPixel Ring - 12 RGB LED).

Шаг 3: Проектирование схемы

Схемотехника
Схемотехника

Neopixel_LED подключен к контакту 6 Feather M0

Button_Unlock подключен к PIN 12 Feather M0

Button_Lock подключен к контакту 13 Feather M0

Шаг 4: Подключение оборудования

Подключение оборудования
Подключение оборудования
Подключение оборудования
Подключение оборудования
Подключение оборудования
Подключение оборудования

Припаяйте заголовки с помощью Adafruit M0 Feather, Adafruit Ultimate GPS Featherwing. Сложите две доски вместе. GPS FeatherWing подключается прямо к плате Feather M0 без каких-либо дополнительных проводов.

Шаг 5: Разработка программного обеспечения

Разработка программного обеспечения
Разработка программного обеспечения

Компоненты для тестирования

Прочитать ИСПРАВЛЕНИЕ

void setup () {

Serial.println («Тест эха GPS»); Serial.begin (9600); Serial1.begin (9600); // по умолчанию скорость передачи данных NMEA GPS}

void loop () {

если (Serial.available ()) {char c = Serial.read (); Serial1.write (c); } если (Serial1.available ()) {char c = Serial1.read (); Serial.write (c); }}

Мигающее светодиодное кольцо

См. Примеры Adafruit NeoPixel.

Функции расчета GPS

Рассчитать азимут

// Рассчитываем азимут

двойной азимут (двойная широта_а, двойная долгота_а, двойная широта_b, двойная долгота_b) {

двойной 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; }

Рассчитайте время по светодиодным часам, которое также является направлением движения автомобиля

// Рассчитываем время по светодиодным часам

int led_time (двойной угол) {

int flag = 0; если (угол = 15) {угол_время = угол_время + 1; } if (flag == 1) {angle_time = 12 - angle_time; } return angle_time; }

Рассчитайте расстояние между человеком и его транспортным средством

// Рассчитываем расстояние

двойное расстояние (двойная широта_а, двойная долгота_а, двойная широта_b, двойная долгота_b) {

двойной EARTH_RADIUS = 6378137.0; двойной radLat1 = (lat_a * PI / 180.0); двойной radLat2 = (lat_b * PI / 180.0); double a = radLat1 - radLat2; двойной 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; return s; }

Функции светодиодного дисплея

Загораются светодиоды по кругу, показывая, что он начинает движение

// Поочередное свечение светодиодных колец показывает, что навигация началась

void colorWipe (uint32_t c, uint8_t wait) {

for (uint16_t i = 0; i strip.setPixelColor (i, c); strip.show (); delay (ждать);}}

Получите частоту светодиода на основе расстояния

// Получить частоту светодиода

int frequency (двойное расстояние) {

int f = (int) расстояние * 20; return f; }

Мигать определенным светодиодом, указывающим направление движения автомобиля

// Отображение на светодиодах

strip.clear ();

strip.show (); задержка (частота (car_person_distance)); // задержка (500); strip.setPixelColor (время_ракурса, strip. Color (0, 0, 255)); strip.show (); задержка (частота (car_person_distance)); // задержка (500);

// Отключить светодиод

если (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_flag = 1; strip.clear (); strip.show (); }

Главный

#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); Adafruit_NeoPixel strip = Adafruit_NeoPixel (Neopixel_LED_NUM, Neopixel_LED_PIN, NEO_GRB + NEO_KHZ800); Кнопка button_lock (Button_Lock_PIN); Кнопка button_unlock (Button_Unlock_PIN); int button_flag = 0; int led_flag = 1; uint32_t timer = millis (); двойной car_lat, car_lon; двойной car_person_distance; двойной move_direction; двойной car_azimuth; двойной car_person_angle; int angle_time;

void setup () {

Serial.begin (115200); // Serial1.begin (9600); GPS.begin (9600); // по умолчанию NMEA GPS baud strip.begin (); // раскомментируйте эту строку, чтобы включить RMC (рекомендуемый минимум) и GGA (фиксированные данные), включая высоту GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); // Устанавливаем частоту обновления GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); // Частота обновления 1 Гц // Запросить обновления статуса антенны, закомментировать, чтобы не шуметь // GPS.sendCommand (PGCMD_ANTENNA); задержка (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); // если предложение получено, мы можем проверить контрольную сумму, проанализировать его … if (GPS.newNMEAreceived ()) {// сложная вещь - если мы напечатаем предложение NMEA или данные // мы не будем слушать и ловить другие предложения! // поэтому будьте очень осторожны, используя OUTPUT_ALLDATA и пытаясь распечатать данные Serial.println (GPS.lastNMEA ()); // это также устанавливает для флага newNMEAreceived () значение false if (! GPS.parse (GPS.lastNMEA ())) // это также устанавливает для флага newNMEAreceived () значение false return; // мы можем не разобрать предложение, и в этом случае мы должны просто дождаться другого} // если цикл millis () или таймер завершается, мы просто сбросим его if (timer> millis ()) timer = millis (); если (миллис () - таймер> 2000) {таймер = миллис (); // сбросить таймер Serial.print ("\ nTime:"); Серийный.печать (GPS.час, DEC); Serial.print (':'); Серийный.печать (GPS.минут, DEC); Serial.print (':'); Серийный.печать (GPS.секунды, DEC); Серийный.принт ('.'); Serial.println (GPS. Миллисекунды); Serial.print ("Дата:"); Серийный.печать (GPS.day, DEC); Серийный.принт ('/'); Serial.print (GPS.month, DEC); Serial.print ("/ 20"); Serial.println (GPS.year, DEC); Serial.print ("Исправить:"); Serial.print ((int) GPS.fix); Serial.print ("качество:"); Serial.println ((int) GPS.fixquality); if (GPS.fix) {Serial.print ("Местоположение:"); Serial.print (широта GPS, 4); Serial.print (GPS.lat); Serial.print (","); Серийный отпечаток (долгота GPS, 4); Serial.println (GPS.lon); Serial.print ("Местоположение (в градусах, работает с Google Maps):"); Serial.print (GPS.latitudeDegrees, 4); Serial.print (","); Serial.println (GPS.longitudeDegrees, 4); Serial.print ("Скорость (узлы):"); Serial.println (GPS.speed); Serial.print ("Угол:"); Serial.println (GPS.angle); Serial.print ("Высота:"); Serial.println (GPS.высота); Serial.print («Спутники:»); Serial.println ((int) GPS.satellites); // Сохраняем GPS автомобиля if (button_lock.read ()) {car_lat = GPS.latitudeDegrees; car_lon = GPS.longitudeDegrees; // для отладки Serial.print ("carLatitude:"); Serial.println (car_lat); Serial.print ("carLongitude:"); Serial.println (car_lon); } // Начать поиск машины if (button_flag == 0) {button_flag = button_unlock.read (); } если (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); // Расчет расстояния // car_person_distance = distance (100.0005, 100.0005, 100.0, 100.0); // для отладки Serial.println (car_person_distance); move_direction = GPS.angle; // Записываем направление движения (угол) // move_direction = 100.0; // Записываем азимут (угол) car_azimuth = azimuth (GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); // car_azimuth = азимут (100.0005, 100.0005, 100.0, 100.0); // Рассчитываем время по светодиодным часам car_person_angle = car_azimuth - move_direction; angle_time = led_time (car_person_angle); // Отображение на светодиодной ленте.clear (); strip.show (); // задержка (частота (car_person_distance)); задержка (500); strip.setPixelColor (время_ракурса, strip. Color (0, 0, 255)); strip.show (); // задержка (частота (car_person_distance)); задержка (500); // Отключить светодиод if (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_flag = 1; strip.clear (); strip.show (); }}} //}}}

Шаг 6: Отладка на макетной плате

Отладка на макетной плате
Отладка на макетной плате
Отладка на макетной плате
Отладка на макетной плате
Отладка на макетной плате
Отладка на макетной плате

Шаг 7: Сборка оборудования

Сборка оборудования
Сборка оборудования
Сборка оборудования
Сборка оборудования
Сборка оборудования
Сборка оборудования

Шаг 8: Дизайн корпуса электроники в Adobe Illustrator

Дизайн корпуса электроники в Adobe Illustrator
Дизайн корпуса электроники в Adobe Illustrator

Шаг 9: Картонный прототип

Картонный прототип
Картонный прототип
Картонный прототип
Картонный прототип

Этот шаг используется для подтверждения размера корпуса и каждой детали модели, чтобы убедиться, что размер коробки, положение кнопки и положение светодиода соответствуют собранным электронным компонентам.

Шаг 10: прототип березовой фанеры

Прототип березовой фанеры
Прототип березовой фанеры
Прототип березовой фанеры
Прототип березовой фанеры

Это был начальный прототип. Наконец, к одной из частей было добавлено квадратное отверстие для подключения к зарядному устройству.

Рекомендуемые: