джойстик для мира танков,траблы

3210pusk
Offline
Зарегистрирован: 21.04.2020

Здравствуйте!Это моя первая поделка,прошу не судить строго.В этой игре(WOT) управление прицеливанием осуществляется мышью,движением танка- кнопками WASD;RF.Кнопки RF служат для последовательного переключения передач и смены направления движения.При пользовании ими существенно возрастает точность стрельбы,(в игре немногие ими пользуются,то ли неудобно,то ли сила привычки)а при смене направления движения кнопками WS возрастает разброс орудия.Появилась мысль с помощью джойстика и Leonard-ы организовать управление танком ,с эмуляцией нажатия соответствующих клавиш.В открытый текстовый документ все символы отправляются вроде правильно,а в игре не работают повороты по неясной мне причине,видно дергание вначале ,но этим всё и заканчивается.Да,частота отсылаемых символов при повороте зависит от наклона ручки джойстика.Перепробованы команды:Keiboard press;Keiboard write;Keiboard print;('символ');(номер скан.кода ASCII).Идеи кончились.Не подскажете ли,уважаемое сообщество направление куда копать?Буду благодарен.

 
3210pusk
Offline
Зарегистрирован: 21.04.2020
#include <Keyboard.h>

const int BUTTON = 10;//номер пина кнопки прерывания процесса
const int RED = 3;//номер пина красного светодиода
const int GREEN = 2;//номер пина зеленого светодиода
const int POTX = 4; //пин ось X джойстика
const int POTY = 5; //пин ось Y джойстика
boolean lastButton = LOW; //Переменная для сохранения предыдущего состояния кнопки
boolean currentButton = LOW; //Переменная для сохранения текущего состояния кнопки
int numLast = 2;//предыдущее состояни передачи
boolean sost = 0;
int kor = 0;
int delayPeriod = 25;
int delayPeriod_X = 25;
int num = 2;//первоначально включить нейтраль
int  valX = 1;//чтение значения оси X c джойстика(диапазон 0-508-1023)
int valY ; //чтение значения оси Y c джойстика
unsigned long T;//переменная временная задержка вывода букв
unsigned long timeX;//переменная временная задержка вывода букв ось X
unsigned long tPricel;//переменная временная устранение дребезга при переключении прицела
int mX;
int a;//временная задержка малого угла поворота
void setup() {
  pinMode (RED, OUTPUT);
  pinMode (GREEN, OUTPUT);
  pinMode (BUTTON, INPUT);
  pinMode (POTX, INPUT);
  pinMode (POTY, INPUT);
  pinMode(4, INPUT_PULLUP);// задаем 4-й контакт как входной,а также включаем встроенный подтягивающий резистор
  Serial.begin(9600); //Инициализация последовательного порта на скорости 9600
  digitalWrite(GREEN, LOW);
  digitalWrite(RED, LOW);
  T = millis();

}

void loop()//
{
  currentButton = debounce(lastButton); //чтение состояние дребезга
  if (lastButton == LOW && currentButton == HIGH) //Если нажатие…
  {
    sost = !sost;
    Keyboard.begin();
    //Serial.begin(9600);
  }
  lastButton = currentButton; //сбросить значение кнопки
  if (sost == HIGH)
  {

    valX = analogRead(POTX) + 0; //чтение значения оси X c джойстика(диапазон 0-508-1023)
    valX = constrain(valX, 0, 1023);
    valY = analogRead(POTY) + kor ; //чтение значения оси Y c джойстика
    if (millis() - T > 20)
    { outputX();
      readY();
      pricel();//выбор прицела(снайперский/аркадный)
      digitalWrite(GREEN, LOW);
      digitalWrite(RED, HIGH);
      T = millis();
    }
  }
  else
  {
    //Serial.end();
    Keyboard.end();
    digitalWrite(GREEN, HIGH);
    digitalWrite(RED, LOW);
  }
}
void outputX()//---------------значения оси X----------
{
  mX = 511-valX;//приведенный к рулю
  a = 512 - (abs(mX))+10; //временная задержка малого угла поворота
  if (mX <= -20 && millis() - timeX > a)

    {
      Keyboard.press('a');//клавиша a
 
      Keyboard.release('a');//клавиша a
      timeX = millis();
    }
  
  if (mX < 20 && mX>-20)
  {
    Keyboard.release('a');//клавиша a
    Keyboard.release('d');//клавиша d
    timeX = millis();
  }
  if (mX >= 20 && millis() - timeX > a)
    {
      Keyboard.press('d');//клавиша D
    
      Keyboard.release('d');//клавиша d
      timeX = millis();

    }
 
  // parX();//параметры оси в консоли,если раскоментить

}
void readY()//---------------значения оси Y----------
{
  //parY();//параметры оси в консоли
  if (valY > 0 && valY < 50) {
    num = 5; //третья
    Keyboard.press('w');//клавиша w
    numLast = 5;

  }
  if (valY > 50 && valY < 200) {
    num = 4; //вторая
  }
  if (valY > 200 && valY < 500) {
    num = 3; //первая
  }
  if (valY > 500 && valY < 540) {
    num = 2; //нейтраль
  }
  if (valY > 540 && valY < 750) {
    num = 1; //первая задняя
  }
  if (valY > 950 && valY < 1024) {
    num = 0; //вторая задняя
    Keyboard.press('s');//клавиша s
    numLast = 1;
    //Keyboard.println(115);
  }
  if (num != numLast)
  {
    if (num == 3 && numLast == 2)
    {
      Keyboard.write(114);//клавиша r
    }
    if (num == 3 && numLast == 4)
    {
      Keyboard.write(102);//клавиша f
    }

    if (num == 4 && numLast == 3)
    {
      Keyboard.write(114);//клавиша r
    }
    if (num == 4 && numLast == 5)
    {
      Keyboard.write(102);//клавиша f
    }

    if (num == 2 && numLast == 3)
    {
      neytrPer();
    }
    if (num == 2 && numLast == 4)
    {
      neytrPer();
    }
    if (num == 2 && numLast == 5)
    {
      neytrPer();
    }
    if (num == 2 && numLast == 0)
    {
      neytrPer();
    }

    if (num == 2 && numLast == 1)
    {
      neytrPer();
    }
    if (num == 1 && numLast == 2)
    {
      Keyboard.write(102);//клавиша f swf swf
    }
    if (num == 1 && numLast == 0)
    {
      Keyboard.write(114);//клавиша r
    }
    numLast = num;

  }
  /*if (num == 5  )
    {
    Keyboard.press('w');//клавиша w
    numLast = 4;
    }*/
  if (num == 0  )
  {
    Keyboard.press('s');//клавиша s
    numLast = 0;
  }
}
void neytrPer()
{
  Keyboard.write(32); //клавиша space
  Keyboard.write('s');
  Keyboard.write('w');
  Keyboard.release('s');
  Keyboard.release('w');
}
void     parY()
{
  Serial.print ("valY=");
  Serial.println (valY);
  Serial.print("num=");
  Serial.println(num);
  Serial.print("numLast=");
  Serial.println(numLast);

}
void     parX()
{
  Serial.print ("valX");
  Serial.println (valX);
  Serial.print("mX=");
  Serial.println(mX);
  Serial.print("a=");
  Serial.println(a);
  Serial.print("timeX=");
  Serial.println(timeX);
  
}
void  pricel()
{
  int sensorVal = digitalRead(4);    // сохраняем информацию, полученную от кнопки, в переменную:
  if (sensorVal == LOW)
  {
    if (millis() - tPricel > 1000) //ждем устранение дребезга
    {
      int sensorVal = digitalRead(4);    // сохраняем информацию, полученную от кнопки, в переменную:
        if (sensorVal == LOW)
          {
           Keyboard.press(129); //клавиша Left shift
           Keyboard.release(129);
           tPricel = millis();
           }
    }
  }

  //Serial.println(sensorVal);  // выводим эту информацию на Serial Monitor:

}
boolean debounce(boolean last)
{
  boolean current = digitalRead(BUTTON); //Считать состояние кнопки
  if (last != current) //Если изменилось...
  {
    delay(5); //Ждем 5 мс
    current = digitalRead(BUTTON); //Считываем состояние кнопки снова
  }
  return current; //Возвращаем состояние кнопки
}

 

3210pusk
Offline
Зарегистрирован: 21.04.2020

выше был мой говнокод,https://www.tinkercad.com/things/6uqZv8BOWZD-fantabulous-blorr   -это схема,в ней я не нарисовал одну неважную кнопку на четвертом ПИНе-для эмуляции клавиши SHIFT.

3210pusk
Offline
Зарегистрирован: 21.04.2020

N79-N109-ось X(повороты)