джойстик для мира танков,траблы
- Войдите на сайт для отправки комментариев
Здравствуйте!Это моя первая поделка,прошу не судить строго.В этой игре(WOT) управление прицеливанием осуществляется мышью,движением танка- кнопками WASD;RF.Кнопки RF служат для последовательного переключения передач и смены направления движения.При пользовании ими существенно возрастает точность стрельбы,(в игре немногие ими пользуются,то ли неудобно,то ли сила привычки)а при смене направления движения кнопками WS возрастает разброс орудия.Появилась мысль с помощью джойстика и Leonard-ы организовать управление танком ,с эмуляцией нажатия соответствующих клавиш.В открытый текстовый документ все символы отправляются вроде правильно,а в игре не работают повороты по неясной мне причине,видно дергание вначале ,но этим всё и заканчивается.Да,частота отсылаемых символов при повороте зависит от наклона ручки джойстика.Перепробованы команды:Keiboard press;Keiboard write;Keiboard print;('символ');(номер скан.кода ASCII).Идеи кончились.Не подскажете ли,уважаемое сообщество направление куда копать?Буду благодарен.
#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; //Возвращаем состояние кнопки }выше был мой говнокод,https://www.tinkercad.com/things/6uqZv8BOWZD-fantabulous-blorr -это схема,в ней я не нарисовал одну неважную кнопку на четвертом ПИНе-для эмуляции клавиши SHIFT.
N79-N109-ось X(повороты)