Управление роботом на сервомоторах через ИК

Юрец
Offline
Зарегистрирован: 20.01.2016
#include <IRremote.h>
#include<Servo.h>

Servo servoG1;
Servo servoV1;
Servo servoG2;
Servo servoV2;
Servo servoG3;
Servo servoV3;                      
Servo servoG4;
Servo servoV4;
int RECV_PIN = 11; // назначаем 11-ый вывод для подключения фотоприемника
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  servoG1.attach(9);  // s is on pin 8
  servoV1.attach(2);
  servoG2.attach(3);
  servoV2.attach(4);
  servoG3.attach(5);
  servoV3.attach(6);
  servoG4.attach(7);
  servoV4.attach(8);
  Serial.begin(9600); // устанавливает скорость обмена данными с компьютером
  irrecv.enableIRIn(); // функция начала приема
}

void loop() {
if (irrecv.decode(&results)) { // если сигнал принят
    Serial.println(results.value); // выводим его на экран компьютера
    if (results.value > 16000000 && results.value < 17000000){
     if (results.value == 16718055) // если принятый код равен одному из запомненных нами (кнопка 2)
     {
      servoV3.write(60); // 3-я нога вверх
      servoG3.write(15); // 3-я нога вперёд
      delay(500);
      servoV3.write(90); // 3-я нога вниз
      delay(500);
      servoV4.write(120); // 4-я нога вверх
      servoG4.write(165); // 4-я нога вперёд
      delay(500);
      servoV4.write(90); // 4-я нога вниз
      delay(500);
      servoG1.write(165); // 1-я нога назад
      servoG2.write(15); // 2-я нога назад
      servoG3.write(75); // 3-я нога назад
      servoG4.write(105); // 4-я нога назад
      delay(500);
      servoV1.write(120); // 1-я нога вверх
      servoG1.write(105); // 1-я нога вперёд
      delay(500);
      servoV1.write(90); // 1-я нога вниз
      delay(500);
      servoV2.write(60); // 2-я нога вверх
      servoG2.write(75); // 2-я нога вперёд
      delay(500);
      servoV2.write(90); // 2-я нога вниз
      delay(500);
     }
     if (results.value == 16726215) // если принятый код равен второму из запомненных нами (кнопка 5)
     {
      servoG1.write(105); // 1-я нога
      servoG2.write(75); // 2-я нога
      servoG3.write(75); // 3-я нога
      servoG4.write(105); // 4-я нога
      servoV1.write(90); // 1-я нога
      servoV2.write(90); // 2-я нога
      servoV3.write(90); // 3-я нога
      servoV4.write(90); // 4-я нога
     }
    }
   irrecv.resume(); // ждем прием следующего сигнала
  }
}

Доброго всем дня. Пилю скетч для управления четырёхногим роботом с 8-ю сервами и с ИК-датчиком. Часть кода написал (вперёд, стоп), но возник вопрос. При движении вперёд (при нажатии на кнопку на ИК-пульте) робот делает цикл перемещения ног (3-4-1-2) и встаёт. Что бы он опять пошёл, приходится опять нажать кнопку. Как завершить цикл движения, что бы он повторялся без нажатия кнопки? Знаю, что мой код с кучей делаев довольно убогий. Мне тут подкидывали код движения вперёд с shwitch-case, но я слабоват пока в программировании и не разобрался как его вписать.

 

Юрец
Offline
Зарегистрирован: 20.01.2016
#include <IRremote.h>
#include<Servo.h>

Servo servoG1;
Servo servoV1;
Servo servoG2;
Servo servoV2;
Servo servoG3;
Servo servoV3;
Servo servoG4;
Servo servoV4;
int RECV_PIN = 11; // назначаем 11-ый вывод для подключения фотоприемника
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long currentTime2; //Переменная для pause
byte var = 0;

void setup()
{
  servoG1.attach(9);  // s is on pin 8
  servoV1.attach(2);
  servoG2.attach(3);
  servoV2.attach(4);
  servoG3.attach(5);
  servoV3.attach(6);
  servoG4.attach(7);
  servoV4.attach(8);
  Serial.begin(9600); // устанавливает скорость обмена данными с компьютером
  irrecv.enableIRIn(); // функция начала приема
}

//Функция паузы
int pause(int y)
{
  bool x = 0;
  if (millis() - currentTime2 >= y) x = 1, currentTime2 = millis();
  return x;
}

void loop() {

if (irrecv.decode(&results)) { // если сигнал принят
    Serial.println(results.value); // выводим его на экран компьютера
    if (results.value > 16000000 && results.value < 17000000){
       if (results.value == 16718055) // если принятый код равен одному из запомненных нами (кнопка 2)

    {
//Посылаем запрос в функцию паузы- если 1 выполняем действие по очереди с паузой 500, при этом можно без тормозов опрашивать другие датчики
       if (pause (500))
     {
    switch (var) {
      case 0:
        servoV3.write(60); // 3-я нога вверх
        servoG3.write(15); // 3-я нога вперёд
        var = 1;
        break;
      case 1:
        servoV3.write(90); // 3-я нога вниз
        var = 2;
        break;
      case 2:
        servoV4.write(120); // 4-я нога вверх
        servoG4.write(165); // 4-я нога вперёд
        var = 3;
        break;
      case 3:
        servoV4.write(90); // 4-я нога вниз
        var = 4;
        break;
      case 4:
        servoG1.write(165); // 1-я нога назад
        servoG2.write(15); // 2-я нога назад
        servoG3.write(75); // 3-я нога назад
        servoG4.write(105); // 4-я нога назад
        var = 5;
        break;
      case 5:
        servoV1.write(120); // 1-я нога вверх
        servoG1.write(105); // 1-я нога вперёд
        var = 6;
        break;
      case 6:
        servoV1.write(90); // 1-я нога вниз
        var = 7;
        break;
      case 7:
        servoV2.write(60); // 2-я нога вверх
        servoG2.write(75); // 2-я нога вперёд
        var = 8;
        break;
      case 8:
        servoV2.write(90); // 2-я нога вниз
        var = 0;
        break;
    }
    }

}
if (results.value == 16726215) // если принятый код равен второму из запомненных нами (кнопка 5)
      {
        servoG1.write(105); // 1-я нога назад
        servoG2.write(75); // 2-я нога назад
        servoG3.write(75); // 3-я нога назад
        servoG4.write(105); // 4-я нога назад
        servoV1.write(90); // 1-я нога назад
        servoV2.write(90); // 2-я нога назад
        servoV3.write(90); // 3-я нога назад
        servoV4.write(90); // 4-я нога назад 
      }
}
irrecv.resume(); // ждем прием следующего сигнала
}
}

Это вариант кода без делай. В этом варианте для движения вперёд приходится нажимать кнопку для каждого движения ноги (нажал - одна нога сработала, нажал -следующая и т.д.) кроме case 4, когда все четыре ноги поворачиваютя. Код без ИК составляющей работает нормально. Как сделать, что бы цикл движения происходил непрерывно до нажатии кнопки "стоп"?

nevkon
Offline
Зарегистрирован: 20.01.2015

У вас идет проверка на нажатие кнопки. Сделайте так чтобы в этой проверке не обработчик перемещения стоял, а смена флага. А по флагу уже заставляйте робота шагать или останавливаться.

Юрец
Offline
Зарегистрирован: 20.01.2016

А как это выглядит вообще? Смена флага?

nevkon
Offline
Зарегистрирован: 20.01.2015

Создаешь переменную в самом начале

bool _flag_=false;

Дальше обращаешься к ней: Если нажата одна кнопка делаем true, если нажата другая делаем false. Так будет определяться движется робот или нет.

Ну а само движение выполняем только если флаг true.

Юрец
Offline
Зарегистрирован: 20.01.2016

Попробую, конечно. Но, если можете, вставте мне в код, пожалуйста, что бы я посмотрел, как правильно.

nevkon
Offline
Зарегистрирован: 20.01.2015

Тогда опишите что происходит по ажатию "2" и "5". Правильно я понимаю что "2" это идти вперед, а "5" это остановка?.

Юрец
Offline
Зарегистрирован: 20.01.2016

Да, именно так. Я почти дописал скетч с делаями. Добавил назад и развортот влево. Осталось вправо добавить. Выкладывать не стал, чтоб не загромождать. С делаями всё также, одно нажатие-один цикл.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробуйте так проверить не на чем

#include <IRremote.h>
#include<Servo.h>

Servo servoG1;
Servo servoV1;
Servo servoG2;
Servo servoV2;
Servo servoG3;
Servo servoV3;
Servo servoG4;
Servo servoV4;
int RECV_PIN = 11; // назначаем 11-ый вывод для подключения фотоприемника
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long currentTime2; //Переменная для pause
byte var = 0;
bool run = 0; // Переменная для движения

void setup()
{
  servoG1.attach(9);  // s is on pin 8
  servoV1.attach(2);
  servoG2.attach(3);
  servoV2.attach(4);
  servoG3.attach(5);
  servoV3.attach(6);
  servoG4.attach(7);
  servoV4.attach(8);
  Serial.begin(9600); // устанавливает скорость обмена данными с компьютером
  irrecv.enableIRIn(); // функция начала приема
}

//Функция паузы
int pause(int y)
{
  bool x = 0;
  if (millis() - currentTime2 >= y) x = 1, currentTime2 = millis();
  return x;
}

void loop() {

  if (irrecv.decode(&results)) { // если сигнал принят
    Serial.println(results.value); // выводим его на экран компьютера
    if (results.value > 16000000 && results.value < 17000000) {
      if (results.value == 16718055) // если принятый код равен одному из запомненных нами (кнопка 2)

      {
        run = 1;
      }
      if (run == 1)
      {
        //Посылаем запрос в функцию паузы- если 1 выполняем действие по очереди с паузой 500, при этом можно без тормозов опрашивать другие датчики
        if (pause (500))
        {
          switch (var) {
            case 0:
              servoV3.write(60); // 3-я нога вверх
              servoG3.write(15); // 3-я нога вперёд
              var = 1;
              break;
            case 1:
              servoV3.write(90); // 3-я нога вниз
              var = 2;
              break;
            case 2:
              servoV4.write(120); // 4-я нога вверх
              servoG4.write(165); // 4-я нога вперёд
              var = 3;
              break;
            case 3:
              servoV4.write(90); // 4-я нога вниз
              var = 4;
              break;
            case 4:
              servoG1.write(165); // 1-я нога назад
              servoG2.write(15); // 2-я нога назад
              servoG3.write(75); // 3-я нога назад
              servoG4.write(105); // 4-я нога назад
              var = 5;
              break;
            case 5:
              servoV1.write(120); // 1-я нога вверх
              servoG1.write(105); // 1-я нога вперёд
              var = 6;
              break;
            case 6:
              servoV1.write(90); // 1-я нога вниз
              var = 7;
              break;
            case 7:
              servoV2.write(60); // 2-я нога вверх
              servoG2.write(75); // 2-я нога вперёд
              var = 8;
              break;
            case 8:
              servoV2.write(90); // 2-я нога вниз
              var = 0;
              break;
          }
        }

      }
      if (results.value == 16726215) // если принятый код равен второму из запомненных нами (кнопка 5)
      {
        run = 0;
        var = 0;
        servoG1.write(105); // 1-я нога назад
        servoG2.write(75); // 2-я нога назад
        servoG3.write(75); // 3-я нога назад
        servoG4.write(105); // 4-я нога назад
        servoV1.write(90); // 1-я нога назад
        servoV2.write(90); // 2-я нога назад
        servoV3.write(90); // 3-я нога назад
        servoV4.write(90); // 4-я нога назад
      }
    }
    irrecv.resume(); // ждем прием следующего сигнала
  }
}

 

Юрец
Offline
Зарегистрирован: 20.01.2016

Обязательно попробую в понедельник. Ибо робот там квартирует пока.

Юрец
Offline
Зарегистрирован: 20.01.2016

Vosara не, не получается. Теперь на каждое нажатие происходит половина движение, т.е. на каждое движение ноги нужно 2 нажатия.

nevkon
Offline
Зарегистрирован: 20.01.2015

Все верно, думал предложили вариант типа моего, но оказалось немного не так. Проверка флага не должна быть только при нажатой кнопке:

#include <IRremote.h>
#include<Servo.h>

Servo servoG1;
Servo servoV1;
Servo servoG2;
Servo servoV2;
Servo servoG3;
Servo servoV3;
Servo servoG4;
Servo servoV4;
int RECV_PIN = 11; // назначаем 11-ый вывод для подключения фотоприемника
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long currentTime2; //Переменная для pause
byte var = 0;
bool run = 0; // Переменная для движения

void setup()
{
  servoG1.attach(9);  // s is on pin 8
  servoV1.attach(2);
  servoG2.attach(3);
  servoV2.attach(4);
  servoG3.attach(5);
  servoV3.attach(6);
  servoG4.attach(7);
  servoV4.attach(8);
  Serial.begin(9600); // устанавливает скорость обмена данными с компьютером
  irrecv.enableIRIn(); // функция начала приема
}

//Функция паузы
int pause(int y)
{
  bool x = 0;
  if (millis() - currentTime2 >= y) x = 1, currentTime2 = millis();
  return x;
}

void loop() {

  if (irrecv.decode(&results)) { // если сигнал принят
    Serial.println(results.value); // выводим его на экран компьютера
    if (results.value > 16000000 && results.value < 17000000) {
      if (results.value == 16718055) // если принятый код равен одному из запомненных нами (кнопка 2)

      {
        run = 1;
      }
      if (results.value == 16726215) // если принятый код равен второму из запомненных нами (кнопка 5)
      {
        run = 0;
        var = 0;
        servoG1.write(105); // 1-я нога назад
        servoG2.write(75); // 2-я нога назад
        servoG3.write(75); // 3-я нога назад
        servoG4.write(105); // 4-я нога назад
        servoV1.write(90); // 1-я нога назад
        servoV2.write(90); // 2-я нога назад
        servoV3.write(90); // 3-я нога назад
        servoV4.write(90); // 4-я нога назад
      }
    }
      if (run == 1)
      {
        //Посылаем запрос в функцию паузы- если 1 выполняем действие по очереди с паузой 500, при этом можно без тормозов опрашивать другие датчики
        if (pause (500))
        {
          switch (var) {
            case 0:
              servoV3.write(60); // 3-я нога вверх
              servoG3.write(15); // 3-я нога вперёд
              var = 1;
              break;
            case 1:
              servoV3.write(90); // 3-я нога вниз
              var = 2;
              break;
            case 2:
              servoV4.write(120); // 4-я нога вверх
              servoG4.write(165); // 4-я нога вперёд
              var = 3;
              break;
            case 3:
              servoV4.write(90); // 4-я нога вниз
              var = 4;
              break;
            case 4:
              servoG1.write(165); // 1-я нога назад
              servoG2.write(15); // 2-я нога назад
              servoG3.write(75); // 3-я нога назад
              servoG4.write(105); // 4-я нога назад
              var = 5;
              break;
            case 5:
              servoV1.write(120); // 1-я нога вверх
              servoG1.write(105); // 1-я нога вперёд
              var = 6;
              break;
            case 6:
              servoV1.write(90); // 1-я нога вниз
              var = 7;
              break;
            case 7:
              servoV2.write(60); // 2-я нога вверх
              servoG2.write(75); // 2-я нога вперёд
              var = 8;
              break;
            case 8:
              servoV2.write(90); // 2-я нога вниз
              var = 0;
              break;
          }
        }

      }
    irrecv.resume(); // ждем прием следующего сигнала
  }
}

 

Юрец
Offline
Зарегистрирован: 20.01.2016

Nevkom результат прежний. Одно нажатие - выполнение case 1, второе - выполнение case 2 и т.д.

 

Юрец
Offline
Зарегистрирован: 20.01.2016
#include <IRremote.h>
#include<Servo.h>

Servo servoG1;
Servo servoV1;
Servo servoG2;
Servo servoV2;
Servo servoG3;
Servo servoV3;                      
Servo servoG4;
Servo servoV4;
int RECV_PIN = 11; // назначаем 11-ый вывод для подключения фотоприемника
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  servoG1.attach(9);  // s is on pin 8
  servoV1.attach(2);
  servoG2.attach(3);
  servoV2.attach(4);
  servoG3.attach(5);
  servoV3.attach(6);
  servoG4.attach(7);
  servoV4.attach(8);
  Serial.begin(9600); // устанавливает скорость обмена данными с компьютером
  irrecv.enableIRIn(); // функция начала приема
  servoG1.write(105); // 1-я нога
  servoG2.write(75); // 2-я нога
  servoG3.write(75); // 3-я нога
  servoG4.write(105); // 4-я нога
  servoV1.write(90); // 1-я нога
  servoV2.write(90); // 2-я нога
  servoV3.write(90); // 3-я нога
  servoV4.write(90); // 4-я нога
}

void loop() {
if (irrecv.decode(&results)) { // если сигнал принят
    Serial.println(results.value); // выводим его на экран компьютера
    if (results.value > 16000000 && results.value < 17000000){
     if (results.value == 16718055) // если принятый код равен одному из запомненных нами (кнопка 2)
     {
      servoV3.write(60); // 3-я нога вверх
      servoG3.write(15); // 3-я нога вперёд
      delay(500);
      servoV3.write(90); // 3-я нога вниз
      delay(500);
      servoV4.write(120); // 4-я нога вверх
      servoG4.write(165); // 4-я нога вперёд
      delay(500);
      servoV4.write(90); // 4-я нога вниз
      delay(500);
      servoG1.write(165); // 1-я нога назад
      servoG2.write(15); // 2-я нога назад
      servoG3.write(75); // 3-я нога назад
      servoG4.write(105); // 4-я нога назад
      delay(500);
      servoV1.write(120); // 1-я нога вверх
      servoG1.write(105); // 1-я нога вперёд
      delay(500);
      servoV1.write(90); // 1-я нога вниз
      delay(500);
      servoV2.write(60); // 2-я нога вверх
      servoG2.write(75); // 2-я нога вперёд
      delay(500);
      servoV2.write(90); // 2-я нога вниз
      delay(500);
     }
     if (results.value == 16726215) // если принятый код равен второму из запомненных нами (кнопка 5)
     {
      servoG1.write(105); // 1-я нога
      servoG2.write(75); // 2-я нога
      servoG3.write(75); // 3-я нога
      servoG4.write(105); // 4-я нога
      servoV1.write(90); // 1-я нога
      servoV2.write(90); // 2-я нога
      servoV3.write(90); // 3-я нога
      servoV4.write(90); // 4-я нога
     }
     if (results.value == 16730805) // если принятый код равен одному из запомненных нами (кнопка 8)
     {
      servoV1.write(120); // 1-я нога вверх
      servoG1.write(165); // 1-я нога назад
      delay(500);
      servoV1.write(90); // 1-я нога вниз
      delay(500);
      servoV2.write(60); // 2-я нога вверх
      servoG2.write(15); // 2-я нога назад
      delay(500);
      servoV2.write(90); // 2-я нога вниз
      delay(500);
      servoG1.write(105); // 1-я нога вперёд
      servoG2.write(75); // 2-я нога вперёд
      servoG3.write(15); // 3-я нога вперёд
      servoG4.write(165); // 4-я нога вперёд
      delay(500);
      servoV3.write(60); // 3-я нога вверх
      servoG3.write(75); // 3-я нога назад
      delay(500);
      servoV3.write(90); // 3-я нога вниз
      delay(500);
      servoV4.write(120); // 4-я нога вверх
      servoG4.write(105); // 4-я нога назад
      delay(500);
      servoV4.write(90); // 4-я нога вниз
      delay(500);
     }
     if (results.value == 16716015) // если принятый код равен одному из запомненных нами (кнопка 4)
     {
      servoV1.write(120); // 1-я нога вверх
      servoG1.write(135); // 1-я нога назад
      delay(500);
      servoV1.write(90); // 1-я нога вниз
      delay(500);
      servoV4.write(120); // 4-я нога вверх
      servoG4.write(135); // 4-я нога вперёд
      delay(500);
      servoV4.write(90); // 4-я нога вниз
      delay(500);
      servoV2.write(60); // 2-я нога вверх
      servoG2.write(105); // 2-я нога вперёд
      delay(500);
      servoV2.write(90); // 2-я нога вниз
      delay(500);
      servoV3.write(60); // 3-я нога вверх
      servoG3.write(105); // 3-я нога назад
      delay(500);
      servoV3.write(90); // 3-я нога вниз
      delay(500); 
      servoG1.write(75); // 1-я нога
      servoG2.write(45); // 2-я нога
      servoG3.write(45); // 3-я нога
      servoG4.write(75); // 4-я нога
      delay(500);
      }
      if (results.value == 16734885) // если принятый код равен одному из запомненных нами (кнопка 6)
      {
      servoV2.write(60); // 2-я нога вверх
      servoG2.write(45); // 2-я нога назад
      delay(500);
      servoV2.write(90); // 2-я нога вниз
      delay(500);
      servoV3.write(60); // 3-я нога вверх
      servoG3.write(45); // 3-я нога вперёд
      delay(500);
      servoV3.write(90); // 3-я нога вниз
      delay(500);
      servoV1.write(120); // 1-я нога вверх
      servoG1.write(75); // 1-я нога вперёд
      delay(500);
      servoV1.write(90); // 1-я нога вниз
      delay(500);
      servoV4.write(120); // 4-я нога вверх
      servoG4.write(75); // 4-я нога вперёд
      delay(500);
      servoV4.write(90); // 4-я нога вниз
      delay(500); 
      servoG1.write(135); // 1-я нога
      servoG2.write(105); // 2-я нога
      servoG3.write(105); // 3-я нога
      servoG4.write(135); // 4-я нога
      delay(500);
      }
    }
   irrecv.resume(); // ждем прием следующего сигнала
  }
}

Вот полный вариант кода с делаями. Вперёд-стоп-назад-влево-вправо. Иногда, правда, заглючивает. От переизбытка делаев, наверное. Алгоритм прежний, одно нажатие - один цикл. Непрерывно не движется.

nevkon
Offline
Зарегистрирован: 20.01.2015

Все верно, вынес, но не до конца.

Сделайте 2 фукции: прием нажатия с пульта и обработчик движения. Не срабатывает по причине что ждет когда будет нажата кнопка (if (irrecv.decode(&results)) { // если сигнал принят). Ну или для начала перенесите if (run == 1) в конец loop:

#include <IRremote.h>
#include<Servo.h>

Servo servoG1;
Servo servoV1;
Servo servoG2;
Servo servoV2;
Servo servoG3;
Servo servoV3;
Servo servoG4;
Servo servoV4;
int RECV_PIN = 11; // назначаем 11-ый вывод для подключения фотоприемника
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long currentTime2; //Переменная для pause
byte var = 0;
bool run = 0; // Переменная для движения

void setup()
{
  servoG1.attach(9);  // s is on pin 8
  servoV1.attach(2);
  servoG2.attach(3);
  servoV2.attach(4);
  servoG3.attach(5);
  servoV3.attach(6);
  servoG4.attach(7);
  servoV4.attach(8);
  Serial.begin(9600); // устанавливает скорость обмена данными с компьютером
  irrecv.enableIRIn(); // функция начала приема
}

//Функция паузы
int pause(int y)
{
  bool x = 0;
  if (millis() - currentTime2 >= y) x = 1, currentTime2 = millis();
  return x;
}

void loop() {

  if (irrecv.decode(&results)) { // если сигнал принят
    Serial.println(results.value); // выводим его на экран компьютера
    if (results.value > 16000000 && results.value < 17000000) {
      if (results.value == 16718055) // если принятый код равен одному из запомненных нами (кнопка 2)

      {
        run = 1;
      }
      if (results.value == 16726215) // если принятый код равен второму из запомненных нами (кнопка 5)
      {
        run = 0;
        var = 0;
        servoG1.write(105); // 1-я нога назад
        servoG2.write(75); // 2-я нога назад
        servoG3.write(75); // 3-я нога назад
        servoG4.write(105); // 4-я нога назад
        servoV1.write(90); // 1-я нога назад
        servoV2.write(90); // 2-я нога назад
        servoV3.write(90); // 3-я нога назад
        servoV4.write(90); // 4-я нога назад
      }
    }
    irrecv.resume(); // ждем прием следующего сигнала
  }
  
  if (run == 1)
  {
    //Посылаем запрос в функцию паузы- если 1 выполняем действие по очереди с паузой 500, при этом можно без тормозов опрашивать другие датчики
    if (pause (500))
    {
      switch (var) {
        case 0:
          servoV3.write(60); // 3-я нога вверх
          servoG3.write(15); // 3-я нога вперёд
          var = 1;
          break;
        case 1:
          servoV3.write(90); // 3-я нога вниз
          var = 2;
          break;
        case 2:
          servoV4.write(120); // 4-я нога вверх
          servoG4.write(165); // 4-я нога вперёд
          var = 3;
          break;
        case 3:
          servoV4.write(90); // 4-я нога вниз
          var = 4;
          break;
        case 4:
          servoG1.write(165); // 1-я нога назад
          servoG2.write(15); // 2-я нога назад
          servoG3.write(75); // 3-я нога назад
          servoG4.write(105); // 4-я нога назад
          var = 5;
          break;
        case 5:
          servoV1.write(120); // 1-я нога вверх
          servoG1.write(105); // 1-я нога вперёд
          var = 6;
          break;
        case 6:
          servoV1.write(90); // 1-я нога вниз
          var = 7;
          break;
        case 7:
          servoV2.write(60); // 2-я нога вверх
          servoG2.write(75); // 2-я нога вперёд
          var = 8;
          break;
        case 8:
          servoV2.write(90); // 2-я нога вниз
          var = 0;
          break;
      }
    }

  }
}

Ну а дальше если теперь будет работать нормально наращивай функционал. Кстати комментарий не читали к коду видимо, иначе додумались бы сдвинуть условие еще ниже.

nevkon
Offline
Зарегистрирован: 20.01.2015

И кстати начало движения в другую сторону советую сделать через нулевую точку. Хоть так будет и медленнее, но зато заморочек меньше с переходами состояний.

Юрец
Offline
Зарегистрирован: 20.01.2016

Ага, завтра попробую.

P.s. Это у меня так старший сын типа робототехникой занимается.

Юрец
Offline
Зарегистрирован: 20.01.2016

nevkom большое спасибо. Всё вроде заработало. Буду сейчас пыжиться остальные части скетча привинчивать. Про нулевую точку знаю (опыт - сын ошибок трудных). Смену направления только через "стоп" делаю во избежании глюков. Про результат отпишусь.

Юрец
Offline
Зарегистрирован: 20.01.2016
#include <IRremote.h>
#include<Servo.h>

Servo servoG1;
Servo servoV1;
Servo servoG2;
Servo servoV2;
Servo servoG3;
Servo servoV3;
Servo servoG4;
Servo servoV4;
int RECV_PIN = 11; // назначаем 11-ый вывод для подключения фотоприемника
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long currentTime2; //Переменная для pause
byte var = 0;
bool run = 0; // Переменная для движения

void setup()
{
  servoG1.attach(9);  // s is on pin 8
  servoV1.attach(2);
  servoG2.attach(3);
  servoV2.attach(4);
  servoG3.attach(5);
  servoV3.attach(6);
  servoG4.attach(7);
  servoV4.attach(8);
  Serial.begin(9600); // устанавливает скорость обмена данными с компьютером
  irrecv.enableIRIn(); // функция начала приема
  servoG1.write(105); // 1-я нога
  servoG2.write(75); // 2-я нога
  servoG3.write(75); // 3-я нога
  servoG4.write(105); // 4-я нога
  servoV1.write(90); // 1-я нога
  servoV2.write(90); // 2-я нога
  servoV3.write(90); // 3-я нога
  servoV4.write(90); // 4-я нога
}

//Функция паузы
int pause(int y)
{
  bool x = 0;
  if (millis() - currentTime2 >= y) x = 1, currentTime2 = millis();
  return x;
}

void loop() {

  if (irrecv.decode(&results)) { // если сигнал принят
    Serial.println(results.value); // выводим его на экран компьютера
    if (results.value > 16000000 && results.value < 17000000) {
      if (results.value == 16718055) // если принятый код равен одному из запомненных нами (кнопка 2)

      {
        run = 1;
      }
      if (results.value == 16730805) // если принятый код равен одному из запомненных нами (кнопка 8)
      {
        run = 2;
      }
      if (results.value == 16726215) // если принятый код равен второму из запомненных нами (кнопка 5)
      {
        run = 0;
        var = 0;
        servoG1.write(105); // 1-я нога назад
        servoG2.write(75); // 2-я нога назад
        servoG3.write(75); // 3-я нога назад
        servoG4.write(105); // 4-я нога назад
        servoV1.write(90); // 1-я нога назад
        servoV2.write(90); // 2-я нога назад
        servoV3.write(90); // 3-я нога назад
        servoV4.write(90); // 4-я нога назад
      }
    }
    irrecv.resume(); // ждем прием следующего сигнала
  }
  
  if (run == 1)
  {
    //Посылаем запрос в функцию паузы- если 1 выполняем действие по очереди с паузой 500, при этом можно без тормозов опрашивать другие датчики
    if (pause (500))
    {
      switch (var) {
        case 0:
          servoV3.write(60); // 3-я нога вверх
          servoG3.write(15); // 3-я нога вперёд
          var = 1;
          break;
        case 1:
          servoV3.write(90); // 3-я нога вниз
          var = 2;
          break;
        case 2:
          servoV4.write(120); // 4-я нога вверх
          servoG4.write(165); // 4-я нога вперёд
          var = 3;
          break;
        case 3:
          servoV4.write(90); // 4-я нога вниз
          var = 4;
          break;
        case 4:
          servoG1.write(165); // 1-я нога назад
          servoG2.write(15); // 2-я нога назад
          servoG3.write(75); // 3-я нога назад
          servoG4.write(105); // 4-я нога назад
          var = 5;
          break;
        case 5:
          servoV1.write(120); // 1-я нога вверх
          servoG1.write(105); // 1-я нога вперёд
          var = 6;
          break;
        case 6:
          servoV1.write(90); // 1-я нога вниз
          var = 7;
          break;
        case 7:
          servoV2.write(60); // 2-я нога вверх
          servoG2.write(75); // 2-я нога вперёд
          var = 8;
          break;
        case 8:
          servoV2.write(90); // 2-я нога вниз
          var = 0;
          break;
      }
    }
  }
  if (run == 2)
  {
    //Посылаем запрос в функцию паузы- если 1 выполняем действие по очереди с паузой 500, при этом можно без тормозов опрашивать другие датчики
    if (pause (500))
    {
      switch (var) {
        case 9:
          servoV1.write(120); // 3-я нога вверх
          servoG1.write(165); // 3-я нога вперёд
          var = 1;
          break;
        case 10:
          servoV1.write(90); // 3-я нога вниз
          var = 2;
          break;
        case 11:
          servoV2.write(60); // 4-я нога вверх
          servoG2.write(15); // 4-я нога вперёд
          var = 3;
          break;
        case 12:
          servoV2.write(90); // 4-я нога вниз
          var = 4;
          break;
        case 13:
          servoG1.write(105); // 1-я нога назад
          servoG2.write(75); // 2-я нога назад
          servoG3.write(15); // 3-я нога назад
          servoG4.write(165); // 4-я нога назад
          var = 5;
          break;
        case 14:
          servoV3.write(60); // 1-я нога вверх
          servoG3.write(75); // 1-я нога вперёд
          var = 6;
          break;
        case 15:
          servoV3.write(90); // 1-я нога вниз
          var = 7;
          break;
        case 16:
          servoV4.write(120); // 2-я нога вверх
          servoG4.write(105); // 2-я нога вперёд
          var = 8;
          break;
        case 17:
          servoV4.write(90); // 2-я нога вниз
          var = 0;
          break;
      }
    }

  }
}

С привинчиванием пока не очень получается. Добавил движение "назад" (кнопка 8). Но при нажатии кнопки 8 всё равно выполняется движение вперёд (кнопка 2). Сначала оставил номера case как в "вперёд", робот идёт вперёд. Поменял на другие - ничего не изменилось, гребёт врепёд. Что-то я недопонял видимо. Что я не так сделал?

nevkon
Offline
Зарегистрирован: 20.01.2015

Потому что тупо скопировали блок. У вас var меняется не правильно.

Можно сделать проще. Если я правильно понял движения делаются в обратном порядке при движении назад.

Добавьте переменную byte dir. Сделайте так чтобы при движении вперед она принимала значение 1, а при движении назад - 2.

Ну и пример реализации (остальные состояния додумаете сами):

case 3:
  servoV4.write(90); // 4-я нога вниз
  if (dir == 1) {
    var = 4;
  } else {
    var = 2;
  }
  break;

 

Юрец
Offline
Зарегистрирован: 20.01.2016

Не хватает ума понять, как сделать. Мне бы понять как правильно var менять, что бы следующий блок движений выполнялся. А то мне ещё влево-вправо описывать.

nevkon
Offline
Зарегистрирован: 20.01.2015

var определяет у вас порядок движений. Логично предположить что у вас движение назад будет происходить в обратном порядке от движения вперед. Иначе говоря при движении вперед var должен меняться в порядке 0-1-2-...-8, при движении назад порядок должен быть 8-7-6-...-0.

А вот для поворота/движения боком (смотря что вы будете реализовывать) подойдет то что вы сделали в 132-182 строках по логике. Но чтобы перейти на следующий шаг var должна меняться правильно, а у вас он прыгает на первый цикл. Иначе говоря условия вы поменяли, а переходы по условиям не обеспечили. Да и не надо var гнать выше - условие обеспечивает run.

Надеюсь теперь более понятно объяснил.

Юрец
Offline
Зарегистрирован: 20.01.2016

Да, теперь стало более понятно. Я не понял только, как обеспечить переходы по условиям. Разные варианты пробывал, но не смог переключить на другой цикл.

nevkon
Offline
Зарегистрирован: 20.01.2015

Вот как должен выглядеть мой код вперед-назад:

#include <IRremote.h>
#include<Servo.h>

Servo servoG1;
Servo servoV1;
Servo servoG2;
Servo servoV2;
Servo servoG3;
Servo servoV3;
Servo servoG4;
Servo servoV4;
int RECV_PIN = 11; // назначаем 11-ый вывод для подключения фотоприемника
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long currentTime2; //Переменная для pause
byte var = 0;
byte run = 0; // Переменная для движения
byte dir = 1; //направление движения, 1 - прямое, 2 - обратное (в т.ч. и направо/налево)

void setup()
{
  servoG1.attach(9);  // s is on pin 8
  servoV1.attach(2);
  servoG2.attach(3);
  servoV2.attach(4);
  servoG3.attach(5);
  servoV3.attach(6);
  servoG4.attach(7);
  servoV4.attach(8);
  Serial.begin(9600); // устанавливает скорость обмена данными с компьютером
  irrecv.enableIRIn(); // функция начала приема
}

//Функция паузы
int pause(int y)
{
  bool x = 0;
  if (millis() - currentTime2 >= y) x = 1, currentTime2 = millis();
  return x;
}

void loop() {

  if (irrecv.decode(&results)) { // если сигнал принят
    Serial.println(results.value); // выводим его на экран компьютера
    if (results.value > 16000000 && results.value < 17000000) {
      if (results.value == 16718055) // если принятый код равен одному из запомненных нами (кнопка 2)
      {
        run = 1;
        dir = 1;
      }

      if (results.value == 16730805) // если принятый код равен одному из запомненных нами (кнопка 2)
      {
        run = 1;
        dir = 2;
      }

      if (results.value == 16726215) // если принятый код равен второму из запомненных нами (кнопка 5)
      {
        run = 0;
        var = 0;
        servoG1.write(105); // 1-я нога назад
        servoG2.write(75); // 2-я нога назад
        servoG3.write(75); // 3-я нога назад
        servoG4.write(105); // 4-я нога назад
        servoV1.write(90); // 1-я нога назад
        servoV2.write(90); // 2-я нога назад
        servoV3.write(90); // 3-я нога назад
        servoV4.write(90); // 4-я нога назад
      }
    }
    irrecv.resume(); // ждем прием следующего сигнала
  }
  
  if (run == 1)
  {
    //Посылаем запрос в функцию паузы- если 1 выполняем действие по очереди с паузой 500, при этом можно без тормозов опрашивать другие датчики
    if (pause (500))
    {
      switch (var) {
        case 0:
          servoV3.write(60); // 3-я нога вверх
          servoG3.write(15); // 3-я нога вперёд
          if (dir == 1) {
            var = 1;
          } else {
            var = 8;
          }
          break;
        case 1:
          servoV3.write(90); // 3-я нога вниз
          if (dir == 1) {
            var = 2;
          } else {
            var = 0;
          }
          break;
        case 2:
          servoV4.write(120); // 4-я нога вверх
          servoG4.write(165); // 4-я нога вперёд
          if (dir == 1) {
            var = 3;
          } else {
            var = 1;
          }
          break;
        case 3:
          servoV4.write(90); // 4-я нога вниз
          if (dir == 1) {
            var = 4;
          } else {
            var = 2;
          }
          break;
        case 4:
          servoG1.write(165); // 1-я нога назад
          servoG2.write(15); // 2-я нога назад
          servoG3.write(75); // 3-я нога назад
          servoG4.write(105); // 4-я нога назад
          if (dir == 1) {
            var = 5;
          } else {
            var = 3;
          }
          break;
        case 5:
          servoV1.write(120); // 1-я нога вверх
          servoG1.write(105); // 1-я нога вперёд
          if (dir == 1) {
            var = 6;
          } else {
            var = 4;
          }
          break;
        case 6:
          servoV1.write(90); // 1-я нога вниз
          if (dir == 1) {
            var = 7;
          } else {
            var = 5;
          }
          break;
        case 7:
          servoV2.write(60); // 2-я нога вверх
          servoG2.write(75); // 2-я нога вперёд
          if (dir == 1) {
            var = 8;
          } else {
            var = 6;
          }
          break;
        case 8:
          servoV2.write(90); // 2-я нога вниз
          if (dir == 1) {
            var = 0;
          } else {
            var = 7;
          }
          break;
      }
    }

  }
}

Вот как должен выглядеть ваш код, найдите разницу между исправленным и оригиналом, тогда поймете где была ошибка:

#include <IRremote.h>
#include<Servo.h>

Servo servoG1;
Servo servoV1;
Servo servoG2;
Servo servoV2;
Servo servoG3;
Servo servoV3;
Servo servoG4;
Servo servoV4;
int RECV_PIN = 11; // назначаем 11-ый вывод для подключения фотоприемника
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long currentTime2; //Переменная для pause
byte var = 0;
bool run = 0; // Переменная для движения

void setup()
{
  servoG1.attach(9);  // s is on pin 8
  servoV1.attach(2);
  servoG2.attach(3);
  servoV2.attach(4);
  servoG3.attach(5);
  servoV3.attach(6);
  servoG4.attach(7);
  servoV4.attach(8);
  Serial.begin(9600); // устанавливает скорость обмена данными с компьютером
  irrecv.enableIRIn(); // функция начала приема
  servoG1.write(105); // 1-я нога
  servoG2.write(75); // 2-я нога
  servoG3.write(75); // 3-я нога
  servoG4.write(105); // 4-я нога
  servoV1.write(90); // 1-я нога
  servoV2.write(90); // 2-я нога
  servoV3.write(90); // 3-я нога
  servoV4.write(90); // 4-я нога
}

//Функция паузы
int pause(int y)
{
  bool x = 0;
  if (millis() - currentTime2 >= y) x = 1, currentTime2 = millis();
  return x;
}

void loop() {

  if (irrecv.decode(&results)) { // если сигнал принят
    Serial.println(results.value); // выводим его на экран компьютера
    if (results.value > 16000000 && results.value < 17000000) {
      if (results.value == 16718055) // если принятый код равен одному из запомненных нами (кнопка 2)

      {
        run = 1;
      }
      if (results.value == 16730805) // если принятый код равен одному из запомненных нами (кнопка 8)
      {
        run = 2;
      }
      if (results.value == 16726215) // если принятый код равен второму из запомненных нами (кнопка 5)
      {
        run = 0;
        var = 0;
        servoG1.write(105); // 1-я нога назад
        servoG2.write(75); // 2-я нога назад
        servoG3.write(75); // 3-я нога назад
        servoG4.write(105); // 4-я нога назад
        servoV1.write(90); // 1-я нога назад
        servoV2.write(90); // 2-я нога назад
        servoV3.write(90); // 3-я нога назад
        servoV4.write(90); // 4-я нога назад
      }
    }
    irrecv.resume(); // ждем прием следующего сигнала
  }
  
  if (run == 1)
  {
    //Посылаем запрос в функцию паузы- если 1 выполняем действие по очереди с паузой 500, при этом можно без тормозов опрашивать другие датчики
    if (pause (500))
    {
      switch (var) {
        case 0:
          servoV3.write(60); // 3-я нога вверх
          servoG3.write(15); // 3-я нога вперёд
          var = 1;
          break;
        case 1:
          servoV3.write(90); // 3-я нога вниз
          var = 2;
          break;
        case 2:
          servoV4.write(120); // 4-я нога вверх
          servoG4.write(165); // 4-я нога вперёд
          var = 3;
          break;
        case 3:
          servoV4.write(90); // 4-я нога вниз
          var = 4;
          break;
        case 4:
          servoG1.write(165); // 1-я нога назад
          servoG2.write(15); // 2-я нога назад
          servoG3.write(75); // 3-я нога назад
          servoG4.write(105); // 4-я нога назад
          var = 5;
          break;
        case 5:
          servoV1.write(120); // 1-я нога вверх
          servoG1.write(105); // 1-я нога вперёд
          var = 6;
          break;
        case 6:
          servoV1.write(90); // 1-я нога вниз
          var = 7;
          break;
        case 7:
          servoV2.write(60); // 2-я нога вверх
          servoG2.write(75); // 2-я нога вперёд
          var = 8;
          break;
        case 8:
          servoV2.write(90); // 2-я нога вниз
          var = 0;
          break;
      }
    }
  }
  if (run == 2)
  {
    //Посылаем запрос в функцию паузы- если 1 выполняем действие по очереди с паузой 500, при этом можно без тормозов опрашивать другие датчики
    if (pause (500))
    {
      switch (var) {
        case 9:
          servoV1.write(120); // 3-я нога вверх
          servoG1.write(165); // 3-я нога вперёд
          var = 10;
          break;
        case 10:
          servoV1.write(90); // 3-я нога вниз
          var = 11;
          break;
        case 11:
          servoV2.write(60); // 4-я нога вверх
          servoG2.write(15); // 4-я нога вперёд
          var = 12;
          break;
        case 12:
          servoV2.write(90); // 4-я нога вниз
          var = 13;
          break;
        case 13:
          servoG1.write(105); // 1-я нога назад
          servoG2.write(75); // 2-я нога назад
          servoG3.write(15); // 3-я нога назад
          servoG4.write(165); // 4-я нога назад
          var = 14;
          break;
        case 14:
          servoV3.write(60); // 1-я нога вверх
          servoG3.write(75); // 1-я нога вперёд
          var = 15;
          break;
        case 15:
          servoV3.write(90); // 1-я нога вниз
          var = 16;
          break;
        case 16:
          servoV4.write(120); // 2-я нога вверх
          servoG4.write(105); // 2-я нога вперёд
          var = 17;
          break;
        case 17:
          servoV4.write(90); // 2-я нога вниз
          var = 9;
          break;
      }
    }

  }
}

 

nevkon
Offline
Зарегистрирован: 20.01.2015

Кстати для справки, иде 1.6.7. Первый скетч:

Скетч использует 11 886 байт (38%) памяти устройства. Всего доступно 30 720 байт.
Глобальные переменные используют 501 байт (24%) динамической памяти, оставляя 1 547 байт для локальных переменных. Максимум: 2 048 байт.
 
Второй скетч:
Скетч использует 11 888 байт (38%) памяти устройства. Всего доступно 30 720 байт.
Глобальные переменные используют 501 байт (24%) динамической памяти, оставляя 1 547 байт для локальных переменных. Максимум: 2 048 байт.

Тут еще оптимизатор компилятора неплохо поработал, но разница хоть и небольшая, но есть. А делают скетчи по идее одно и то же.

Юрец
Offline
Зарегистрирован: 20.01.2016

Дважды построчно проверил код, разницы не нашёл. Ведёт себя так же, повторяет первый цикл.

nevkon
Offline
Зарегистрирован: 20.01.2015

Я правильно понял что если со стопа нажать 8, то идет вперед? Код правильный принимается? Движение описано правильно для заднего хода?

Обратите внимание на строки 141, 145, 150, 154, 161, 166, 170, 175 и 179.

Мой код работает как надо? У моего варианта кстати ситуация что не надо переходить через 0 для начала движения назад.

Юрец
Offline
Зарегистрирован: 20.01.2016
#include <IRremote.h>
#include<Servo.h>

Servo servoG1;
Servo servoV1;
Servo servoG2;
Servo servoV2;
Servo servoG3;
Servo servoV3;
Servo servoG4;
Servo servoV4;
int RECV_PIN = 11; // назначаем 11-ый вывод для подключения фотоприемника
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long currentTime2; //Переменная для pause
byte var = 0;
bool run = 0; // Переменная для движения

void setup()
{
  servoG1.attach(9);  // s is on pin 8
  servoV1.attach(2);
  servoG2.attach(3);
  servoV2.attach(4);
  servoG3.attach(5);
  servoV3.attach(6);
  servoG4.attach(7);
  servoV4.attach(8);
  Serial.begin(9600); // устанавливает скорость обмена данными с компьютером
  irrecv.enableIRIn(); // функция начала приема
  servoG1.write(105); // 1-я нога
  servoG2.write(75); // 2-я нога
  servoG3.write(75); // 3-я нога
  servoG4.write(105); // 4-я нога
  servoV1.write(90); // 1-я нога
  servoV2.write(90); // 2-я нога
  servoV3.write(90); // 3-я нога
  servoV4.write(90); // 4-я нога
}

//Функция паузы
int pause(int y)
{
  bool x = 0;
  if (millis() - currentTime2 >= y) x = 1, currentTime2 = millis();
  return x;
}

void loop() {

  if (irrecv.decode(&results)) { // если сигнал принят
    Serial.println(results.value); // выводим его на экран компьютера
    if (results.value > 16000000 && results.value < 17000000) {
      if (results.value == 16718055) // если принятый код равен одному из запомненных нами (кнопка 2)

      {
        run = 1;
      }
      if (results.value == 16730805) // если принятый код равен одному из запомненных нами (кнопка 8)
      {
        run = 2;
      }
      if (results.value == 16726215) // если принятый код равен второму из запомненных нами (кнопка 5)
      {
        run = 0;
        var = 0;
        servoG1.write(105); // 1-я нога назад
        servoG2.write(75); // 2-я нога назад
        servoG3.write(75); // 3-я нога назад
        servoG4.write(105); // 4-я нога назад
        servoV1.write(90); // 1-я нога назад
        servoV2.write(90); // 2-я нога назад
        servoV3.write(90); // 3-я нога назад
        servoV4.write(90); // 4-я нога назад
      }
    }
    irrecv.resume(); // ждем прием следующего сигнала
  }
  
  if (run == 1)
  {
    //Посылаем запрос в функцию паузы- если 1 выполняем действие по очереди с паузой 500, при этом можно без тормозов опрашивать другие датчики
    if (pause (500))
    {
      switch (var) {
        case 0:
          servoV3.write(60); // 3-я нога вверх
          servoG3.write(15); // 3-я нога вперёд
          var = 1;
          break;
        case 1:
          servoV3.write(90); // 3-я нога вниз
          var = 2;
          break;
        case 2:
          servoV4.write(120); // 4-я нога вверх
          servoG4.write(165); // 4-я нога вперёд
          var = 3;
          break;
        case 3:
          servoV4.write(90); // 4-я нога вниз
          var = 4;
          break;
        case 4:
          servoG1.write(165); // 1-я нога назад
          servoG2.write(15); // 2-я нога назад
          servoG3.write(75); // 3-я нога назад
          servoG4.write(105); // 4-я нога назад
          var = 5;
          break;
        case 5:
          servoV1.write(120); // 1-я нога вверх
          servoG1.write(105); // 1-я нога вперёд
          var = 6;
          break;
        case 6:
          servoV1.write(90); // 1-я нога вниз
          var = 7;
          break;
        case 7:
          servoV2.write(60); // 2-я нога вверх
          servoG2.write(75); // 2-я нога вперёд
          var = 8;
          break;
        case 8:
          servoV2.write(90); // 2-я нога вниз
          var = 0;
          break;
      }
    }
  }
  if (run == 2)
  {
    //Посылаем запрос в функцию паузы- если 1 выполняем действие по очереди с паузой 500, при этом можно без тормозов опрашивать другие датчики
    if (pause (500))
    {
      switch (var) {
        case 9:
          servoV1.write(120); // 3-я нога вверх
          servoG1.write(165); // 3-я нога вперёд
          var = 10;
          break;
        case 10:
          servoV1.write(90); // 3-я нога вниз
          var = 11;
          break;
        case 11:
          servoV2.write(60); // 4-я нога вверх
          servoG2.write(15); // 4-я нога вперёд
          var = 12;
          break;
        case 12:
          servoV2.write(90); // 4-я нога вниз
          var = 13;
          break;
        case 13:
          servoG1.write(105); // 1-я нога назад
          servoG2.write(75); // 2-я нога назад
          servoG3.write(15); // 3-я нога назад
          servoG4.write(165); // 4-я нога назад
          var = 14;
          break;
        case 14:
          servoV3.write(60); // 1-я нога вверх
          servoG3.write(75); // 1-я нога вперёд
          var = 15;
          break;
        case 15:
          servoV3.write(90); // 1-я нога вниз
          var = 16;
          break;
        case 16:
          servoV4.write(120); // 2-я нога вверх
          servoG4.write(105); // 2-я нога вперёд
          var = 17;
          break;
        case 17:
          servoV4.write(90); // 2-я нога вниз
          var = 9;
          break;
      }
    }

  }
}

Да, если нажать 8 идёт вперёд. В моём коде с делаями движется правильно. Это загруженый код.

Юрец
Offline
Зарегистрирован: 20.01.2016

Ваш код при нажатии 8 также имитует движение вперёд, но по довольно кривому алгоритму.

nevkon
Offline
Зарегистрирован: 20.01.2015

Опишите как он должен шагать. Кажется я понял что простой инверсии движений (перебор в обратном направлении) будет не достаточно. Когда опишите поймете почему. Ваш вариант в этом случае будет работать, а мой не будет (он будет идти также вперед, но иначе перебирая ноги). По моему варианту тоже можно сделать, но состояний нужно больше описывать, в каждом case должны срабатывать все сервы.

При описании указывайте состояние серв (их позиции).

nevkon
Offline
Зарегистрирован: 20.01.2015

Какова вероятность что ик датчик не срабатывает как надо?

Юрец
Offline
Зарегистрирован: 20.01.2016
#include <IRremote.h>
#include<Servo.h>

Servo servoG1;
Servo servoV1;
Servo servoG2;
Servo servoV2;
Servo servoG3;
Servo servoV3;                      
Servo servoG4;
Servo servoV4;
int RECV_PIN = 11; // назначаем 11-ый вывод для подключения фотоприемника
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  servoG1.attach(9);  // s is on pin 8
  servoV1.attach(2);
  servoG2.attach(3);
  servoV2.attach(4);
  servoG3.attach(5);
  servoV3.attach(6);
  servoG4.attach(7);
  servoV4.attach(8);
  Serial.begin(9600); // устанавливает скорость обмена данными с компьютером
  irrecv.enableIRIn(); // функция начала приема
  servoG1.write(105); // 1-я нога
  servoG2.write(75); // 2-я нога
  servoG3.write(75); // 3-я нога
  servoG4.write(105); // 4-я нога
  servoV1.write(90); // 1-я нога
  servoV2.write(90); // 2-я нога
  servoV3.write(90); // 3-я нога
  servoV4.write(90); // 4-я нога
}

void loop() {
if (irrecv.decode(&results)) { // если сигнал принят
    Serial.println(results.value); // выводим его на экран компьютера
    if (results.value > 16000000 && results.value < 17000000){
     if (results.value == 16718055) // если принятый код равен одному из запомненных нами (кнопка 2)
     {
      servoV3.write(60); // 3-я нога вверх
      servoG3.write(15); // 3-я нога вперёд
      delay(500);
      servoV3.write(90); // 3-я нога вниз
      delay(500);
      servoV4.write(120); // 4-я нога вверх
      servoG4.write(165); // 4-я нога вперёд
      delay(500);
      servoV4.write(90); // 4-я нога вниз
      delay(500);
      servoG1.write(165); // 1-я нога назад
      servoG2.write(15); // 2-я нога назад
      servoG3.write(75); // 3-я нога назад
      servoG4.write(105); // 4-я нога назад
      delay(500);
      servoV1.write(120); // 1-я нога вверх
      servoG1.write(105); // 1-я нога вперёд
      delay(500);
      servoV1.write(90); // 1-я нога вниз
      delay(500);
      servoV2.write(60); // 2-я нога вверх
      servoG2.write(75); // 2-я нога вперёд
      delay(500);
      servoV2.write(90); // 2-я нога вниз
      delay(500);
     }
     if (results.value == 16726215) // если принятый код равен второму из запомненных нами (кнопка 5)
     {
      servoG1.write(105); // 1-я нога
      servoG2.write(75); // 2-я нога
      servoG3.write(75); // 3-я нога
      servoG4.write(105); // 4-я нога
      servoV1.write(90); // 1-я нога
      servoV2.write(90); // 2-я нога
      servoV3.write(90); // 3-я нога
      servoV4.write(90); // 4-я нога
     }
     if (results.value == 16730805) // если принятый код равен одному из запомненных нами (кнопка 8)
     {
      servoV1.write(120); // 1-я нога вверх
      servoG1.write(165); // 1-я нога назад
      delay(500);
      servoV1.write(90); // 1-я нога вниз
      delay(500);
      servoV2.write(60); // 2-я нога вверх
      servoG2.write(15); // 2-я нога назад
      delay(500);
      servoV2.write(90); // 2-я нога вниз
      delay(500);
      servoG1.write(105); // 1-я нога вперёд
      servoG2.write(75); // 2-я нога вперёд
      servoG3.write(15); // 3-я нога вперёд
      servoG4.write(165); // 4-я нога вперёд
      delay(500);
      servoV3.write(60); // 3-я нога вверх
      servoG3.write(75); // 3-я нога назад
      delay(500);
      servoV3.write(90); // 3-я нога вниз
      delay(500);
      servoV4.write(120); // 4-я нога вверх
      servoG4.write(105); // 4-я нога назад
      delay(500);
      servoV4.write(90); // 4-я нога вниз
      delay(500);
     }
     if (results.value == 16716015) // если принятый код равен одному из запомненных нами (кнопка 4)
     {
      servoV1.write(120); // 1-я нога вверх
      servoG1.write(135); // 1-я нога назад
      delay(500);
      servoV1.write(90); // 1-я нога вниз
      delay(500);
      servoV4.write(120); // 4-я нога вверх
      servoG4.write(135); // 4-я нога вперёд
      delay(500);
      servoV4.write(90); // 4-я нога вниз
      delay(500);
      servoV2.write(60); // 2-я нога вверх
      servoG2.write(105); // 2-я нога вперёд
      delay(500);
      servoV2.write(90); // 2-я нога вниз
      delay(500);
      servoV3.write(60); // 3-я нога вверх
      servoG3.write(105); // 3-я нога назад
      delay(500);
      servoV3.write(90); // 3-я нога вниз
      delay(500); 
      servoG1.write(75); // 1-я нога
      servoG2.write(45); // 2-я нога
      servoG3.write(45); // 3-я нога
      servoG4.write(75); // 4-я нога
      delay(500);
      }
      if (results.value == 16734885) // если принятый код равен одному из запомненных нами (кнопка 6)
      {
      servoV2.write(60); // 2-я нога вверх
      servoG2.write(45); // 2-я нога назад
      delay(500);
      servoV2.write(90); // 2-я нога вниз
      delay(500);
      servoV3.write(60); // 3-я нога вверх
      servoG3.write(45); // 3-я нога вперёд
      delay(500);
      servoV3.write(90); // 3-я нога вниз
      delay(500);
      servoV1.write(120); // 1-я нога вверх
      servoG1.write(75); // 1-я нога вперёд
      delay(500);
      servoV1.write(90); // 1-я нога вниз
      delay(500);
      servoV4.write(120); // 4-я нога вверх
      servoG4.write(75); // 4-я нога вперёд
      delay(500);
      servoV4.write(90); // 4-я нога вниз
      delay(500); 
      servoG1.write(135); // 1-я нога
      servoG2.write(105); // 2-я нога
      servoG3.write(105); // 3-я нога
      servoG4.write(135); // 4-я нога
      delay(500);
      }
    }
   irrecv.resume(); // ждем прием следующего сигнала
  }
}

Это полный код с делай. В коде с делай датчик нормально срабатывает, но отрабатывает один цикл и ждёт повторное нажатие кнопки. Мне бы понять как переключить на другой цикл по нажатию кнопки со shwich-case.

nevkon
Offline
Зарегистрирован: 20.01.2015

Этот код я видел. Также проверил что движения перенесены правильно. Так что двигаться должен назад. Кстати у вас ноги 1 и 4 спереди, а 2 и 3 сзади все верно? Есть подозрение и обоснованое что не происходит переход по run=2. А все потому что тип данных у вас все еще bool, а не byte или int.

Кстати посмотрите статью, там интересно описывают логику, за счет чего можно много уменьшить код: http://cxem.net/uprav/uprav56.php

nevkon
Offline
Зарегистрирован: 20.01.2015

А вот есть еще двуногий: http://robocraft.ru/blog/projects/681.html

И веселый четырехног: http://robocraft.ru/blog/projects/706.html

Юрец
Offline
Зарегистрирован: 20.01.2016

Нет, ноги спереди 1 и 2, сзади - 3 и 4. Если представить корпус робота как квадрат, то ноги выходят из углов с небольшими отклонениями от геометрического центра квадрата (90,90,90,90 - если через центр, 105,75,75,105 - у меня). Это положение "стоп", с которого всё начинается. При движении вперёд сначала начинают последовательно двигаться задние ноги (3 и 4), т.к. передние (1 и 2), уже ориентированы вперёд. Затем идёт отработка всех ног одновременно назад (т.е. получается ноги стоят на месте, а корпус перемещается вперёд). Ну и потом , т.к. ноги 1 и 2 перемесились назад, они отрабатывают последовательно движение вперёд. Вот цикл "вперёд".  Попробую сейчас bool на byte и int поочереди поменять.

Юрец
Offline
Зарегистрирован: 20.01.2016

Урраааа!!! bool на byte поменял, вернул var и case номера как в цикле "вперёд" и заработало. Спасибо огромное!!! Сейчас буду влево-вправо прибивать.

Юрец
Offline
Зарегистрирован: 20.01.2016

На мои радостные крики пришёл начальник и узнав в чём дело сказал, так тип данных Bool, говорит, только 0 и 1 принимает значения. Поэтому циклы дальше еденицы и не работали. Век живи, век учись.