Автомобиль-робот не работает
Моя машина-робот не отвечает на мои команды. Однако приведенный ниже код работал раньше, но на этот раз ответа нет. Я пробовал экспериментировать с кодом в первом цикле 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
А вот схемы:
@user17247218, 👍-1
Обсуждение2 ответа
Лучший ответ:
@timemage
Ваш ответ был частью решения!
Большое спасибо! В первом цикле while я переключил его с bluetooth.available > 2
в bluetooth.доступно > 0
, а затем поменял местами знаки TX и RX. Теперь автомобиль-робот реагирует и работает. Однако он не повернет налево, хотя оба двигателя работают нормально.
Короче говоря, помимо любых других проблем, которые могут у вас возникнуть, вы подключили свои соединения 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.
- HC-05 подключение к Arduino
- Модуль Bluetooth HC-05 мигает красным светом - Arduino Uno
- Bluetooth-модуль HC-05 — команда INQ не работает
- Самая низкая мощность, возможная в Arduino
- Проблемы с последовательной связью от Arduino к Bluetooth HC-05
- Какова самая высокая скорость передачи данных, которая может работать между Android-устройством и Ардуино, подключенным к HC05?
- Отправка целого числа> 1 байта с Android на Arduino через последовательный порт
- Контроллер HM-10 BLE не отвечает на некоторые AT-команды
Выводит ли
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