1

Topic: Сервопривод+Мотор-редуктор (конфликт библиотек)

Подскажите пожалуйста как совместить сервоприводы+Моторы-редукторы, при условии, что в примере говорится про "Есть одна особенность использования библиотеки "servo.h". Ее нельзя использовать совместно с библиотекой программного последовательного порта "SoftwareSerial.h". Можно ли на библиотеке "servo.h" использовать мотор-редуктор в месте с сервоприводом.? Или как настроить чтобы все работало. Хочу сделать танк с 3 моторами-редукторами (а будет на спусковом механизме шмалять пульками) и 2 серовпривода (башня танка). И также подскажите как можно настроить угол поворота. Заранее спасибо за помощь, жду с нетерпением ответа.

2

Re: Сервопривод+Мотор-редуктор (конфликт библиотек)

1. Библиотека servo.h только для сервоприводов, а не для мотор-редукторов.
2. Совместить сервоприводы и мотор-редукторы можно.
3. Утверждение "servo.h" нельзя использовать совместно с библиотекой "SoftwareSerial.h", - это относится только к библиотекам servo.h и SoftwareSerial.h , и ни как не к мотор-редукторам
4. Что бы использовать servo.h без проблем, просто не используйте SoftwareSerial.h, цепляйте RemoteXY к аппаратному порту

3

Re: Сервопривод+Мотор-редуктор (конфликт библиотек)

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

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

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

#include <RemoteXY.h>

// настройки соединения
#define REMOTEXY_SERIAL Serial
#define REMOTEXY_SERIAL_SPEED 115200
#define REMOTEXY_WIFI_SSID "RemoteXY"
#define REMOTEXY_WIFI_PASSWORD "12345678"
#define REMOTEXY_SERVER_PORT 6377


// конфигурация интерфейса 
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
  { 255,5,0,0,0,33,0,6,0,0,
  5,0,5,29,30,30,2,1,0,74,
  24,21,21,2,88,0,4,32,52,15,
  9,45,2,4,160,30,6,51,8,2 };
 
// структура определяет все переменные вашего интерфейса управления
struct {

    // input variable
  int8_t joystick_1_x; // =-100..100 координата x положения джойстика
  int8_t joystick_1_y; // =-100..100 координата y положения джойстика
  uint8_t button_3; // =1 если кнопка нажата, иначе =0
  int8_t slider_x; // =0..100 положение слайдера
  int8_t slider_y; // =0..100 положение слайдера

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

} RemoteXY;
#pragma pack(pop)

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

#include <Servo.h>

#define PIN_X_SERVO 2
#define PIN_Y_SERVO 3

Servo x_servo;
Servo y_servo;

unsigned char led_state = 0;
unsigned long led_time=0;
unsigned long prev_time=0;

/* определяем пины управления правым мотором */
#define PIN_MOTOR_RIGHT_UP 7
#define PIN_MOTOR_RIGHT_DN 6
#define PIN_MOTOR_RIGHT_SPEED 10

/* определяем пины управления левым мотором */
#define PIN_MOTOR_LEFT_UP 5
#define PIN_MOTOR_LEFT_DN 4
#define PIN_MOTOR_LEFT_SPEED 9

/* определяем пин управления светодиодом */
#define PIN_MOTOR_SHOOT 8

/* определяем два массива с перечислением пинов для каждого мотора */
unsigned char RightMotor[3] = 
  {PIN_MOTOR_RIGHT_UP, PIN_MOTOR_RIGHT_DN, PIN_MOTOR_RIGHT_SPEED};
unsigned char LeftMotor[3] = 
  {PIN_MOTOR_LEFT_UP, PIN_MOTOR_LEFT_DN, PIN_MOTOR_LEFT_SPEED};

/*
   управление скоростью мотора
   motor - ссылка на массив пинов
   v - скорость мотора, может принимать значения от -100 до 100
*/
void Wheel (unsigned char * motor, int v)
{
  if (v>100) v=100;
  if (v<-100) v=-100;
  if (v>0) {
    digitalWrite(motor[0], HIGH);
    digitalWrite(motor[1], LOW);
    analogWrite(motor[2], v*2.55);
  }
  else if (v<0) {
    digitalWrite(motor[0], LOW);
    digitalWrite(motor[1], HIGH);
    analogWrite(motor[2], (-v)*2.55);
  }
  else {
    digitalWrite(motor[0], LOW);
    digitalWrite(motor[1], LOW);
    analogWrite(motor[2], 0);
  }
}


void setup()
{
  RemoteXY_Init ();
   
  // TODO you setup code 
   
  x_servo.attach(PIN_X_SERVO);
  y_servo.attach(PIN_Y_SERVO);

  RemoteXY.slider_x=50;
  RemoteXY.slider_y=50;

    /* инициализация пинов */
  pinMode (PIN_MOTOR_RIGHT_UP, OUTPUT);
  pinMode (PIN_MOTOR_RIGHT_DN, OUTPUT);
  pinMode (PIN_MOTOR_LEFT_UP, OUTPUT);
  pinMode (PIN_MOTOR_LEFT_DN, OUTPUT);
  pinMode (PIN_MOTOR_SHOOT, OUTPUT);

  /* инициализация модуля RemoteXY */
  RemoteXY_Init ();
}

void loop()
{
  RemoteXY_Handler ();
 
 
  // TODO you loop code
  // используйте структуру RemoteXY для передачи данных
/* обработчик событий модуля RemoteXY */
  RemoteXY_Handler ();

  /* управляем пином спускового механизма */
  digitalWrite (PIN_MOTOR_SHOOT, (RemoteXY.button_3==0)?LOW:HIGH);

  /* управляем правым мотором */
  Wheel (RightMotor, RemoteXY.joystick_1_y - RemoteXY.joystick_1_x);
  /* управляем левым мотором */
  Wheel (LeftMotor, RemoteXY.joystick_1_y + RemoteXY.joystick_1_x);

  /* Cервоприводы */
  unsigned long time = millis();
  unsigned long d_time = time - prev_time;
  prev_time = time;
   
  x_servo.writeMicroseconds(RemoteXY.slider_x*20+500); 
  y_servo.writeMicroseconds(2500-RemoteXY.slider_y*20); 

}

4

Re: Сервопривод+Мотор-редуктор (конфликт библиотек)

И тут же следующий вопрос, подскажите пожалуйста к Motor Shield L293D, через библиотеку "AFMotor.h" как подтянуть управление.
В Вашем примере идет 3 пина на выход (вперед, назад, скорость), а у Motor Shield L293D через библиотеку "AFMotor.h" используется как я понял 2 пина (направление вращения, скорость). Как вот это все можно совместить, или тот вариант, что я указал в скетче сработает. То есть хочу роторный двигатель подключить паралельно на 2 канала, где на каждом канале будет свое направление вращения (так как у Вас было в примере).

5

Re: Сервопривод+Мотор-редуктор (конфликт библиотек)

Лучше самого ардуино ваш скетч никто не проверит. Загружайте и ищите ошибки.