Сервоуправление 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);


}
}
}

В чем проблема?

, 👍-1

Обсуждение

в вашем скетче нет отладочного кода .... почему вы не печатаете значения `a " и " b " на последовательный монитор?, @jsotola


1 ответ


0

При использовании

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