Pull to refresh

RC Авто c GPS на платформе Arduino Nano

Reading time 7 min
Views 18K


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

Машинка, которая используется в комплектации:
  • Сервопривод «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».


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


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


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

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

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

1. Arduino Nano



2. LCD 1602 и I2C


LCD


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

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


GPS-приемник

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

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

Сам скетч:
СКЕТЧ
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); //I2C: SDA pin A4 / SCL pin A5 /VCC pin +3,3V /GND pin GND
#include <SoftwareSerial.h>
#include <TinyGPS.h>
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<len; ++i)
Serial.print(' ');
}
smartdelay(0);
}
static void print_int(unsigned long val, unsigned long invalid, int len)
{
char sz[32];
if (val == invalid)
strcpy(sz, "*******");
else
sprintf(sz, "%ld", val);
sz[len] = 0;
for (int i=strlen(sz); i<len; ++i)
sz[i] = ' ';
if (len > 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».

Всем удачи!
Tags:
Hubs:
+10
Comments 18
Comments Comments 18

Articles