Ошибка взаимодействия сервоприводов и драйвера двигателя l298n

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем abubakar, 27 мар 2017.

  1. abubakar

    abubakar Нерд

    Я сегодня задался целью создания погрузчика с управлением через телефон(remotexy). Проблема вот в чем: при загрузке в плату стандартного скетча сервоприводов, оба сервопривода работает нормально(без статического дрожания и нагрева). Драйвер двигателя так же работает в нормальном рабочем режиме при загрузке скетча именно для драйвера двигателя. Я решил объединить оба эти скетча, для того чтобы мой механизм не только двигал ковшом при помощи двух сервоприводов, но и передвигался по поверхности при помощи колес с установленными двумя двигателями. Все вроде бы заработало. Но проблема в следующем: К драйверу двигателей вопросов нет, а вот сервоприводы подергиваются все время как-будто бы их кто-то постоянно слегка дергает за веревочку, хотя они и выполняют свою функцию. Как мне убрать это подергивание. Скетч прилагается
    /////////////////////////////////////////////
    // Абубакар Альтемиров //
    /////////////////////////////////////////////

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


    /* настройки соединения */
    // настройки соединения
    #define REMOTEXY_SERIAL_RX 2
    #define REMOTEXY_SERIAL_TX 3
    #define REMOTEXY_SERIAL_SPEED 9600
    #define REMOTEXY_SERIAL Serial
    /* конфигурация интерфейса */
    unsigned char RemoteXY_CONF[] =
    { 4,0,56,0,6,0,0,5,47,28
    ,14,43,43,6,4,0,1,0,13,61
    ,6,4,0,86,0,13,61,6,129,0
    ,9,0,81,11,8,208,159,208,190,208
    ,179,209,128,209,131,208,183,209,135,208
    ,184,208,186,32,118,46,49,46,52,0
    };

    /* структура определяет все переменные вашего интерфейса управления */
    struct {

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

    unsigned char slider_2; // =0..100 положение слайдера //сервоприводы
    unsigned char slider_1; // =0..100 положение слайдера //сервоприводы
    /* other variable */
    unsigned char connect_flag; /* =1 if wire connected, else =0 */

    } RemoteXY;

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

    /* определяем пины управления правым мотором */
    #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

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

    #include <Servo.h>//сервоприводы
    Servo myservo1;//сервоприводы
    Servo myservo;//сервоприводы

    /* определяем два массива с перечислением пинов для каждого мотора */
    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>1) v=1;
    if (v<-1) v=-1;
    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()
    {
    /* инициализация пинов */
    pinMode (PIN_MOTOR_RIGHT_UP, OUTPUT);
    pinMode (PIN_MOTOR_RIGHT_DN, OUTPUT);
    pinMode (PIN_MOTOR_LEFT_UP, OUTPUT);
    pinMode (PIN_MOTOR_LEFT_DN, OUTPUT);

    RemoteXY.slider_1 = 50;//сервоприводы
    myservo1.attach(12);//сервоприводы
    RemoteXY.slider_2 = 50;//сервоприводы
    myservo.attach(11);//сервоприводы
    /* инициализация модуля RemoteXY */
    RemoteXY_Init ();

    }

    void loop()
    {
    /* обработчик событий модуля RemoteXY */
    RemoteXY_Handler ();
    myservo.write(RemoteXY.slider_1 * 1.5);
    myservo1.write(160 - RemoteXY.slider_2 * 1.6); //сервоприводы
    /* управляем пином светодиода */


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

    vvr Инженерище

    похоже что вашим сервам тока не хватает
    как вы их запитали?
     
  3. Onkel

    Onkel Гуру

    эт вряд ли. Если подергиваются - значит импульс приходит не той длины. Если бы тока не хватало, они бы подтормаживали. А тут подергиваются.
     
  4. abubakar

    abubakar Нерд

    питание прямо с ардуино
     
  5. vvr

    vvr Инженерище

    подайте на сервы отдельное питание и не забудьте земли объудинить