29 апреля 2016 г.

Сервомотор и джойстик

Наконец-то появилась плата Arduino. Не совсем Arduino, конечно, а ее полностью совместимый аналог. Пока проверял отдельные датчики, в голову пришла мысль: "А почему бы не скрестить кенгуру и бегемота?". Цель - проверить работоспособность трех компонентов с осмысленной сборкой. Итак, проверяем работосмособность платы питания, джойстик и сервомашинку.

  1. Сервомашинку я использовал MG996R
  2. Двухосевой XY джойстик
  3. Модуль питания (шел в комплекте)

Зачем нам дополнительное питание?

Первые мои эксперименты с сервомотором заканчивались всегда одинаково - непредсказуемое поведение. То есть, с кетч содержал команду "Повернуться на 90 градусов и замереть на 2 секунды". Результат совершенно иной - сервомотор елозил туда-сюда и угол поворота был совсем не 90 градусов. Что говорить про "замереть на 2 секунды", такого вообще не было - постоянно в движении. Много раз проверял правильность сборки схемы, экспериментировал со скетчем, углами поворота и задержками - ничего ен помогало. Как вы догадались, серве просто не хватало питания (малышка недоедала). После подключения отдельного питания все встало на свои места, серва, наконец, начала слушаться.

Алгоритм работы

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

Собираем все вместе

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

Скетч


/**
 * Вращение сервомотора под управлением джойстика
 */
#include <Servo.h> 
 
Servo servo;
 
int servoPin = 9;   // Пин для сервы
int ledPin = 13;    // Пин светодиода (здесь встроеный светодиод)
int switchPin = 2;  // Пин кнопки джойстика
int xPin = A0;      // Пин для считывания по оси X
int yPin = A1;      // Пин для считывания оси Y
 
void setup() {
    // Ставим соответствующие атрибуты для пинов
    pinMode(ledPin, OUTPUT);
    pinMode(switchPin, INPUT);
    pinMode(xPin, INPUT);
    pinMode(yPin, INPUT);
 
    // подцепляем серву
    servo.attach(servoPin);
 
    // Ждем секунду
    delay(1000);
 
    // Ставим положение сервы на 90 градусов
    // т.к. джойстик по умолчанию стоит по центру
    // (вообще не обязательная команда)
    servo.write(90);
 
    // Моргнем 4 раза, сказав, что мы закончили с первоначальными настройками
    // За это время серва точно доберется до положения в 90 градусов
    for (int i = 0; i < 4; ++i) {
        digitalWrite(ledPin, HIGH);
        delay(200);
        digitalWrite(ledPin, LOW);
        delay(200);
    }
 
    Serial.begin(115200);
}
 
void loop() {
    // Считываем положение джойстика по X
    int xVal = analogRead(xPin);
 
    // Убедимся, что значение в интервале от 0 до 1023
    xVal = constrain(xVal, 0, 1023);
 
    // Выставим соответствие считанному значению и углу поворота сервы
    // Сделал небольшой люфт
    int angle = map(xVal, 0, 1023, 170, 20);
 
    // Поворачиваем серву
    servo.write(angle);
 
    // Ждем 15 милисекунд, что бы серва успела повернуться
    delay(15);
} 

Фотоотчет





Комментариев нет:

Отправить комментарий