Сервоуправление Arduino bluetooth HC-05
Я использую модуль Bluetooth HC-05 для управления двумя сервоприводами. Я использую терминал Bluetooth в своем телефоне Android, чтобы управлять ими.
Проблема в том, что myServo1 движется так, как я хочу, но я не могу контролировать myServo2. Код считывает переменную a, но не может прочитать переменную b.
#include <SoftwareSerial.h>
#include <Servo.h>
Servo myServo1;
Servo myServo2;
int servo;
SoftwareSerial BT(2, 3);
void setup()
{
myServo1.attach(11);
myServo2.attach(10);
servo = 90;
Serial.begin(9600);
BT.begin(9600);
}
char a;
char b;
void loop()
{
if (BT.available())
{
a=(BT.read());
b = (BT.read());
if (a=='1')
{
myServo1.write(180);
delay(50);
}
if (a=='2')
{
myServo1.write(-180);
delay(50);
}
if (b=='3')
{
myServo2.write(90);
delay(50);
}
if (b=='4')
{
myServo2.write(-90);
delay(50);
}
}
}
В чем проблема?
@engineerstudent, 👍-1
Обсуждение1 ответ
При использовании
if(BT.available())
это делает то же самое, что и
if(BT.available() > 0)
Но тогда вы читаете 2 байта, хотя и не можете быть уверены, что нужно прочитать 2 байта. Данные передаются последовательно, поэтому, даже когда вы отправляете их на свой телефон в одной связке, они не передаются как связка.
Попробуйте использовать
if(BT.available() >= 2)
Также гарантирует, что ничто другое не будет отправлено по порядковому номеру, кроме номеров (часто есть строка, заканчивающаяся неявно, в зависимости от используемого приложения).
Если я использую " if(BT.available() >= 2)", это смешает всю систему, @engineerstudent
Что вы хотите этим сказать? @engineerstudent, @chrisl
Он не работает должным образом. Если я положу "1", "2", "3" или "4" - он вращает один сервопривод случайным образом. В некоторых случаях это вообще не работает, @engineerstudent
Тогда у вас есть еще одна проблема. Вы подтвердили, что измельчение с помощью HC-05 работает правильно? Вы можете сделать это с помощью testsketch, где вы пересылаете полученные данные с Bluetooth на последовательный монитор. Если все передано правильно, мы можем исключить эту часть, @chrisl
Я не думаю, что есть проблема в соединении, потому что если я использую "BT.available()>0" и набираю "1" или "2", то он работает правильно и поворачивает myServo1 между 180 и -180., @engineerstudent
Мое предлагаемое решение не должно приводить к наблюдаемому ошибочному поведению. Он просто ждет, пока 2 байта будут действительно доступны, прежде чем вы их прочитаете. При этом я думаю, что здесь что-то еще не так. Вы действительно не посылаете никаких окончаний строк? Это объяснило бы его поведение, @chrisl
Когда он отправляет значение, я нажимаю enter. Не приведет ли это к ошибке? Если да, то как я это исправлю?, @engineerstudent
Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/106049/discussion-between-chrisl-and-engineerstudent)., @chrisl
- Как объединить два скетча Arduino: один для реле и один для серводвигателя?
- Сервопривод сохраняет свою позицию каждый раз, когда я отправляю какое-то значение
- Как заставить сервопривод вращаться на угол больше 180°
- Подключение Arduino к сервоприводу с внешним источником питания
- Мой сервопривод не работает плавно
- Бесполезная проводка коробки и код
- Почему сервопривод не перемещается по углам должным образом
- Микро сервопривод не работает с Arduino UNO
в вашем скетче нет отладочного кода .... почему вы не печатаете значения `a " и " b " на последовательный монитор?, @jsotola