Как подключить джойстик к arduino

Оглавление

Sketch code

#define step_pin 9 // Pin 9 connected to Steps pin on EasyDriver#define dir_pin 8 // Pin 8 connected to Direction pin#define MS1 10 // Pin 10 connected to MS1 pin#define MS2 11 // Pin 11 connected to MS2 pin#define SLEEP 12 // Pin 12 connected to SLEEP pin

#define X_pin A0 // Pin A0 connected to joystick x axis#define Joy_switch 4 // Pin 4 connected to joystick switch

#define Limit01 2 // Pin 2 connected to Limit switch out#define Limit02 3 // Pin 3 connected to Limit switch out

int step_speed = 10; // Speed of Stepper motor (higher = slower)

void setup() pinMode(MS1, OUTPUT); pinMode(MS2, OUTPUT); pinMode(dir_pin, OUTPUT); pinMode(step_pin, OUTPUT); pinMode(SLEEP, OUTPUT);

pinMode(Limit01, INPUT); pinMode(Limit01, INPUT);

digitalWrite(SLEEP, HIGH); // Wake up EasyDriver delay(5); // Wait for EasyDriver wake up

/* Configure type of Steps on EasyDriver:// MS1 MS2//// LOW LOW = Full Step //// HIGH LOW = Half Step //// LOW HIGH = A quarter of Step //// HIGH HIGH = An eighth of Step //*/

digitalWrite(MS1, LOW); // Configures to Full Steps digitalWrite(MS2, LOW); // Configures to Full Steps>

void loop() if (!digitalRead(Joy_switch)) delay(500); // delay for deboucing switch (step_speed) case 1: step_speed=10; // slow speed break; case 3: step_speed=1; // fast speed break; case 10: step_speed=3; // medium speed break; > >

if (analogRead(X_pin) > 712) if (!digitalRead(Limit01)) // check if limit switch is activated

digitalWrite(dir_pin, LOW); // (HIGH = anti-clockwise / LOW = clockwise) digitalWrite(step_pin, HIGH); delay(step_speed); digitalWrite(step_pin, LOW); delay(step_speed); > >

if (analogRead(X_pin) Скопируйте код и вставьте в Arduino IDE

Как подключить кнопки на руле к нештатной магнитоле

Практически все современные машины выпускаются со штатной музыкальной установкой.

Но что если захотелось поменять автомагнитолу? Установить более мощную и совершенную систему? В этом случае кнопки на руле работать не будут. Есть два варианта решения проблемы.

Управлять системой в обычном режиме или провести лёгкий тюнинг. Выбираете второй вариант — статья именно для вас. Мы расскажем о том, как подключить кнопки на руле к магнитоле.

Кнопки управления можно подключить даже к нештатной магнитоле

Особенности рулевого управления

При установке новой музыкальной системы подавать сигналы на неё при помощи руля будет невозможно. Это происходит потому, что нештатный прибор не воспринимает сигналы управления. Для решения проблемы необходимо установить специальный контроллер-преобразователь входящего сигнала.

Виды контроллеров:

резисторные (работают по принципу замера сопротивления. Подходят для большинства современных авто);
CAN-модуль (работают по принципу преобразования цифрового сигнала. Используются преимущественно на европейских машинах).

Выбор типа контроллера зависит от марки вашего авто

Прежде чем начать подключение новой системы, изучите особенности авто и точно определите, какой контроллер нужен.

Лучше обратиться в сервисный центр. Но если лишних денег нет или просто хочется испытать собственные силы, попробуйте подключиться самостоятельно. Детально остановимся на порядке выполнения операции.

Скидки на новые автомобили!Выгодный кредит от 9.9% Рассрочка 0%

Независимо от того, какой тип контроллера выбрали — принцип подключения у всех устройств примерно одинаковый. Для того чтобы всё работало, нужно подсоединить четыре провода (на некоторых моделях — только три).

Цифровая маркировка не меняется, поэтому ориентируйтесь прежде всего на этот показатель.

Порядок подключения:

  • разбираем панель, извлекаем устройство;
  • от главной колодки рулевого управления выбираем четыре провода указанной выше маркировки;
  • кабель красного цвета («АСС», подающий питание на адаптер при повороте ключа зажигания) подключаем к проводу «7» колодки;
  • кабель чёрного цвета («Масса») подключаем к проводу «15»;
  • кабель синего цвета (сигнальный провод кнопок руля) подсоединяем к проводу «6»;
  • кабель зелёного цвета («Вход 2») подключаем к проводу «16». Этот пункт актуален для автомобилей марок Ниссан (Nissan) и Тойота (Toyota);
  • программируем рулевое управление.

Общие принципы работы джойстика

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

Джойстик имеет две оси – горизонтальную и вертикальную. Каждая ось джойстика имеет потенциометр или набор переменных резисторов. Средние точки осей обозначаются как Rx и Ry. Эти контакты являются выходными для джойстика. Когда рукоятка джойстика движется вдоль горизонтальной оси (когда на джойстик подано питающее напряжение) напряжение на контакте Rx изменяется.

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

Таким образом, мы имеем четыре направления джойстика для двух каналов аналого-цифрового преобразования (АЦП) микроконтроллера. При нормальных условиях мы будем иметь 1В на каждом контакте. Когда рукоятка джойстика движется напряжение на каждом контакте становится больше или меньше в зависимости от направления движения рукоятки. Получаем изменение напряжения от 0 до 5В на канале 0 (ось x) и от 0 до 5В на канале 1 (ось y).

Мы будем использовать два АЦП канала микроконтроллера ATmega8 (канал 0 и канал 1) чтобы обрабатывать движения рукоятки джойстика.

Игра на Ардуино с джойстиками и моторами

Для этого проекта нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • 2 мотора с редукторами;
  • мотор шилд LD239;
  • 2 джойстика KY-023;
  • УЗ датчик расстояния;
  • светодиоды и резисторы;
  • фанера или другой листовой материал;
  • столярный клей, провода, изолента, паяльник и т.д.

Схема сборки электрической схемы для проекта

Используйте провода достаточной длины для подключения джойстиков к плате. Для крепления передней крышки корпуса можно использовать магниты, чтобы легко снять крышку при необходимости. Внутри корпуса находится наклонная поверхность, по которой шарик скатывается в одну сторону. Для регистрации наличия шарика в корпусе устанавливается датчик HC-SR04 — УЗ сенсор расстояния Ардуино.

Скетч для игры с джойстиками и моторами

#include "AFMotor.h"        // библиотека для мотор шилда
AF_DCMotor motor1(3);  // подключаем 1 мотор к клеммнику M3
AF_DCMotor motor2(4);  // подключаем 2 мотор к клеммнику M4

#include <Ultrasonic.h>            // библиотека для уз сенсора
Ultrasonic ultrasonic(A3, A4);  // пины trig и echo

void setup() {
   pinMode(A1, INPUT);      // пины для джойстиков
   pinMode(A2, INPUT);
   pinMode(A0, OUTPUT);  // пины для светодиодов
   pinMode(A5, OUTPUT);

   Serial.begin(9600);

   motor1.setSpeed(250); // задаем макс. скорость моторам
   motor2.setSpeed(250);
   motor1.run(RELEASE);   // останавливаем моторы
   motor2.run(RELEASE);
}

void loop() {
   // получаем информацию с джойстиков
   int d1 = analogRead(A1);
   int d2 = analogRead(A2);
   // выводим информацию на монитор
   Serial.print(d1);
   Serial.print(" - ");
   Serial.println(d2);
  
   if (d1 > 800) {
      motor1.run(FORWARD);  // задаем направление
      motor1.setSpeed(250);   // задаем скорость
   }
   if (d1 run(BACKWARD);  // задаем направление
      motor1.setSpeed(250);      // задаем скорость
   }
   if (d1 > 200 && d1 run(RELEASE); }  // останавливаем мотор

   if (d2 > 800) {
      motor2.run(FORWARD);  // задаем направление
      motor1.setSpeed(250);   // задаем скорость
   }
   if (d2 run(BACKWARD);  // задаем направление
      motor2.setSpeed(250);     // задаем скорость
   }
   if (d2 > 200 && d2 run(RELEASE); }  // останавливаем мотор

   // узнаем информацию с уз датчика
   int cm = ultrasonic.Ranging(CM);
   Serial.println(cm);

   // включаем/выключаем светодиоды
   if (cm digitalWrite(A0, HIGH); digitalWrite(A5, LOW); }
   if (cm > 5) { digitalWrite(A0, LOW); digitalWrite(A5, HIGH); }
}

Пояснения к коду:

  1. скорость вращения моторов можно поменять, уменьшив значение ;
  2. светодиоды с подсветкой подключены к аналоговым портам с АЦП — A0 и A5, которые работают в режиме OUTPUT.

Этапы сборки настольной игры на Ардуино

1. соберите электрическую схему игры, как на картинке выше;

Для подключения УЗ датчика, джойстиков и светодиодов через Motor Shield придется припаивать провода или коннекторы к аналоговым портам A0-A5 платы расширения.

2. загрузите в микроконтроллер скетч, размещенный ниже;

Так как цифровые пины используются для управления шилдом, УЗ датчик и светодиоды подключены к аналоговым пинам, которые используются, как цифровые.

Сборка электрической схемы настольной игры Ардуино

3. протестируйте правильную работу джойстиков и моторов;

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

5. закрепите моторы и редукторы на внутренней стороне крышки;

Здесь вам потребуется термоклей для крепления моторов на крышке. Для быстрого крепления самой крышки на корпусе можно использовать магниты.

6. надежно закрепите нитки на шкиве и подъемнике.

Используйте супер клей или момент для крепления ниток. Шкивы можно распечатать на 3D принтере или использовать подручные материалы.

Установка шкивов с нитками на моторы с редукторами

Заключение. Данный проект игры на Ардуино с джойстиками имеет простой код программы, однако чтобы собрать корпус и электрическую схему потребуется немало усилий. Проект с моторами на Arduino можно повесить на стене, а для питания можно использовать обычную зарядку от телефона. Теперь остается только установить шарик от пинг-понга в подъемнике и протестировать работу игры на Ардуино.

Как отследить текущее направление джойстика?

Очень полезный кусок кода. На основании значений положений X и Y мы можем определить, находится ли джойстик по центу или он смещен в одном из восьми направлений (вверх, вправо-вверх, вправо, вправо-вниз, вниз, влево-вниз, влево, влево-вверх).

Так как значения в каждом из направлений будет в диапазоне от 0 до 1023, можно предположить, что центр будет находиться в диапазоне 511-512. Но это не совсем так. Настолько точно текущее значение мы не получим. И если мы определим неверное значение, можем получить информацию о движении джойстика, хотя он стоял по центру и не двигался.

Для этого мы введем диапазон значений и будем считать, что любое значение в этом диапазоне будет считаться центром:

|—|—|—|

0 505 515 1023

Этот диапазон не является «истиной последней инстанции». Вам надо его подстроить под ваш джойстик, так. Эти значения вводятся в код в виде констант:

const int X_THRESHOLD_LOW = 505;

const int X_THRESHOLD_HIGH = 515;

const int Y_THRESHOLD_LOW = 500;

const int Y_THRESHOLD_HIGH = 510;

Теперь мы преобразуем каждую координату из диапазона от 0 до 1023 в диапазон от -1 до 1. Для координаты Х – 1 значит перемещение влево, 0 означает отсутствие перемещения, а 1 – перемещение вправо. Для направления Y -1 означает перемещение вниз, 0 означает отсутствие перемещения, а 1 – перемещение вверх.

Мы начнем с установки значения в каждом направлении 0 («центр»). После этого мы используем выражения if/else для проверки, принимает ли значение положения в любом из направлений большее или меньшее значение чем наш диапазон:

x_direction = 0;

y_direction = 0;

x_position = analogRead(PIN_ANALOG_X);

y_position = analogRead(PIN_ANALOG_Y);

if (x_position > X_THRESHOLD_HIGH) {

x_direction = 1;

} else if (x_position

x_direction = -1;

}

if (y_position > Y_THRESHOLD_HIGH) {

y_direction = 1;

} else if (y_position

y_direction = -1;

}

В Arduino IDE есть функция map(), которую, теоретически могли бы использовать вместо if/else, но в данном случае метод усложняется из-за вопросов центрирования, так что применять здесь map мы не будем.

В примере, который представлен ниже, вы увидите, что в дальнейшем if/else используются для отображения направления – вы можете спокойно изменить этот пример под ваши задачи:

const byte PIN_ANALOG_X = 0;

const byte PIN_ANALOG_Y = 1;

const int X_THRESHOLD_LOW = 505;

const int X_THRESHOLD_HIGH = 515;

const int Y_THRESHOLD_LOW = 500;

const int Y_THRESHOLD_HIGH = 510;

int x_position;

int y_position;

int x_direction;

int y_direction;

void setup() {

Serial.begin(9600);

}

void loop () {

x_direction = 0;

y_direction = 0;

x_position = analogRead(PIN_ANALOG_X);

y_position = analogRead(PIN_ANALOG_Y);

if (x_position > X_THRESHOLD_HIGH) {

x_direction = 1;

} else if (x_position

x_direction = -1;

}

if (y_position > Y_THRESHOLD_HIGH) {

y_direction = 1;

} else if (y_position

y_direction = -1;

}

if (x_direction == -1) {

if (y_direction == -1) {

Serial.println(«left-down»);

} else if (y_direction == 0) {

Serial.println(«left»);

} else {

// y_direction == 1

Serial.println(«left-up»);

}

} else if (x_direction == 0) {

if (y_direction == -1) {

Serial.println(«down»);

} else if (y_direction == 0) {

Serial.println(«centered»);

} else {

// y_direction == 1

Serial.println(«up»);

}

} else {

// x_direction == 1

if (y_direction == -1) {

Serial.println(«right-down»);

} else if (y_direction == 0) {

Serial.println(«right»);

} else {

// y_direction == 1

Serial.println(«right-up»);

}

}

Плата расширения JoyStick shield

Для управления роботами или другими механизмами иногда требуется использовать джойстик к кнопками и средствами коммуникаций. Для того, чтобы не придумывать каждый раз новые конструкции, рекомендуется купить готовую плату расширения ардуино для джойстика, в которой все необходимые элементы будут спаяны.

Рассмотрим, что представляет собой этот шилд от известного в мире ардуино производителя Sparkfun. Данный геймпад работает исправно и стоит относительно недорого. Устройство может поставляться в немного разобранном виде, так что сначала его нужно собрать.

Шилд содержит несколько стандартных кнопок (4 обычных сбоку и кнопка выбора). В зависимости от модели, на плате могут быть добавлены разъемы для подключения модулей bluetooth или wifi. Традиционно, с помощью выходов пинов и гребенки можно подключать внешние устройства.

Работа схемы

Схема устройства приведена на следующем рисунке.

Напряжение на выходных контактах джойстика не является полностью линейным – оно зашумлено. Для фильтрации этого шума устанавливаются конденсаторы как показано на схеме.

Также на схеме мы имеем 4 светодиода. Каждый светодиод будет отображать соответствующее направление движения джойстика. Перед тем как двигаться дальше остановимся немного на принципах работы АЦП микроконтроллера ATmega8.

Аналого-цифровой преобразователь (АЦП) микроконтроллера ATmega8 может быть использован на любом из четырех каналов PORTC – мы выберем канал 0 (PIN0) PORTC.

В микроконтроллере ATmega8 АЦП имеет разрешение (разрешающую способность) 10 бит, таким образом микроконтроллер способен реализовать чувствительность равную Vref/2^10, то есть если опорное напряжение (Vref) равно 5В мы получим цифровой инкремент на выходе 5/2^10 = 5мВ. Таким образом, на каждое приращение напряжения на 5 мВ мы будем получать один дополнительный инкремент цифрового выхода АЦП.

Для обеспечения работы схемы мы должны установить значения регистров АЦП следующим образом:

  1. Сначала мы должны активировать АЦП микроконтроллера.
  2. Затем необходимо установить максимальное входное напряжение для АЦП равное 5В. Это можно сделать путем установки значения опорного напряжения АЦП равного 5В.
  3. АЦП микроконтроллера в нашей схеме будет начинать действовать при внешнем воздействии (не от действий пользователя), поэтому нам следует установить его в режим непрерывного преобразования (free running mode): в этом режиме запуск преобразований выполняется непрерывно через определенные интервалы времени.
  4. В любом АЦП частота преобразования аналогового значения в цифровое и точность цифрового выхода обратно пропорциональны. То есть для лучшей точности цифрового выхода мы должны выбрать меньшую частоту. Для этого мы должны установить коэффициент деления предделителя АЦП в максимальное значение (2). Поскольку мы используем внутреннюю частоту микроконтроллера 1 МГц, то значение частоты преобразования АЦП будет равно 1000000/2.

Четыре основных принципа работы с АЦП микроконтроллера мы рассмотрели, теперь нам нужно установить правильные значения в двух регистрах АЦП.

RED (красный, ADEN): этот бит устанавливается чтобы задействовать функции АЦП в ATmega8.

BLUE (синий, REFS1, REFS0): эти два бита используются для установки опорного напряжения (максимального входного напряжения, которое мы собираемся обрабатывать). Поскольку мы будем использовать опорное напряжение равное 5В, бит REFS0  необходимо выставить в соответствии с приведенной таблицей.

LIGHT GREEN (светло зеленый, ADATE): этот бит должен быть установлен чтобы АЦП работал непрерывно (в режиме непрерывного преобразования).

PINK (розовый, MUX0-MUX4): эти 5 бит используются чтобы задать входной канал. Поскольку мы будем использовать ADC0 (PIN0) то, как следует из ниже приведенной таблицы, нам нет необходимости устанавливать все эти биты.

BROWN (коричневый, ADPS0-ADPS2): эти три бита используются для установки коэффициент деления предделителя АЦП. Поскольку мы используем коэффициент деления предделителя 2, мы должны установить только один из этих битов.

DARK GREEN (темно-зеленый, ADSC): этот бит необходимо установить для того чтобы АЦП начал осуществлять преобразование. Далее в программе мы можем его сбросить (в 0) если нам нужно будет остановить процесс аналого-цифрового преобразования.

Джойстик Nintendo 64 (N64) в USB-порт PC-компа.

Но вернемся к первоочередной задаче. С джойстиком N64 одновременно и проще и сложнее. Результат выглядит так.

Также немного поясню:

Джойстик N64 содержит полноценный «аналоговый джойстик» (две аналоговых оси), цифровую крестовину (4-кнопки, как и на дендевом джое) и еще 10 функциональных кнопок (A, B, два шифта, Z – снизу в центре, Старт – в центре наверху, а также группу из 4-х независимых кнопок «С» расположенных тоже в виде крестовины);
Электрический интерфейс джойстика N64 весьма прост – одна линия данных (плюс питания и земля). Но протокол обмена, в отличие от джойстика Денди, весьма чувствителен к точному соблюдению таймингов. Линию данных подключаем к порту D2 (в терминологии ардуины), не забываем, что питание джойстика N64 +3.3В

Также обращу внимание, что при желании переназначить линию данных на другой порт ардуины – необходимо поменять не только номер порта в начале скетча, но и маски (следующие далее) при помощи которых происходит попеременное переключение линии то на вход, то на выход. Вместе с этим не забывает, что у разных плат Ардуино (Leonardo, UNO, Mega) – одни и теже порты, с точки зрения среды разработки (распайки ардуины), — подключены (в некоторых случаях) к разным линиям (портам) самого контроллера – что в конкретном примере требует маску, соответствующую типу контроллера

Проще говоря: приведенный скетч в части опроса состояния джойстика N64 не имеет непосредственной переносимости между платами UNO и Leonardo – при подключении джоя к порту D2 маска для уны — 0x04, для леонарды — 0x02 (см. карты портов UNO и Leonardo);
Как представить цифровую крестовину? С аппаратной точки зрения – это просто 4 кнопки (ровно как и в Денди) – «запилить» их также в виде осей как в примере выше для дендевого джойстика? – но в данном примере у нас уже есть две полноценные оси … Вариант решения я «подглядел» в реализации моего древнего беспроводного PC-джойстика Logitech RumblePad 2 – там цифровая крестовина представлена в виде датчика угла поворота («Hat switch» — в терминологии HID-профиля или «POV» — в терминологии панели управления винды). В данном примере мы описываем объект с углом поворота от 0 до 315 градусов (360 — 45), дискретностью 45 градусов – итого 8 фиксированных положений (нумерация от 0 до 7). Но в такой модели отсутствует состояние, соответствующее не нажатым кнопкам крестовины – решение придумал экспериментально: присваиваем значение выходящие за рамки установленного диапазона (например 8);
При описании HID-профиля не допускается оставлять недоопределенные биты в байтах структуры профиля (устройство не будет работать). В нашем же случае, если при описании объекта Hat switch несмотря на востребованные лишь 4 бита мы указали размер структуры в 8 бит – то для кнопок так просто не выкрутишься. У нас 10 кнопок, соответственно 6 бит остаются неиспользованными, но нам нужно их описать, при этом не создавать визуальных (логических) объектов в профиле, а также не изобретать чего либо лишнего, дабы потом не городить всяко разно для работы с этим (не по 5 же бит вместо одного отводить на кнопку, чтобы уложиться в размер кратный одновременно и 10-ти и 8-и, а потом заморачиваться с преобразованием данных при их «рассовывании» по такой структуре). Удалось все же найти вариант описания незаюзанных бит – который и был применен;
Для компиляции проекта кладем соответствующие проекту «патченые» версии библиотек (HID.cpp и USBAPI.h) в \hardware\arduino\cores\arduino\ (относительно корня среды разработки);

Происхождение

Считается, что название джойстика произошло от французского летчика начала 20 века Роберта Эсно-Пелтери . Есть также конкурирующие претензии от имени других пилотов Роберта Лорейна , Джеймса Генри Джойса и А.Э. Джорджа . Оксфордский словарь английского языка цитирует Лорейна за использование термина «джойстик» в своем дневнике в 1909 году, когда он отправился в По, чтобы научиться летать в школе Блерио . Джордж был пионером-авиатором, который вместе со своим коллегой Джоблингом построил и пилотировал биплан в Ньюкасле в Англии в 1910 году. Утверждается, что он изобрел «Джордж Стик», который стал более известен как джойстик. Колонна управления самолетами Джорджа и Джоблинга находится в коллекции Музея открытий в Ньюкасл-апон-Тайн, Англия. Джойстики присутствовали в первых самолетах, хотя их механическое происхождение неясно. Создание термина «джойстик» может быть приписано Лорейну, так как это самое раннее известное использование этого термина, хотя он определенно не изобрел устройство.

4 Управление яркостью и цветом светодиодас помощью аналогового джойстика и Arduino

Обычно джойстик используют для управления электродвигателями. Но почему бы не использовать его, например, для управления яркостью светодиода? Давайте подключим по приведённой схеме RGB светодиод (или три обычных светодиода) к цифровым портам 9, 10 и 11 Arduino, не забывая, конечно, о резисторах.

Подключение RGB светодиода и джойстика к Arduino

Будем менять яркость соответствующих цветов при изменении положения джойстика по осям, как показано на рисунке.

Из-за того, что джойстик может быть не точно отцентрирован производителем и иметь середину шкалы не на отметке 512, а варьироваться в диапазоне примерно от 490 до 525, то светодиод может слегка светиться даже когда джойстик находится в нейтральном положении. Если вы хотите, чтобы он был полностью выключен, то внесите в программу соответствующие поправки.

Диаграмма распределения яркости красного, синего и зелёного каналов светодиода в зависимости от положения ручки джойстика

Ориентируясь на приведённую диаграмму, напишем скетч управления Arduino яркостью RGB светодиода с помощью джойстика.

const int pinRed    = 9;
const int pinGreen  = 10;
const int pinBlue   = 11;
const int swPin = 8; 
const int pinX      = A1; // X 
const int pinY      = A2; // Y 
const int ledPin    = 13;
boolean ledOn = false;  // текущее состояние кнопки
boolean prevSw = false; // предыдущее состояние кнопки

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(pinRed, OUTPUT);
  pinMode(pinGreen, OUTPUT);
  pinMode(pinBlue, OUTPUT);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  pinMode(swPin, INPUT);  
  digitalWrite(swPin, HIGH); // включаем встроенный подтягивающий резистор
}

void loop() {
  if (isLedOn()) freeMode(); // если нажата кнопка и горит светодиод на пине 13, включаем режим "фонарик"
  else discoMode(); // иначе включаем "цветомузыку"
}

boolean isLedOn() { // Определяем нажатие кнопки
  if (digitalRead(swPin) == HIGH && prevSw == LOW) {
    ledOn = !ledOn;
    prevSw = HIGH;
  }
  else  prevSw = digitalRead(swPin); 
  digitalWrite(ledPin, ledOn); // включаем светодиод на пине 13
  return ledOn;
}

void freeMode() { // Режим "фонарик"
  int X = analogRead(pinX); // считываем положение джойстика
  int Y = analogRead(pinY);
  int RED = map(Y, 512, 1023, 0, 255); // маппинг значений
  int GREEN = map(X, 512, 1023, 0, 255);
  int BLUE = map(X, 511, 0, 0, 255);
  analogWrite(pinRed, RED);     // включение каналов R,G,B
  analogWrite(pinGreen, GREEN);
  analogWrite(pinBlue, BLUE);
}

void discoMode() { // Режим "цветомузыка"
    for (int i=0; i }

Сначала объявим соответствие пинов и две переменные – ledOn и prevSw – для работы с кнопкой. В процедуре setup() назначим пинам функции и подключим к пину кнопки подтягивающий резистор командой digitalWrite(swPin, HIGH).

В цикле loop() определяем нажатие кнопки джойстика. При нажатии на кнопку переключаем режимы работы между режимом «фонарика» и режимом «цветомузыки».

В режиме freeMode() управляем яркостью светодиодов с помощью наклона джойстика в разные стороны: чем сильнее наклон по оси, тем ярче светит соответствующий цвет. Причём преобразование значений берёт на себя функция map(значение, отНижнего, отВерхнего, кНижнему, кВерхнему).

Функция map() очень полезна и удобна в применении. Она переносит измеренные значения (отНижнего, отВерхнего) по осям джойстика в желаемый диапазон яркости (кНижнему, кВерхнему). Можно то же самое сделать обычными арифметическими действиями, но запись с помощью функции map() существенно короче.

В режиме discoMode() три цвета попеременно набирают яркость и гаснут. Чтобы можно было выйти из цикла при нажатии кнопки, каждую итерацию проверяем, не была ли нажата кнопка.

В результате получился фонарик из трёхцветного RGB светодиода, яркость свечения каждого цвета которого задаётся с помощью джойстика. А при нажатии на кнопку происходит включение режима «цветомузыка». Я сделал специальную печатную плату с Arduino Pro Mini и джойстиком, и у меня он используется в качестве ночника для ребёнка 🙂

Управление яркостью и цветом RGB светодиода с помощью аналогового джойстика, подключённого к Arduino

Таким образом, мы научились подключать к Arduino аналоговый двухосевой джойстик с кнопкой и считывать с него показания. Вы можете придумать и реализовать более интересное применение джойстику, чем наш пример.

Драйвер шагового двигателя Ардуино

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

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

Схема подключения шагового двигателя 28BYJ-48 к Arduino Uno через драйвер ULN2003 изображена на рисунке ниже. Основные характеристики мотора 28BYJ-48: питание от 5 или 12 Вольт, 4-х фазный двигатель, угол шага 5,625°. Порты драйвера IN1 — IN4 подключаются к любым цифровым выводам платы Arduino Mega или Nano. Светодиоды на модуле служат для индикации включения катушек двигателя.