[Из песочницы] RC Авто c GPS на платформе Arduino Nano

d67db3b26af24911938126975efd41b9.jpg

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

  • Сервопривод «HARD HS3004»
  • Двигатель «Leopard 4370KV»;
  • Регулятор для двигателя «Leopard V2»
  • Батарейка «Li-Pol 7,2V 30C 5000mA»;
  • Приемник »2,4Ghz» 3 канала;
  • Пульт управления»2,4Ghz Digital Proportional R/C system»


Задача сделать на имеющей машинке:

  1. Установить все световые огни и кнопку
  2. Установить аппаратуру ардуино
  3. Закачать программу в ардуино
  4. Настройка программы


Установка световых огней. Я взял готовые светодиоды с проводами из набора «RC Car Flashing Light System».

52ed5f31575145748c2a3a3e303b2438.png
Установка передних фар (они же являются габаритами) и поворотников

510f6cc912234d628c94c0288a4e5f6f.jpg
Установка аппаратуры ардуино Nano и GPS, все закрепил двухсторонем скотчем и винтами

3b63170fa06747c8a008f40d9f555143.png
Установка LCD на заднем стекле, закрепил винтами

Что понадобится для сборки:
Arduino Nano, цена от 200 р.
GPS приемник, цена от 900 р.
Светодиоды, цена от 100 р. / Светодиоды белые, 3 шт. (передние фары и задний ход), красные 2 шт. (тормоз), оранжевые 2 шт. (поворотники)
Провода, цена от 100 р.
LCD и I2C, цена от 200 р.
Кнопка и резистор, цена от 100 р. / Кнопка (сброс скорости и включение мигалок) и резистор 10 кОм

Цена проекта получилось 1600 рублей.

1. Arduino Nano

e0df9f1d9c78415fafd6e61b7f587009.png

2. LCD 1602 и I2C

72981988aa414b54bc3653a0d570db61.png
LCD

62e64b4b72044d9a9577cd011a895f0c.png
Задняя сторона LCD и припаял к нему модуль I2C

3. GPS-GY-NEO-6MV2 (GPS приемник)

a73eccd371024c98a6a9deb6d674c742.jpg
GPS-приемник

Устанавливаем программу для ардуино в комп и закачиваем скетч в ардуино.

Если не хватает библиотеки, то нужно их скачать и установить на компе: LiquidCrystal_I2C.h, EEPROM.h, Wire.h, SoftwareSerial.h, TinyGPS.h.

Сам скетч:

СКЕТЧ

#include #include #include LiquidCrystal_I2C lcd(0x27, 16, 2); //I2C: SDA pin A4 / SCL pin A5 /VCC pin +3,3V /GND pin GND #include #include TinyGPS gps; SoftwareSerial ss(4, 3); // GPS: RX pin D4, TX pin D3, VCC pin +5V ,GND pin GND static void smartdelay(unsigned long ms); static void print_float(float val, float invalid, int len, int prec); static void print_int(unsigned long val, unsigned long invalid, int len); static void print_date(TinyGPS &gps); float flat, flon; // unsigned long fix_age, time, date, speed, course; // int value; int value2; int pin = 7; //поворотник D7 int pins = 8; //движение D8 int pin1 = 11;//Светодиод оранжевый: влево D11 int pin2 = 12;// Светодиод оранжевый: вправо D12 int pin3 = 10;// Светодиоды красные: тормоз D10 int pin4 = 9;// Светодиоды белые : вперед D9 int pin6 = 6;// Светодиод белый : задний ход D6 unsigned long duration1;//центр 1372 ,влево 1834 ,вправо973 unsigned long duration2;//тормоз 1834 ,вперед 973 int pin7 = 2;// Светодиод мигалка красная: pin D2 int pin8 = 13;// Светодиод мигалка синяя pin D13 const int buttonPin = 5; // Кнопка (сброса) номер входа, подключенный к кнопке pin D5 int buttonState = 0; // переменная для хранения состояния кнопки void setup() { pinMode(pin, INPUT); pinMode(pin1, OUTPUT); pinMode(pin2, OUTPUT); pinMode(pins, INPUT); pinMode(pin3, OUTPUT); pinMode(pin4, OUTPUT); pinMode(pin6, OUTPUT); pinMode(pin7, OUTPUT); pinMode(pin8, OUTPUT); pinMode(buttonPin, INPUT); // инициализируем пин, подключенный к кнопке, как вход Serial.begin(115200); //для отладки ss.begin(9600); //gps Serial.println("RRRR777"); lcd.init(); // инициализация ЖК lcd.clear(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("RRRR777 2015"); lcd.setCursor(0, 1); lcd.print(" GPS RCavto"); digitalWrite(pin7, HIGH); // digitalWrite(pin8, LOW); // delay(500); // ждем digitalWrite(pin8, HIGH); // digitalWrite(pin7, LOW); // delay(500); // ждем digitalWrite(pin7, HIGH); // digitalWrite(pin8, LOW); // delay(500); // ждем с digitalWrite(pin8, HIGH); // digitalWrite(pin7, LOW); // delay(500); // ждем digitalWrite(pin7, HIGH); // digitalWrite(pin8, LOW); // delay(500); // ждем digitalWrite(pin7, HIGH); // digitalWrite(pin8, LOW); // delay(500); // ждем digitalWrite(pin8, HIGH); // digitalWrite(pin7, LOW); // delay(500); // ждем digitalWrite(pin7, HIGH); // digitalWrite(pin8, LOW); // delay(500); // ждем с digitalWrite(pin8, HIGH); // digitalWrite(pin7, LOW); // delay(500); // ждем digitalWrite(pin7, HIGH); // digitalWrite(pin8, LOW); // delay(500); digitalWrite(pin7, LOW); // digitalWrite(pin8, LOW); // delay(500); // ждем lcd.clear(); delay(500); } void loop() { duration1 = pulseIn(pin, HIGH); duration2 = pulseIn(pins, HIGH); if ((duration1 > 1500) && (duration1 < 2000)) {digitalWrite(pin1, HIGH); // зажигаем светодиод LEFT delay(250); // ждем секунду digitalWrite(pin1, LOW); // выключаем светодиод } if ((duration1 < 1300) && (duration1 > 800)) {digitalWrite(pin2, HIGH); // зажигаем светодиод RIGHT delay(250); // ждем секунду digitalWrite(pin2, LOW); // выключаем светодиод } if ((duration2 > 1480) && (duration2 < 2000))//ФАРЫ { analogWrite(pin4, 20); //габариты задние analogWrite(pin3, 255); // зажигаем светодиод фары delay(500); // ждем } if ((duration2 < 1480) && (duration2 > 800)) //ТОРМОЗ {analogWrite(pin4, 255); // светодиод тормоз analogWrite(pin3, 20); // зажигаем светодиод фары габариты+* digitalWrite(pin6, LOW); // выключаем светодиод delay(50); } if ((duration2 < 1400) && (duration2 > 800))//Задний ход {//digitalWrite(pin4, LOW); // зажигаем светодиод digitalWrite(pin6, HIGH); // зажигаем светодиод delay(500); // ждем секунду } float flat, flon; unsigned long age, date, time, chars = 0; unsigned short sentences = 0, failed = 0; float h = gps.f_speed_kmph(); // speed in km/hr int h1 = (h-(int)h)*100; Serial.println(h); lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Mersedes GT3"); // название машины lcd.setCursor(0, 1); lcd.print("S="); lcd.print(h); lcd.setCursor(8, 1); lcd.print("MS="); value = EEPROM.read(0); //чтение из памяти value2 = EEPROM.read(1); lcd.print(value); lcd.print("."); lcd.print(value2); buttonState = digitalRead(buttonPin);// считываем значения с входа кнопки if (buttonState == HIGH)// LOW) /// { EEPROM.write (0,0); EEPROM.write (1,0); lcd.setCursor(8, 1); lcd.print("MS=RESET"); digitalWrite(pin7, HIGH); // digitalWrite(pin8, LOW); // delay(500); // ждем digitalWrite(pin8, HIGH); // digitalWrite(pin7, LOW); // delay(500); // ждем digitalWrite(pin7, HIGH); // digitalWrite(pin8, LOW); // delay(500); // ждем с digitalWrite(pin8, HIGH); // digitalWrite(pin7, LOW); // delay(500); lcd.setCursor(0, 1); lcd.print("Rusticktigr777@mail.ru"); digitalWrite(pin7, HIGH); // digitalWrite(pin8, LOW); // delay(500); // ждем digitalWrite(pin8, HIGH); // digitalWrite(pin7, LOW); // delay(500); // ждем digitalWrite(pin7, HIGH); // digitalWrite(pin8, LOW); // delay(500); // ждем с digitalWrite(pin8, HIGH); // digitalWrite(pin7, LOW); // delay(500); // ждем digitalWrite(pin7, HIGH); // digitalWrite(pin8, LOW); // delay(500); digitalWrite(pin8, HIGH); // digitalWrite(pin7, LOW); // delay(500); // ждем digitalWrite(pin7, HIGH); // digitalWrite(pin8, LOW); // delay(500); // ждем с digitalWrite(pin8, HIGH); // digitalWrite(pin7, LOW); // delay(500); // ждем digitalWrite(pin7, HIGH); // digitalWrite(pin8, LOW); // delay(500); digitalWrite(pin7, LOW); // digitalWrite(pin8, LOW); // } if (h > value)//RECORD { EEPROM.write (0,h); EEPROM.write (1,h1); } smartdelay(500); } static void smartdelay(unsigned long ms) { unsigned long start = millis(); do { while (ss.available()) gps.encode(ss.read()); } while (millis() - start < ms); } static void print_float(float val, float invalid, int len, int prec) { if (val == invalid) { while (len-- > 1) Serial.print('*'); Serial.print(' '); } else { Serial.print(val, prec); int vi = abs((int)val); int flen = prec + (val < 0.0 ? 2 : 1); // . and - flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1; for (int i=flen; i 0) sz[len-1] = ' '; Serial.print(sz); smartdelay(0); } static void print_date(TinyGPS &gps) { int year; byte month, day, hour, minute, second, hundredths; unsigned long age; gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age); if (age == TinyGPS::GPS_INVALID_AGE) Serial.print("********** ******** "); else { char sz[32]; sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ", month, day, year, hour, minute, second); Serial.print(sz); } print_int(age, TinyGPS::GPS_INVALID_AGE, 5); smartdelay(0); }


Подключение проводов к ардуино:

Провода
I2C: SDA pin A4 / SCL pin A5 /VCC pin +3,3V /GND pin GND (установить максимальная яркость и подсветку)
GPS: RX pin D4, TX pin D3, VCC pin +5V, GND pin GND
Кнопка сброса (нормально разомкнутая кнопка): один контакт VCC pin +5V, другой контакт на pin D5, резистор на pin D5 и pin GND
Светодиоды: Фары передние (габариты) белые »+» на pin D9
Светодиоды: Фары задние (габариты) красные »+» на pin D10
Светодиод: Задний ход белый »+» на pin D6
Светодиоды: Фары передние (габариты) белые »+» на pin D9
Светодиод: Поворот влево оранжевый »+» на pin D11
Светодиод: Поворот вправо оранжевый »+» на pin D12
Светодиод: Мигалка красный »+» на pin D2
Светодиод: Мигалка синий »+» на pin D13
Для всех Светодиодов »-» на pin GND

Подключаем провод для поворотников на pin D7 от входа сервомашинки поворотов (три провода обычно это белый к нему подпаеваемся и выводим провод на pin D7, красный — питание плюс, черный — питание минус, подключается к приемнику).

Подключаем провод для движения на pin D8 от входа сервомашинки двигателя (три провода: обычно это белый, к нему подпаеваемся и выводим провод на pin D8, красный — питание плюс, черный — питание минус, подключается к приемнику).

Питание для Ардуино берется прямо из аккумулятора »+» на pin VIN (в моем 7,2в). Общий провод GND для Ардуино прямо из аккумулятора »-».

Настройка: если не правильно срабатывает при поворотах или движении, то через программу на компьютере изменяем значения на свои: в строчках if ((durationХ > ХХХХ) && (durationХ < ХХХХ)) если не обрабатывается данные и горит зеленый светодиод на плате GPS, TX/RX возможно нужно поменять местами RX pin D4, TX pin D3,)

P.S. Идея оказалось несложной, зная программирование, можно еще добавить в эту машинку температуру в двигателе и оповещение о ней, добавить моточасы, тахометр и видеокамеру на «Mercedes-Benz GT3».

Всем удачи!

© Geektimes