HC-05 сбрасывает соединение, тогда двигатели постоянного тока не перестанут двигаться "вперед"

Это мой первый пост. Я обращаюсь к вам за помощью в решении моей проблемы, ребята. По сути, мой проект-это мобильное приложение для инвалидной коляски с управлением по Bluetooth. Все сделано, за исключением небольшой проблемы, обнаружившейся во время тестирования. После подключения всего этого инвалидная коляска перемещается в соответствии с кодом, который я написал. Однако через несколько секунд/мин HC-05 сбрасывает соединение, и инвалидная коляска движется сама по себе, двигаясь вперед. Надеюсь, вы понимаете, о чем я.

Когда я установил скорость = 100. Я думаю, что не сталкивался с такой проблемой, как выше (подтверждено).

Аппаратное обеспечение:

PowerBank

Arduino Uno

HC 05

Драйвер двигателя MDD20A

X2 Двигатель постоянного тока 24 В

Батарея X2 12V

//including the libraries
#include <SoftwareSerial.h> // библиотека программного обеспечения TX RX для bluetooth

//Инициализация контактов для модуля bluetooth
int bluetoothTx = 0; // bluetooth tx to 0 pin
int bluetoothRx = 1; // bluetooth rx to 1 pin
SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);

//Motor 1
int Motor1_Pin = 2;
int Enable1 = 3;

//Motor 2     
int Motor2_Pin = 4;
int Enable2 = 5;

char command ; //переменная для хранения данных
int velocity = 0; //Переменная для управления скоростью двигателя

void setup()
{       
  //Установите скорость передачи данных последовательной связи и модуля Bluetooth на одинаковую скорость.
  // Последовательная Настройка
  Serial.begin(9600); // скорость связи по умолчанию модуля Bluetooth HC-06; 
  bluetooth.begin(9600);
 
  // Motor Setup
  pinMode(Motor1_Pin,OUTPUT);
  pinMode(Enable1,OUTPUT);
  pinMode(Motor2_Pin,OUTPUT);
  pinMode(Enable2,OUTPUT);
 
  //Setting the enable as HIGH.
  digitalWrite(Enable1, LOW);
  digitalWrite(Enable2, LOW);
}

void loop(){
  if(bluetooth.available() > 0){  //Проверка наличия или отсутствия данных
    command = bluetooth.read();   //Хранение данных в переменной 'command' 
    Serial.println(command);      //Печать на последовательном мониторе
   
    //Измените режим pin только в том случае, если новая команда отличается от предыдущей.   
    switch(command){
    case 'F':  //Перемещение автомобиля вперед
      analogWrite(Enable1, 175);
      analogWrite(Enable2, 175);
      digitalWrite(Motor1_Pin, HIGH);
      digitalWrite(Motor2_Pin, HIGH);
      break;
    case 'B':  //Перемещение автомобиля Назад
      analogWrite(Enable1, 175);
      analogWrite(Enable2, 175);
      digitalWrite(Motor1_Pin, LOW);
      digitalWrite(Motor2_Pin, LOW);
      break;
    case 'L':  //Перемещение автомобиля Влево
      analogWrite(Enable1, 175);
      analogWrite(Enable2, 100);
      digitalWrite(Motor1_Pin, HIGH);
      digitalWrite(Motor2_Pin, LOW);
      break;
    case 'R':   //Перемещение автомобиля Вправо
      analogWrite(Enable2, 175);
      analogWrite(Enable1, 100);
      digitalWrite(Motor2_Pin, HIGH);
      digitalWrite(Motor1_Pin, LOW);
      break;
    case 'S':   //Stop
      analogWrite(Enable1, 0);
      analogWrite(Enable2, 0);
      digitalWrite(Motor1_Pin, 0);
      digitalWrite(Motor2_Pin, 0);
      break;
//    case 'I':  //Moving the Car Forward right
//      digitalWrite(Motor2_Pin2, LOW);
//      digitalWrite(Motor2_Pin1, LOW);
//      analogWrite(enable1, 0);
//      analogWrite(enable2, 0);
//      break;
//    case 'J':  //Moving the Car backward right
//      digitalWrite(Motor2_Pin2, LOW);
//      digitalWrite(Motor2_Pin1, LOW);
//      analogWrite(enable1, 0);
//      analogWrite(enable2, 0);
//      break;       
//    case 'G':  //Moving the Car Forward left
//      digitalWrite(Motor2_Pin2, LOW);
//      digitalWrite(Motor2_Pin1, LOW);
//      analogWrite(enable1, 0);
//      analogWrite(enable2, 0);
//      break;
//    case 'H':  //Moving the Car backward left
//      digitalWrite(Motor2_Pin2, LOW);
//      digitalWrite(Motor2_Pin1, LOW);
//      analogWrite(enable1, 0);
//      analogWrite(enable2, 0);
//      break;
    break;

    //Controlling the Speed of Car 
    default:  //Get velocity
      if(command=='q'){
        velocity = 255;  //Full velocity
        analogWrite(Enable2, velocity);
        analogWrite(Enable1, velocity);
      }
      else{
        //Chars '0' - '9' have an integer equivalence of 48 - 57, accordingly.
        if((command >= 48) && (command <= 57)){
          //Subtracting 48 changes the range from 48-57 to 0-9.
          //Multiplying by 25 changes the range from 0-9 to 0-225.
          velocity = (command - 48)*25;       
          analogWrite(Enable2, velocity);
          analogWrite(Enable1, velocity);
        }
      }
      }
    }

  }

, 👍2

Обсуждение

"HC-05 drops connection" Означает ли это, что он больше не подключен к телефону (я предполагаю)? Или это означает что - то другое?, @timemage

Да, это правда. Это как-то связано с ШИМ. Когда я устанавливаю скорость на 100, нет никаких проблем с подключением HC-05. Однако, как только я установил скорость на 175, это не идет гладко слишком долго, пока внезапно соединение HC-05 не сбрасывает соединение, а затем двигатель постоянного тока становится неисправным и приводит в движение свой собственный (например, застрявший вперед). Извините за опоздание. Я не понимал, что это маленькое поле для комментариев., @Peace You

Вы можете попробовать добавить некоторые конденсаторы рядом с VCC/GND на HC-05., @timemage


1 ответ


1

Предполагаю, что вы хотите, чтобы стул остановился, если связь потеряна. Реализован ли вывод "состояние" на вашем HC-05 и различает ли он подключенные и не подключенные (или что-то еще)? Если это первое, вы должны следить за состоянием этого контакта. В противном случае ваш Arduino и мобильное приложение должны договориться о протоколе "Вы там?"; рукопожатие, которое происходит каждые 0,5 секунды или около того (от стены угадайте!), И если контроллер стула не получил ответ чертовски близко сразу, он останавливается. Если мобильный телефон пропускает ответ, он должен отправить "стоп" (резервную копию, которая может не быть услышана контроллером кресла) и предупредить оператора. Было бы неплохо иметь сторожевой таймер (в аппаратном обеспечении) на стуле, который останавливает двигатели, если контроллер стула не сбрасывает его через короткие промежутки времени. Контроллер кресла-это программное обеспечение; программное обеспечение иногда выходит из строя. Вы хотели бы обнаружить это в аппаратном обеспечении вовремя, чтобы отрезать диск к стулу, прежде чем он ударится о препятствие или выедет на улицу.

,