Завалялась у меня 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 <Servo.h> //Библиотека для работы с сервомотором
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 градусов
}
void loop() {
xPosition = analogRead(xPin); // читаем значение xPin
yPosition = analogRead(yPin); // читаем значение yPin
buttonState = digitalRead(buttonPin); // читаем 'состояние' кнопки
//если значение xPosition больше 360
if(xPosition > 360) {
angle = angle-10; // уменьшаем угол поворота на 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.