Блог о программировании, электронике и рыбалке

Ведроид-мобиль — робот на Arduino — Часть 3. Подключаем Bluetooth

arduino роботВ этот раз я опишу процесс подключения к моему роботу "Ведроид-мобиль" модуля Bluetooth JY-MCU и реализую управление через смартфон на Android.

Ранее я описал процесс сборки мотоплатформы для робота на Arduinoподключения модуля Motor Shield и работу с ним.

Модернизация Motor Shield

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

 arduino робот

Меня этот нюанс совсем не устраивает. Именно поэтому я решил взяться за паяльник и привести Motor Shield к удобному для меня виду.

arduino робот

Аккуратно выдрал родные панельки контактов и выкинул их нафиг.

arduino робот

Установил на их место нормальные.

arduino робот

В таком виде модулем стало пользоваться гораздо удобнее. Теперь я смогу нормально подключить провода от Bluetooth в разъемы, а не припаивать их намертво к контактам на Motor Shield.

Bluetooth модуль JY-MCU для Arduino

arduino робот

Сам Bluetooth модуль JY-MCU довольно миниатюрный. В комплект поставки входит кабель для подключения. Назначение выводов расписано на обратной стороне.

arduino робот

Запитать его можно от источника питания 3,6-6В. Это предоставляет нам возможность подключить его напрямую к Arduino без использования стабилизатора или делителя напряжения.

Код, используемый при подключении к устройству: 1234.

Подключение Bluetooth JY-MCU к Arduino Mega 2560

Подключение довольно простое.

Официальная схема подключения:

  • VCC на JY-MCU подключаем к +5В Arduino
  • GND на JY-MCU подключаем к GND Arduino
  • TXT на JY-MCU подключаем к RX (0) на Arduino
  • RXD на JY-MCU подключаем к TX (1) на Arduino

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

Меня такой вариант не устраивает, поэтому я решил использовать дискретные порты с поддержкой Serial.

Неофициальная схема подключения:

  • VCC на JY-MCU подключаем к +5В Arduino
  • GND на JY-MCU подключаем к GND Arduino
  • TXT на JY-MCU подключаем к дискретному PIN 50 на Arduino
  • RXD на JY-MCU подключаем к дискретному PIN 51 на Arduino

Вот теперь можно загружать скетчи без отключения питания модуля Bluetooth.

Чтобы закрепить Bluetooth, я решил использовать плату Proto Shield и миниатюрную беспаечную макетную плату. К ней в будущем и буду подключать остальное оборудование, элементы управления и индикации.

arduino роботarduino роботarduino робот

Скетч для управления роботом на Arduino по Bluetooth через смартфон на Android

В своём скетче я реализовал следующие функции:

  • Движение вперед
  • Движение назад
  • Разворот влево
  • Разворот вправо
  • Плавный поворот влево при движении вперед
  • Плавный поворот вправо при движении вперед
  • Плавный поворот влево при движении назад
  • Плавный поворот вправо при движении назад
  • Остановка
  • Установка скорости 0%
  • Установка скорости 10%
  • Установка скорости 20%
  • Установка скорости 30%
  • Установка скорости 40%
  • Установка скорости 50%
  • Установка скорости 60%
  • Установка скорости 70%
  • Установка скорости 80%
  • Установка скорости 90%
  • Установка скорости 100%

В скетче использовал функции, чтобы не дублировать код при схожих событиях.

#include <AFMotor.h> // Подключаем библиотеку для управления двигателями
#include <Servo.h>   // Подключаем библиотеку для сервоприводов 
#include <SoftwareSerial.h> // Подключаем библиотеку для работы с Serial через дискретные порты

//Создаем объекты для двигателей
AF_DCMotor motor1(1); //канал М1 на Motor Shield — задний левый
AF_DCMotor motor2(2); //канал М2 на Motor Shield — задний правый
AF_DCMotor motor3(3); //канал М3 на Motor Shield — передний левый
AF_DCMotor motor4(4); //канал М4 на Motor Shield — передний правый

// Создаем объект для сервопривода
Servo vservo;

SoftwareSerial BTSerial(50, 51); // RX, TX

// Создаем переменную для команд Bluetooth
char vcmd;
// Создаем переменные для запоминания скорости двигателей
int vspdL, vspdR;
/* Создаем переменную, на значение которой будет уменьшаться скорость при плавных поворотах.
Текущая скорость должна быть больше этого значения.  В противном случае двигатели со стороны направления поворота просто не будут вращаться */
int vspd = 200;

void setup() {
  // Устанавливаем скорость передачи данных по Bluetooth
  BTSerial.begin(9600);
  // Устанавливаем скорость передачи данных по кабелю
  Serial.begin(9600);
  // Выбираем пин к которому подключен сервопривод
  vservo.attach(9); // или 10, если воткнули в крайний разъём
  // Поворачиваем сервопривод в положение 90 градусов при каждом включении
  vservo.write(90); 
  // Устанавливаем максимальную скорость вращения двигателей
  vspeed(255,255);
}

void loop() {
  // Если есть данные
  if (BTSerial.available())
  {
    // Читаем команды и заносим их в переменную. char преобразует код символа команды в символ
    vcmd = (char)BTSerial.read();
    // Отправляем команду в порт, чтобы можно было их проверить в "Мониторе порта"
    Serial.println(vcmd);

    // Вперед
    if (vcmd == 'F') {
      vforward();
    }
    // Назад
    if (vcmd == 'B')
    {
      vbackward();
    }
    // Влево
    if (vcmd == 'L')
    {
      vleft();
    }    
    // Вправо
    if (vcmd == 'R')
    {
      vright();
    } 
    // Прямо и влево
    if (vcmd == 'G')
    {
      vforwardleft();
    } 
    // Прямо и вправо
    if (vcmd == 'I')
    {
      vforwardright();
    } 
    // Назад и влево
    if (vcmd == 'H')
    {
      vbackwardleft();
    } 
    // Назад и вправо
    if (vcmd == 'J')
    {
      vbackwardright();
    } 
    // Стоп
    if (vcmd == 'S')
    {
      vrelease();
    }
    // Скорость 0%
    if (vcmd == '0')
    {
      vspeed(0,0);
    }
    // Скорость 10%
    if (vcmd == '1')
    {
      vspeed(25,25);
    }
    // Скорость 20%
    if (vcmd == '2')
    {
      vspeed(50,50);
    }
    // Скорость 30%
    if (vcmd == '3')
    {
      vspeed(75,75);
    }
    // Скорость 40%
    if (vcmd == '4')
    {
      vspeed(100,100);
    }
    // Скорость 50%
    if (vcmd == '5')
    {
      vspeed(125,125);
    }
    // Скорость 60%
    if (vcmd == '6')
    {
      vspeed(150,150);
    }
    // Скорость 70%
    if (vcmd == '7')
    {
      vspeed(175,175);
    }
    // Скорость 80%
    if (vcmd == '8')
    {
      vspeed(200,200);
    }
    // Скорость 90%
    if (vcmd == '9')
    {
      vspeed(225,225);
    }
    // Скорость 100%
    if (vcmd == 'q')
    {
      vspeed(255,255);
    }
  }
}

// Вперед
void vforward() {
  vspeed(vspdL,vspdR);
  vforwardRL();
}

// Вперед для RL
void vforwardRL() {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
}

// Назад
void vbackward() {
  vspeed(vspdL,vspdR);
  vbackwardRL();
}

// Назад для RL
void vbackwardRL() {
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
}

// Влево
void vleft() {
  vspeed(vspdL,vspdR);
  motor1.run(BACKWARD);
  motor2.run(FORWARD);
  motor3.run(BACKWARD);
  motor4.run(FORWARD);
}

// Вправо
void vright() {
  vspeed(vspdL,vspdR);
  motor1.run(FORWARD);
  motor2.run(BACKWARD);
  motor3.run(FORWARD);
  motor4.run(BACKWARD);
}

// Вперед и влево
void vforwardleft() {
  if (vspdL > vspd) {
    vspeed(vspdL-vspd,vspdR);
  }
  else
  {
    vspeed(0,vspdR);
  }
  vforwardRL();
}

// Вперед и вправо
void vforwardright() {
  if (vspdR > vspd) {
    vspeed(vspdL,vspdR-vspd);
  }
  else
  {
    vspeed(vspdL,0);
  }
  vforwardRL();
}

// Назад и влево
void vbackwardleft() {
  if (vspdL > vspd) {
    vspeed(vspdL-vspd,vspdR);
  }
  else
  {
    vspeed(0,vspdR);
  }
  vbackwardRL();
}

// Назад и вправо
void vbackwardright() {
  if (vspdR > vspd) {
    vspeed(vspdL,vspdR-vspd);
  }
  else
  {
    vspeed(vspdL,0);
  }
  vbackwardRL();
}

// Стоп
void vrelease(){
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
}

// Изменение скорости
void vspeed(int spdL,int spdR){
  if (spdL == spdR) {
    vspdL=spdL;
    vspdR=spdR;
  }
  motor1.setSpeed(spdL);
  motor2.setSpeed(spdR);
  motor3.setSpeed(spdL);
  motor4.setSpeed(spdR);
}

Программа Bluetooth RC Car - управление роботом-машинкой со смартфона на Android

В свой смартфон я установил программу Bluetooth RC Car. На мой взгляд  - это лучшая софтинка для управления роботом-машинкой.

arduino робот

Программа позволяет передавать команды при нажатии на кнопки или реагировать на данные с акселерометра в смартфоне, регулировать скорость движения ползунком, включать передние и задние фонари, включать и выключать звуковой сигнал, включать и выключать сигнал “аварийка”.

arduino робот

arduino робот

arduino робот

Для работы программы требуется Android версии 2.3.3 или выше. Размер программы 3 мегабайта.

Список команд:

  • F – вперед
  • B – назад
  • L – влево
  • R – вправо
  • G – прямо и влево
  • I – прямо и вправо
  • H – назад и влево
  • J – назад и вправо
  • S – стоп
  • W – передняя фара включена
  • w – передняя фара выключена
  • U – задняя фара включена
  • u – задняя фара выключена
  • V – звуковой сигнал включен
  • v – звуковой сигнал выключен
  • X – сигнал “аварийка” включен
  • x - сигнал “аварийка” выключен
  • 0 – скорость движения 0%
  • 1 – скорость движения 10%
  • 2 – скорость движения 20%
  • 3 – скорость движения 30%
  • 4 – скорость движения 40%
  • 5 – скорость движения 50%
  • 6 – скорость движения 60%
  • 7 – скорость движения 70%
  • 8 – скорость движения 80%
  • 9 – скорость движения 90%
  • q – скорость движения 100%

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

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

Принцип передачи команд: при нажатии на кнопку в программе, команда передается по Bluetooth один раз, а при отпускании кнопки сразу передается команда S-остановка.

Демонстрация работы

В следующий раз я планирую подключить к роботу ультразвуковой дальномер и реализовать алгоритм объезда препятствий.

Не забывайте оценивать и комментировать статьи, чтобы автор понимал — стоит ли писать на похожие темы или это интересно только ему одному :)

Читайте нас в социальных сетях

вконтакте twitter google plus facebook
  • keyboard_arrow_downВедроид-мобиль — робот на Arduino — Часть 3. Подключаем Bluetooth
    • Автор:
    • Язык: ru-RU
    • Миниатюра: https://geekelectronics.org/wp-content/uploads/2017/05/image_thumb7-4.png
    • Рубрика: Arduino
    • Обновлено: 12.12.2017
    • Комментариев: 72
    • Просмотров: 33 096
  • Оцените пожалуйста статью
    1 Star2 Stars3 Stars4 Stars5 Stars 17 votes, average: 4,59 out of 5
    Loading Загрузка...
  • Поделитесь с друзьями
logo

Комментариев: 72

  • Avatar for source
    Вадим:

    Поскорее бы 4 часть =)

  • Avatar for source
    Вадим:

    Кароче надо бы 4 часть поскорее =)

  • Avatar for source
    source:

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

    • Avatar for source
      Сергей:

      Припаяй прямо на клемы всех движков керамические кондеры на 0.1мкФ, они снимут помехи которые создают движки.

  • Avatar for source
    ECO9:

    Oh please! we need translation to english!!!!

  • Avatar for source
    mit551:

    А для L298N и 2 моторов можно такую же? Ну нету Motor Shield....

  • Avatar for source
    Вадим:

    А 293 не греется? у меня после 20 секунд пылает!

  • Avatar for source
    Тоха:

    'vleft' was not declared in this scope - сплошные ошибки

    • Avatar for source
      source:

      закинул код с сайта в компилятор для проверки - все нормально. ошибок нет.

  • Avatar for source
    Вадим:

    Супер проект, супер админ! Сделал себе тоже машинку и переделал android программу, а то фон странный какой-то =)

  • Avatar for source
    Вадим:

    А куда часть 4 делась???

  • Avatar for source
    денис:

    Скажите пожалуйста такой по дойдет модуль Bluetooth модуль BCD110SC-01. Заренее спасибо

    • Avatar for source
      source:

      подойдет, но учтите, что питание у него только 3,3 вольта - не тыкните случайно в 5 вольт.

  • Avatar for source
    никита:

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

  • Avatar for source
    Олег:

    Все собрал по схеме, подскажите когда нажимаю на кнопки движения раздается какой-то звук а колеса не крутятся. Подскажите в чем может быть проблема?

  • Avatar for source
    никита:

    Все сделал все собрал но одна проблема со скетчем когда я залил его в программу Arduino 1.0.5 она пишет сплошную ошибку. Подскажите пожалуйста что мне сделать.

  • Avatar for source
    никита:

    Здравствуйте.А какой у вас стоит на компьютере компилятор?

  • Avatar for source
    Никита:

    Здравствуйте. Вы можете скинуть ссылку на ваш компилятор. Заранее спасибо!

  • Avatar for source
    Олег:

    Пользовался этим кодом все гуд

  • Avatar for source
    Александр:

    Здравствуйте. Проект очень хороший респект автору! Я сам начинающий ардуинист)) Пара вопросов возникло. У меня железо немного другое. Mega Sensor Shield v.2.0 и драйвер на 4 DC. Пишу скетч по Вашему аналогу и не могу понять как у Вас компиляция проходит хорошо.
    // Вперед
    if (vcmd == 'F') {
    vforward();
    }
    Что такое vforward(); ? У меня ругается что это не где не опубликовано.
    P.s за ранее Спасибо

    • Avatar for source
      source:

      vforward() - функция движения вперед. Смотрите ниже по коду.

  • Avatar for source
    Александр:

    mit551
    Вот я как написал для L298N

    #define robot_go digitalWrite(D22, HIGH); digitalWrite(D25, HIGH); digitalWrite(D26, HIGH); digitalWrite(D29, HIGH); digitalWrite(D23,LOW); digitalWrite(D24, LOW); digitalWrite(D27, LOW); digitalWrite(D28, LOW);

    robot_go используйте для движения вперед

  • Avatar for source
    Александр:

    Я так понял это опечатка?

    TXT на JY-MCU подключаем к RX (0) на Arduino
    RXD на JY-MCU подключаем к TX (1) на Arduino

  • Avatar for source
    Алексей:

    Отличный проект, все понял кроме одной мелочи - где взять "правильные" панельки контактов? На ебэе все варианты панелек типа "мама" с короткими ногами.

    • Avatar for source
      source™:

      http://ru.aliexpress.com/item/10pcs-10-Pin-Female-tall-stackable-Header-Connector-socket-for-Arduino/1095902757.html

      • Avatar for source
        Алексей:

        Большое спасибо. :)
        Буду с нетерпением ждать следующих проектов в Вашем исполнении. ;)

  • Avatar for source
    Денис:

    В целом все отлично, но скорости в этом коде не работают, хотя по логике должны. В мониторе смотрел, команда с телефона приходит. Не пойму в чем дело.

    • Avatar for source
      source™:

      С момента написания статьи программа управления несколько раз обновлялась. Посмотрите в ее настройках - может коды регулировки скорости поменялись.

      • Avatar for source
        Денис:

        Нет, скорость все так же задается цифрами от 0 до 9 и q - полная. С телефона сигнал приходит, но значение скорости не меняется, я даже в монитор его выводил для проверки.
        Не знаю как раньше, сейчас программа с телефона постоянно спамит символ "S", то бишь остановка с частотой 50 мс. Может он и сбивает? По логике вроде не должен.

  • Avatar for source
    Денис:

    Все разобрался. На сайте разработчика программы управления прочитал, что он немного доработал программу. Теперь у него постоянно посылается символ "S" для проверки выхода машинки из диапазона блютус. Так же он соответствует команде стоп, поэтому переключение скорости теперь не работает в данном коде. Ссылка на его код есть в Play Маркет.

  • Avatar for source
    Александр:

    TXT на JY-MCU подключаем к дискретному PIN 50 на Arduino
    RXD на JY-MCU подключаем к дискретному PIN 51 на Arduino

    А где на Uno эти пины находятся? На плате обозначений таких нет, атмега тоже стольго ног не имеет.

  • Avatar for source
    Александр:

    Разобрался, все дело в плате. У Вас Mega.

  • Avatar for source
    Александр:

    Еще пару вопросов по-ходу возникло.
    Софт Bluetooth RC Car на планшете кто-нибудь пробовал юзать? Софт видимо заточен под телефон и поэтому на планшете отсутствует кнопка меню. Даже связь с блютузом установить не могу. Как можно решить проблему?
    И второй вопрос. Переделываю машинку на радиоуправлении. Спереди будет стоять серва для поворота вправо-влево, сзади мотор. Если кто делал, поделитесь кодом, любопытно посмотреть как управление сервой реализовано.

  • Avatar for source
    MIIRIK:

    Все работает, переделал код под uno. Скорость регулируется!

    • Avatar for source
      Сыр:

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

  • Avatar for source
    Александр:

    Привет всем! Помогите решить проблему. Раньше все работало, но щас блютус отказывается работать.в других программах на телефоне работает ( светодиод включает и выключает) ,а тут нет. Подключается в программе и все больше ничего моторчики не крутятся.В чем может быть дело, скетч тот же, пробовал на разные пины подключать tx и rx не помогает.питание для ардуино беру пока с ноутбука а моторшильд с аккумулятора . ( разбираюсь пока плохо не профи))

  • Avatar for source
    Александр:

    Да использую пока питание ардуино от ноута потому что спалил стабилизатор на ардуино перемычку не ставлю ( для полной информации) может быть дело в этом ?

  • Avatar for source
    Семён:

    А у меня всё время ошибка компиляции вылазит. Что делать? Плата Arduino Uno.

    • Avatar for source
      source™:

      Что за ошибка? Ctal+C поможет её скопировать

      • Avatar for source
        Семён:

        sketch_jan06a.ino:1:77: fatal error: AFMotor.h: No such file or directory
        compilation terminated.
        Ошибка компиляции.

  • Avatar for source
    Александр:

    А я нашёл в чем проблема .вBTSerial убрал BT везде и поехало)))) странно раньше и так ездило )

  • Avatar for source
    Александр:

    Может нет самой библиотеке для моторов у тебя ?

    • Avatar for source
      Семён:

      а где её взять?

      • Avatar for source
        source™:

        Во второй части

        • Avatar for source
          Семён:

          я скачал библиотеку, распаковал, скетч вгрузил, но машина не слушается, постоянно правые колёса крутятся назад

          • Avatar for source
            source™:

            крутятся постоянно назад без перерыва?

          • Avatar for source
            Сыр:

            Аналогичная проблема, правые колёса крутятся вперёд, остановить их не выходит, всё установил через uno и без шилда, использовал драйвер для моторчиков L293d

  • Avatar for source
    Семён:

    Да

    • Avatar for source
      source™:

      видимо используете выводы которые используются мотор шилдом

      • Avatar for source
        Сыр:

        всё проще, я просмотрел модуль под лупой и увидел сломанный кондёр, думаю у вас тоже может быть такой брак. Пожалуйста! А вообще мне нужно было узнать только как он подключается, а робота я собрал сам но намного проще, и без шилда даже. Геркон как переключатель поставил кстати, очень прикольно, попробуй!)

  • Avatar for source
    саша:

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

  • Avatar for source
    kolio:

    автор программки bluetooth RC controller написал:
    (Please don't ask for the Android code)

    взял - декомпилил, подшаманил для того, чтобы собиралась прога под android studio - работает! кое, что мне нафиг не нужно, и не нравится оформление программы. Короче поменял под себя
    Так, что спасибо автору android приложения, что выложил программку на google play ха ха хахахаа :)

  • Avatar for source
    саша:

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

    • Avatar for source
      Eduard:

      Та же проблема. Подключение блютуз есть, но машина не едет. Помогите кто может пожалуйста? В чем дело?

  • Avatar for source
    artur:

    Как добавить команду передних фар??

    • Avatar for source
      саша:

      вот тебе скетч но там дальномер не работает,если нужен другой скетч в автономном режиме пиши ,но мне нужно что бы два в одном или две ардуины ставить придётся #include
      #include

      int ledPin1 = 22; // передние фары
      int ledPin2 = 24; // передние фары
      int ledPin3 = 34; // задние фары
      int ledPin4 = 35; // задние фары
      int ledPin5 = A8; // клаксон
      int ledPin6 = A9; // питание для клаксона
      //Создаем объекты для двигателей
      AF_DCMotor motor1(1); //канал М1 на Motor Shield — задний левый
      AF_DCMotor motor2(2); //канал М2 на Motor Shield — задний правый
      AF_DCMotor motor3(3); //канал М3 на Motor Shield — передний левый
      AF_DCMotor motor4(4); //канал М4 на Motor Shield — передний правый

      //Время мигания Аварийки
      int blinkTime = 15; //частота мигания
      int leftTime = 0;
      boolean signalOn = LOW;
      boolean avaOn = LOW;

      SoftwareSerial BTSerial(50, 51); // RX, TX

      // Создаем переменную для команд Bluetooth
      char vcmd;
      // Создаем переменные для запоминания скорости двигателей
      int vspdL, vspdR;
      /* Создаем переменную, на значение которой будет уменьшаться скорость при плавных поворотах.
      Текущая скорость должна быть больше этого значения. В противном случае двигатели со стороны направления поворота просто не будут вращаться */
      int vspd = 200;

      void setup() {
      pinMode(ledPin1, OUTPUT);
      pinMode(ledPin2, OUTPUT);
      pinMode(ledPin3, OUTPUT);
      pinMode(ledPin4, OUTPUT);
      pinMode(ledPin5, OUTPUT);
      pinMode(ledPin6, OUTPUT);
      digitalWrite(ledPin6, HIGH);
      // Устанавливаем скорость передачи данных по Bluetooth
      BTSerial.begin(9600);
      // Устанавливаем скорость передачи данных по кабелю
      Serial.begin(9600);
      // Устанавливаем максимальную скорость вращения двигателей
      vspeed(255,255);
      }

      void loop() {
      // Если есть данные
      if (BTSerial.available())
      {
      // Читаем команды и заносим их в переменную. char преобразует код символа команды в символ
      vcmd = (char)BTSerial.read();
      // Отправляем команду в порт, чтобы можно было их проверить в "Мониторе порта"
      //Serial.println(vcmd);

      // Передние фары ВКЛ
      if (vcmd == 'W') {
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
      }

      // Передние фары ВЫКЛ
      if (vcmd == 'w') {
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
      }

      // Задние фары ВКЛ
      if (vcmd == 'U') {
      digitalWrite(ledPin3, HIGH);
      digitalWrite(ledPin4, HIGH);
      }

      // Задние фары ВЫКЛ
      if (vcmd == 'u') {
      digitalWrite(ledPin3, LOW);
      digitalWrite(ledPin4, LOW);
      }

      // Аварийка ВКЛ
      if (vcmd == 'X') {
      avaOn = HIGH;
      }

      // Аварийка ВЫКЛ
      if (vcmd == 'x') {
      avaOn = LOW;
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
      digitalWrite(ledPin3, LOW);
      digitalWrite(ledPin4, LOW);
      }

      if (vcmd != 'S') {
      Serial.println(vcmd);
      }

      if (avaOn) {
      if (leftTime == 0) {
      leftTime = blinkTime;
      signalOn = !signalOn;
      }
      Serial.print("leftTime = ");
      Serial.println(leftTime);

      if (signalOn) {
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
      digitalWrite(ledPin3, HIGH);
      digitalWrite(ledPin4, HIGH);
      delay(1);
      leftTime = leftTime - 1;
      }
      else
      {
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
      digitalWrite(ledPin3, LOW);
      digitalWrite(ledPin4, LOW);
      delay(1);
      leftTime = leftTime - 1;
      }

      } //закончилась Аварийка

      // Клаксон ВКЛ
      if (vcmd == 'V') {
      analogWrite(ledPin5, 200);
      }

      // Клаксон ВЫКЛ
      if (vcmd == 'v') {
      analogWrite(ledPin5, LOW);
      }

      // Вперед
      if (vcmd == 'F') {
      vforward();
      }
      // Назад
      if (vcmd == 'B')
      {
      vbackward();
      }
      // Влево
      if (vcmd == 'L')
      {
      vleft();
      }
      // Вправо
      if (vcmd == 'R')
      {
      vright();
      }
      // Прямо и влево
      if (vcmd == 'G')
      {
      vforwardleft();
      }
      // Прямо и вправо
      if (vcmd == 'I')
      {
      vforwardright();
      }
      // Назад и влево
      if (vcmd == 'H')
      {
      vbackwardleft();
      }
      // Назад и вправо
      if (vcmd == 'J')
      {
      vbackwardright();
      }
      // Стоп
      if (vcmd == 'S')
      {
      vrelease();
      }
      // Скорость 0%
      if (vcmd == '0')
      {
      vspeed(0,0);
      }
      // Скорость 10%
      if (vcmd == '1')
      {
      vspeed(25,25);
      }
      // Скорость 20%
      if (vcmd == '2')
      {
      vspeed(50,50);
      }
      // Скорость 30%
      if (vcmd == '3')
      {
      vspeed(75,75);
      }
      // Скорость 40%
      if (vcmd == '4')
      {
      vspeed(100,100);
      }
      // Скорость 50%
      if (vcmd == '5')
      {
      vspeed(125,125);
      }
      // Скорость 60%
      if (vcmd == '6')
      {
      vspeed(150,150);
      }
      // Скорость 70%
      if (vcmd == '7')
      {
      vspeed(175,175);
      }
      // Скорость 80%
      if (vcmd == '8')
      {
      vspeed(200,200);
      }
      // Скорость 90%
      if (vcmd == '9')
      {
      vspeed(225,225);
      }
      // Скорость 100%
      if (vcmd == 'q')
      {
      vspeed(255,255);
      }
      }
      }

      // Вперед
      void vforward() {
      vspeed(vspdL,vspdR);
      vforwardRL();
      }

      // Вперед для RL
      void vforwardRL() {
      motor1.run(FORWARD);
      motor2.run(FORWARD);
      motor3.run(FORWARD);
      motor4.run(FORWARD);
      }

      // Назад
      void vbackward() {
      vspeed(vspdL,vspdR);
      vbackwardRL();
      }

      // Назад для RL
      void vbackwardRL() {
      motor1.run(BACKWARD);
      motor2.run(BACKWARD);
      motor3.run(BACKWARD);
      motor4.run(BACKWARD);
      }

      // Влево
      void vleft() {
      vspeed(vspdL,vspdR);
      motor1.run(BACKWARD);
      motor2.run(FORWARD);
      motor3.run(BACKWARD);
      motor4.run(FORWARD);
      }

      // Вправо
      void vright() {
      vspeed(vspdL,vspdR);
      motor1.run(FORWARD);
      motor2.run(BACKWARD);
      motor3.run(FORWARD);
      motor4.run(BACKWARD);
      }

      // Вперед и влево
      void vforwardleft() {
      if (vspdL > vspd) {
      vspeed(vspdL-vspd,vspdR);
      }
      else
      {
      vspeed(0,vspdR);
      }
      vforwardRL();
      }

      // Вперед и вправо
      void vforwardright() {
      if (vspdR > vspd) {
      vspeed(vspdL,vspdR-vspd);
      }
      else
      {
      vspeed(vspdL,0);
      }
      vforwardRL();
      }

      // Назад и влево
      void vbackwardleft() {
      if (vspdL > vspd) {
      vspeed(vspdL-vspd,vspdR);
      }
      else
      {
      vspeed(0,vspdR);
      }
      vbackwardRL();
      }

      // Назад и вправо
      void vbackwardright() {
      if (vspdR > vspd) {
      vspeed(vspdL,vspdR-vspd);
      }
      else
      {
      vspeed(vspdL,0);
      }
      vbackwardRL();
      }

      // Стоп
      void vrelease(){
      motor1.run(RELEASE);
      motor2.run(RELEASE);
      motor3.run(RELEASE);
      motor4.run(RELEASE);
      }

      // Изменение скорости
      void vspeed(int spdL,int spdR){
      if (spdL == spdR) {
      vspdL=spdL;
      vspdR=spdR;
      }
      motor1.setSpeed(spdL);
      motor2.setSpeed(spdR);
      motor3.setSpeed(spdL);
      motor4.setSpeed(spdR);
      }

      • Avatar for source
        Рустам:

        Добрый вечер! У вас случайно нету скетча для приложения bluetooth RC Car arduino? Если есть помогите пожалуйста, отправьте на rus091176@mail.ru
        Заранее благодарен! Рустам.

    • Avatar for source
      саша:

      здесь и клаксон есть)

Добавить комментарий

arrow_upward