я тут решил сделать слона на 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; } }
Слоны, так слоны, тем более они животные полезные. После того, как Вы построили слона в масштабе 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.
Не обращал внимание а кол-во сервомашинок, смотрел код. Библиотека 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\.
Вот так : Код (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; } }
Данный код ни чего принципиально не меняет. Он как и предыдущий даже не скомпилируется. Старые почти не устранены, но уже есть новые, о старых повторяться не буду, укажу на новые или те, что не увидел в прошлый раз. Код (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; } } Она компилируется, передача данных есть, определение что пришло тоже. В остальное не вникал. Удачи!