Остановка моторов при потере сигнала Bluetooth
- Войдите на сайт для отправки комментариев
Ср, 01/04/2020 - 01:42
Привет!
Сделал простую машинку с управлением по 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); }
Отправляй сигналы каждую секунду, отключай при отсутствии сигнала через 2 с.
А есть может быть ещё варианты?
А есть может быть ещё варианты?
Какие еще могут быть варианты, кроме периодической проверки связи?
и чем вас не устраивает предложенный - проще этого вряд ли что можно придумать
Устраивает. Попробую реализовать. Спасибо.
скетч переделать, сделать по человечески, то-есть надо передавать параметры каналов, один - влево-право, второй ход, стандартные значения для аппаратуры управления 1000 -1500 -2000, 1500 среднее положение руля управления, если не приходят сигналы управления в течении определённого времени включается режим файлсейв, а уж в режиме устанавливать что делать...
Насколько я понял, отправку периодических сигналов нужно сделать в приложении, с которого управляем со смартфона. А потом в скетче сделать проверку - приходят ли сигналы.
Приложение делал на App inventor. Не могу сообразить, как это реализовать.
Подскажите, пожалуйста, как сделать :)
Вот такое приложение:
Приложение делал на App inventor. Не могу сообразить, как это реализовать.
В MIT есть таймеры. Своеобразные, но есть.
Насколько я понял, отправку периодических сигналов нужно сделать в приложении, с которого управляем со смартфона. А потом в скетче сделать проверку - приходят ли сигналы.
Приложение делал на App inventor. Не могу сообразить, как это реализовать.
Подскажите, пожалуйста, как сделать :)
Лучше всего это делать в Arduino IDE, набирая текст с клавиатуры ручками.
Визуальное программирование на этом форуме не жалуют (по вполне объективным причинам), поэтому получить совет по Вашим "картинкам" здесь вряд ли удастся.
PS. Разумеется это все при условии, что Вам уже исполнилось 10 лет. Если Вы моложе, обсудите проблему с тем, кто учит Вас программировать: не поверю, чтобы 7-9-летний ребенок учился программировать без посторонней помощи.
PPS. Сейчас справился у Гугла, оказывается App inventor - это разработка приложений под Андроид (визуальным программированием не интересовался от слова "совсем"). В этом случае совет остается прежним - отказаться от визуального программирования в пользу, например, Java Android Studio.
В MIT есть таймеры. Своеобразные, но есть.
Спасибо. Посмотрю, как можно будет таймер прикрутить.
Лучше всего это делать в Arduino IDE, набирая текст с клавиатуры ручками.
...
Разумеется это все при условии, что Вам уже исполнилось 10 лет. Если Вы моложе, обсудите проблему с тем, кто учит Вас программировать: не поверю, чтобы 7-9-летний ребенок учился программировать без посторонней помощи.
как маленький, но мне уже за 30 :) Программирование открыл для себя только полгода назад...
Ничо, даже на старуху бывает проруха...
Кароч в инвертере делаешь ФУНКЦИЮ на ВЫВОД по блюпупу и в этой функции ПРОВЕРЯЕШЬ наличие/отсутствие связи. Выходным параметром функции будет харошо/нехорошо. В обработчиках событий касаний заменяешь своё "фуфло" на вызов функции с входными параметрами (...12345 U D E) и ТАМ-ЖЕ проверяешь выходной параметр хорошо/нехорошо. Делаешь какунибудь пустую кнопку с изображением, допустим, зелёный/красный и в зависимости от результата меняешь свойства кнопки (цвет). Вот и всё, фкрацце.
А по ВЫКЛЮЧЕНИЮ моторчиков это нужно со стороны дурдуины кодить. Принцип тот-же, что и в инвертере.