сервы

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем robokop, 2 июн 2016.

  1. robokop

    robokop Гик

    Люди помогите , я подключил 11 серв к общему минусу и плюсу. минус-GND плюс - VIN . Аккумулятор , который я использую ,мощностью 12в. Вопрос: как мне повысить мощность выходного тока ?
     
  2. mat

    mat Нерд

    12 вольт это напряжение, а не мощность. Мощность это произведение напряжения на ток. Другими словами 12 вольт умножим на 10 ампер получим 120 ватт. Если отвечать на Ваш вопрос, возьмите самый большой, какой сможете, по габаритам аккумулятор.
     
  3. robokop

    robokop Гик

    мне нужна компактность. И этот аккумулятор оказался самым лучшим решением. Нужно что-то другое.
     
  4. mat

    mat Нерд

    Тогда, подсчитайте суммарный ток ( в амперах ) Ваших сервомоторов и сравните с током, который может отдавать Ваш аккумулятор. Второе число должно быть не меньше первого.
     
  5. robokop

    robokop Гик

    а может быть так,что сервоприводам просто не хватает тока,так как аккумулятор не полностью заряжен?
     
  6. mat

    mat Нерд

    Вполне. У Вас приборы есть ?
     
  7. mat

    mat Нерд

    Дайте данные Ваших сервомоторов и аккумулятора.
     
  8. robokop

    robokop Гик

    у меня только мультиметр на руках
     
  9. robokop

    robokop Гик

    Сервоприводы-http://shop.zelectro.cc/servo-9g-sg90
    аккумулятор -http://ru.aliexpress.com/item/Super-Rechargeable-Protable-Lithium-ion-Battery-EU-Plug-for-DC-12V-1800mAh/32342434387.html
     
  10. mat

    mat Нерд

    По описанию, Ваш аккумулятор отдаёт ток от 1 ампера до 2,4 ампера, а вот сервомоторы при таком напряжении могут вполне потребовать ток, который превысит возможности Вашего аккумулятора. Напряжение им нужно в два раза меньше. Попробуйте сначала скажем, 4 мотора подключить к аккумулятору и попробуйте. Потом добавляйте Ваши моторы, пока аккумулятор не начнёт протестовать...
     
  11. robokop

    robokop Гик

    А что потом ?
     
  12. mat

    mat Нерд

    Ну, как минимум, Вы узнаете, на что способен Ваш аккумулятор или не допустили ли Вы сами ошибку в монтаже.
     
  13. XCB

    XCB Гик

    сервам нужно 5 вольт, то есть вам нежно понизить напряжение, например при помощи dc-dc step down преобразователя
     
  14. robokop

    robokop Гик

    Здравствуйте! Помогите мне в решении моей проблемы, пожалуйста! Я неправильно написал программ, и теперь не понимаю, как это исправить. По моей идее, платформа должна сначала встать с согнутых лап на прямые.

    НО происходит то , что показано на видео . Вот на него ссылка
    https://yadi.sk/i/rVNxOdIDsRrYY

    Помогите решить проблему с кодом ,пожалуйста !
    Вот код:
    #include <Servo.h>

    // Пины ультразвукового дальномера
    #define trigPin 22
    #define echoPin 24
    long duration, distance;

    // Название сервоприводов
    Servo servo1;
    Servo servo2;
    Servo servo3;
    Servo servo4;
    Servo servo5;
    Servo servo6;
    Servo servo7;
    Servo servo8;
    Servo myservoH; // Горизонтальная серва углы от 25 до 145 (центровка 85)
    Servo myservoV; // Вертикальная серва углы от 0 до 35

    const int H_SERVO_PIN = 11; // Горизонтальная серва подключена к пину 11
    const int V_SERVO_PIN = 10; //Пин вертикального сервопривода

    const float H_L_ANGLE = 145; // Максимальные угл поворота башни налево
    const float H_R_ANGLE = 25; // Максимальные угл поворота башни направо
    const float H_DEF_ANGLE = 85; // Дефолтный угол (центровка)

    const float V_U_ANGLE = 55; // Максимальные угл поворота башни вверх
    const float V_D_ANGLE = 0; // Максимальные угл поворота башни вниз
    const float V_DEF_ANGLE = 25; // Дефолтный угол (центровка)

    //Размер шага V_STEP и H_STEP побираем экспериментально для достижения нужной скорости поворота серв
    const float V_STEP = 0.007; // Шаг - знаение отвечающее за скорость вращения по вертикали.
    const float H_STEP = 0.012; // Шаг - знаение отвечающее за скорость вращения по горизонтали

    float curVAngle = V_DEF_ANGLE; //Переменная текущего угла верт. сервы
    float curHAngle = H_DEF_ANGLE; //Переменная текущего угла гор. сервы

    bool moveServoVUp = false; //Флаг движения верт. сервы вверх
    bool moveServoVDown = false; //Флаг движения верт. сервы вниз
    bool moveServoHLeft = false; //Флаг движения гор. сервы влево
    bool moveServoHRight = false; //Флаг движения гор. сервы вправо

    // Переменные 1 = вкл. 0 = откл.
    int gozforward = 1 ; // идти вперед
    int gozstop = 0 ; // Стоп
    int go = 1 ; // Для удобства тестирования дополнений
    //int val ;

    // Переменные скорости
    int movespeed = 100; // Скорость подъема в стойку
    int stepspeed = 220; // скорость передвижения

    // Крайние точки углов при которых нужно устанавливать лапы
    int zs1 = 0;
    int zs2 = 180;
    int zs3 = 180;
    int zs4 = 0;
    int zs5 = 0;
    int zs6 = 180;
    int zs7 = 180;
    int zs8 = 0;
    int LED = 13;

    // Основная стойка. Можете написать отдельное число.
    // например int s1 = 130;
    // Я использовал такой способ для подгонки каждой лапы. Измените если нужно.
    int s1 = zs1 + 130;
    int s2 = zs2 - 130;
    int s3 = zs3 - 130;
    int s4 = zs4 + 130;
    int s5 = zs5 + 130;
    int s6 = zs6 - 130;
    int s7 = zs7 - 130;
    int s8 = zs8 + 130;

    // Основная стойка используется для остановки
    int pos_stop[1][8]={s1,s2, s3,s4, s5,s6, s7,s8};
    // откройте при настройке исходного положения лап
    //int pos_stop[1][8]={zs1,zs2, zs3,zs4, zs5,zs6, zs7,zs8};

    // Переменные для массива шагов
    int zgos1 = 0;
    int zgos2 = 0;
    int zgos3 = 0;


    // Массив в котором записаны все шаги
    int pos_steps[2][6][8]=
    {
    //---------- Часть 1 Шаг начинается с передней левой ноги -------------
    {
    {
    s1,s2, s3,s4, s5+10,s6-10, s7+20,s8-20 }
    ,
    {
    s1-100,s2+50, s3,s4, s5+10,s6-10, s7+20,s8-20 }
    ,
    {
    s1-30,s2-40, s3-20,s4+20, s5,s6, s7,s8 }
    ,
    {
    s1-30,s2-40, s3-20,s4+20, s5,s6, s7+40,s8-20 }
    ,
    {
    s1-10,s2-30, s3,s4, s5,s6, s7+10,s8+30 }
    ,
    {
    s1,s2, s3-10,s4-10, s5+10,s6+10, s7,s8 }
    }
    ,

    //---------- Часть 2 Шаг начинается с передней правой ноги -------------
    {
    {
    s1,s2, s3,s4, s5-20,s6+20, s7-10,s8+10 }
    ,
    {
    s1,s2, s3+100,s4-50, s5-20,s6+20, s7-10,s8+10 }
    ,
    {
    s1+20,s2-20, s3+30,s4+40, s5,s6, s7-10,s8+10 }
    ,
    {
    s1+20,s2-20, s3+30,s4+40, s5-40,s6+20, s7-10,s8+10 }
    ,
    {
    s1,s2, s3+10,s4+30, s5-10,s6-30, s7,s8 }
    ,
    {
    s1+10,s2+10, s3,s4, s5,s6, s7-10,s8-10 }
    }
    };

    void setup ()
    {
    Serial.begin(9600);

    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);

    //используем 13 пин как индикатор включённой ардуины
    pinMode(LED, OUTPUT);
    digitalWrite(LED, HIGH);

    // Пины сервоприводов
    servo1.attach(2);
    servo2.attach(3);
    servo3.attach(4);
    servo4.attach(5);
    servo5.attach(6);
    servo6.attach(7);
    servo7.attach(8);
    servo8.attach(9);

    // Занимает исходное положение
    servo1.write(pos_stop[0][0]);
    delay(movespeed);
    servo2.write(pos_stop[0][1]);
    delay(movespeed);
    servo3.write(pos_stop[0][2]);
    delay(movespeed);
    servo4.write(pos_stop[0][3]);
    delay(movespeed);
    servo5.write(pos_stop[0][4]);
    delay(movespeed);
    servo6.write(pos_stop[0][5]);
    delay(movespeed);
    servo7.write(pos_stop[0][6]);
    delay(movespeed);
    servo8.write(pos_stop[0][7]);
    //gozstop = 1;
    delay(3000);
    }

    void loop()
    {
    char val;
    if (Serial.available())
    {
    val = (char)Serial.read();
    //Serial.println(val);
    }

    ! switch var;
    {
    servo1.write(pos_stop[0][0]);
    servo3.write(pos_stop[0][2]);
    servo5.write(pos_stop[0][4]);
    servo7.write(pos_stop[0][6]);
    servo2.write(pos_stop[0][1]);
    servo4.write(pos_stop[0][3]);
    servo6.write(pos_stop[0][5]);
    servo8.write(pos_stop[0][7]);

    //! Перенес из case
    moveServoVDown = true;



    case 'S':
    // Движение вперед
    // при этом условии в первую очередь работает нога 4

    // данное условие возможно вам не понадобиться!
    // оставьте часть после else!
    servo7.write(pos_steps[zgos1][zgos2][6]);
    servo8.write(pos_steps[zgos1][zgos2][7]);
    servo5.write(pos_steps[zgos1][zgos2][4]);
    servo6.write(pos_steps[zgos1][zgos2][5]);
    servo1.write(pos_steps[zgos1][zgos2][0]);
    servo2.write(pos_steps[zgos1][zgos2][1]);
    servo3.write(pos_steps[zgos1][zgos2][2]);
    servo4.write(pos_steps[zgos1][zgos2][3]);


    servo1.write(pos_steps[zgos1][zgos2][0]);
    servo3.write(pos_steps[zgos1][zgos2][2]);
    servo2.write(pos_steps[zgos1][zgos2][1]);
    servo4.write(pos_steps[zgos1][zgos2][3]);
    servo5.write(pos_steps[zgos1][zgos2][4]);
    servo7.write(pos_steps[zgos1][zgos2][6]);
    servo6.write(pos_steps[zgos1][zgos2][5]);
    servo8.write(pos_steps[zgos1][zgos2][7]);
    Serial.println('S');
    break;
    case 'I': //servoV вверх:
    moveServoVUp = true;
    Serial.println('I');
    break;
    //case 'g': //servoV вниз
    // moveServoVDown = true;
    // break;
    case 'i': //servoV стоп
    moveServoVUp = false;
    moveServoVDown = false;
    Serial.println('i');
    break;
    case 'L': //servoH движется к 25
    moveServoHRight = true;
    Serial.println('L');
    break;
    case 'J': //servoH движется к 145
    moveServoHLeft = true;
    Serial.println('J');
    break;
    case 'l': //servoH стоп
    moveServoHLeft = false;
    moveServoHRight = false;
    Serial.println('l');
    break;
    case 'h':
    curVAngle = V_DEF_ANGLE;
    curHAngle = H_DEF_ANGLE;
    myservoV.write(curVAngle);
    myservoH.write(curHAngle);
    Serial.println('h');
    break;
    }
    }
     
  15. pyro

    pyro Гик

    Код (C++):

    #include <Servo.h>

    // Пины ультразвукового дальномера
    #define trigPin 22
    #define echoPin 24
    long duration, distance;

    // Название сервоприводов
    Servo servo1;
    Servo servo2;
    Servo servo3;
    Servo servo4;
    Servo servo5;
    Servo servo6;
    Servo servo7;
    Servo servo8;
    Servo myservoH; // Горизонтальная серва углы от 25 до 145 (центровка 85)
    Servo myservoV; // Вертикальная серва углы от 0 до 35

    const int H_SERVO_PIN = 11; // Горизонтальная серва подключена к пину 11
    const int V_SERVO_PIN = 10; //Пин вертикального сервопривода

    const float H_L_ANGLE = 145; // Максимальные угл поворота башни налево
    const float H_R_ANGLE = 25; // Максимальные угл поворота башни направо
    const float H_DEF_ANGLE = 85; // Дефолтный угол (центровка)

    const float V_U_ANGLE = 55; // Максимальные угл поворота башни вверх
    const float V_D_ANGLE = 0; // Максимальные угл поворота башни вниз
    const float V_DEF_ANGLE = 25; // Дефолтный угол (центровка)

    //Размер шага V_STEP и H_STEP побираем экспериментально для достижения нужной скорости поворота серв
    const float V_STEP = 0.007; // Шаг - знаение отвечающее за скорость вращения по вертикали.
    const float H_STEP = 0.012; // Шаг - знаение отвечающее за скорость вращения по горизонтали

    float curVAngle = V_DEF_ANGLE; //Переменная текущего угла верт. сервы
    float curHAngle = H_DEF_ANGLE; //Переменная текущего угла гор. сервы

    bool moveServoVUp = false; //Флаг движения верт. сервы вверх
    bool moveServoVDown = false; //Флаг движения верт. сервы вниз
    bool moveServoHLeft = false; //Флаг движения гор. сервы влево
    bool moveServoHRight = false; //Флаг движения гор. сервы вправо

    // Переменные 1 = вкл. 0 = откл.
    int gozforward = 1 ; // идти вперед
    int gozstop = 0 ; // Стоп
    int go = 1 ; // Для удобства тестирования дополнений
    //int val ;

    // Переменные скорости
    int movespeed = 100; // Скорость подъема в стойку
    int stepspeed = 220; // скорость передвижения

    // Крайние точки углов при которых нужно устанавливать лапы
    int zs1 = 0;
    int zs2 = 180;
    int zs3 = 180;
    int zs4 = 0;
    int zs5 = 0;
    int zs6 = 180;
    int zs7 = 180;
    int zs8 = 0;
    int LED = 13;

    // Основная стойка. Можете написать отдельное число.
    // например int s1 = 130;
    // Я использовал такой способ для подгонки каждой лапы. Измените если нужно.
    int s1 = zs1 + 130;
    int s2 = zs2 - 130;
    int s3 = zs3 - 130;
    int s4 = zs4 + 130;
    int s5 = zs5 + 130;
    int s6 = zs6 - 130;
    int s7 = zs7 - 130;
    int s8 = zs8 + 130;

    // Основная стойка используется для остановки
    int pos_stop[1][8] = {s1, s2, s3, s4, s5, s6, s7, s8};
    // откройте при настройке исходного положения лап
    //int pos_stop[1][8]={zs1,zs2, zs3,zs4, zs5,zs6, zs7,zs8};

    // Переменные для массива шагов
    int zgos1 = 0;
    int zgos2 = 0;
    int zgos3 = 0;


    // Массив в котором записаны все шаги
    int pos_steps[2][6][8] =
    {
      //---------- Часть 1 Шаг начинается с передней левой ноги -------------
      {
        {
          s1, s2, s3, s4, s5 + 10, s6 - 10, s7 + 20, s8 - 20
        }
        ,
        {
          s1 - 100, s2 + 50, s3, s4, s5 + 10, s6 - 10, s7 + 20, s8 - 20
        }
        ,
        {
          s1 - 30, s2 - 40, s3 - 20, s4 + 20, s5, s6, s7, s8
        }
        ,
        {
          s1 - 30, s2 - 40, s3 - 20, s4 + 20, s5, s6, s7 + 40, s8 - 20
        }
        ,
        {
          s1 - 10, s2 - 30, s3, s4, s5, s6, s7 + 10, s8 + 30
        }
        ,
        {
          s1, s2, s3 - 10, s4 - 10, s5 + 10, s6 + 10, s7, s8
        }
      }
      ,

      //---------- Часть 2 Шаг начинается с передней правой ноги -------------
      {
        {
          s1, s2, s3, s4, s5 - 20, s6 + 20, s7 - 10, s8 + 10
        }
        ,
        {
          s1, s2, s3 + 100, s4 - 50, s5 - 20, s6 + 20, s7 - 10, s8 + 10
        }
        ,
        {
          s1 + 20, s2 - 20, s3 + 30, s4 + 40, s5, s6, s7 - 10, s8 + 10
        }
        ,
        {
          s1 + 20, s2 - 20, s3 + 30, s4 + 40, s5 - 40, s6 + 20, s7 - 10, s8 + 10
        }
        ,
        {
          s1, s2, s3 + 10, s4 + 30, s5 - 10, s6 - 30, s7, s8
        }
        ,
        {
          s1 + 10, s2 + 10, s3, s4, s5, s6, s7 - 10, s8 - 10
        }
      }
    };

    void setup ()
    {
      Serial.begin(9600);

      pinMode(trigPin, OUTPUT);
      pinMode(echoPin, INPUT);

      //используем 13 пин как индикатор включённой ардуины
      pinMode(LED, OUTPUT);
      digitalWrite(LED, HIGH);

      // Пины сервоприводов
      servo1.attach(2);
      servo2.attach(3);
      servo3.attach(4);
      servo4.attach(5);
      servo5.attach(6);
      servo6.attach(7);
      servo7.attach(8);
      servo8.attach(9);

      // Занимает исходное положение
      servo1.write(pos_stop[0][0]);
      delay(movespeed);
      servo2.write(pos_stop[0][1]);
      delay(movespeed);
      servo3.write(pos_stop[0][2]);
      delay(movespeed);
      servo4.write(pos_stop[0][3]);
      delay(movespeed);
      servo5.write(pos_stop[0][4]);
      delay(movespeed);
      servo6.write(pos_stop[0][5]);
      delay(movespeed);
      servo7.write(pos_stop[0][6]);
      delay(movespeed);
      servo8.write(pos_stop[0][7]);
      //gozstop = 1;
      delay(3000);
    }

    void loop()
    {
      char val;
      if (Serial.available())
      {
        val = (char)Serial.read();
        //Serial.println(val);
      }

      ! switch var;
    {
      servo1.write(pos_stop[0][0]);
        servo3.write(pos_stop[0][2]);
        servo5.write(pos_stop[0][4]);
        servo7.write(pos_stop[0][6]);
        servo2.write(pos_stop[0][1]);
        servo4.write(pos_stop[0][3]);
        servo6.write(pos_stop[0][5]);
        servo8.write(pos_stop[0][7]);

        //! Перенес из case
        moveServoVDown = true;



      case 'S':
        // Движение вперед
        // при этом условии в первую очередь работает нога 4

        // данное условие возможно вам не понадобиться!
        // оставьте часть после else!
        servo7.write(pos_steps[zgos1][zgos2][6]);
        servo8.write(pos_steps[zgos1][zgos2][7]);
        servo5.write(pos_steps[zgos1][zgos2][4]);
        servo6.write(pos_steps[zgos1][zgos2][5]);
        servo1.write(pos_steps[zgos1][zgos2][0]);
        servo2.write(pos_steps[zgos1][zgos2][1]);
        servo3.write(pos_steps[zgos1][zgos2][2]);
        servo4.write(pos_steps[zgos1][zgos2][3]);


        servo1.write(pos_steps[zgos1][zgos2][0]);
        servo3.write(pos_steps[zgos1][zgos2][2]);
        servo2.write(pos_steps[zgos1][zgos2][1]);
        servo4.write(pos_steps[zgos1][zgos2][3]);
        servo5.write(pos_steps[zgos1][zgos2][4]);
        servo7.write(pos_steps[zgos1][zgos2][6]);
        servo6.write(pos_steps[zgos1][zgos2][5]);
        servo8.write(pos_steps[zgos1][zgos2][7]);
        Serial.println('S');
        break;
      case 'I': //servoV вверх:
        moveServoVUp = true;
        Serial.println('I');
        break;
        //case 'g': //servoV вниз
        // moveServoVDown = true;
        // break;
      case 'i': //servoV стоп
        moveServoVUp = false;
        moveServoVDown = false;
        Serial.println('i');
        break;
      case 'L': //servoH движется к 25
        moveServoHRight = true;
        Serial.println('L');
        break;
      case 'J': //servoH движется к 145
        moveServoHLeft = true;
        Serial.println('J');
        break;
      case 'l': //servoH стоп
        moveServoHLeft = false;
        moveServoHRight = false;
        Serial.println('l');
        break;
      case 'h':
        curVAngle = V_DEF_ANGLE;
        curHAngle = H_DEF_ANGLE;
        myservoV.write(curVAngle);
        myservoH.write(curHAngle);
        Serial.println('h');
        break;
      }
    }

     
     
    robokop нравится это.
  16. robokop

    robokop Гик

    компилятор ругается на ! switch var