Остановка моторов при потере сигнала Bluetooth

kazakov1988
Offline
Зарегистрирован: 01.04.2020

Привет!

Сделал простую машинку с управлением по Bluetooth. Всё хорошо работает. Но не пойму, как сделать так, чтобы машинка останавливалась при потере соединения с Bluetooth (например, если выехал за пределы действия сигнала или если батарейка села в смартфоне, с которого управляешь и т.п.).

Скетч такой:

int motorRight1 = 2;       // Правый мотор.
int motorRight2 = 4;
int enableRight = 3;

int motorLeft1 = 6;        // Левый мотор.
int motorLeft2 = 7;
int enableLeft = 5;


int control;               // Управление двигателями.
int motorSpeed;            // Управление скоростью.

void setup() {
  pinMode (motorRight1, OUTPUT);
  pinMode (motorRight2, OUTPUT);
  pinMode (enableRight, OUTPUT);

  pinMode (motorLeft1, OUTPUT);
  pinMode (motorLeft2, OUTPUT);
  pinMode (enableLeft, OUTPUT);

  Serial.begin (9600);
}

void loop()
{
  if (Serial.available() > 0) {
    control = Serial.read();

    /*********************** Скорость ***********************/
    switch (control) {
      case '1': motorSpeed = 100; break;
      case '2': motorSpeed = 170; break;
      case '3': motorSpeed = 250; break;

      /*********************** Направление ***********************/
      case 'W': rightWheelForward (); leftWheelForward ();  break;   // Вперёд.
      case 'S': rightWheelBack ();    leftWheelBack ();     break;   // Назад.
      case 'E': rightWheelStop ();    leftWheelForward ();  break;   // Направо вперёд.
      case 'Q': leftWheelStop ();     rightWheelForward (); break;   // Налево вперёд.
      case 'D': rightWheelStop ();    leftWheelBack ();     break;   // Направо назад.
      case 'A': leftWheelStop ();     rightWheelBack ();    break;   // Налево назад.
      case 'P': rightWheelStop ();    leftWheelStop ();     break;   // Стоп.
    }
  }
}

/*********************** Функции колёс ***********************/
void rightWheelForward () {               // Правое колесо вперёд.
  digitalWrite (motorRight1, LOW);
  digitalWrite (motorRight2, HIGH);
  analogWrite(enableRight, motorSpeed);
}

void leftWheelForward () {                // Левое колесо вперёд.
  digitalWrite (motorLeft1, LOW);
  digitalWrite (motorLeft2, HIGH);
  analogWrite(enableLeft, motorSpeed);
}

void rightWheelBack () {                  // Правое колесо назад.
  digitalWrite (motorRight1, HIGH);
  digitalWrite (motorRight2, LOW);
  analogWrite(enableRight, motorSpeed);
}

void leftWheelBack () {                   // Левое колесо назад.
  digitalWrite (motorLeft1, HIGH);
  digitalWrite (motorLeft2, LOW);
  analogWrite(enableLeft, motorSpeed);
}

void rightWheelStop () {                  // Правое колесо остановить.
  digitalWrite (motorRight1, LOW);
  digitalWrite (motorRight2, LOW);
  analogWrite(enableRight, 0);
}

void leftWheelStop () {                   // Левое колесо остановить.
  digitalWrite (motorLeft1, LOW);
  digitalWrite (motorLeft2, LOW);
  analogWrite(enableLeft, 0);
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

Отправляй сигналы каждую секунду, отключай при отсутствии сигнала через 2 с.

kazakov1988
Offline
Зарегистрирован: 01.04.2020

А есть может быть ещё варианты?

b707
Offline
Зарегистрирован: 26.05.2017

kazakov1988 пишет:

А есть может быть ещё варианты?

Какие еще могут быть варианты, кроме периодической проверки связи?

и чем вас не устраивает предложенный - проще этого вряд ли что можно придумать

kazakov1988
Offline
Зарегистрирован: 01.04.2020

Устраивает. Попробую реализовать. Спасибо.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

скетч переделать, сделать по человечески, то-есть надо передавать параметры каналов, один - влево-право, второй ход, стандартные значения для аппаратуры управления 1000 -1500 -2000, 1500 среднее положение руля управления, если не приходят сигналы управления в течении определённого времени включается режим файлсейв, а уж в режиме устанавливать что делать...

kazakov1988
Offline
Зарегистрирован: 01.04.2020

Насколько я понял, отправку периодических сигналов нужно сделать в приложении, с которого управляем со смартфона. А потом в скетче сделать проверку - приходят ли сигналы.

Приложение делал на App inventor. Не могу сообразить, как это реализовать.

Подскажите, пожалуйста, как сделать :)

Вот такое приложение:

Feofan
Offline
Зарегистрирован: 28.05.2017

kazakov1988 пишет:

Приложение делал на App inventor. Не могу сообразить, как это реализовать.

В MIT есть таймеры. Своеобразные, но есть.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

kazakov1988 пишет:

Насколько я понял, отправку периодических сигналов нужно сделать в приложении, с которого управляем со смартфона. А потом в скетче сделать проверку - приходят ли сигналы.

Приложение делал на App inventor. Не могу сообразить, как это реализовать.

Подскажите, пожалуйста, как сделать :)

Лучше всего это делать в Arduino IDE, набирая текст с клавиатуры ручками.

Визуальное программирование на этом форуме не жалуют (по вполне объективным причинам), поэтому получить совет по Вашим "картинкам" здесь вряд ли удастся.

PS. Разумеется это все при условии, что Вам уже исполнилось 10 лет. Если Вы моложе, обсудите проблему с тем, кто учит Вас программировать: не поверю, чтобы 7-9-летний ребенок учился программировать без посторонней помощи.

 

PPS. Сейчас справился у Гугла, оказывается App inventor - это разработка приложений под Андроид (визуальным программированием не интересовался от слова "совсем"). В этом случае совет остается прежним - отказаться от визуального программирования в пользу, например, Java Android Studio.

kazakov1988
Offline
Зарегистрирован: 01.04.2020

Feofan пишет:

В MIT есть таймеры. Своеобразные, но есть.

Спасибо. Посмотрю, как можно будет таймер прикрутить.

andriano пишет:

Лучше всего это делать в Arduino IDE, набирая текст с клавиатуры ручками.

...

Разумеется это все при условии, что Вам уже исполнилось 10 лет. Если Вы моложе, обсудите проблему с тем, кто учит Вас программировать: не поверю, чтобы 7-9-летний ребенок учился программировать без посторонней помощи.

 
Скетч я делал на Arduino IDE и писал его руками. Но тут нужно изменить приложение на Android. Ранее не имел опыта в создании приложений Android с нуля, поэтому использовал визуальное программирование. Да, я я понимаю, что визуальное программирование ограниченно, но я уверен, что поставленную задачу там решить можно. Сейчас больше хочется углубиться в изучение Arduino, а не в программирование под Android.
 
Я понимаю, что задаю вопросы, как маленький, но мне уже за 30 :) Программирование открыл для себя только полгода назад, Arduino юзаю две недели. В этой области я, конечно, салага )
-NMi-
Offline
Зарегистрирован: 20.08.2018

kazakov1988 пишет:

 как маленький, но мне уже за 30 :) Программирование открыл для себя только полгода назад...

Ничо, даже на старуху бывает проруха...

Кароч в инвертере делаешь ФУНКЦИЮ на ВЫВОД по блюпупу и в этой функции ПРОВЕРЯЕШЬ наличие/отсутствие связи. Выходным параметром функции будет харошо/нехорошо. В обработчиках событий касаний заменяешь своё "фуфло" на вызов функции с входными параметрами (...12345 U D E) и ТАМ-ЖЕ проверяешь выходной параметр хорошо/нехорошо. Делаешь какунибудь пустую кнопку с изображением, допустим, зелёный/красный и в зависимости от результата меняешь свойства кнопки (цвет). Вот и всё, фкрацце.

А по ВЫКЛЮЧЕНИЮ моторчиков это нужно со стороны дурдуины кодить. Принцип тот-же, что и в инвертере.