Cлон на arduino

Тема в разделе "Arduino & Shields", создана пользователем robokop, 9 сен 2015.

  1. robokop

    robokop Гик

    я тут решил сделать слона на arduino , и сделал скетч -при котором робот должен будет при нажатии кнопок ходить и при нажатии других кнопок управлять манипулятором . Проверьте код пожалуйста :)
    Код (Text):
    /*---------------------------------------------------------------------------
    #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;

    /*-------------------------------------------------------------------
    Массив шагов в котором все движения совершаются изменением углов относительно основной стойки
    s1 s2 s3 и т.д. переменные в которых заданы углы каждого из сервоприводов.
    Подробности можно прочитать тут http://robocontroller.ru/news/z_robodog_sobaka_robot_svoimi_rukami/2013-07-19-26
    --------------------------------------------------------------------*/

    // Массив в котором записаны все шаги
    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 (){
      {
      if (Serial.available())
      {
        val = Serial.read();
      }
     

    // Стоп
    {
        if ( val == 'g ')
      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]);
    }

    // Движение вперед
    {
     
      // при этом условии в первую очередь работает нога 4
      // это улучшает подсадку и собачку не перевешивает
      // данное условие возможно вам не понадобиться!
      // оставьте часть после else!
        if ( val == 'S')
        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]);
      }
        if ( val == 'f ')
        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]);
      }        
        {
           
            ////////////////////////////// Сервы
          case 'I': //servoV вверх
            moveServoVUp = true;
            break;
          case 'K': //servoV вниз
            moveServoVDown = true;
            break;
          case 'i': //servoV стоп
            moveServoVUp = false;
            moveServoVDown = false;
            break;
          case 'L': //servoH движется к 25
            moveServoHRight = true;
            break;
          case 'J': //servoH движется к 145
            moveServoHLeft = true;
                break;
          case 'l': //servoH стоп
            moveServoHLeft = false;
            moveServoHRight = false;
            break;  
          case 'U':
            curVAngle = V_DEF_ANGLE;
            curHAngle = H_DEF_ANGLE;
            myservoV.write(curVAngle);
            myservoH.write(curHAngle);
            break;
            //////////////////////////////

        }
    // переключение частей в массиве шагов
      if ( val == 'z '){
        zgos2++;
        delay(stepspeed);
      }
      else{
        delay(stepspeed);
          zgos1++;
          zgos2 = 0;
        }
        if (zgos1 == 2){
          zgos1 = 0;
          zgos2 = 0;
          zgos3 = 0;
        }
       
    }
     
  2. Arduiner001

    Arduiner001 Гик

    На arduino максимум можно подключить 6 серв. Или юзайте серво шилд.
     
  3. ANV

    ANV Гуру

    Сигнал на сервы формируется через таймер, а не PWM, так что можно больше 6ти
     
  4. robokop

    robokop Гик

    ну пожалуйста ,помогите,мне срочно надо , а с кодом справится не могу :(:(:(
     
  5. Alex19

    Alex19 Гуру

    Слоны, так слоны, тем более они животные полезные.

    После того, как Вы построили слона в масштабе 1 к 1, необходимо вдохнуть в него жизнь. И тут самое главное, написать код, который будет легко читаться (это кстати относится и другим млекопитающим, членестоногим и т.д.):).

    Другими словами, прежде всего необходимы отступы и правильное соблюдение скобок.
    А вот как выглядит Ваш код с отступами

    Самое любопытное в loop.
    Код (Text):

    #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;

    /*-------------------------------------------------------------------
    Массив шагов в котором все движения совершаются изменением углов относительно основной стойки
    s1 s2 s3 и т.д. переменные в которых заданы углы каждого из сервоприводов.
    Подробности можно прочитать тут http://robocontroller.ru/news/z_robodog_sobaka_robot_svoimi_rukami/2013-07-19-26
    --------------------------------------------------------------------*/

    // Массив в котором записаны все шаги
    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 ()
    {
      {//! Что это?
      if (Serial.available())
      {
        val = Serial.read();
      }

    // Стоп
    { //!  Что это?
      if ( val == 'g ')
      servo1.write(pos_stop[0][0]); //! Если if выполнится только 1 строка, остальное не зависимо от if
      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]);
    }//!  Что это?

    // Движение вперед
    {//!  Что это?
      // при этом условии в первую очередь работает нога 4
      // это улучшает подсадку и собачку не перевешивает
      // данное условие возможно вам не понадобиться!
      // оставьте часть после else!
        if ( val == 'S')
        servo7.write(pos_steps[zgos1][zgos2][6]); //! Если if выполнится только 1 строка, остальное не зависимо от if
        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]);
      }//!  Что это?
        if ( val == 'f ') //! Поясните почему 'f ' а не 'f'
        servo1.write(pos_steps[zgos1][zgos2][0]); // Если if выполнится только 1 строка, остальное не зависимо от if
        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]);
      }//!  Что это?    
        {//!  Что это?
       
          //! Где switch?
            ////////////////////////////// Сервы
          case 'I': //servoV вверх
            moveServoVUp = true;
            break;
          case 'K': //servoV вниз
            moveServoVDown = true;
            break;
          case 'i': //servoV стоп
            moveServoVUp = false;
            moveServoVDown = false;
            break;
          case 'L': //servoH движется к 25
            moveServoHRight = true;
            break;
          case 'J': //servoH движется к 145
            moveServoHLeft = true;
            break;
          case 'l': //servoH стоп
            moveServoHLeft = false;
            moveServoHRight = false;
            break;
          case 'U':
            curVAngle = V_DEF_ANGLE;
            curHAngle = H_DEF_ANGLE;
            myservoV.write(curVAngle);
            myservoH.write(curHAngle);
            break;
            //////////////////////////////

        }//!  Что это?
    // переключение частей в массиве шагов
      if ( val == 'z ')
      {
        zgos2++;
        delay(stepspeed);
      }
      else
      {
        delay(stepspeed);
        zgos1++;
        zgos2 = 0;
      }
      if (zgos1 == 2)
      {
        zgos1 = 0;
        zgos2 = 0;
        zgos3 = 0;
      }
    }
    Весь код не разбирал, что увидел с ходу, там добавил свои коментарии //!.

    Возможно, Вы ошиблись при вставке, если нет, почитайте следующие статьи if - http://arduino.ru/Reference/If, if-else - http://arduino.ru/Reference/Else, switch - http://arduino.ru/Reference/SwitchCase.
     
    Последнее редактирование: 10 сен 2015
    robokop нравится это.
  6. vvr

    vvr Инженерище

    библиотека Servo поддерживает 12 серв.
     
  7. robokop

    robokop Гик

    извините, но мне на тот момент как раз 13 и надо было ,а сейчас 12 :):)
     
  8. Alex19

    Alex19 Гуру

    Не обращал внимание а кол-во сервомашинок, смотрел код.

    Библиотека Servo, поддерживает определенное кол-во сервомашинок, в зависимости от контролера. В зависимости от того, сколько в том или ином контроллере 16 битных таймеров. На каждый таймер приходится до 12 сервомашинок.

    Для контролеров на ATmega1280, ATmega256o (Arduino Mega), у которых 4 - 16 битных таймеров, до 48 сервомашинок, 12 без потери ножек ШИМ.
    Контроллеры на ATmega32U4 (Leonardo, Micro) и на ATmega328p (Un0, Mini), до 12 сервомашинок.
    Контроллеры на AT90USB646 (не знаю таких плат) и AT90USB1286 (Teensy++ 2.0) до 24 сервомашинок.
    Контроллеры на SAM3X (Due) до 60 сервомашинок.

    И т.д. полную информацию, без труда можно найти в коде самой библиотеке, путь к ней - Аrduino\libraries\Servo\src\.
     
  9. robokop

    robokop Гик

    Вот так :
    Код (Text):
     #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 = 1
    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;

    /*-------------------------------------------------------------------
    Массив шагов в котором все движения совершаются изменением углов относительно основной стойки
    s1 s2 s3 и т.д. переменные в которых заданы углы каждого из сервоприводов.
    Подробности можно прочитать тут http://robocontroller.ru/news/z_robodog_sobaka_robot_svoimi_rukami/2013-07-19-26
    --------------------------------------------------------------------*/

    // Массив в котором записаны все шаги
    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 ()
    {
      //! Что это?
      if (Serial.available())
     
        val = Serial.read();
      }

    // Стоп
    { //!  Что это?
      ( val == 'g ')
      servo1.write(pos_stop[0][0]); //! Если if выполнится только 1 строка, остальное не зависимо от if
      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]);
    }//!  Что это?

    // Движение вперед
    {//!  Что это?
      // при этом условии в первую очередь работает нога 4
      // это улучшает подсадку и собачку не перевешивает
      // данное условие возможно вам не понадобиться!
      // оставьте часть после else!
          ( val ==  'S')
        servo7.write(pos_steps[zgos1][zgos2][6]); //! Если if выполнится только 1 строка, остальное не зависимо от if
        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]);
      }//!  Что это?
          ( val == 'f ') //! Поясните почему 'f ' а не 'f'
        servo1.write(pos_steps[zgos1][zgos2][0]); // Если if выполнится только 1 строка, остальное не зависимо от if
        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]);
      }//!  Что это?  
       
          !  switch (var)
           
          case 'I ': //servoV вверх
            moveServoVUp = true;
            break;
          case ' g ': //servoV вниз
            moveServoVDown = true;
            break;
          case 'i': //servoV стоп
            moveServoVUp = false;
            moveServoVDown = false;
            break;
          case 'L': //servoH движется к 25
            moveServoHRight = true;
            break;
          case 'J': //servoH движется к 145
            moveServoHLeft = true;
            break;
          case 'l': //servoH стоп
            moveServoHLeft = false;
            moveServoHRight = false;
            break;
          case ' h ':
            curVAngle = V_DEF_ANGLE;
            curHAngle = H_DEF_ANGLE;
            myservoV.write(curVAngle);
            myservoH.write(curHAngle);
            break;
            //////////////////////////////

        }//!  Что это?
        switch (var)
    // переключение частей в массиве шагов
      if ( val == 'z ')
      {
        zgos2++;
        delay(stepspeed);
      }
      else
      {
        delay(stepspeed);
        zgos1++;
        zgos2 = 0;
      }
      if (zgos1 == 2)
      {
        zgos1 = 0;
        zgos2 = 0;
        zgos3 = 0;
      }
    }
     
  10. Alex19

    Alex19 Гуру

    Данный код ни чего принципиально не меняет. Он как и предыдущий даже не скомпилируется.

    Старые почти не устранены, но уже есть новые, о старых повторяться не буду, укажу на новые или те, что не увидел в прошлый раз.

    Код (Text):
    long duration  distance ;
    Вероятнее всего тут была попытка объявить 2 переменные long. Это делается, через запятую.
    Код (Text):
    long duration,  distance ;
    Пропущена ;
    Код (Text):
    int zs2 = 1
    Надо так
    Код (Text):
    int zs2 = 1;
    Куда-то делись zs3 и т.д..

    Проблема с val
    Код (Text):
    val = Serial.read();
    val у Вас int
    Код (Text):
    int val ;
    А дальше Вы сравниваете их с char 'S', да еще с такими char 'g ' с пробелами.

    После этого в switch (который синтаксически не правильный) идет проверка var, которая даже не объявлена.

    Ошибок много, мы все когда-то начинали. Тут нет ничего страшного, но учится увы придется. Поищите на форуме, темы о книгах начинающим (сам не рискну дать совет, пришел пусть с небольшим, но опытом программирования), к примеру эта тема - http://forum.amperka.ru/threads/Книги-для-начинающих.2344/.

    Я приведу код заготовку, которая поможет Вам, отчего-то оттолкнуться.
    Код (Text):
    #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;

    /*-------------------------------------------------------------------
    Массив шагов в котором все движения совершаются изменением углов относительно основной стойки
    s1 s2 s3 и т.д. переменные в которых заданы углы каждого из сервоприводов.
    Подробности можно прочитать тут http://robocontroller.ru/news/z_robodog_sobaka_robot_svoimi_rukami/2013-07-19-26
    --------------------------------------------------------------------*/

    // Массив в котором записаны все шаги
    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(val)
      {
      case 'g':
        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;
     
        Serial.println('g');
        break;
      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]);
        Serial.println('S');
        break;
      case 'f':
        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('f');
        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 и egordorichev нравится это.