A
ARDUINO LABGUIDE

Выставка · проект 3

Двухосевая «голова» на джойстике

Модуль KY-023 (стики X/Y и кнопка) крутит два серво: поворот (pan) на MG90S и наклон (tilt) на SG90. В коде — map в углы и мёртвая зона, чтобы серво не дрожали в центре.

старт 2× серво джойстик ~2–3 часа + печать

Оглавление

1. Цель

Гость двигает стик — «голова» смотрит в ту же сторону. Нажал кнопку джойстика — углы возвращаются в центр (90°). Без мёртвой зоны серво обычно дрожат: стик редко даёт ровно 512.

Критерий готовности: оба серво плавно следуют за стиком; в центре стика (±DEADZONE) нет дрожания; кнопка SW возвращает pan/tilt в 90°.

2. Подготовка

Программы

Инструменты

Компоненты

ЧтоКаталогСколько
Arduino Unoarduino-uno-r31
Джойстик KY-023joystick-ky0231
Серво SG90 (наклон)servo-sg901
Серво MG90S (поворот)servo-mg90s1
Макетка, проводаbreadboard-mb102, jumper-mf, jumper-mm—
Джойстик KY-023 SG90

3. Распиновка (Uno → модуль)

Пин UnoКудаПояснение
5 VVCC джойстика, красные обоих серво+5 V
GNDGND джойстика и обоих сервоОбщий минус
A0VRX (ось X)analogRead 0…1023
A1VRY (ось Y)
D2SW (кнопка стика)INPUT_PULLUP: нажатие = LOW
D9сигнал pan (MG90S)Поворот основания
D10сигнал tilt (SG90)Наклон «головы»
На модуле KY-023 подписи бывают +5V, GND, VRx, VRy, SW. Если оси «перепутаны» в пространстве — поменяйте A0/A1 местами или инвертируйте map в коде.
Два серво с одного USB — на грани. Если Uno перезагружается при резком движении — остановитесь и согласуйте отдельные 5 V + общий GND.

4. Сборка по шагам

Шаг 4.1

Джойстик на макетке

Поставьте модуль так, чтобы стик был удобен гостю. Подключите 5 V, GND, VRX→A0, VRY→A1, SW→D2.

✓ В Serial (после заливки) в покое X и Y около 500…520
Шаг 4.2

Два серво

Pan на D9, tilt на D10. Пока без тяжёлой камеры/телефона — только рама или рожки.

✓ Питание и сигнал не перепутаны (красный не на сигнал)
Шаг 4.3

Verify → Upload по согласию

Скомпилируйте скетч. Заливка — только после явного согласия. Крутите стик медленно.

✓ Pan и tilt едут; в центре тишина без дрожи; SW → центр
Шаг 4.4

Подстройка мёртвой зоны

Если в центре всё же дрожит — увеличьте DEADZONE с 40 до 60–80. Если «тупой» стик — уменьшите.

✓ Центр спокойный, края сектора достижимы

5. Скетч (полный рабочий)

analogRead → при выходе за мёртвую зону → map в 0…180. Кнопка SW сбрасывает углы.

#include <Servo.h>

const int PIN_VRX = A0;
const int PIN_VRY = A1;
const int PIN_SW  = 2;
const int PIN_PAN  = 9;
const int PIN_TILT = 10;

const int DEADZONE = 40;   // вокруг центра 512
const int ANGLE_MIN = 10;
const int ANGLE_MAX = 170;

Servo pan;
Servo tilt;
int panAngle = 90;
int tiltAngle = 90;

int axisToAngle(int raw, int current) {
  int centered = raw - 512;
  if (abs(centered) < DEADZONE) return current; // не трогаем — нет дрожи
  // map: влево/вниз → меньше угол, вправо/вверх → больше
  return constrain(map(raw, 0, 1023, ANGLE_MIN, ANGLE_MAX), ANGLE_MIN, ANGLE_MAX);
}

void setup() {
  pinMode(PIN_SW, INPUT_PULLUP);
  pan.attach(PIN_PAN);
  tilt.attach(PIN_TILT);
  pan.write(panAngle);
  tilt.write(tiltAngle);
  Serial.begin(115200);
}

void loop() {
  int x = analogRead(PIN_VRX);
  int y = analogRead(PIN_VRY);

  if (digitalRead(PIN_SW) == LOW) {
    panAngle = 90;
    tiltAngle = 90;
    delay(200); // простая защита от дребезга
  } else {
    panAngle  = axisToAngle(x, panAngle);
    tiltAngle = axisToAngle(y, tiltAngle);
  }

  pan.write(panAngle);
  tilt.write(tiltAngle);

  Serial.print("x=");
  Serial.print(x);
  Serial.print(" y=");
  Serial.print(y);
  Serial.print(" pan=");
  Serial.print(panAngle);
  Serial.print(" tilt=");
  Serial.println(tiltAngle);

  delay(20);
}

6. Печать на Bambu Lab P2S

Общий курс «с нуля» (Studio, отправка, качество): setup-bambu-p2s.html. Ниже — только детали ЭТОГО проекта.
Печатайте корпус после того, как схема на макетке уже работает.
Шаг 6.1

Какие детали печатаем

  • Основание под MG90S (горизонтальный поворот — pan).
  • Вилка / качалка под SG90 (наклон — tilt).
  • Площадка под табличку талисмана или очень лёгкий гаджет (не смартфон «кирпич»).
Шаг 6.2

Модель: скачать или нарисовать простое

Путь A. Ищите: pan tilt SG90, dual servo gimbal, camera pan tilt mount, MG90S bracket.

Путь C (Tinkercad). Плита-основание с отверстиями под винты MG90S; U-образная вилка с отверстиями под SG90. Отверстия под винты серво — с запасом +0,3…0,5 mm, иначе PLA «закусывает».

Шаг 6.3

Проект в Bambu Studio

Импорт STL → детали плашмя → PLA, 0.2 mm, заполнение 15–20% (для рамы ок 20%). Отправка — setup-bambu-p2s.html.

Шаг 6.4

Проверка качества

  • Винты серво входят в отверстия без сверления «с боем»
  • Вилка tilt не трещит при лёгком сгибе руками
  • Нет больших наплывов на посадочных плоскостях
Шаг 6.5

Примерка без клея

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

✓ Оба серво закреплены; кабели не натягиваются на крайних углах

7. Скрипт демо

  1. «Это двухосевая голова: как шея — влево-вправо и вверх-вниз.»
  2. «Джойстик даёт два числа 0…1023. Программа переводит их в углы серво.»
  3. «Мёртвая зона в центре — чтобы рука не дрожала и серво не жужжали зря.»
  4. «Нажмите стик — взгляд в центр. Дальше научим платформу крутиться сама — шаговиком.»

8. Неисправности

СимптомЧто проверить
Дрожит в центреУвеличить DEADZONE; плохой контакт VRx/VRy
Оси наоборотПоменять A0/A1 или инвертировать map
Кнопка не центрируетSW на D2, INPUT_PULLUP; на модуле SW замыкает на GND
Один серво мёртвСигнальный провод, attach на верный пин
Сброс UnoТок двух серво — отдельное 5 V + общий GND

9. Безопасность

10. Что дальше

Следующий уровень механики: Поворотный стенд на шаговике (отдельное питание мотора!).

← К списку проектов