Джойстик на пульте управления танчиком

Попробовал вместо экранно-сенсорного пульта для игрушки сделать пульт на джойстике.
С направлениями по серым стрелкам всё нормально, а по красным надо тютелька в тютельку направление выдерживать иначе сваливается к серым стрелкам. Почему так? Вроде математика правильная у меня.

const int pinX = A1; // Ось X джойстика
const int pinY = A2; // Ось Y джойстика
const  int porog1 = 250; //порог между 0 и 510
const  int porog2 = 750; // порог между 510 и 1023
 int X=0;//
 int Y=0;//
bool FLAG=true;//
 
void setup() {
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  Serial.begin(19200);
}
 
void loop() {
   X = analogRead(pinX); // считываем аналоговое значение оси Х
   delay(10);
   Y = analogRead(pinY); // считываем аналоговое значение оси Y
   delay(10);
  if(X>porog1&&X<porog2&&Y>porog1&&Y<porog2&&FLAG){Serial.print("5");Serial.print('\n'); FLAG=false;}//стоп
  if(X>porog1&&X<porog2&&Y<porog1&&!FLAG){Serial.print("1");Serial.print('\n'); FLAG=true;}//вперёд
  if(X>porog1&&X<porog2&&Y>porog2&&!FLAG){Serial.print("2");Serial.print('\n'); FLAG=true;}//назад
  if(X>porog2&&Y>porog1&&Y<porog2&&!FLAG){Serial.print("6");Serial.print('\n'); FLAG=true;}//вправо
  if(X<porog1&&Y>porog1&&Y<porog2&&!FLAG){Serial.print("9");Serial.print('\n'); FLAG=true;}//влево
  if(X>porog2&&Y<porog1&&!FLAG){Serial.print("3");Serial.print('\n'); FLAG=true;}//разворот по часовой
  if(X<porog1&&Y<porog1&&!FLAG){Serial.print("4");Serial.print('\n'); FLAG=true;}//разворот против часовой
  if(X>porog2&&Y>porog2&&!FLAG){Serial.print("8");Serial.print('\n'); FLAG=true;}//башня по часовой
  if(X<porog1&&Y>porog2&&!FLAG){Serial.print("7");Serial.print('\n'); FLAG=true;}//башня против часовой
  delay(10);
}

Картинку брал из интернета, дорисовывал красные стрелки (на ней значения x,y неправильные - точка 0,0 это левый верхний угол).

Круг товарищу - не квадрат! :slightly_smiling_face:

1 лайк

Условия в коде невероятно сложны для понимания.
Джойстик поди китайский? Встречал такой один, у него нет аналога, а тупо вкл-выкл при перемещении до упора.
Условия неправильные

Везде неправильные или частично?

Прошу прощения, ошибся. Ща погляжу получше.
Алгоритм не правильный.
При приближении двух координат к каким-либо крайним положениям “по диагонали”, либо Х либо
Y срабатывает первей и выполняется одна из веток горизонтального положения и сбрасывает флаг.
Иными словами при перемещении джойстика сначала X или Y переходят за пределы porog1 или porog2, и только затем порог проходит вторая координата, но флаг сбрасывается ещё при преодолении порога одной координатой.

Другой вопрос - а доходят ли они вообще до порогов? На диагональных линиях(на дешёвых джойстиках) никогда не будет тех же максимальных значений. В порте то смотрели?

1 лайк

Да смотрел. Сейчас посмотрел ещё раз:) При диагональном движении СНАЧАЛА меняется одна координата, а уже ПОТОМ вторая. Из-за этого алгоритм мой рабочий наполовину - повезёт, не повезёт. Надо придумывать что бы условия проверялись после достижения крайних положений.

Придумал и переделал. Теперь танчик катается здорово, пульт ловчее чем на сенсорном экране.

const int pinX = A1; // Ось X джойстика
const int pinY = A2; // Ось Y джойстика
const  int porog1 = 250; //порог между 0 и 510
const  int porog2 = 750; // порог между 510 и 1023
 int X=0;//
 int Y=0;//
byte FLAG=1;//
 
void setup() {
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  Serial.begin(19200);
}
 
void loop() {
   X = analogRead(pinX); // считываем аналоговое значение оси Х
   Y = analogRead(pinY); // считываем аналоговое значение оси Y
   
  if(X>porog1&&X<porog2&&Y>porog1&&Y<porog2&&FLAG!=0){Serial.print("5");Serial.print('\n');FLAG=0;}//стоп
 
  if(X>porog1&&X<porog2&&Y<porog1&&FLAG!=1){Serial.print("5");Serial.print('\n');Serial.print("1");Serial.print('\n');FLAG=1; }//вперёд
  if(X>porog1&&X<porog2&&Y>porog2&&FLAG!=2){Serial.print("5");Serial.print('\n');Serial.print("2");Serial.print('\n');FLAG=2;}//назад
  if(X>porog2&&Y>porog1&&Y<porog2&&FLAG!=3){Serial.print("5");Serial.print('\n');Serial.print("6");Serial.print('\n');FLAG=3; }//вправо
  if(X<porog1&&Y>porog1&&Y<porog2&&FLAG!=4){Serial.print("5");Serial.print('\n');Serial.print("9");Serial.print('\n');FLAG=4; }//влево
  if(X>porog2&&Y<porog1&&FLAG!=5){Serial.print("5");Serial.print('\n');Serial.print("3");Serial.print('\n');FLAG=5; }//разворот по часовой
  if(X<porog1&&Y<porog1&&FLAG!=6){Serial.print("5");Serial.print('\n');Serial.print("4");Serial.print('\n');FLAG=6; }//разворот против часовой
  if(X>porog2&&Y>porog2&&FLAG!=7){Serial.print("5");Serial.print('\n');Serial.print("8");Serial.print('\n');FLAG=7; }//башня по часовой
  if(X<porog1&&Y>porog2&&FLAG!=8){Serial.print("5");Serial.print('\n');Serial.print("7");Serial.print('\n');FLAG=8; }//башня против часовой
  
}

Главное аппаратный дефект джойстика убран программно и можно отличить 9 положений ручки.

1 лайк