ARDUINO Простой руль для ПК. Обсуждение проекта

Старик Похабыч

★★★★★★★
14 Авг 2019
4,261
1,300
Москва
Зажал кнопку, воткнул, подождал, отпустил.
Можно сделать : там где проверка на зажатую кнопку сделать безусловный переход. откалибровать и снова вернуть оборатно
 

Mocmegas

✩✩✩✩✩✩✩
2 Сен 2020
3
0
Спасибо за советы! Все заработало. Оказывается не туда спаял землю кнопки. Я новичок в этом всём:p
Но появилась другая проблема. В играх работает только 2 потенциометра. Никак не могу заставить заработать еще две, в дебаге все 4 потенциометра реагируют.
 

s60team

★✩✩✩✩✩✩
А я вообще код запорол (ну или с питанием проблемы). Хотел все модули заставить работать, но...
Вобщем я пробовал подключать ещё потенциометры на оси rX и rY. Оказалось, что в коде они -32768—32767, как и оси X и Y.

Добавлено позже:
Всё-таки дешёвый модуль энкодера - это плохая идея.
TLE5010 (Кстати, мне помогли найти код для работы TLE5010) - Нужно паять схему и добавлять в код (по-ходу на Леонардо будет нормально работать только один такой).
Заказал себе AS5600 (модуль датчик угла поворота (магнитный, I2C)). Как приедет - попробую совместить с GyverWheel.

PS: Перешёл на библиотеку в которой функций побольше, чем от NicoHood: ArduinoJoystickLibrary.
Там можно добавить Ещё оси: Управление рулём (Steering), Руль Высоты (Rudder) и Ускорение (Throttle), 128 кнопок, 4 крестовины...
 
Изменено:

Glich

✩✩✩✩✩✩✩
23 Сен 2020
2
0
Ветка обсуждения проекта Руль для компьютера на Arduino
Страница проекта на AlexGyver.ru: https://alexgyver.ru/GyverWheel/
Репозиторий на GitHub: https://github.com/AlexGyver/GyverWheel/
Видео:

Делитесь своими вариантами изготовления, модификациями и улучшениями!
Всем привет. Я сделал этот проект но появилась проблема педали Ардуино видит как одну я пробовал менять входы но ничего не помогло (резисторы работают хорошо)
 

s60team

★✩✩✩✩✩✩
Всем привет. Я сделал этот проект но появилась проблема педали Ардуино видит как одну я пробовал менять входы но ничего не помогло (резисторы работают хорошо)
Без схемы и кода это будет словно гадание на кофейной гуще...
 

besstrahnuy

✩✩✩✩✩✩✩
15 Окт 2018
2
1
Доброго времени суток! Подскажите, возможно ли сделать раль и педали на основе платы Arduino NANO? Если да, можнте подсказать как это сделать.
 
  • Лойс +1
Реакции: s60team

Danissmo

✩✩✩✩✩✩✩
5 Июл 2020
4
0
danisimo.ru
Доброго времени суток! Подскажите, возможно ли сделать раль и педали на основе платы Arduino NANO? Если да, можнте подсказать как это сделать.
Нет, она не определяется ПК как контроллер, нужно именно либо Arduino Leonardo, либо его уменьшенная копия Arduino Pro Micro
 

Pon4ik

✩✩✩✩✩✩✩
30 Окт 2020
8
0
Привет, можете проверить код? Пришлось не много допилить его и добавить сцепление.
А вот сам код:
/*
Скетч к проекту "Простой руль для ПК"
Страница проекта (схемы, описания): https://alexgyver.ru/GyverWheel/
Исходники на GitHub: https://github.com/AlexGyver/GyverWheel/
Нравится, как написан код? Поддержи автора! https://alexgyver.ru/support_alex/
Автор: AlexGyver, AlexGyver Technologies, 2019
https://AlexGyver.ru/
*/

// стандартный тестер геймпада в Win10: поиск/joy.cpl

// =========== НАСТРОЙКИ ===========
#define DEBUG 0 // режим отладки
#define ENC_TYPE 1 // тип энкодера, 0 или 1
#define INV_WHEEL 1 // инверсия руля

// пины
#define ENC_A 5 // пин энкодера
#define ENC_B 6 // пин энкодера
#define POT_THR A0 // педаль газа
#define POT_BR A1 // педаль тормоза
#define POT_CL A2 // педаль сцепления
#define BUTT_BR 4 // кнопка ручника
#define BUTT_CAL 3 // кнопка калибровки

volatile int encCounter = 0;
volatile boolean state0, lastState, turnFlag;
int throttleMin, throttleMax, brakeMin, brakeMax, clutchMin, clutchMax, wheelMax;
uint32_t timer;

#include <EEPROM.h>
#include "HID-Project.h"

void setup() {
pinMode(BUTT_BR, INPUT_PULLUP);
pinMode(BUTT_CAL, INPUT_PULLUP);
setupTmr();
debug();
calibration();
EEPROM.get(0, throttleMin);
EEPROM.get(2, brakeMin);
EEPROM.get(4, clutchMin);
EEPROM.get(6, throttleMax);
EEPROM.get(8, brakeMax);
EEPROM.get(10, clutchMax);
EEPROM.get(12, wheelMax);
Gamepad.begin();
//Serial.begin(9600);
}

void loop() {
gamepadTick();

// при нажатии кнопки калибровки скидываем позицию руля в 0
if (!digitalRead(BUTT_CAL)) {
encCounter = 0;
}
}

void encTick() {
state0 = digitalRead(ENC_A);
if (state0 != lastState) {
#if (ENC_TYPE == 1)
turnFlag = !turnFlag;
if (turnFlag)
encCounter += (digitalRead(ENC_B) != lastState) ? -1 : 1;
#else
encCounter += (digitalRead(ENC_B) != lastState) ? -1 : 1;
#endif
lastState = state0;
}
}

void gamepadTick() {
if (millis() - timer > 10) {
timer = millis();
int wheel;
if (INV_WHEEL) wheel = constrain(-encCounter, -wheelMax, wheelMax);
else wheel = constrain(encCounter, -wheelMax, wheelMax);

wheel = map(wheel, -wheelMax, wheelMax, -32768, 32767);
Gamepad.xAxis(wheel);

int thr, br, cl;
thr = map(analogRead(POT_THR), throttleMin, throttleMax, -128, 127);
thr = constrain(thr, -128, 127);
Gamepad.zAxis(thr);

br = map(analogRead(POT_BR), brakeMin, brakeMax, -128, 127);
br = constrain(br, -128, 127);
Gamepad.rzAxis(br);


cl= map(analogRead(POT_CL), clutchMin, clutchMax, -128, 127);
cl = constrain(cl, -128, 127);
Gamepad.rzAxis(cl);

if (!digitalRead(BUTT_BR)) Gamepad.press(1);
else Gamepad.release(1);
Gamepad.write();
}
}

// калибровка
void calibration() {
if (!digitalRead(BUTT_CAL)) { // нажата кнопка
while (!digitalRead(BUTT_CAL)); // пока кнопка удерживается
Serial.begin(9600);
delay(100);
Serial.print(F("Calibration start"));
encCounter = 0;
int zeroTHR = analogRead(POT_THR);
int zeroBR = analogRead(POT_BR);
int zeroCL = analogRead(POT_CL);
int maxTHR, maxBR, maxCL, maxWHEEL;

EEPROM.put(0, zeroTHR);
EEPROM.put(2, zeroBR);
EEPROM.put(4, zeroCL);
delay(100); // дебаунс
while (true) { // крутимся
if (!digitalRead(BUTT_CAL)) break;
maxTHR = analogRead(POT_THR);
maxBR = analogRead(POT_BR);
maxCL = analogRead(POT_CL);
Serial.println(encCounter);
}
EEPROM.put(4, maxTHR);
EEPROM.put(6, maxBR);
EEPROM.put(8, maxCL);
EEPROM.put(10, abs(encCounter));

Serial.println(F("Calibration end"));
Serial.print(F("Wheel: "));
Serial.println(abs(encCounter));
Serial.print(F("Throat: "));
Serial.print(zeroTHR);
Serial.print(" - ");
Serial.println(maxTHR);
Serial.print(F("Brake: "));
Serial.print(zeroBR);
Serial.print(" - ");
Serial.println(maxBR);
Serial.print(F("clutch: "));
Serial.print(zeroCL);
Serial.print(" - ");
Serial.println(maxCL);
Serial.println();
}
Serial.end();
delay(3000); // задержка чтобы кнопку отпустить
}

// дебаг
void debug() {
#if (DEBUG == 1)
Serial.begin(9600);
uint32_t timer;
while (true) {
encTick();
if (millis() - timer > 100) {
timer = millis();
Serial.print(encCounter);
Serial.print("\t");
Serial.print(analogRead(POT_THR));
Serial.print("\t");
Serial.print(analogRead(POT_BR));
Serial.print("\t");
Serial.print(analogRead(POT_CL));
Serial.print("\t");
Serial.print(!digitalRead(BUTT_BR));
Serial.print("\t");
Serial.println(!digitalRead(BUTT_CAL));
}
}
Serial.end();
#endif
}

// опрос энкодера в прерывании
ISR(TIMER3_COMPA_vect) {
encTick();
}

// ставим таймер 3, канал А, период 0.5 мс. Для опроса энкодера
void setupTmr() {
TCCR3B = 0b00001001;
TIMSK3 = 0b00000010;
OCR3AH = highByte(15999 / 2);
OCR3AL = lowByte(15999 / 2);
}
https://vk.com/away.php?to=https%3A%2F%2Falexgyver.ru%2FGyverWheel%2F&post=-97877471_662158&el=snippet
 

bort707

★★★★★★✩
21 Сен 2020
3,056
910
@Pon4ik, ошибки я тебе уже указал. Но тебе ж не "проверить" код нужно, а чтоб все за тебя отладили и дописали.
 
  • Лойс +1
Реакции: s60team

s60team

★✩✩✩✩✩✩
Привет, можете проверить код? Пришлось не много допилить его и добавить сцепление.
А вот сам код:
Код проверьте: У вас там два раза указана ось Rz и в EEPROM память записываете не туда и не правильно.
 
  • Лойс +1
Реакции: Pon4ik

s60team

★✩✩✩✩✩✩
Упрощённая версия прошивки AlexGyver'а (сообщение изменено по просьбе администрации):
  • Убрана отладка и калибровка - калибруем в Windows.
  • Руль на энкодере: перед подключением к ПК можно задать угол поворота руля зажатием кнопки сброса.
  • Угол поворота руля (настраиваемый, в зависимости от точности энкодера): 270 и 900
  • Газ, Тормоз, Сцепление, Ручник (Если нет ручника, ось "не реагирует").
  • 13 кнопок (Leonardo) или 11 (Pro Micro). Код и Схема.
 
Изменено:

Pon4ik

✩✩✩✩✩✩✩
30 Окт 2020
8
0
кароч, тема такая, три потенциометра (газ, тормоз и сцепа) в режиме дэбаг работают, захожу в joy.cpl но движения ни какого нет
 

s60team

★✩✩✩✩✩✩
кароч, тема такая, три потенциометра (газ, тормоз и сцепа) в режиме дэбаг работают, захожу в joy.cpl но движения ни какого нет
Попробуйте код (прошивку) с сообщение №37 - она отлажена и отлично работает.
PS: Код снабжён очень подробными комментариями!
PPS: При добавлении сцепления в обычную прошивку (с отладкой и калибровкой) AlexGyver'а прошивка перестаёт нормально работать.
Напоминаю, не забываем калибровать встроенной в Windows функцией!
 
Изменено:

Pon4ik

✩✩✩✩✩✩✩
30 Окт 2020
8
0
Крч прикол такой, появилась проблема, крестовина поднимается вверх нормально, а вот вниз в разы быстрее
 

bulavka82

✩✩✩✩✩✩✩
6 Янв 2021
1
0
Здравствуйте!
У кого-нибудь есть скетч с обратной отдачей руля?
 

s60team

★✩✩✩✩✩✩
У кого-нибудь есть скетч с обратной отдачей руля?
Скетча нет, но есть библиотеки с примерами:
ArduinoFFB иногда не определяется играми.
VNWheel - хрен разберёшся, но должен работать (Руль энкодер, Газ, Тормоз, Сцепление, 8 кнопок (КПП)).
Fake FFB ещё не пробовал.
 
Изменено:

Oscarmeister

✩✩✩✩✩✩✩
6 Янв 2021
6
2
Всем привет, купил все компоненты по ссылкам со страницы проекта, брал дорогой энкодер. С ним проблема. Припаял черный к земле, красный к VCC, зеленый и белый к 5 и 6. Со всего идут данные, кроме энкодера. При любом типе энкодера, ноль реакции. Калибровку не делал, не думаю, что в этом дело. Может ему надо питание 5в? Если да, то где мне взять 5в с платы?
 

s60team

★✩✩✩✩✩✩
Всем привет, купил все компоненты по ссылкам со страницы проекта, брал дорогой энкодер. С ним проблема. Припаял черный к земле, красный к VCC, зеленый и белый к 5 и 6. Со всего идут данные, кроме энкодера. При любом типе энкодера, ноль реакции. Калибровку не делал, не думаю, что в этом дело. Может ему надо питание 5в? Если да, то где мне взять 5в с платы?
Будьте добры, попробуйте прошивку с сообщения #37
НЕ забываем, что энкодер стабильно работает только на пинах с прерываниями, т.е. пины: 0, 1, 2, 3. В моём случае 0 и 1
 
Изменено:

Oscarmeister

✩✩✩✩✩✩✩
6 Янв 2021
6
2
Спасибо за ответ, разобрался сам, посмотрев другие видео. Поставил 2 резистора на 10 кОм. Припаял от VCC к пинам 5 и 6.
Если я припаяю энкодер к пинам 0, 1, 2, 3, то можно будет убрать резисторы? И это нормально ставить резисторы от питания к пинам?
 

s60team

★✩✩✩✩✩✩
Чаще всего библиотеки Энкодер используют пины прерываний, чтобы ускорить отклик + чтобы получать показания независимо от других сенсоров. А насчёт подтяжки к питанию - не знаю, у меня таких проблем нет. Энкодер подключен напрямую (схема в сообщении 37).
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,261
1,300
Москва
Чаще всего библиотеки Энкодер используют пины прерываний, чтобы хоть как то работать. Очень часто программы.. хотя в данном случае лучше все же скетчи, выполняются так медленно, что ни о какой периодичности опросов пинов энкодера кроме как по прерыванию можно не говорить.Прерывание позволяет запустить такой говнокод. Но если код оптимизировать и добиться опроса энкодера хотя бы 10 000 раз в секунду, то уже будет работать.И я видел такие варинаты - опрос энкодера не по прерываниями, а по таймеру.
А подтяжка к земле имеет значения для антидребезга контактов. Это отдельная тема. Лучше брать плату с энкодером и не парится .
 

Oscarmeister

✩✩✩✩✩✩✩
6 Янв 2021
6
2
Не работало сцепление(в дебаге все норм), решил попробовать MMJOY, как перейти обратно, как удалить прошивку MMJOY?
-------
Все починил, час зажимал кнопку ресет и ловил момент. Остался только один момент, что делать со сцеплением. Видел скетчи сверху, не понял как это все работает, если не сложно объясните, как калибровать, как добавить кнопок.
 
Изменено:

s60team

★✩✩✩✩✩✩
Oscarmeister, как и куда у вас подключены педали, кнопки, руль?
Мы ведь не экстрасенсы, не видим что у вас там и как.

Если проще, то:
1. Загружаем прошивку GyverWheel-Simple или PCWheel-Simple
2. Подключаем всё по схеме.
Можно оставить только энкодер (пин 0 и 1), кнопка сброса (пин 2),
кнопку (доступны пины 3-12,14-16), педали (газа A0, тормоза A1, и сцепления A2).
3. Открываем управление игровыми устройствами: Win+R (Выполнить) joy.cpl
4. Открываем "Калибровка" и крутим руль, жмём педали. Готово!
5. Настраиваем в игре Оси Руля, Газа, Тормоза и т.д. под себя.
 
Изменено: