Подергивание серво 9G

Dimidrol
Offline
Зарегистрирован: 19.02.2016

Вот такой код. Это управление маршовым мотором и однм серво приводом руля. Испольую в качестве пульта андроид смартфон использую приложение remotexy. Проблема в том что при включении схемы. Серва поворачивается на 90 градусов. Но после подключения смартфона через блютуз. серва реагирует на управление. Но пстоянно дергается. раскачивается на 1 или 2 градуса. В чем проблема.

 

/* 
   -- Пульт для машинки -- 
    
/* 
////////////////////////////////////////////// 
//        RemoteXY include library          // 
////////////////////////////////////////////// 

// определение режима соединения и подключение библиотеки RemoteXY  
#define REMOTEXY_MODE__SOFTSERIAL
#include <SoftwareSerial.h> 
#include <Servo.h> 

#include <RemoteXY.h> 

// настройки соединения  
#define REMOTEXY_SERIAL_RX 2 
#define REMOTEXY_SERIAL_TX 3 
#define REMOTEXY_SERIAL_SPEED 9600 


// конфигурация интерфейса   
#pragma pack(push, 1) 
uint8_t RemoteXY_CONF[] = 
  { 4,4,99,0,6,5,0,5,32,67
  ,31,30,30,2,5,32,3,30,30,30
  ,2,66,131,42,11,16,7,2,65,10
  ,62,12,24,7,2,65,10,16,12,21
  ,7,2,65,12,42,25,18,7,2,129
  ,0,63,12,23,6,9,208,146,208,191
  ,208,181,209,128,208,181,208,180,0,129
  ,0,17,12,18,6,9,208,157,208,176
  ,208,183,208,176,208,180,0,129,0,43
  ,25,15,6,9,208,161,209,130,208,190
  ,208,191,0 }; 
   
// структура определяет все переменные вашего интерфейса управления  
struct { 

    // input variable
  int8_t joystick_1_x; // =-100..100 координата x положения джойстика 
  int8_t joystick_1_y; // =-100..100 координата y положения джойстика 
  int8_t joystick_2_x; // =-100..100 координата x положения джойстика 
  int8_t joystick_2_y; // =-100..100 координата y положения джойстика 

    // output variable
  int8_t level_speed; // =0..100 положение уровня 
  uint8_t led_forward_g; // =0..255 яркость зеленого цвета индикатора 
  uint8_t led_back_g; // =0..255 яркость зеленого цвета индикатора 
  uint8_t led_stop_r; // =0..255 яркость красного цвета индикатора 

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

} RemoteXY; 
Servo servoL1;  // объект сервопривод №1
#pragma pack(pop) 

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

                                                                         //Графика
#include <robocraft.h>
//
// тестовый скетч с L293
// добавили пробные функции для работы с моторчиками через L293
//
//
// by noonv <http://www.robocraft.ru>
//

MOTOR MOTOR1 = { 6, 7, 9 };
MOTOR MOTOR2 = { 10, 11, 12 };

RoboCraft robot(&MOTOR1, &MOTOR2);     // создаём экземпляр нашего класса

void setup()
{
  servoL1.attach(5); // Сервопривод подключен к цифровому выходу 9
   //servo1.detach() для расслабления мотора сервопривода

   servoL1.write(90); 

  RemoteXY_Init ();  

  Serial.begin(9600);
  robot.hello();    // говорим "Hello" :)
}

void loop()
{
  RemoteXY_Handler (); 
   //Функция управления поворотом
    if (RemoteXY.joystick_2_x<0)
      { servoL1.write(RemoteXY.joystick_2_x+89);}
   if (RemoteXY.joystick_2_x>0)
      {servoL1.write(RemoteXY.joystick_2_x+89);}
      //Функция управления поворотом
      Serial.println(RemoteXY.joystick_2_x);
  if (RemoteXY.joystick_1_y > 40) //едем вперед
    {    
   robot.motor_forward(1,(RemoteXY.joystick_1_y*2.55)); // если джостик вверх полный вперёд :)
   RemoteXY.level_speed = RemoteXY.joystick_1_y;
   RemoteXY.led_forward_g = 255;
   RemoteXY.led_stop_r = 0;  // сброс всех значений датчиков
   
    }
  if (RemoteXY.joystick_1_y < -40) //едем назад
     {
   robot.motor_back(1,((RemoteXY.joystick_1_y*-1)*2.55)); 
   RemoteXY.level_speed = (RemoteXY.joystick_1_y*-1);
   RemoteXY.led_back_g = 255;
   RemoteXY.led_stop_r = 0;  // сброс всех значений датчиков
     }
      if (RemoteXY.joystick_1_y == 0)//стоим
    {    
  robot.motor_forward(1,0); // джойстик отпущен стоп :)
    RemoteXY.led_stop_r = 255;
    RemoteXY.led_back_g = 0; // сброс всех значений датчиков
    RemoteXY.led_forward_g =0; // сброс всех значений датчиков
    RemoteXY.level_speed = 0; // сброс всех значений датчиков
    }
   
}

 

Dimidrol
Offline
Зарегистрирован: 19.02.2016

Так же заметил следующее при добавлении кода управления сервой. Проподает шим управление маршавым мотором. Он включается только при максимальном положении джосика. При удалении кода управлени сервой, шим управлеия восстанавливается. и маршавый мотор адыкватно реагирует на положение джойстика.

Igor23
Offline
Зарегистрирован: 04.02.2017

Dimidrol пишет:

 Проблема в том что при включении схемы. Серва поворачивается на 90 градусов.

У вас в коде - это записано в строке 083 servoL1.write(90); - серва устанавливается в центральное положение

В робототехнике перед сборкой робота рекомендуют выставить сервоприводы в центральное положение - затем

одеть на сервопривод рычаг... в вашем случае - снимите рычаг с сервы - включите машинку она установит серво в 0 положение (90 градусов) - колёса также установлены в 0 положение то-есть прямо, оденьте в этом положении рычаг и закрепите.

 

Dimidrol
Offline
Зарегистрирован: 19.02.2016

Проблема не в том что она проворачивается на 90 градусов. А втом, что начинает дергаться после этого.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Dimidrol пишет:
Проблема не в том что она проворачивается на 90 градусов. А втом, что начинает дергаться после этого.

смотрите питание

M a x
Offline
Зарегистрирован: 20.06.2016

попробуйте убрать первые два "if (RemoteXY....", оставьте только "servoL1.write(RemoteXY

bborisbboris
Offline
Зарегистрирован: 08.10.2017

Есть одна особенность использования библиотеки "servo.h". Ее нельзя использовать совместно с библиотекой программного последовательного порта "SoftwareSerial.h". Эти библиотеки используют совместные ресурсы микроконтроллера. Сервоприводы будут подергиваться, так как поддержание постоянной ширины импульсов будет невозможно. Для решения этой проблемы для обмена данными со смартфоном настроим библиотеку RemoteXY на аппаратный последовательный порт.