Двуногий шагающий робот на четырех сервоприводах - ФОРУМ ДВ Робот dvrobot.ru
Пятница, 17.05.2024, 06:06
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    • Страница 1 из 1
    • 1
    Модератор форума: GRACH, Serg  
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Двуногий шагающий робот на четырех сервоприводах (Простой и недорогой шагающий робот на arduino)
    Двуногий шагающий робот на четырех сервоприводах
    m_wДата: Вторник, 26.02.2013, 06:27 | Сообщение # 1
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline
    Давно хотел сделать двуногую шагающую платформу.

    На YouTube нашел

     

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

    Видео того, что получилось



    Он немного дороже, но мне больше нравиться мой вариант :-)


    Мой блог http://justforduino.blogspot.ru/

    Сообщение отредактировал m_w - Вторник, 26.02.2013, 07:21
     
    m_wДата: Вторник, 26.02.2013, 06:33 | Сообщение # 2
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline
    Сделан робот из нижеперечисленных деталей:
    - Ступня для шагающего робота http://dvrobot.ru/shop/i347.Robo_-_Stupnya.htm (2 шт.),
    - Рулевое устройство манипулятора http://dvrobot.ru/shop/i225.rulevoe_ustroystvo_manipulyatora.htm (4 шт.),
    - Короткий П образный кронштей http://dvrobot.ru/shop/i223.korotkiy_p_obraznyy_kronshteyn..htm (4 шт.),
    - Кронштейн L-типа http://dvrobot.ru/shop/i222.kronshteyn_l_tipa.htm (2 шт.),
    - Подшипник для манипулятора http://dvrobot.ru/shop/i227.podshipnik_dlya_manipulyatora.htm (4 шт.).

    Еще нужно четыре сервопривода. Я использовал HK15288A. Но должны подойти и MG995 http://dvrobot.ru/shop/i99.servodvigatel_mg995.htm

    Для крепления ступни необходимо 8 болтиков 4х10 с конической головкой. Для крепления сервоприводов я использовал 16 болтиков 4х10 с циллиндрической головкой. Ко всем этим болтикам нужно 24 гаички. Качалки сервоприводов фиксируются 16 саморезиками 2.5х10 с конической головкой. В остальных соединениях применяются болтики 3х10 с цилиндрической головкой. Их требуется 20 штук. Для них тоже нужны соответствующие гаички.

    Неплохо применить специальные составы для фиксации резьбовых соединений. Но это если не планируется переделка платформы.

    Подробно описывать процес сборки вряд ли нужно. Платформа действительно простая. И на фотографиях все видно.



    http://yadi.sk/d/bvD4mMx72sxYy
    Прикрепления: 7429785.jpg (199.2 Kb)


    Мой блог http://justforduino.blogspot.ru/
     
    m_wДата: Вторник, 26.02.2013, 06:35 | Сообщение # 3
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline


    http://yadi.sk/d/GIoQTB-12sxsA
    Прикрепления: 2329312.jpg (209.4 Kb)


    Мой блог http://justforduino.blogspot.ru/
     
    m_wДата: Вторник, 26.02.2013, 06:36 | Сообщение # 4
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline


    http://yadi.sk/d/-atdN6Vt2sy7o
    Прикрепления: 8367546.jpg (193.7 Kb)


    Мой блог http://justforduino.blogspot.ru/
     
    m_wДата: Вторник, 26.02.2013, 06:38 | Сообщение # 5
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline


    http://yadi.sk/d/S6KOlWBn2syI2
    Прикрепления: 5659762.jpg (188.0 Kb)


    Мой блог http://justforduino.blogspot.ru/
     
    m_wДата: Вторник, 26.02.2013, 06:40 | Сообщение # 6
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline


    http://yadi.sk/d/2gaYg1x82syQK
    Прикрепления: 1701246.jpg (188.8 Kb)


    Мой блог http://justforduino.blogspot.ru/
     
    m_wДата: Вторник, 26.02.2013, 06:41 | Сообщение # 7
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline


    http://yadi.sk/d/-8ntbhWK2syVg
    Прикрепления: 2609476.jpg (169.0 Kb)


    Мой блог http://justforduino.blogspot.ru/
     
    m_wДата: Вторник, 26.02.2013, 06:42 | Сообщение # 8
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline


    http://yadi.sk/d/uD7WT4Ai2syh2
    Прикрепления: 5255446.jpg (166.4 Kb)


    Мой блог http://justforduino.blogspot.ru/
     
    m_wДата: Вторник, 26.02.2013, 06:53 | Сообщение # 9
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline


    http://yadi.sk/d/3ova7ZtO2symy

    Добавлено (26.02.2013, 06:47)
    ---------------------------------------------
    Прежде чем устанавливать качалки на сервоприводы их нужно установить в среднее положение.

    Управление роботом возложено на Arduino. У меня Leonardo. При замене  на UNO http://dvrobot.ru/shop/i129.arduino_uno.htm или UNO R3 http://dvrobot.ru/shop/i230.arduino_uno_r3.htm необходимо внести изменения в скетчи. Нужно в тексте программы везде заменить Serial1 на Serial. И это все. Думаю сложностей быть не должно.

    Для подключения сервоприводов используется датчик-шилд. Я использовал v4.0. Но они все стандартные. Подойдет v5 http://dvrobot.ru/shop/i121.datchik_schit_arduino_v5.htm или v6 http://dvrobot.ru/shop/i279.Datchik_schit_Arduino_V6.htm

    Сервоприводы подключаются к ардуино следующим образом:
    - нижний сервопривод правой ноги управляется D4,
    - верхний сервопривод правой ноги управляется D5,
    - верхний сервопривод левой ноги управляется D6,
    - нижний сервопривод левой ноги управляется D7.

    Для связи с ПК используется Bluetooth модуль.

    Тот, что у меня подключается к ардуино следующим образом:

    Arduino --- Bluetooth Module
    VCC --- VCC
    GND --- GND
    D0 --- TxD
    D1 --- RxD

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

    Добавлено (26.02.2013, 06:49)
    ---------------------------------------------

    Код
    ////////////////////////
    //
    // Arduino Leonardo
    //
    ////////////////////////
    //
    // Sketch: walking robot
    //

    #include <Servo.h>

    int data = 0;

    Servo servo1;
    Servo servo2;
    Servo servo3;
    Servo servo4;

    unsigned int time_1 = 1500;
    unsigned int time_2 = 1500;
    unsigned int time_3 = 1500;
    unsigned int time_4 = 1500;

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

         servo1.attach(4);
         servo2.attach(5);
         servo3.attach(6);
         servo4.attach(7);

         servo1.writeMicroseconds(1500);
         servo2.writeMicroseconds(1500);
         servo3.writeMicroseconds(1500);
         servo4.writeMicroseconds(1500);
    }

    void loop()
    {
         while (Serial1.available() <= 0) ;

         data = Serial1.read();

         if ( data == 0 )
         {
             time_1 = 1500;
             servo1.writeMicroseconds(time_1);

             time_2 = 1500;
             servo2.writeMicroseconds(time_2);

             time_3 = 1500;
             servo3.writeMicroseconds(time_3);

             time_4 = 1500;
             servo4.writeMicroseconds(time_4);
         }

         if ( data == 1 )
         {
             if ( time_1 < 2000 ) time_1 += 100;
             servo1.writeMicroseconds(time_1);
         }

         if ( data == 2 )
         {
             if ( time_1 > 1000 ) time_1 -= 100;
             servo1.writeMicroseconds(time_1);
         }

         if ( data == 3 )
         {
             if ( time_2 < 2000 ) time_2 += 100;
             servo2.writeMicroseconds(time_2);
         }

         if ( data == 4 )
         {
             if ( time_2 > 1000 ) time_2 -= 100;
             servo2.writeMicroseconds(time_2);
         }

         if ( data == 5 )
         {
             if ( time_3 < 2000 ) time_3 += 100;
             servo3.writeMicroseconds(time_3);
         }

         if ( data == 6 )
         {
             if ( time_3 > 1000 ) time_3 -= 100;
             servo3.writeMicroseconds(time_3);
         }

         if ( data == 7 )
         {
             if ( time_4 < 2000 ) time_4 += 100;
             servo4.writeMicroseconds(time_4);
         }

         if ( data == 8 )
         {
             if ( time_4 > 1000 ) time_4 -= 100;
             servo4.writeMicroseconds(time_4);
         }

         delay(500);
    }

    Добавлено (26.02.2013, 06:53)
    ---------------------------------------------
    Для компьютера я написал программу на python.

    Код
    #!/usr/bin/env python
    # -*- coding: cp1251 -*-

    import serial

    try :

         # open port: COM6
         # baud rate: 9600 bps
         # frame format: 8 data, 1 stop bit
         ser = serial.Serial(5,
                             9600,
                             bytesize = serial.EIGHTBITS,
                             parity = serial.PARITY_NONE,
                             stopbits = serial.STOPBITS_ONE,
                             timeout = 1)

         print ser, '\n' # print port information

    except serial.SerialException :

         print 'Could not open COM6\n'

    time_1 = 1500
    time_2 = 1500
    time_3 = 1500
    time_4 = 1500

    while 1 :

         try :
             a = int(raw_input('--> '))

         except ValueError :
             a = 0

         except :
             break

         if a < 0 or a > 255 :
             a = 0

         ser.write(chr(a))

         if a == 0 :
             time_1 = 1500
             time_2 = 1500
             time_3 = 1500
             time_4 = 1500

         if a == 1 and time_1 < 2000 :
             time_1 += 100

         if a == 2 and time_1 > 1000 :
             time_1 -= 100

         if a == 3 and time_2 < 2000 :
             time_2 += 100

         if a == 4 and time_2 > 1000 :
             time_2 -= 100

         if a == 5 and time_3 < 2000 :
             time_3 += 100

         if a == 6 and time_3 > 1000 :
             time_3 -= 100

         if a == 7 and time_4 < 2000 :
             time_4 += 100

         if a == 8 and time_4 > 1000 :
             time_4 -= 100

         print 'servo1', time_1
         print 'servo2', time_2
         print 'servo3', time_3
         print 'servo4', time_4

    ser.close() # close port

    Подробно об управлении сервоприводами я писал в http://forumdvrobot.ru/forum/3-46-1 Повторятся не буду. Опишу только работу с программой.

    Отправка 0 выставляет все сервоприводы в среднее положение. Управляющие сигналы на всех сервоприводах равны 1500 us. Отправка 1 приводит к увеличению управляющего сигнала на D4 на 100 us. Отправка 2 приводит к уменьшению управляющего сигнала на D4 на 100 us. 3 и 4 делают то же самое, но для D5. 5 и 6 - для D6. 7 и 8 - для D7.

    Изменения выводятся на экран.
    Прикрепления: 4327925.jpg (185.7 Kb)


    Мой блог http://justforduino.blogspot.ru/
     
    m_wДата: Вторник, 26.02.2013, 07:49 | Сообщение # 10
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline
    Скриншот



    Не смотря на сказанное ранее у этой программы недостатков больше, чем достоинств. Консольный интерфейс. Очень ограниченное число положений качалок сервоприводов. Невозможность одновременного изменения положения качалок нескольких сервоприводов. Все эти недостатки устранимы, но мне пока лень. Если дело дойдет до улучшения платформы тогда придется сделать GUI. Управление даже четырьмя сервоприводами из консоли напрягает. Возможно кто-то из читателей сделает то, что не сделал я :-)

    Итак окончательный вариант скетча. Работа именно этой программы показана на видео.

    Добавлено (26.02.2013, 07:33)
    ---------------------------------------------

    Код
    ////////////////////////
    //
    // Arduino Leonardo
    //
    ////////////////////////
    //
    // Sketch: walking robot
    //

    #include <Servo.h>

    int data = 0;

    Servo servo1;
    Servo servo2;
    Servo servo3;
    Servo servo4;

    unsigned int time_1 = 1500;
    unsigned int time_2 = 1500;
    unsigned int time_3 = 1500;
    unsigned int time_4 = 1500;

    void check_receiver( void )
    {
          while (Serial1.available() > 0)
          {
              data = Serial1.read();
          }
    }

    void stop_0( void )
    {
          // servo 1 --- 1500
          // servo 2 --- 1500
          // servo 3 --- 1500
          // servo 4 --- 1500

          time_1 = 1500;
          servo1.writeMicroseconds(time_1);
          time_2 = 1500;
          servo2.writeMicroseconds(time_2);
          time_3 = 1500;
          servo3.writeMicroseconds(time_3);
          time_4 = 1500;
          servo4.writeMicroseconds(time_4);

          delay(600);
    }

    void stop_1( void )
    {
          // servo 1 --- 1500
          // servo 2 --- 1500
          // servo 3 --- 1500
          // servo 4 --- 1500

          while (1)
          {
              if ( time_1 == 1500 )
                  if ( time_2 == 1500 )
                      if ( time_3 == 1500 )
                          if ( time_4 == 1500 )
                              break;

              if ( time_1 < 1500 ) time_1 += 1;
              if ( time_1 > 1500 ) time_1 -= 1;
              servo1.writeMicroseconds(time_1);

              if ( time_2 < 1500 ) time_2 += 1;
              if ( time_2 > 1500 ) time_2 -= 1;
              servo2.writeMicroseconds(time_2);

              if ( time_3 < 1500 ) time_3 += 1;
              if ( time_3 > 1500 ) time_3 -= 1;
              servo3.writeMicroseconds(time_3);

              if ( time_4 < 1500 ) time_4 += 1;
              if ( time_4 > 1500 ) time_4 -= 1;
              servo4.writeMicroseconds(time_4);

              delay(1);
          }

          delay(100);
    }

    Добавлено (26.02.2013, 07:34)
    ---------------------------------------------

    Код
    void left( void )
    {
          // servo 1 --- 1500
          // servo 2 --- 1500
          // servo 3 --- 1500
          // servo 4 --- 1500

          time_1 = 1500;
          servo1.writeMicroseconds(time_1);
          time_2 = 1500;
          servo2.writeMicroseconds(time_2);
          time_3 = 1500;
          servo3.writeMicroseconds(time_3);
          time_4 = 1500;
          servo4.writeMicroseconds(time_4);

          delay(100);

          // servo 1 --- 1800
          // servo 2 --- 1500
          // servo 3 --- 1500
          // servo 4 --- 2000

          while (1)
          {
              if ( time_1 == 1800 ) break;

              time_1 += 1;
              servo1.writeMicroseconds(time_1);

              if ( time_4 < 2000 ) time_4 += 3;
              servo4.writeMicroseconds(time_4);

              delay(1);
          }

          // servo 1 --- 1800
          // servo 2 --- 1500
          // servo 3 --- 1300
          // servo 4 --- 2000

          while (1)
          {
              if ( time_3 == 1300 ) break;   

              time_3 -= 1;
              servo3.writeMicroseconds(time_3);

              delay(1);
          }

          // servo 1 --- 1500
          // servo 2 --- 1500
          // servo 3 --- 1300
          // servo 4 --- 1500

          while (1)
          {
              if ( time_1 == 1500 )
                  if ( time_4 == 1500 )
                      break;

              if ( time_1 > 1500 ) time_1 -= 1;
              servo1.writeMicroseconds(time_1);

              if ( time_4 > 1500 ) time_4 -= 1;
              servo4.writeMicroseconds(time_4);

              delay(1);
          }

          // servo 1 --- 1000
          // servo 2 --- 1500
          // servo 3 --- 1300
          // servo 4 --- 1200

          while (1)
          {
              if ( time_4 == 1200 ) break;

              if ( time_1 > 1000 ) time_1 -= 3;
              servo1.writeMicroseconds(time_1);

              time_4 -= 1;
              servo4.writeMicroseconds(time_4);

              delay(1);
          }

          // servo 1 --- 1000
          // servo 2 --- 1500
          // servo 3 --- 1500
          // servo 4 --- 1200

          while (1)
          {
              if ( time_3 == 1500 ) break;   

              time_3 += 1;
              servo3.writeMicroseconds(time_3);

              delay(1);
          }

          // servo 1 --- 1500
          // servo 2 --- 1500
          // servo 3 --- 1500
          // servo 4 --- 1500

          while (1)
          {
              if ( time_1 == 1500 )
                  if ( time_4 == 1500 )
                      break;

              if ( time_1 < 1500 ) time_1 += 1;
              servo1.writeMicroseconds(time_1);

              if ( time_4 < 1500 ) time_4 += 1;
              servo4.writeMicroseconds(time_4);

              delay(1);
          }
    }

    Добавлено (26.02.2013, 07:35)
    ---------------------------------------------

    Код
    void right( void )
    {   
          // servo 1 --- 1500
          // servo 2 --- 1500
          // servo 3 --- 1500
          // servo 4 --- 1500

          time_1 = 1500;
          servo1.writeMicroseconds(time_1);
          time_2 = 1500;
          servo2.writeMicroseconds(time_2);
          time_3 = 1500;
          servo3.writeMicroseconds(time_3);
          time_4 = 1500;
          servo4.writeMicroseconds(time_4);

          delay(100);

          // servo 1 --- 1000
          // servo 2 --- 1500
          // servo 3 --- 1500
          // servo 4 --- 1200

          while (1)
          {
              if ( time_4 == 1200 ) break;

              if ( time_1 > 1000 ) time_1 -= 3;
              servo1.writeMicroseconds(time_1);

              time_4 -= 1;
              servo4.writeMicroseconds(time_4);

              delay(1);
          }

          // servo 1 --- 1000
          // servo 2 --- 1700
          // servo 3 --- 1500
          // servo 4 --- 1200

          while (1)
          {
              if ( time_2 == 1700 ) break;   

              time_2 += 1;
              servo2.writeMicroseconds(time_2);

              delay(1);
          }

          // servo 1 --- 1500
          // servo 2 --- 1700
          // servo 3 --- 1500
          // servo 4 --- 1500

          while (1)
          {
              if ( time_1 == 1500 )
                  if ( time_4 == 1500 )
                      break;

              if ( time_1 < 1500 ) time_1 += 1;
              servo1.writeMicroseconds(time_1);

              if ( time_4 < 1500 ) time_4 += 1;
              servo4.writeMicroseconds(time_4);

              delay(1);
          }

          // servo 1 --- 1800
          // servo 2 --- 1700
          // servo 3 --- 1500
          // servo 4 --- 2000

          while (1)
          {
              if ( time_1 == 1800 ) break;

              time_1 += 1;
              servo1.writeMicroseconds(time_1);

              if ( time_4 < 2000 ) time_4 += 3;
              servo4.writeMicroseconds(time_4);

              delay(1);
          }

          // servo 1 --- 1800
          // servo 2 --- 1500
          // servo 3 --- 1500
          // servo 4 --- 2000

          while (1)
          {
              if ( time_2 == 1500 ) break;   

              time_2 -= 1;
              servo2.writeMicroseconds(time_2);

              delay(1);
          }

          // servo 1 --- 1500
          // servo 2 --- 1500
          // servo 3 --- 1500
          // servo 4 --- 1500

          while (1)
          {
              if ( time_1 == 1500 )
                  if ( time_4 == 1500 )
                      break;

              if ( time_1 > 1500 ) time_1 -= 1;
              servo1.writeMicroseconds(time_1);

              if ( time_4 > 1500) time_4 -= 1;
              servo4.writeMicroseconds(time_4);

              delay(1);
          }
    }

    Добавлено (26.02.2013, 07:42)
    ---------------------------------------------

    Код
    void forward( void )
    {
          // servo 1 --- 1500
          // servo 2 --- 1500
          // servo 3 --- 1500
          // servo 4 --- 1500

          time_1 = 1500;
          servo1.writeMicroseconds(time_1);
          time_2 = 1500;
          servo2.writeMicroseconds(time_2);
          time_3 = 1500;
          servo3.writeMicroseconds(time_3);
          time_4 = 1500;
          servo4.writeMicroseconds(time_4);

          delay(100);

          // servo 1 --- 1800
          // servo 2 --- 1500
          // servo 3 --- 1500
          // servo 4 --- 2000

          while (1)
          {
              if ( time_1 == 1800 ) break;

              time_1 += 1;
              servo1.writeMicroseconds(time_1);

              if ( time_4 < 2000 ) time_4 += 3;
              servo4.writeMicroseconds(time_4);

              delay(1);
          }

          while (1)
          {

              // servo 1 --- 1800
              // servo 2 --- 1300
              // servo 3 --- 1300
              // servo 4 --- 2000

              while (1)
              {
                  if ( time_2 == 1300 ) break;   

                  time_2 -= 1;
                  servo2.writeMicroseconds(time_2);

                  time_3 -= 1;
                  servo3.writeMicroseconds(time_3);

                  delay(1);
              }

              // servo 1 --- 1500
              // servo 2 --- 1300
              // servo 3 --- 1300
              // servo 4 --- 1500

              while (1)
              {
                  if ( time_1 == 1500 )
                      if ( time_4 == 1500 )
                          break;

                  if ( time_1 > 1500 ) time_1 -= 1;
                  servo1.writeMicroseconds(time_1);

                  if ( time_4 > 1500 ) time_4 -= 1;
                  servo4.writeMicroseconds(time_4);

                  delay(1);
              }

              // servo 1 --- 1000
              // servo 2 --- 1300
              // servo 3 --- 1300
              // servo 4 --- 1200

              while (1)
              {
                  if ( time_4 == 1200 ) break;

                  if ( time_1 > 1000 ) time_1 -= 3;
                 servo1.writeMicroseconds(time_1);

                  time_4 -= 1;
                  servo4.writeMicroseconds(time_4);

                  delay(1);
              }

              // servo 1 --- 1000
              // servo 2 --- 1500
              // servo 3 --- 1500
              // servo 4 --- 1200

              while (1)
              {
                  if ( time_2 == 1500 ) break;   

                  time_2 += 1;
                  servo2.writeMicroseconds(time_2);

                  time_3 += 1;
                  servo3.writeMicroseconds(time_3);

                  delay(1);
              }

              check_receiver();

              if ( data != 'w' && data != 'W' )
              {
                  stop_1();
                  break;
              }

              // servo 1 --- 1000
              // servo 2 --- 1700
              // servo 3 --- 1700
              // servo 4 --- 1200

              while (1)
             {
                  if ( time_2 == 1700 ) break;   

                  time_2 += 1;
                  servo2.writeMicroseconds(time_2);

                  time_3 += 1;
                  servo3.writeMicroseconds(time_3);

                  delay(1);
              }

              // servo 1 --- 1500
              // servo 2 --- 1700
              // servo 3 --- 1700
              // servo 4 --- 1500

              while (1)
              {
                  if ( time_1 == 1500 )
                      if ( time_4 == 1500 )
                          break;

                  if ( time_1 < 1500 ) time_1 += 1;
                  servo1.writeMicroseconds(time_1);

                  if ( time_4 < 1500 ) time_4 += 1;
                  servo4.writeMicroseconds(time_4);

                  delay(1);
              }

              // servo 1 --- 1800
              // servo 2 --- 1700
              // servo 3 --- 1700
              // servo 4 --- 2000

              while (1)
              {
                  if ( time_1 == 1800 ) break;

                  time_1 += 1;
                  servo1.writeMicroseconds(time_1);

                  if ( time_4 < 2000 ) time_4 += 3;
                  servo4.writeMicroseconds(time_4);

                  delay(1);
              }

              // servo 1 --- 1800
              // servo 2 --- 1500
              // servo 3 --- 1500
              // servo 4 --- 2000

              while (1)
              {
                  if ( time_2 == 1500 ) break;   

                  time_2 -= 1;
                  servo2.writeMicroseconds(time_2);

                  time_3 -= 1;
                  servo3.writeMicroseconds(time_3);

                  delay(1);
              }

              check_receiver();

              if ( data != 'w' && data != 'W' )
              {
                  stop_1();
                  break;
              }
          }
    }

    Добавлено (26.02.2013, 07:45)
    ---------------------------------------------

    Код
    void backward( void )
    {
          // servo 1 --- 1500
          // servo 2 --- 1500
          // servo 3 --- 1500
          // servo 4 --- 1500

          time_1 = 1500;
          servo1.writeMicroseconds(time_1);
          time_2 = 1500;
          servo2.writeMicroseconds(time_2);
          time_3 = 1500;
          servo3.writeMicroseconds(time_3);
          time_4 = 1500;
          servo4.writeMicroseconds(time_4);

          delay(100);

          // servo 1 --- 1000
          // servo 2 --- 1500
          // servo 3 --- 1500
          // servo 4 --- 1200

          while (1)
          {
              if ( time_4 == 1200 ) break;

              if (time_1 > 1000 ) time_1 -= 3;
              servo1.writeMicroseconds(time_1);

              time_4 -= 1;
              servo4.writeMicroseconds(time_4);

              delay(1);
          }

          while (1)
          {

              // servo 1 --- 1000
              // servo 2 --- 1300
              // servo 3 --- 1300
              // servo 4 --- 1200

              while (1)
              {
                  if ( time_2 == 1300 ) break;   

                  time_2 -= 1;
                  servo2.writeMicroseconds(time_2);

                  time_3 -= 1;
                  servo3.writeMicroseconds(time_3);

                  delay(1);
              }

              // servo 1 --- 1500
              // servo 2 --- 1300
              // servo 3 --- 1300
              // servo 4 --- 1500

              while (1)
              {
                  if ( time_1 == 1500 )
                      if ( time_4 == 1500 )
                          break;

                  if ( time_1 < 1500 ) time_1 += 1;
                  servo1.writeMicroseconds(time_1);

                  if ( time_4 < 1500 ) time_4 += 1;
                  servo4.writeMicroseconds(time_4);

                  delay(1);
              }

              // servo 1 --- 1800
              // servo 2 --- 1300
              // servo 3 --- 1300
              // servo 4 --- 2000

              while (1)
              {
                  if ( time_1 == 1800 ) break;

                  time_1 += 1;
                  servo1.writeMicroseconds(time_1);

                  if ( time_4 < 2000 ) time_4 += 3;
                  servo4.writeMicroseconds(time_4);

                  delay(1);
              }

              // servo 1 --- 1800
              // servo 2 --- 1500
              // servo 3 --- 1500
              // servo 4 --- 2000

              while (1)
              {
                  if ( time_2 == 1500 ) break;   

                  time_2 += 1;
                  servo2.writeMicroseconds(time_2);

                  time_3 += 1;
                  servo3.writeMicroseconds(time_3);

                  delay(1);
              }

              check_receiver();

              if ( data != 'x' && data != 'X' )
              {
                  stop_1();
                  break;
              }

              // servo 1 --- 1800
              // servo 2 --- 1700
              // servo 3 --- 1700
              // servo 4 --- 2000

              while (1)
              {
                  if ( time_2 == 1700 ) break;

                  time_2 += 1;
                  servo2.writeMicroseconds(time_2);

                  time_3 += 1;
                  servo3.writeMicroseconds(time_3);

                  delay(1);
              }

              // servo 1 --- 1500
              // servo 2 --- 1700
              // servo 3 --- 1700
              // servo 4 --- 1500

              while (1)
              {
                  if ( time_1 == 1500 )
                      if ( time_4 == 1500 )
                          break;

                  if ( time_1 > 1500 ) time_1 -= 1;
                  servo1.writeMicroseconds(time_1);

                  if ( time_4 > 1500 ) time_4 -= 1;
                  servo4.writeMicroseconds(time_4);

                  delay(1);
              }

              // servo 1 --- 1000
              // servo 2 --- 1700
              // servo 3 --- 1700
              // servo 4 --- 1200

              while (1)
              {
                  if ( time_4 == 1200 ) break;

                  if ( time_1 > 1000 ) time_1 -= 3;
                  servo1.writeMicroseconds(time_1);

                  time_4 -= 1;
                  servo4.writeMicroseconds(time_4);

                  delay(1);
              }

              // servo 1 --- 1000
              // servo 2 --- 1500
              // servo 3 --- 1500
              // servo 4 --- 1200

              while (1)
              {
                  if ( time_2 == 1500 ) break;   

                  time_2 -= 1;
                  servo2.writeMicroseconds(time_2);

                  time_3 -= 1;
                  servo3.writeMicroseconds(time_3);

                  delay(1);
              }

              check_receiver();

              if ( data != 'x' && data != 'X' )
              {
                  stop_1();
                  break;
              }
          }
    }

    Добавлено (26.02.2013, 07:48)
    ---------------------------------------------

    Код
    void setup()
    {
          Serial1.begin(9600);

          servo1.attach(4);
          servo2.attach(5);
          servo3.attach(6);
          servo4.attach(7);

          servo1.writeMicroseconds(1500);
          servo2.writeMicroseconds(1500);
          servo3.writeMicroseconds(1500);
          servo4.writeMicroseconds(1500);

          delay(600);
    }

    void loop()
    {
          check_receiver();

          if ( data == 's' || data == 'S' )
          {
              stop_0();
          }

          if ( data == 'w' || data == 'W' )
          {
              forward();
          }

          if ( data == 'x' || data == 'X' )
          {
              backward();
          }

          if ( data == 'a' || data == 'A' )
          {
              left();
          }

          if ( data == 'd' || data == 'D' )
          {
              right();
          }
    }

    Добавлено (26.02.2013, 07:49)
    ---------------------------------------------
    На ПК для управления роботом используется программа http://forumdvrobot.ru/forum/3-49-1

    Теперь немного о грустном. Четырех батареек АА 1.5 V хватает минут на 10. Для питания лучше использовать аккумулятор LiPo 2S 7.4 V. Иначе можно разорится. Да и поменять батарейки непросто.

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

    Вообще, питание сервоприводов через линейный стабилизатор ардуино не самая лучшая идея. Для сервоприводов лучше использовать импульсный понижающий DC-DC преобразователь ампер на 15 (с запасом). Но так как на данной платформе сервоприводов немного и в состоянии покоя они почти не потребляют энергию, то все работает нормально.

    Прикрепления: 7616580.png (34.2 Kb)


    Мой блог http://justforduino.blogspot.ru/

    Сообщение отредактировал m_w - Вторник, 26.02.2013, 07:31
     
    Jc_WerderДата: Среда, 10.08.2016, 02:20 | Сообщение # 11
    1.5 Вольт
    Группа: Пользователи
    Сообщений: 4
    Репутация: 0
    Статус: Offline
    m_w, Привет, как с тобой связаться?
    моя почта themiesha@yandex.ru


    AA
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Двуногий шагающий робот на четырех сервоприводах (Простой и недорогой шагающий робот на arduino)
    • Страница 1 из 1
    • 1
    Поиск:

    ДВ Робот - Чат