Автомобиль-робот не работает

Моя машина-робот не отвечает на мои команды. Однако приведенный ниже код работал раньше, но на этот раз ответа нет. Я пробовал экспериментировать с кодом в первом цикле while. Я пробовал другой код из других проектов, подобных этому. Я поигрался со схемами, но ничего не работает.

Это мой код:

#include <SoftwareSerial.h> // Программная библиотека TX RX для Bluetooth
#include <Servo.h> // сервобиблиотека
Servo myservo1, myservo2, myservo3; // имя сервопривода
int bluetoothTx = 10; // bluetooth tx на 10-контактный
int bluetoothRx = 11; // bluetooth rx на 11-контактный
int motorOne = 4;
int motorOne2 = 5;
int motorTwo = 6;
int motorTwo2 = 7;
int enA = 3;
int enB = 2;
SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);


//начальный вывод двигателей

char command; 
char Value;

void setup()
{
  myservo1.attach(2); // подключаем сигнальный провод сервопривода к контакту 9
  myservo2.attach(8);
  myservo3.attach(12);
   
  //Настройка последовательного USB-подключения к компьютеру
  Serial.begin(9600);
  //Настройка последовательного соединения Bluetooth с Android
  bluetooth.begin(9600);
}
void loop()
{
  while (bluetooth.available() > 2) {
    Value = bluetooth.read();
    Serial.println(Value);
  }

  if ( Value == 'F') {
    // Робо-питомец бежит вперед
    digitalWrite(enA, 255);
    digitalWrite(enB, 255);
    digitalWrite(motorOne, HIGH);
    digitalWrite(motorOne2, LOW);
    digitalWrite(motorTwo, HIGH);
    digitalWrite(motorTwo2, LOW);
  } else if (Value == 'B') {
    //Робо-питомец бежит назад
    digitalWrite(enA, 255);
    digitalWrite(enB, 255);
    digitalWrite(motorOne, LOW);
    digitalWrite(motorOne2, HIGH);
    digitalWrite(motorTwo, LOW);
    digitalWrite(motorTwo2, HIGH);
  } else if (Value == 'L') {
    //Робо-питомец поверни налево
    digitalWrite(enA, 255);
    
    digitalWrite(motorOne, LOW);
    digitalWrite(motorOne2, LOW);
    digitalWrite(motorTwo, HIGH);
    digitalWrite(motorTwo2, LOW);
  } else if (Value == 'R') {
    //Робо-питомец поверни направо
    
    digitalWrite(enB, 255);
    digitalWrite(motorOne, HIGH);
    digitalWrite(motorOne2, LOW);
    digitalWrite(motorTwo, LOW);
    digitalWrite(motorTwo2, LOW);
  } else if (Value == 'S') {
    //Робо-остановка домашних животных
    digitalWrite(motorOne, LOW);
    digitalWrite(motorOne2, LOW);
    digitalWrite(motorTwo, LOW);
    digitalWrite(motorTwo2, LOW);
  }

  //Чтение с bluetooth и запись на usb serial
  if(bluetooth.available()>= 2 )
  {
    unsigned int servopos = bluetooth.read();
    unsigned int servopos1 = bluetooth.read();
    unsigned int realservo = (servopos1 *256) + servopos;
    Serial.println(realservo);
    if (realservo >= 1000 && realservo <1180) {
      int servo1 = realservo;
      servo1 = map(servo1, 1000, 1180, 0, 180);
      myservo1.write(servo1);
      Serial.println("Servo 1 ON");
      delay(10);
    }
    if (realservo >= 2000 && realservo <2180) {
      int servo2 = realservo;
      servo2 = map(servo2, 2000, 2180, 0, 180);
      myservo2.write(servo2);
      Serial.println("Servo 2 ON");
      delay(10);
    }
    if (realservo >= 3000 && realservo <3180) {
      int servo3 = realservo;
      servo3 = map(servo3, 3000, 3180, 0, 180);
      myservo3.write(servo3);
      Serial.println("Servo 3 ON");
      delay(10);
    }
    
  }
}

Я использую это приложение: https://play.google.com/ store/apps/details?id=com.giumig.apps.bluetoothserialmonitor&hl=en&gl=US

А вот схемы: схема

, 👍-1

Обсуждение

Выводит ли Serial.println(Value); то, что вы ожидаете?, @timemage

проверьте, все ли подключено правильно... напишите простой код, который проверяет каждый двигатель... проверьте сервопривод, @jsotola

@timemage Когда это работало раньше, приложение печатало ряд чисел, а затем буквы. Он печатает команду только в том случае, если мой Nano подключен к компьютеру., @user17247218

@jsotola Я протестировал двигатели и сервоприводы по отдельности и контролировал их с помощью потенциометров, прежде чем перейти к Bluetooth. Я также протестировал модуль Bluetooth с помощью простой команды мигания в приложении, и он отлично работает., @user17247218

«Я протестировал моторы и сервоприводы по отдельности и управлял ими с помощью потенциометров, прежде чем перейти к Bluetooth»… это было раньше… протестировать их сейчас… запустить один из моторов на секунду в «setup()», @jsotola

Что из этого получается, так это то, что Serial.print(Value); *используется* для того, что вы ожидаете, а это не то, о чем я спрашиваю. Сейчас он сломан. Что он делает сейчас?, @timemage

@jsotola Я снова протестировал каждый двигатель с помощью простого скетча, и они оба работают нормально., @user17247218

@timemage Теперь на последовательном мониторе ничего не печатается, даже если Arduino Nano подключен к компьютеру., @user17247218

Аннотированная схема, которую вы подключили вместо вашей нечеткой, вьющейся картинки, была бы большой помощью. Убедитесь, что он показывает все соединения, включая питание и заземление. Включите ссылки на аппаратные устройства, которые предоставляют «техническую» информацию., @Gil


2 ответа


Лучший ответ:

0

@timemage

Ваш ответ был частью решения!

Большое спасибо! В первом цикле while я переключил его с bluetooth.available > 2 в bluetooth.доступно > 0, а затем поменял местами знаки TX и RX. Теперь автомобиль-робот реагирует и работает. Однако он не повернет налево, хотя оба двигателя работают нормально.

,

1

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


Согласно документации:

SoftwareSerial var_name(rxPin, txPin)
Операция СС
Прием
Передача

Вы создали свой объект SoftwareSerial следующим образом:

SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);
Операция СС Переменная PIN
Прием BluetoothTx
Передача BluetoothRx

Определил переменные пинов для этих пинов:

int bluetoothTx = 10; // bluetooth tx на 10-контактный
int bluetoothRx = 11; // bluetooth rx на 11-контактный
Операция СС Переменная PIN Пин Arduino
Прием BluetoothTx 10
Передача BluetoothRx 11

Подключил их как:

Последовательные соединения

Операция СС Переменная PIN Пин Arduino Операция BT
Прием BluetoothTx 10 Прием
Передача BluetoothRx 11 Передача

Итак, у вас они наоборот. Подключение их RX (входов), что безвредно, но бесполезно, и подключение их TX (выходов), которые могут что-то повредить.

Если это неясно, RX и TX на HC-05 помечены с его точки зрения, а не с точки зрения Arduino. За исключением некоторых вещей, таких как старый внешний модем, RX и TX на устройстве почти всегда помечаются с точки зрения этого устройства.


Имя переменной, такое как bluetoothTx, может сбивать с толку, если вы не уверены, какая вещь выполняет передачу. Это номер контакта для передачи в Bluetooth или номер контакта, который будет подключен к передатчику Bluetooth (другими словами, для приема)?

В некоторых случаях я просто описываю ситуацию в имени переменной:

static const int PIN_SOFTSERIAL_RX_TO_BLUETOOTH_TX = 11;
static const int PIN_SOFTSERIAL_TX_TO_BLUETOOTH_RX = 10;
/// ...
SoftwareSerial bluetooth(
  PIN_SOFTSERIAL_RX_TO_BLUETOOTH_TX,
  PIN_SOFTSERIAL_TX_TO_BLUETOOTH_RX
);

Не думаю, что я бы выбрал довольно такое длинное имя, но вы поняли.

Я заменю их здесь в программном обеспечении, оставив ваши физические соединения такими, какими они были на диаграмме, главным образом потому, что мне не хочется перерисовывать вашу диаграмму. Хотя, если бы это был мой проект, я бы поменял местами провода (и определенные номера контактов выше), потому что соглашение состоит в том, чтобы SoftwareSerial получал на 10 так же, как оборудование получает на контакт 0, и чтобы SoftwareSerial передал на 11 так же, как аппаратное обеспечение передает на контакт 1; словами по порядку, сохраняя относительный порядок номеров контактов.

Итак, вот что у вас получилось с приведенным выше кодом:

Операция СС Переменная PIN Пин Arduino Операция BT
Прием PIN_SOFTSERIAL_RX_TO_BLUETOOTH_TX 11 Передача
Передача PIN_SOFTSERIAL_TX_TO_BLUETOOTH_RX 10 Прием

Передатчики подключены к приемникам. Если вы запутались, создайте свою собственную таблицу и убедитесь, что ваши имена переменных имеют смысл.

На самом деле это не имеет никакого отношения к нашему вопросу, но: большинству пользователей Arduino, в любом случае новых, лучше использовать Arduino с возможностью подключения, которая устраняет необходимость в SoftwareSerial. Минимальное изменение по сравнению с Nano для того, что вы делаете, — это плата Micro или Pro Micro. Эта плата имеет встроенную поддержку USB, которую она использует для отправки "Serial" к компьютеру. Таким образом, остается одно фактическое аппаратное последовательное периферийное устройство на (Pro) Micro, доступное для подключения к HC-05 (или чему-то еще). Существует множество вариантов, в том числе те, которые просто поддерживают Bluetooth (без необходимости использования HC-05). В любом случае, есть много способов не использовать SoftwareSerial.

,