Arduino nano, сервомотор и джойстик

Завалялась у меня 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.