Попробовал вместо экранно-сенсорного пульта для игрушки сделать пульт на джойстике.
С направлениями по серым стрелкам всё нормально, а по красным надо тютелька в тютельку направление выдерживать иначе сваливается к серым стрелкам. Почему так? Вроде математика правильная у меня.
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 это левый верхний угол).
Условия в коде невероятно сложны для понимания.
Джойстик поди китайский? Встречал такой один, у него нет аналога, а тупо вкл-выкл при перемещении до упора.
Условия неправильные
Прошу прощения, ошибся. Ща погляжу получше.
Алгоритм не правильный.
При приближении двух координат к каким-либо крайним положениям “по диагонали”, либо Х либо
Y срабатывает первей и выполняется одна из веток горизонтального положения и сбрасывает флаг.
Иными словами при перемещении джойстика сначала X или Y переходят за пределы porog1 или porog2, и только затем порог проходит вторая координата, но флаг сбрасывается ещё при преодолении порога одной координатой.
Другой вопрос - а доходят ли они вообще до порогов? На диагональных линиях(на дешёвых джойстиках) никогда не будет тех же максимальных значений. В порте то смотрели?
Да смотрел. Сейчас посмотрел ещё раз:) При диагональном движении СНАЧАЛА меняется одна координата, а уже ПОТОМ вторая. Из-за этого алгоритм мой рабочий наполовину - повезёт, не повезёт. Надо придумывать что бы условия проверялись после достижения крайних положений.
Придумал и переделал. Теперь танчик катается здорово, пульт ловчее чем на сенсорном экране.
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 положений ручки.