Спидометры используются для измерения скорости движения транспортного средства. Ранее на нашем сайте мы уже рассматривали создание аналогового спидометра на основе платы Arduino и цифрового спидометра на Arduino и смартфоне на Android. В аналоговом спидометре для измерения скорости мы использовали инфракрасный датчик, а в цифровом – датчик Холла. В этой же статье для измерения скорости мы будем использовать технологию GPS. В большинстве случаев GPS спидометры более точно измеряют скорость чем обычные спидометры. Также технология GPS в настоящее время широко используется в смартфонах и транспортных средствах для навигации и предупреждения о различных дорожных ситуациях.
В данной статье мы рассмотрим создание GPS спидометра на основе платы Arduino, GPS модуля NEO6M и OLED дисплея.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- GPS-модуль GY-NEO6M (купить на AliExpress).
- OLED дисплей с интерфейсом I2C и диагональю экрана 1.3 дюйма (1.3 inch I2C OLED display) (купить на AliExpress — для данного проекта выбирайте вариант дисплея с 4 контактами).
- Макетная плата.
- Соединительные провода.
GPS модуль NEO6M
NEO-6M является популярным GPS приемником со встроенной керамической антенной, которая обеспечивает хороший прием сигнала с GPS спутников. Данный приемник способен отслеживать до 22 спутников и обеспечивает определение местоположения в любой точке земного шара. Модуль имеет аккумулятор для автономной подпитки (backup battery), что позволяет ему сохранять данные когда основное питание схемы отключено.
Ядром модуля является GPS чип NEO-6M от компании u-blox. Он может отслеживать до 22 спутников по 50 каналам и обладает чрезвычайно хорошей чувствительностью (-161 dBm). Модуль поддерживает скорости передачи данных 4800-230400 бод. По умолчанию он настроен на скорость 9600 бод.
Технические характеристики модуля:
- рабочее напряжение: 2.7-3.6V DC (постоянного тока);
- рабочий ток: 67 mA;
- бодовая скорость передачи: 4800-230400 (9600 по умолчанию);
- протокол связи: NEMA;
- интерфейс: UART;
- внешняя антенна и встроенная энергонезависимая память (EEPROM).
Назначение контактов (распиновка) GPS модуля NEO6M:
• VCC: входное питающее напряжение;
• GND: общий контакт (земля);
• RX, TX: контакты для UART (последовательной) связи с микроконтроллером.
На нашем сайте мы уже достаточно часто рассматривали проекты с использованием GPS модулей, список данных проектов можно посмотреть по следующей ссылке.
OLED дисплей
Термин OLED расшифровывается как “Organic Light emitting diode” (органический светоизлучающий диод) и в используемом нами OLED дисплее используется та же самая технология, что и в привычных нам современных телевизорах, только разрешение экрана нашего дисплея существенно меньше чем у телевизоров. С подобными дисплеями проекты на Arduino сразу начинают «сверкать новыми красками» поскольку они обеспечивают значительно более презентабельную картинку чем обычные монохромные ЖК дисплеи. В нашем проекте мы будем использовать монохромный OLED дисплей SH1106 1.28” с 4-мя контактами, подключаемый по интерфейсу I2C.
Технические характеристики дисплея:
- микросхема драйвера: SH1106;
- входное напряжение: 3.3V-5V DC;
- разрешение: 128×64;
- интерфейс: I2C;
- потребление тока: 8 mA;
- цвет пикселов: синий (Blue);
- угол обзора: >160 градусов.
Назначение контактов (распиновка) дисплея:
VCC: питающее напряжение 3.3-5V DC;
GND: общий провод (земля);
SCL: контакт синхронизации интерфейса I2C;
SDA: контакт передачи данных интерфейса I2C.
Сообществом Arduino разработано уже достаточно много библиотек для работы с OLED дисплеями, нам среди них понравилась библиотека Adafruit_SH1106.h – она проста в использовании и позволяет работать с графикой.
Подобный дисплей мы ранее уже использовали в следующих проектах:
- подключение дисплея SSD1306 к плате Arduino;
- умные часы на Arduino и OLED дисплее;
- бесконтактный термометр на Arduino и датчике температуры MLX90614;
- автоматическое управление температурой кондиционера с помощью Arduino.
Схема проекта
Схема GPS спидометра на Arduino и OLED дисплее представлена на следующем рисунке.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе необходимо подключить все используемые библиотеки. В нашем проекте мы будем использовать библиотеку TinyGPS++.h для считывания GPS координат с GPS модуля и библиотеку Adafruit_SH1106.h для работы с OLED дисплеем.
1 2 3 4 |
#include <TinyGPS++.h> #include <SoftwareSerial.h> #include <Wire.h> #include <Adafruit_SH1106.h> |
Далее в программе мы определим адрес I2C для OLED дисплея, который может быть OX3C или OX3D, в нашем случае OX3C. Далее определим контакт сброса (Reset pin) для дисплея. В нашем случае мы определили его как -1, поскольку дисплей использует контакт сброса (Reset pin) платы Arduino.
1 2 3 |
#define OLED_ADDRESS 0x3C #define OLED_RESET -1 Adafruit_SH1106 display(OLED_RESET); |
Далее определим (создадим) объекты классов TinyGPSPlus и Softwareserial. В нашем случае мы с помощью библиотеки Softwareserial для последовательной связи будем использовать контакты 2 и 3 платы Arduino.
1 2 3 |
int RX = 2, TX = 3; TinyGPSPlus gps; SoftwareSerial gpssoft(RX, TX); |
Примечание: здесь идет расхождение с представленной схемой проекта – в схеме мы подключили выход последовательного порта GPS модуля к контакту RX0 платы Arduino. Поэтому либо внесите изменения в текст программы, либо внесите изменения в схему проекта если не хотите изменять программу.
Внутри функции setup() мы инициализируем последовательную связь и OLED дисплей. Установим скорость последовательной связи для приема данных от GPS модуля равную 9600 бод (на эту скорость GPS модуль настроен по умолчанию). В функции инициализации дисплея display.begin параметр SH1106_SWITCHCAPVCC используется для генерации напряжения 3.3V дисплеем изнутри.
1 2 3 4 5 6 7 |
void setup() { Serial.begin(9600); gpssoft.begin(9600); display.begin(SH1106_SWITCHCAPVCC, OLED_ADDRESS); display.clearDisplay(); } |
Внутри функции loop в цикле while мы проверяем принятые из последовательного порта данные, если приняты корректные GPS сигналы, то вызывается функция displayspeed() для отображения значения скорости на экране OLED дисплея.
1 2 3 |
while (gpssoft.available() > 0) if (gps.encode(gpssoft.read())) displayspeed(); |
Внутри функции displayspeed() данные скорости, полученные от GPS модуля, проверяются с помощью функции gps.speed.isValid() и если она возвращает true, то значение скорости отображается на экране OLED дисплея. Размер текста на OLED дисплее мы устанавливаем с помощью функции display.setTextSize, а позицию курсора – с помощью функции display.setCursor. Данные скорости от GPS модуля декодируются с помощью функции gps.speed.kmph() и отображаются на экране дисплея с помощью функции display.display().
1 2 3 4 5 6 7 |
if (gps.speed.isValid()) { display.setTextSize(2); display.setCursor(40, 40); display.print(gps.speed.kmph()); display.display(); } |
Когда аппаратная часть проекта у вас будет готова вы можете загрузить код программы в плату Arduino и протестировать работу GPS спидометра.
Исходный код программы (скетча)
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 |
#include <TinyGPS++.h> #include <SoftwareSerial.h> #include <Wire.h> #include <Adafruit_SH1106.h> #define OLED_ADDRESS 0x3C #define OLED_RESET -1 Adafruit_SH1106 display(OLED_RESET); int RX = 2, TX = 3; TinyGPSPlus gps; SoftwareSerial gpssoft(RX, TX); void setup() { Serial.begin(9600); gpssoft.begin(9600); display.begin(SH1106_SWITCHCAPVCC, OLED_ADDRESS); display.clearDisplay(); display.display(); } void loop() { display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(27, 2); display.print("CIRCUIT DIGEST"); display.setTextSize(1); display.setCursor(35, 20); display.print("SPEED(KMPH)"); display.display(); while (gpssoft.available() > 0) if (gps.encode(gpssoft.read())) displayspeed(); if (millis() > 5000 && gps.charsProcessed() < 10) { display.setTextSize(1); display.setCursor(35, 40); display.print("Error!!!"); display.display(); while (true); } } void displayspeed() { if (gps.speed.isValid()) { display.setTextSize(2); display.setCursor(40, 40); display.print(gps.speed.kmph()); display.display(); } else { display.setTextSize(1); display.setCursor(35, 40); display.print("No Data!!!"); display.display(); } delay(100); } |
2 ответа к “GPS спидометр на Arduino и OLED дисплее своими руками”
А можно ли добавить кол во спутников местоположение и т.п , и как это сделать , помогите
Количество спутников как добавить я не знаю, но местоположение определить достаточно просто, посмотрите вот эти две статьи:
— отслеживание местоположения автомобиля с использованием GPS, GSM и Arduino;
— отслеживание местоположения автомобиля на Google Maps с помощью Arduino, ESP8266 и GPS.