Поворот турели на заданный угол.
- Войдите на сайт для отправки комментариев
Чт, 20/10/2022 - 15:33
Друзья, пытаюсь тут создать турельку, да вот столкнулся с проблемой: всё не могу придумать как сделать, так что бы при последовательном нажатии на три цифровые клавише ну пульте ДУ, турель поворачивался на заданный угол. Буду рад любой помощи. Вот, собственно сам код:
#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);
}
}
}
а в чем проблема?
В этом скетче уже есть код, который поворачивает турель вправо и влево. Не работает?
А вообще конечно, в условиях военного времени спрашивать, "как создать турельку"? Паспорт предьявите сначала
Это гособоронзаказ
Это гособоронзаказ
Не, там спецификация была бы листов на сто.
Я что то в коде не увидел , даже отдаленной попытки обработки ни одной "цифровой "клавише" ", а нужно аж три...
Непорядок
А вообще, для начала нужно написать обработчик всех кнопок пульта, и желательно не в том виде, который сейчас, а потом уже пытаться их обрабатывать.
А шо, так можно было?
Сначала сделайте на трёх кнопках, а уж потом подключите ДУ.
Отрефакторил твой код для удобства.
У тебя по логике по нажатию на кнопку "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; } }