Поворот турели на заданный угол.

mega_pchel
Offline
Зарегистрирован: 20.10.2022

 



 



Друзья, пытаюсь тут создать турельку, да вот столкнулся с проблемой: всё не могу придумать как сделать, так что бы при последовательном нажатии на три цифровые клавише ну пульте ДУ, турель поворачивался на заданный угол. Буду рад любой помощи. Вот, собственно сам код:

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

int RECV_PIN = 4;
IRrecv irrecv(RECV_PIN);
decode_results results;
Servo servZ;
Servo servX;

int Zpos = 60;
int Xpos = 60;
int x = 0;

void setup() {
   servZ.attach(8); 
   servX.attach(10); 
   irrecv.enableIRIn();
   servZ.write(Zpos);
   servX.write(Xpos);
}

void loop() { 

  if (irrecv.decode(&results)) {
    if (results.value == 16718055) {
      up();
    } else if (results.value == 16730805) {
      down();   
    } else if (results.value == 16716015) {
      left();   
    } else if (results.value == 16734885) {
      right();   
    } else if (results.value == 16738455) {
      axisX();   
    }

    irrecv.resume();
  }
  delay(100);
}

void up() {
  Zpos=Zpos+10;
  servZ.write(Zpos);
  delay(100);
}
 
void down() {
  Zpos=Zpos-10;
  servZ.write(Zpos);
  delay(100);
}
 
void left() {
  Xpos=Xpos-10;
  servX.write(Xpos);
  delay(100);
}

void right() {
  Xpos=Xpos+10;
  servX.write(Xpos);
  delay(100);
}
 
void axisX() {
  x = 0;
  if (irrecv.decode(&results)){
    while (results.value != 16726215){
      for (int i = 3; i > 1; i--){
        if (results.value == 16750695){
            int x = x + pow(0, i);
          }
          else if (results.value == 16753245){
            int x = x + pow(1, i);
          }
          else if (results.value == 16736925){
            int x = x + pow(2, i);
          }
            else if (results.value == 16769565){
            int x = x + pow(3, i);
          }
            else if (results.value == 16720605){
            int x = x + pow(4, i);
          }
            else if (results.value == 16712445){
            int x = x + pow(5, i);
          }
            else if (results.value == 16748655){
            int x = x + pow(6, i);
          }
            else if (results.value == 16769055){
            int x = x + pow(7, i);
          }
            else if (results.value == 16754775){
            int x = x + pow(8, i);
          }
            else if (results.value == 16748655){
            int x = x + pow(9, i);
          }
        }
    }
    if(results.value == 16726215){
      servX.write(x);
    }
  }
}


  

 

b707
Offline
Зарегистрирован: 26.05.2017

а в чем проблема?

В этом скетче уже есть код, который поворачивает турель вправо и влево. Не работает?

 

А вообще конечно, в условиях военного времени спрашивать, "как создать турельку"? Паспорт предьявите сначала

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Это гособоронзаказ

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

Это гособоронзаказ

Не, там спецификация была бы листов на сто.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Я что то в коде не увидел , даже отдаленной попытки обработки ни одной "цифровой "клавише" ", а нужно аж три...
Непорядок

Kakmyc
Offline
Зарегистрирован: 15.01.2018

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

-NMi-
Offline
Зарегистрирован: 20.08.2018

А шо, так можно было?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Сначала сделайте на трёх кнопках, а уж потом подключите ДУ.

everlast945
Offline
Зарегистрирован: 21.10.2022

Отрефакторил твой код для удобства. 

У тебя по логике по нажатию на кнопку "BUTTON_AXIS_X" запускается бесконечный цикл, который ожидает нажатия клавиш.
Далее жмешь 3 цифры.
И "BUTTON_STOP" для применения нового значения.
Правда тут странный алгоритм расчета, может стоит на него обратить внимание.

И думаю баг в том, что ты не сбрасываешь значение в "results.value" (внутри бесконечного цикла) и получается нажав на любую цифру у тебя цикл успевает накрутить огромное значение и servX.write(x) не может его обработать.

Добавь логи в код и сам поймешь в чем дело. 

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

int RECV_PIN = 4;
IRrecv irrecv(RECV_PIN);
decode_results results;
Servo servZ;
Servo servX;

int Zpos = 60;
int Xpos = 60;
int x = 0;

int BUTTON_UP = 16718055
int BUTTON_DOWN = 16730805
int BUTTON_LEFT = 16716015
int BUTTON_RIGHT = 16734885
int BUTTON_AXIS_X = 16738455
int BUTTON_STOP = 16726215
int BUTTON_0 = 16750695
int BUTTON_1 = 16753245
int BUTTON_2 = 16736925
int BUTTON_3 = 16769565
int BUTTON_4 = 16720605
int BUTTON_5 = 16712445
int BUTTON_6 = 16748655
int BUTTON_7 = 16769055
int BUTTON_8 = 16754775
int BUTTON_9 = 16748655
int DIFF = 10
int STEP_DELAY = 100
int ARRAY_EXPONENT [] = {2, 3} 


void setup() {
   servZ.attach(8); 
   servX.attach(10); 
   irrecv.enableIRIn();
   servZ.write(Zpos);
   servX.write(Xpos);
}

void loop() { 
  if (irrecv.decode(&results)) {
    switch(results.value) {
      case BUTTON_UP: up();
      case BUTTON_DOWN: down();
      case BUTTON_LEFT: left();
      case BUTTON_RIGHT: right();
      case BUTTON_AXIS_X: axisX();
    }
    irrecv.resume();
  }
  delay(STEP_DELAY);
}

void up() {
  Zpos = Zpos + DIFF;
  servZ.write(Zpos);
  delay(STEP_DELAY);
}
 
void down() {
  Zpos = Zpos - DIFF;
  servZ.write(Zpos);
  delay(STEP_DELAY);
}
 
void left() {
  Xpos = Xpos - DIFF;
  servX.write(Xpos);
  delay(STEP_DELAY);
}

void right() {
  Xpos = Xpos + DIFF;
  servX.write(Xpos);
  delay(STEP_DELAY);
}
 
void axisX() {
  x = 0;
  if (irrecv.decode(&results)){
    while (results.value != BUTTON_STOP){
      foreach(int exponent in ARRAY_EXPONENT) {
        x = calc_axis(results.value, x, exponent);
      }
      // Тут думаю нужно сбрасывать results.value
    }
    servX.write(x);
  }
}

int calc_axis(int button, int value, int exponent) {
  switch(button) {
    case BUTTON_0: return value + pow(0, exponent);
    case BUTTON_1: return value + pow(1, exponent);
    case BUTTON_2: return value + pow(2, exponent);
    case BUTTON_3: return value + pow(3, exponent);
    case BUTTON_4: return value + pow(4, exponent);
    case BUTTON_5: return value + pow(5, exponent);
    case BUTTON_6: return value + pow(6, exponent);
    case BUTTON_7: return value + pow(7, exponent);
    case BUTTON_8: return value + pow(8, exponent);
    case BUTTON_9: return value + pow(9, exponent);
    default: return value;
  }
}