Робимо ще один джойстик (геймпад) на Arduino. Робимо ще один джойстик (геймпад) на Arduino Підключення джойстика та серво до ардуїно

Для плат Arduino є модулі аналогових джойстиків. Як правило, мають вісь X, Y і кнопку - вісь Z. Джойстик дозволяє більш плавно і точно відстежувати ступінь відхилення від нульової точки. А крім зручності в порівнянні з кнопками, це дозволяє реалізовувати досконаліші інтерфейси. Наприклад, при зміні будь-якого значення в меню, можна написати програму таким чином, що чим сильніше відхилена вісь джойстика, тим швидше змінюється значення змінної. Наприклад, нам необхідно змінити значення від 0 до 2000 з кроком в 1. Уявіть, скільки разів вам потрібно натискати кнопку або писати спеціальний алгоритм, скажімо при тривалості натискання більше 3 сек додавати змінювати крок на 10 або 100. А при використанні джойстика це можна реалізувати набагато простіше.

Середня ціна на подібні модулі коливається в районі 1-2 $ за модуль (з безкоштовною доставкою до Росії). Пошук модулів у магазині AliExpress

Самі модулі виглядають приблизно так:

Не лякайтеся кількістю висновків, це зроблено для універсальності та зручності підключення. Контакти Vcc та GND між усіма трьома групами контактів з'єднані. Т.о. для підключення потрібно 5 проводів: вісь X, вісь Y, кнопка Z, живлення V cc та загальний GND. Джойстики пасивні модулі і не споживають будь-яку енергію від плати Arduino. Живлення V cc необхідно тільки для резисторів, що підтягують. Бувають модулі без резисторів, що підтягують, в такому випадку, необхідно виведення підключення кнопки підтягнути до +V cc через резистор 1-10 кОм.

Схема підключення до Arduino:

У програмі працювати з джойстиком також дуже просто:

#define axis_X 0 // Вісь Х підключена до Analog 0 #define axis_Y 1 // Вісь Y підключена до Analog 1 #define axis_Z 2 // Вісь Z (кнопка джойстика) підключена до Digital 2 int value_X, value_Y, value_Z = ; // Змінні для зберігання значень осей void setup() ( pinMode(axis_Z, INPUT); // Задаємо як вхід Serial.begin(9600); ) void loop() ( value_X = analogRead(axis_X); // Зчитуємо аналогове значення осі X Serial.print("X:"); Serial.print(value_X, DEC); // Виводимо значення Serial Monitor value_Y = analogRead(axis_Y); // Зчитуємо аналогове значення осі Y Serial.print(" | Y:" );Serial.print(value_Y, DEC); // Виводимо значення в Serial Monitor value_Z = digitalRead(axis_Z); // Зчитуємо цифрове значення осі Z (кнопка) value_Z = value_Z ^ 1; // Інвертуємо значення Serial.print(" | Z: "); Serial.println(value_Z, DEC); // Виводимо значення Serial Monitor delay(250); // Затримка 250 мс )

Як видно вище, на початку ми визначаємо вхідні піни для осей (define), а потім у головному циклі зчитуємо значення з пінів і виводимо їх у Serial Monitor. І бачимо таку картину:

Як бачите, все досить просто. І насамкінець напишемо невелику програму, метою якої буде змінювати значення змінної, залежно від відхилення джойстика по осі Y від нульової точки. А при натисканні на кнопку джойстика змінна буде обнулятися.

#define axis_Y 1 // Вісь Y підключена до Analog 1 #define axis_Z 2 // Вісь Z (кнопка джойстика) підключена до Digital 2 int value, value_Y, value_Z = 0; // Змінні для зберігання значень осей void setup() ( pinMode(axis_Z, INPUT); // Задаємо як вхід Serial.begin(9600); ) void loop() ( value_Y = analogRead(axis_Y); // Зчитуємо аналогове значення осі Y if(value_Y >= 0 && value_Y< 100) value = value - 10; if(value_Y >100 && value_Y< 300) value = value - 5; if(value_Y >300 && value_Y< 520) value = value - 1; if(value_Y >535 && value_Y< 700) value = value + 1; if(value_Y >700 && value_Y< 900) value = value + 5; if(value_Y >900) value = value + 10; value_Z = digitalRead(axis_Z); // Зчитуємо цифрове значення осі Z (кнопка) if(value_Z == 0); value = 0; // Скидання значення Serial.println(value, DEC); // Виводимо значення Serial Monitor delay(500); // Затримка)

Завалялась у мене arduino nano (якісний китайський клон від RobotDyn). А тут днями так само з Китаю прийшли сервомотор та маніпулятор, а також знайшовся час, щоб трохи розібратися з цим. Отже, мета у мене була проста: з'єднати arduino nano, сервомотор та джойстик, і змусити сервомотор повертатися при повороті джойстика. У практичних цілях це можна використовувати, наприклад, для керування поворотом камери.

Як виявилося, це не так уже й складно. Схема підключення така:

1. Підключення Arduino та сервомотора:

  • коричневий (на моєму сервомоторі) провід – земля (gnd);
  • червоний провід – 5v;
  • помаранчевий провід – 8 пін.

2. Підключення Arduino та джойстика:

  • gnd – gnd;
  • 5v - 5v (я підключив до 3.3v);
  • VRX (сигнал для координат по осі X) – A1;
  • VRY (сигнал для координат по осі Y) – A0;
  • SW (режим кнопки – натиснута або відпущена) – 2 пін.

З'єднуємо всі наші дива китайського виробництва, підключаємо arduino до комп'ютера, відкриваємо Arduino IDE, заливаємо скетч, вказаний нижче. Після завантаження скетчу можна рухати маніпулятором убік, сервомотор повертатиметься.

#include //Бібліотека для роботи із сервомотором int xPin = A1; //А1 - аналоговий сигнал координат Х джойстика int yPin = A0; //А0 - аналоговий сигнал координат джойстика int buttonPin = 2; // Пін для режиму кнопки (натиснуто або відпущено) int xPosition = 0; // змінна зберігання поточної позиції джойстика по осі X int yPosition = 0; // Змінна для зберігання поточної позиції джойстика по осі Y int buttonState = 0; //поточний стан кнопки (натиснута) int servoPin = 8; // пін для сигналів із сервомотора Servo servo; // Змінна типу Servo int angle = 90; / / Стартовий кут повороту сервомотора int currentXpos = 0; //Поточна позиція X void setup() ( pinMode(xPin, INPUT); // Сигнал з xPin визначаємо як вхідний сигнал pinMode(yPin, INPUT); // Сигнал з yPin визначаємо як вхідний сигнал pinMode(buttonPin, INPUT_PULLUP); / / активуємо підтягуючий резистор на піні кнопки servo.attach(servoPin); // приєднуємо пін servo.write(angle); // Повертаємо сервомотор на 90 градусів) yPosition = analogRead(yPin); // читаємо значення yPin buttonState = digitalRead(buttonPin); повороту на 10 градусів // якщо кут менший за 0 if(angle< 0) { angle = 0; //устанавливаем значение угла 0 градусов } } //если xPosition меньше 300 if(xPosition < 300) { angle = angle+10; // увеличиваем угол поворота сервомотора на 10 градусов //если угол поворота больше 180 градусов if(angle >180) ( angle = 180; // встановлюємо значення кута в 180 градусів ) ) // якщо натиснута кнопка джойстика if (buttonState == 0) ( angle = 90; // встановлюємо кут в 90 градусів ) servo.write (angle); // Повертаємо сервомотор на потрібний кут delay (50); // додаємо затримку між зчитуванням даних)

При підключенні джойстика до живлення 3.3V значення за промовчанням для X і Y позицій було 330 (при підключенні до 5V значення можуть бути інші), для перевірки значень поточних показань і я взяв відхилення від початкового значення 30 одиниць.

Відстежити значення аналогових сигналів можна з допомогою монітора серійного порту (відкрити можна так: інструменти -> монітор порту чи CTRL + SHIFT + M). Для цього у функції setup()необхідно написати наступне:

Serial.begin(9600); // ініціалізація обміну даними по серійному протоколу зі швидкістю 9600 bps

У функції loop()написати таке:

Serial.print("X:"); Serial.print(xPosition); Serial.print(" | Y: "); Serial.print(yPosition); Serial.print(" | Button: "); Serial.println(buttonState);

Ось відео того, що вийшло:

Отже, у цій статті розглянуто процес підключення сервомотора та джойстика до Arduino Nano, наведено приклад скетчу. Надалі я планую підключити другий сервомотор, щоб повністю використовувати можливості джойстика і здійснювати поворот по осях X і Y.

Нові статті


Проста реалізація текстового поля з підказками (аналогічно пошуку у Яндекс і Google) при введенні тексту мовою C# WPF. Реалізація користувача управління в C#/

Нові статті

● Проект 18: Обробляємо дані від джойстика. Управління Pan/Tilt Bracket за допомогою джойстика

У цьому експерименті ми розглянемо підключення до Arduino двоосьового аналогового джойстика.

Необхідні компоненти:

Для керування будь-яким пристроєм на основі Arduino, що переміщається у двовимірній системі координат, відмінно підійде джойстик. Для плат Arduino існують модулі аналогового джойстика, мають вісь X, Y (потенціометри 10 кОм) і додаткову кнопку - вісь Z. Джойстик дозволяє плавно і точно відстежувати ступінь відхилення від нульової точки. Сам джойстик пружний, тому він повертатиметься в центральний стан після його відпускання з певної позиції.
Контакти Vcc та GND між усіма трьома групами контактів з'єднані. Таким чином, для підключення потрібно 5 проводів: вісь X, вісь Y, кнопка Z, живлення Vcc та загальний GND. Джойстики - пасивні модулі і споживають будь-яку енергію від плати Arduino. Висновки VERT та HORZ підключаються до аналогових входів A0 та A1 Arduino, SEL – до цифрового входу D2. Схема підключення показано на рис. 18.1.

Мал. 18.1. Схема підключення плати джойстика Arduino

Напишемо скетч зчитування даних джойстика та виведення значень у монітор послідовного порту Arduino IDE. Вміст скетчу показано у лістингу 18.1.

Const int axisX=A0 // вісь Х підключена до A0 const int axisY=A1 // вісь Y підключена до A1 const int axisZ=2 // вісь Z (кнопка джойстика) підключена до D2 int valX, valY, valZ = 0; void setup()(pinMode (axis_Z, INPUT_PULLUP); // конфігуруємо D2 як INPUT із включенням // Підтягує резистора всередині процесора Serial.begin(9600); ) void loop ()( valX = analogRead(axisX); // значення осі Х valY = analogRead(axisY); // значення осі Y valZ = 1 -digitalRead(axisZ); // Значення осі Z (кнопка) // виводимо значення монітор Serial.print("X:");Serial.print(valX, DEC); Serial.print(" | Y:" );Serial.print(valY, DEC) Serial.print(" | Z: " );Serial.println(valZ, DEC); delay(500); // Пауза перед наступним зчитуванням даних }
Порядок підключення:

1. Підключаємо джойстик до плати Arduino за схемою на рис. 18.2.
2. Завантажуємо до плати Arduino скетч з лістингу 18.1.
3. Дивимося в моніторі послідовного порту Arduino IDE виведення значень зміщення по осях X та Y та стан кнопки (вісь Z).

Мал. 18.2. Схема підключення плати джойстика та Pan/Title Bracket до Arduino


Створимо більш зрозумілий приклад використання джойстика для керування положенням кронштейна Pan/Titl Bracket з двома сервоприводами, на якому можна розмістити, наприклад, камеру і змінювати положення камери вліво/вправо та вниз/вгору за допомогою джойстика. Схема сполук даного експерименту показано на рис. 18.2.
Переміщенням джойстика по осі X ми керуватимемо поворотом нижнього сервоприводу (вліво/вправо), переміщенням джойстика по осі Y керуватимемо поворотом верхнього сервопривода (вгору/вниз). Середнє нейтральне положення джойтика кожної осі (при аналоговому значенні 512) відповідає куту повороту сервоприводу на кут 90°. Вміст скетчу показано у лістингу 18.2.

#include // Підключення бібліотеки Servo Servo servo1, servo2; const int pinServo1 = 8; // Пін для підключення 1 сервоприводу const int pinServo2 = 9; // Пін для підключення 2 сервоприводи // Змінні для зберігання кутів повороту сервоприводів int angleServo1,angleServo2 = 0; const int axis X = A0; // вісь Х підключена до A0 const int axisY=A1; // вісь Y підключена до A1 int valX, valY = 0; // Змінні для зберігання значень осей void setup(){ // підключити змінну servo1 до висновку pinServo1 servo1.attach(pinServo1); // підключити змінну servo2 до висновку pinServo2 Servo2.attach(pinServo2); ) void loop ()( valX = analogRead(axisX); // значення осі Х valY = analogRead(axisY); // значення осі Y // масштабуємо значення інтервалу 0-180 angleServo1=map (valX,0,1023,0,180); angleServo2=map (valY,0 ,1023 ,0 ,180 ); // Поворот сервоприводів на отриманий кут servo1.write(angleServo1); servo2.write(angleServo2); delay(15); // Пауза для очікування повороту сервоприводів }
Порядок підключення:

1. Збираємо Pan/Title Bracket та сервоприводи.
2. Підключаємо джойстик та Pan/Title Bracket до плати Arduino за схемою на рис. 18.2.
3. Завантажуємо в плату Arduino скетч із лістингу 18.2.
4. Керуємо положенням Pan/Title Bracket переміщенням джойстика по осях X та Y.

Лістинги програм

У проекті реалізовано управління двома серводвигунами з використанням джойстика та Arduino.

Управління джойстиком дуже зручне та інтуїтивно зрозуміле. Особливо для подібних проектів із двома ступенями свободи. Більш детально з особливостями налаштування та керуванням джойстиком ви можете у відповідній статті на сайт.

Необхідні матеріали

  • Плата Arduino (у разі використовується Arduino Uno Rev 3).
  • 2 серви Parallax.
  • Джойстик – теж від Parallax.
  • Невелика монтажна плата.
  • Конектори для підключення.
  • Щось для відстеження переміщень серводвигунів (наприклад, тут використовуються поламана веб-камера та кубики від лего. Детально у статті ці вузли не розглядаються, але на фото видно).

Проект у зібраному вигляді показаний на малюнку нижче:

Підключаємо серводвигуни

Почнемо з підключення двох серводвигунів (для попереднього макета використовується монтажна плата. Згодом можна створити окремий шилд).

На малюнку нижче представлена ​​вичерпна інформація про підключення.


Червоний кабель двигунів (живлення) - до піну 5V на Arduino

Чорний кабель двигунів (земля) – до піна GND на Arduino

Жовтий кабель від двигуна Right & Left (на деяких моделях він білого кольору) – до піну 11.

Жовтий кабель від двигуна Up & Down (на деяких моделях він білого кольору) – до піну 4.

Не забувайте, що конектори сигналу керування на сервоприводах повинні підключатися до ШИМ виходів Arduino.

Підключаємо джойстик

Представлена ​​на малюнку нижче схема підключення може вас трохи збентежити. Але повірте, все не так складно, як здається на перший погляд. Знову ж таки для підключення використовуємо монтажну плату.


1. На модулі джойстика один вихід U/R+ та один L/R+. Це виходи для підключення живлення. Ці виходи підключаються до піна 5V Arduino.

2. Також є два роз'єми L/R і два роз'єми U/D. Вони підключаються до аналогових входів А3 та А4.

3. Земля на джойстику підключається до землі Arduino.

Не забудьте перевірити ще раз підключення. Пам'ятайте, що більшість помилок у проектах виникає саме через неправильне підключення. Особливо якщо ви використовуєте монтажну плату, яка обростає купою конекторів.

Скетч для Arduino

Основні пояснення до скетчу наведено у коментарях. Наведений нижче код достатньо скопіювати та вставити в Arduino IDE. Після завантаження скетчу на плату, сервопривод не повинен рухатися, поки ви не використовуєте джойстик.

#include <Servo.h>

const int servo1 = 3; // перша серва

const int servo2 = 10; // друга серва

const int joyH = 3; // вихід L/R джойстика Parallax

const int joyV = 4; // вихід U/D джойстика Parallax

int servoVal; // Змінна для зберігання даних з аналогового піна

Servo myservo1; // створюємо об'єкт Servo для управління першою сервою

Servo myservo2; // створюємо об'єкт Servo для керування другою сервою

myservo1.attach(servo1); // підключаємо серву

myservo2.attach(servo2); // підключаємо серву

// Ініціалізація серійного протоколу зв'язку

Serial.begin(9600);

// Відображаємо значення з джойстика з використанням серійного монітора

outputJoystick();

// зчитуємо значення з джойстика по горизонталі (значення між 0 та 1023)

servoVal = analogRead(joyH);

servoVal = map(servoVal, 0, 1023, 0, 180); // масштабуємо отримане значення для використання із серводвигуном (результат повертається в діапазоні від 0 до 180)

myservo2.write(servoVal); // виводимо ротор серви у положення відповідно до отриманого масштабованого значення

// зчитуємо значення джойстика вздовж вертикальної осі (значення від 0 до 1023)

servoVal = analogRead(joyV);

servoVal = map(servoVal, 0, 1023, 70, 180); //масштабуємо отримане значення для використання з сервою (діапазон: від 70 до 180)

myservo1.write(servoVal); // виводимо ротор другої серви відповідно до отриманого масштабованого значення

delay(15); // чекаємо, доки серва забезпечить задане положення

* відображаємо значення джойстика

void outputJoystick()(

Serial.print(analogRead(joyH));

Serial.print ("---");

Serial.print(analogRead(joyV));

Serial.println ("----------------");

Результат представлений на відео нижче:

Можливі проблеми та їх вирішення

1. Серви не рухаються.

Перевірте підключення. Не забувайте, що для підключення серв використовуються ШИМ виходи, а для джойстика – аналогові.

2. Після завантаження скетчу на Arduino, серви починають вібрувати.

Швидше за все, неправильно підключені піни U/D+ L/R+. Дуже уважно перевірте підключення. Перед перевіркою контактів та підключення обов'язково відключіть Arduino від персонального комп'ютера, щоб випадково не спалити приводу або плату.

3. Я уважно перевірив підключення, але серводвигуни все одно не рухаються.

Вимкніть джойстик і спробуйте підключити його знову. При цьому джойстик краще зняти з монтажної плати. Під час повторного встановлення притисніть його з деяким зусиллям до монтажної плати. Конектори від джойстика повинні добре сісти на макетку.

Залишайте Ваші коментарі, питання та поділіться особистим досвідом нижче. У дискусії часто народжуються нові ідеї та проекти!


Процес складання саморобки:

Крок перший. Підключаємо серводвигуни
Процес збирання саморобки починається з підключення серводвигунів. Для того, щоб зібрати попередній макет, застосовується монтажна плата. Потім можна буде зробити окремий шилд. На малюнку можна побачити, як саме все підключається.


Червоний кабель – це живлення, він підключається до піна 5V на контролері Arduino.
Чорний провід – це мінус (земля), він підключається до виходу на Arduino під назвою GND.
Жовтий кабель від серводвигуна Right & Left потрібно підключити до піна 11. На деяких моделях він може бути білого кольору.
Аналогічний жовтий кабель Up&Down потрібно підключити до піна 4. Він також на деяких моделях двигунів може бути білого кольору.
Важливо пам'ятати, що конектори сигналу, якими відбувається керування двигуном, виходять із ШІМ виходів.

Крок другий. Підключаємо джойстик

Як підключається джойстик, можна побачити на зображенні. Спершу схема може здатися досить складною, але насправді нічого складного тут немає. Як і у випадку з двигунами для підключення, тут використовується монтажна плата.


1. На модулі джойстика можна знайти виходи U/R+ та L/R+. Через ці виходи відбувається підключення живлення. Відповідно, сюди потрібно подати напругу +5V від відповідного піна на Arduino.

2. Ще на джойстику присутні два роз'єми під назвою L/R і два роз'єми U/D. Їх потрібно підключити до аналогових виходів А3 та А4.

3. Ну і в ув'язненні землю на джойстику потрібно з'єднати із землею на Arduino.

Після складання підключення потрібно перевіряти ще раз. Саме через помилки підключення в більшості випадків виникають проблеми. Особливо це стосується випадків, коли використовується монтажна плата і на ній є багато підключень.

Крок третій. Скетч для Arduino
Код дуже простий і в ньому є докладні коментарі. Наведений код потрібно просто скопіювати в Arduino IDE. Після того, як код буде завантажений, двигуни не повинні рухатися. Вони повинні починати рухатись лише при натисканні кнопки на джойстику.


Проблеми, які можуть виникнути та способи їх вирішення
1. Якщо двигуни не вмикаються, потрібно перевірити ще раз підключення. Для підключення двигунів використовуються виходи типу ШІМ, а для підключення джойстиків використовуються аналогові виходи.

2. Буває таке, що відразу після завантаження коду двигуни починають вібрувати. Таке буває, якщо неправильно підключити піни U/D+ L/R+. Підключення потрібно ретельно перевірити. Щоб не спалити плату під час перевірки, потрібно обов'язково відключити від комп'ютера.

3. Якщо все перевірено ще раз, але двигуни все одно не хочуть працювати, можна спробувати перепідключити джойстик. Його потрібно зняти з монтажної плати, а потім встановити назад із деяким зусиллям. Конектори джойстика повинні добре увійти до макетки.

Якщо все вийшло, тепер можна приступати до створення будь-яких саморобок з керуванням через джойстик. Наприклад, можна зробити робота, яким можна буде керувати за допомогою джойстика, та багато іншого.