В этой статье мы сделаем GPS-трекер с использованием ESP32, модуля Quectel L86 GPS и OLED-дисплея. Модуль L86 GPS от Quectel — это крошечный, недорогой и энергосберегающий GPS-модуль, доступный на рынке. Он имеет встроенную патч-антенну и чипсет MediaTek MT3333 GNSS нового поколения, который обладает исключительной производительностью как при сборе данных, так и при отслеживании, а также компактной конструкцией.
Он захватывает и отслеживает спутники в кратчайшие сроки даже при уровне сигнала в помещении. По сравнению с модулем GPS NEO-6M и приемником GPS/GNSS RYS8830 этот модуль имеет наилучшую производительность. Он разработан для совместимости с модулем GPS L80 компании Quectel, чтобы обеспечить гибкую и масштабируемую платформу для перехода с GPS на GNSS.
В этом уроке мы соединим модуль Quectel L86 GPS с платой ESP32 и создадим собственный GPS-трекер. Модуль L86 GPS может выдавать значения широты, долготы, скорости, высоты, даты и времени после синхронизации со спутником. Мы отобразим эти параметры на 0,96-дюймовом OLED-экране. Затем с помощью чипа WiFi ESP32 мы отправим координаты GPS на веб-сервер ESP32.
Также на нашем сайте вы можете посмотреть следующие проекты с использованием технологии GPS:
- GPS спидометр на Arduino и OLED дисплее своими руками;
- GPS часы на Arduino Uno;
- GPS трекер на основе Arduino и технологии Lora;
- отслеживание местоположения автомобиля на Google Maps с помощью Arduino, ESP8266 и GPS;
- отслеживание местоположения автомобиля с использованием GPS, GSM и Arduino.
Необходимые компоненты
- Модуль ESP32 (купить на AliExpress).
- GPS-модуль Neo-6M/L86 (купить на AliExpress).
- Модуль OLED дисплея SSD1306 128×64 с интерфейсом I2C (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
GPS-модуль Quectel L86
L86 является идеальным решением для носимых фитнес-устройств благодаря своей сверхкомпактной конструкции и низкому энергопотреблению. Модуль L86 GNSS со встроенной патч-антенной и LNA обеспечивает высокую производительность движка позиционирования MTK для промышленных приложений. Он способен достичь наивысшего в отрасли уровня чувствительности, точности и TTFF с самым низким энергопотреблением в компактном корпусе без выводов. Встроенная флэш-память обеспечивает пользователям возможность хранить некоторые полезные навигационные данные и позволяет выполнять будущие обновления.
L86 имеет патч-антенну сверху размером 18,4±0,15 ×18,4±0,15 ×6,45±0,1 мм, с 99 каналами захвата и 33 каналами слежения. Он захватывает и отслеживает спутники в кратчайшие сроки даже при уровне сигнала в помещении. Модуль работает при напряжении 3 В~4,3 В с типичным потреблением энергии 26 мА, а в режиме ожидания потребление энергии составляет около 1,0 мА .
Основные характеристики
1. Потребляемая мощность: захват 26 мА, отслеживание 22 мА, режим ожидания 1,0 мА, резервное копирование: 7 мкА.
2. Тип приемника: GPS L1 1575,42 МГц C/A Code, GLONASS L1 1598,0625~1605,375 МГц C/A Code, 99 каналов поиска, 33 одновременных канала отслеживания.
3. Чувствительность: захват -148 дБм, повторный захват -160 дБм, отслеживание -165 дБм.
4. Источник питания: 3 В~4,3 В.
5. Частота обновления: до 10 Гц, 1 Гц по умолчанию.
6. Точность сигнала 1PPS: типичная точность: <15 нс, ширина временного импульса 100 мс.
7. Точность ускорения: без помощи 0,1 м/с2.
8. Динамические характеристики: максимальная высота 18000 м, максимальная скорость 515 м/с, ускорение 4G.
9. Порт UART: TXD1 и RXD1 поддерживают скорость передачи данных от 4800 бит/с до 115200 бит/с, по умолчанию 9600 бит/с.
10. Точность измерения скорости: 0,1 м/с.
11. Диапазон рабочих температур : -40~85 C.
12. Встроенная патч-антенна.
13. Встроенный малошумящий усилитель для лучшей чувствительности.
Распиновка L86
Модуль Quectel L86 GPS имеет 12 контактов, как показано на рисунке выше. Функция каждого контакта представлена в следующей таблице.
Номер контакта | Название контакта | Функция |
1 | RXD1 | UART-приемник |
2 | TXD1 | UART-передатчик |
3 | GND | земля (общий провод) |
4 | VCC | Напряжение питания 2,8–4,3 В, обычно 3,3 В |
5 | V_BCKP | Резервное питание для RTC |
6 | 1PPS | Один импульс в секунду, синхронизирован по переднему фронту, ширина импульса 100 мс |
7 | FORCE_ON | Высокий логический уровень заставит модуль выйти из режима резервного копирования. |
8 | AADET_N | Активное обнаружение антенны (Active antenna detection) |
9 | NC | не подключен |
10 | RESET | Сброс модуля |
11 | EX_ANT | Вход внешней активной антенны RF |
12 | GND | земля (общий провод) |
Более подробную информацию об этом модуле вы можете найти в техническом описании L86.
Пайка штыревых выводов к модулю L86
L86 — это крошечный модуль SMD-типа, который не имеет штыревых/гнездовых контактов для тестирования. Поэтому вы можете использовать штыревой контакт с шагом 2,54 и припаять их к печатной плате L86 снизу.
Схема проекта
Схема подключения GPS-модуля L86 и OLED-дисплея к плате ESP32 представлена на следующем рисунке.
Подключение довольно простое. Подключите VCC/GND для питания модуля. Аналогично подключите резервный VCC (V_BCKP) к VCC или к внешней батарее. Модуль GPS не будет работать, если этот вывод не будет запитан. Подключите RX/TX L86 к TX2/RX2 ESP32. Это для последовательной связи с использованием UART2 ESP32.
Подключите контакты SDA и SCL OLED-дисплея к контактам D21 и D22 ESP32. Вы можете запитать OLED-дисплей, используя вывод 3,3 В и GND ESP32. Таким образом, аппаратная настройка и подключения для GPS-трекера готовы.
Печатная плата для проекта
Если вы не хотите собирать схему на макетной плате, а хотите печатную плату для проекта, то вот печатная плата для вас. Я использовал EasyEDA для проектирования печатной платы. Печатная плата для ESP32 GPS-трекера выглядит примерно так, как показано ниже.
Файл Gerber для изготовления данной печатной платы вы можете скачать по следующей ссылке.
Изготовленная печатная плата показана на следующем рисунке.
Исходный код программы
Самое лучшее в модуле L86 GPS/GNSS — это то, что он поддерживает библиотеку Tiny GPS++ . Загрузите библиотеку и добавьте ее в папку библиотеки. Для этого проекта вам также понадобится библиотека SSD1306 OLED.
Теперь скопируйте следующий код и загрузите его на плату ESP32.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
#include <Wire.h> #include <Adafruit_SSD1306.h> #include <TinyGPS++.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels //On ESP32: GPIO-21(SDA), GPIO-22(SCL) #define OLED_RESET -1 //Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C //See datasheet for Address Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #define RXD2 16 #define TXD2 17 HardwareSerial neogps(1); TinyGPSPlus gps; void setup() { Serial.begin(115200); //Begin serial communication Arduino IDE (Serial Monitor) //Begin serial communication Neo6mGPS neogps.begin(9600, SERIAL_8N1, RXD2, TXD2); // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } display.clearDisplay(); display.display(); delay(2000); } void loop() { boolean newData = false; for (unsigned long start = millis(); millis() - start < 1000;) { while (neogps.available()) { if (gps.encode(neogps.read())) { newData = true; } } } //If newData is true if(newData == true) { newData = false; Serial.println(gps.satellites.value()); print_speed(); } else { display.clearDisplay(); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.setTextSize(3); display.print("No Data"); display.display(); } } void print_speed() { display.clearDisplay(); display.setTextColor(SSD1306_WHITE); if (gps.location.isValid() == 1) { //String gps_speed = String(gps.speed.kmph()); display.setTextSize(1); display.setCursor(25, 5); display.print("Lat: "); display.setCursor(50, 5); display.print(gps.location.lat(),6); display.setCursor(25, 20); display.print("Lng: "); display.setCursor(50, 20); display.print(gps.location.lng(),6); display.setCursor(25, 35); display.print("Speed: "); display.setCursor(65, 35); display.print(gps.speed.kmph()); display.setTextSize(1); display.setCursor(0, 50); display.print("SAT:"); display.setCursor(25, 50); display.print(gps.satellites.value()); display.setTextSize(1); display.setCursor(70, 50); display.print("ALT:"); display.setCursor(95, 50); display.print(gps.altitude.meters(), 0); display.display(); } else { display.clearDisplay(); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.setTextSize(3); display.print("No Data"); display.display(); } } |
Тестирование работы проекта
После загрузки кода OLED-дисплей не будет отображать никаких сообщений, поскольку модуль GPS не синхронизирован со спутником . В первый раз может потребоваться 2-3 минуты для получения данных. В следующий раз он будет получать местоположение очень быстро.
OLED-дисплей покажет широту, долготу, высоту, скорость и общее количество спутников. Вы можете вынести устройство на улицу и зарядить его с помощью внешнего аккумулятора или автомобильного USB-порта и отслеживать местоположение по GPS.
ESP32 GPS-трекер на веб-сервере
Вместо отображения значения на OLED-дисплее мы можем подключить WiFi-модуль ESP32 к сети WiFi. Используя статическую веб-страницу, мы можем создать веб-сервер, на котором мы можем отображать данные GPS.
Полный код для ESP32 GPS-трекера на веб-сервере приведен ниже. В этом коде измените WiFi SSID и пароль.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
#include <Wire.h> #include <Adafruit_SSD1306.h> #include <TinyGPS++.h> #include <WiFi.h> #include<WiFiServer.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels const char* ssid = "BELL685"; //ssid of your wifi const char* password = "644642755D2F"; //password of your wifi WiFiServer server(80); //On ESP32: GPIO-21(SDA), GPIO-22(SCL) #define OLED_RESET -1 //Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C //See datasheet for Address Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #define RXD2 16 #define TXD2 17 HardwareSerial neogps(1); TinyGPSPlus gps; void setup() { Serial.begin(115200); //Begin serial communication Arduino IDE (Serial Monitor) //Begin serial communication Neo6mGPS neogps.begin(9600, SERIAL_8N1, RXD2, TXD2); // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for (;;); // Don't proceed, loop forever } display.clearDisplay(); display.display(); delay(2000); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); //connecting to wifi while (WiFi.status() != WL_CONNECTED)// while wifi not connected { delay(500); Serial.print("."); //print "...." } Serial.println(""); Serial.println("WiFi connected"); server.begin(); Serial.println("Server started"); Serial.println(WiFi.localIP()); // Print the IP address display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.setTextSize(2); display.print("IP Address"); display.setCursor(20, 30); display.setTextSize(1); display.print(WiFi.localIP()); display.display(); delay(5000); } void loop() { boolean newData = false; for (unsigned long start = millis(); millis() - start < 1000;) { while (neogps.available()) { if (gps.encode(neogps.read())) { newData = true; } } } //If newData is true if (newData == true) { newData = false; Serial.println(gps.satellites.value()); print_speed(); } else { display.clearDisplay(); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.setTextSize(3); display.print("No Data"); display.display(); } WiFiClient client = server.available(); // Check if a client has connected if (!client) { return; } // Prepare the response String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n <!DOCTYPE html> <html> <head> <title>GPS DATA</title> <style>"; s += "a:link {background-color: RED;text-decoration: none;}"; s += "table, th, td </style> </head> <body style=background-color:WHITE>"; s += "<h1 style=color:RED;font-size:400%"; s += " ALIGN=CENTER>GPS RECEIVER DATA </h1>" ; s += "<p ALIGN=CENTER style=color:BLUE;font-size:250% >"; s += "<b>Location Details</b></p> <table ALIGN=CENTER style="; s += "font-size:250%;"; s += "> <tr> <th>Latitude :- </th>"; s += "<td ALIGN=CENTER >"; s += (gps.location.lat()); s += "</td> </tr> <tr> <th>Longitude :-</th> <td ALIGN=CENTER >"; s += (gps.location.lng()); s += "</td> </tr> <tr> <th>Speed :-</th> <td ALIGN=CENTER >"; s += (gps.speed.kmph()); s += (" kmph"); s += "</td></tr> <tr> <th>Altitude :-</th> <td ALIGN=CENTER >"; s += (gps.altitude.meters()); s += (" m"); s += "</td> </tr> </table> "; s += "</body> </html> "; client.print(s); // all the values are send to the webpage delay(100); } void print_speed() { display.clearDisplay(); display.setTextColor(SSD1306_WHITE); if (gps.location.isValid() == 1) { //String gps_speed = String(gps.speed.kmph()); display.setTextSize(1); display.setCursor(25, 5); display.print("Lat: "); display.setCursor(50, 5); display.print(gps.location.lat(), 6); display.setCursor(25, 20); display.print("Lng: "); display.setCursor(50, 20); display.print(gps.location.lng(), 6); display.setCursor(25, 35); display.print("Speed: "); display.setCursor(65, 35); display.print(gps.speed.kmph()); display.setTextSize(1); display.setCursor(0, 50); display.print("SAT:"); display.setCursor(25, 50); display.print(gps.satellites.value()); display.setTextSize(1); display.setCursor(70, 50); display.print("ALT:"); display.setCursor(95, 50); display.print(gps.altitude.meters(), 0); display.display(); } else { display.clearDisplay(); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.setTextSize(3); display.print("No Data"); display.display(); } } |
После загрузки кода вы можете открыть Serial Monitor (окно монитора последовательной связи), чтобы получить IP-адрес модуля ESP32.
Перейдите в веб-браузер и введите IP-адрес, который отобразился в окне монитора последовательной связи. Затем нажмите Enter.