6-контактный джойстик подключение

alex-sm
Offline
Зарегистрирован: 17.08.2016

Доброго времени суток.
Приобрёл 6-канальный микро-джойстик для печатной платы, данный джойстик поддерживает 5 направлений (верх, них, право, лево, нажатие). Собственно вопрос, как его подключить и как считывать положение и нажатие ?

alex-sm
Offline
Зарегистрирован: 17.08.2016

С двух сторон джойстик имеет по 3 контакта

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мультиметр имеется? Прозвоните ноги джойстика в разных положениях и будете знать. Если нет мультиметра, прозвоните "батарейкой с лампочкой". Но мультиметр лучше. Наверняка у джойстика есть промежуточные положения, там лучше сопротивление мерять.

__Alexander
Offline
Зарегистрирован: 24.10.2012

нема там промежуточных. четыре контакта направление, один кнопка и один масса для всех.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, тогда и батарейки с лампочкой хватит.

alex-sm
Offline
Зарегистрирован: 17.08.2016

Проверил джойстик вольтметром с пищалкой, действительно - пять контактов это контакты положения, а шестой - земля. При изменении положения джойстика, земля и один их контактов замыкаются. Переключение джойстика происходит по диагонали (красные стрелки на рисунке). 

Как теперь подключить этот джойстик к ардуине ? Если я не ошибаюсь, к обычной кнопке подводится 5 В, которые выдают высокий уровень на цифровом пине при нажатии, но в эом джойстике нет вывода для питания.

alex-sm
Offline
Зарегистрирован: 17.08.2016

Нашел в интернете схему с резисторами, но мне бы что нибудь без них, готов задействовать любое количество выводов микросхемы

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alex-sm пишет:

Как теперь подключить этот джойстик к ардуине ? 

Ну, Вы же сами написали ...

alex-sm пишет:

пять контактов это контакты положения, а шестой - земля. 

Если для Вас резисторы более ценный товар, чем пины, так нет ничего проще.

Выделяете пять пинов. Ставите им режим

pinMode(<pin>, INPUT_PULLUP);

и к этим пинам подключаете пиновые выводы джойстика.

Землю джойстика - на землю ардуины.

Когда направление не нажато - на пине HIGH, когда нажато - LOW.

Вот и всё.

 

alex-sm
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Выделяете пять пинов. Ставите им режим

pinMode(<pin>, INPUT_PULLUP);

и к этим пинам подключаете пиновые выводы джойстика.

Землю джойстика - на землю ардуины.

Когда направление не нажато - на пине HIGH, когда нажато - LOW.

Вот и всё.

Попробовал просто подключить 5-й пин к земле и один пин положения к цифровому входу. Скетч такой:

void setup() {
  Serial.begin(9600);
  pinMode(8, INPUT);
}

void loop() {
  if(digitalRead(8) == 1) {
    Serial.println("HIGH");
  }
  else if(digitalRead(8) == 0) {
    Serial.println("LOW");
  }
  delay(500);
}

Выдает HIGH или LOW в случайном порядке вне зависимсти от нажатия

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
const byte colsPins = 5;
const byte joyPins[colsPins] = {2, 3, 4, 5, 6}; // к этим пинам подключаются выводы 1-4,6 джойстика. Вывод №5 подключается к GND


void setup()
{
  Serial.begin(9600);
  for (byte i = 0; i < colsPins; i++) pinMode(joyPins[i], INPUT_PULLUP); // задаем подтяжку к внутренним резисторам.
  pinMode(LED_BUILTIN, OUTPUT);         // активируем светодиод на 13-м пине
}


void loop()
{
  byte keycode = joystick();            // сканируем джойстик и присваиваем переменной номер вектора направления. Если равно 0, то джойстик в центральном положении.
  digitalWrite(LED_BUILTIN, keycode);   // если джойстик не в центральном положении, включаем светодиод
  if (keycode) Serial.println(keycode); // выводим вектор направления
  delay(200);
}


byte joystick()
{
  byte state;
  for (byte i = 0; i < colsPins; i++) // поочередно смотрим состояния всех пинов из массива
  {
    state = !digitalRead(joyPins[i]);
    if (state > 0) return state;
  }
  return 0;
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alex-sm пишет:

Выдает HIGH или LOW в случайном порядке вне зависимсти от нажатия

Так и должно быть.

Сравните свою строку 3 с той, что я Вам написал. Исправьте ошибку и всё заработает нормально.

alex-sm
Offline
Зарегистрирован: 17.08.2016

Действительно, надо было программно задать подтяжку цифрового пина. Теперь все работает, спасибо! 

void setup() {
  Serial.begin(9600);
  pinMode(8, INPUT_PULLUP);
}

void loop() {
  if(digitalRead(8) == 1) {
    Serial.println("HIGH");
  }
  else if(digitalRead(8) == 0) {
    Serial.println("LOW");
  }
  delay(500);
}