1

Topic: Cерво sg90 двигается рывками по bluetooth

Добрый день товарищи не могу решить проблему следующего плана:
Собрал манипулятор на сервах sg90 с Ардуино Nano
Питание серво и БТ внешнее от блока питания ( 5в 2а 10W)
Управление через смартфон слайдерами
Если подключать ардуино через USB OTG кабель то сервы двигаются плавно никаких проблем
Если подключить через блютуз ( попробовал все и HM10 HC -05(06) ) то при медленном движении слайдера на телефоне серво двигается не плавно а с рывками, если слайдер сместить быстро то проблема уходит, на 9600 бод это заметно сильнее всего а на 115000 блютуз работает немного плавнее, но через USB OTG кабель на тех же 115200 таких проблем с рывками нет, при медленном движении слайдером на смартфоне сервы двигаются плавненько и точно позиционируются.
Блютуз подключен через Hard Serial по гайду на Remote XY примера с сервой
Не путать с дребезгом сервы! их нет, в простое сервы стоят неподвижно, так же не играет роли одна это серва или несколько,  отсутствие нагрузки тоже роли не играет. Делэй RemoteXY_delay() усугубляет ситуацию
Вот код:
/*
   -- New project --
   
   This source code of graphical user interface
   has been generated automatically by RemoteXY editor.
   To compile this code using RemoteXY library 3.1.13 or later version
   download by link http://remotexy.com/en/library/
   To connect using RemoteXY mobile app by link http://remotexy.com/en/download/                   
     - for ANDROID 4.15.01 or later version;
     - for iOS 1.12.1 or later version;
   
   This source code is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.   
*/

//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////

// можете включить вывод отладочной информации в Serial на 115200
//#define REMOTEXY__DEBUGLOG   

// определение режима соединения и подключение библиотеки RemoteXY
#define REMOTEXY_MODE__HARDSERIAL


// настройки соединения
#define REMOTEXY_SERIAL Serial
#define REMOTEXY_SERIAL_SPEED 115200
#define REMOTEXY_ACCESS_PASSWORD "1234"


#include <RemoteXY.h>

// конфигурация интерфейса RemoteXY 
#pragma pack(push, 1) 
uint8_t RemoteXY_CONF[] =   // 65 bytes
  { 255,5,0,0,0,58,0,19,0,0,0,72,77,45,49,48,0,31,1,106,
  200,1,1,5,0,4,12,9,84,18,128,2,26,4,13,46,85,18,128,2,
  26,4,14,85,81,18,128,2,26,4,15,123,81,18,128,2,26,4,14,165,
  81,18,128,2,26 };
 
// структура определяет все переменные и события вашего интерфейса управления
struct {

    // input variables
  int8_t slider_01; // oт 0 до 100
  int8_t slider_02; // oт 0 до 100
  int8_t slider_03; // oт 0 до 100
  int8_t slider_04; // oт 0 до 100
  int8_t slider_05; // oт 0 до 100

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0

} RemoteXY;   
#pragma pack(pop)

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////

#include <Servo.h>           
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;

void setup()
{
  RemoteXY_Init ();
  myservo1.attach(2);
  myservo2.attach(3);
  myservo3.attach(4);
  myservo4.attach(5);
  myservo5.attach(6);
  RemoteXY.slider_01 = 50;
  RemoteXY.slider_02 = 50;
  RemoteXY.slider_03 = 50;
  RemoteXY.slider_04 = 50;
  RemoteXY.slider_05 = 50;
 
  // TODO you setup code
 
}

void loop()
{
  RemoteXY_Handler ();
  myservo1.writeMicroseconds(RemoteXY.slider_01 * 20 + 500);
  myservo2.writeMicroseconds(RemoteXY.slider_02 * 20 + 500);
  myservo3.writeMicroseconds(RemoteXY.slider_03 * 20 + 500);
  myservo4.writeMicroseconds(RemoteXY.slider_04 * 20 + 500);
  myservo5.writeMicroseconds(RemoteXY.slider_05 * 20 + 500);
  // TODO you loop code
  // используйте структуру RemoteXY для передачи данных
  // не используйте функцию delay(), вместо нее используйте RemoteXY_delay()


}

2

Re: Cерво sg90 двигается рывками по bluetooth

Скорее всего то что вы описываете, связано с тем что для передачи данных нужно время. Чем медленнее связь и чем больше задержки в связи то данные в контроллер поступают рывками. Приложение всегда отправляет в контроллер текущее положение слайдера а не историю его перемещения. И если по используемой связи удается передавать данные 3-4 раза в секунду, то данные в контроллер поступят дискретно, ровно в каком положении слайдер находится в момент отправки данных. Ваш контроллер будет думать что положение слайдера не изменилось ровно до тех пор пока через четверть секунды данные не обновятся. Если вы используете связь через облачный сервер, то там данные могут обновляться раз в секунду.
Что бы избежать дерганий из за медленной связи вам нужно в коде это как то учесть. Например ограничить скорость перемещения сервы что бы она не могла крутиться быстрее какой то заданной скорости. Или использовать какие либо другие алгоритмы.