Выставка · проект 3
Двухосевая «голова» на джойстике
Модуль KY-023 (стики X/Y и кнопка) крутит два серво: поворот (pan) на MG90S и наклон (tilt) на SG90. В коде — map в углы и мёртвая зона, чтобы серво не дрожали в центре.
Оглавление
1. Цель
Гость двигает стик — «голова» смотрит в ту же сторону. Нажал кнопку джойстика — углы возвращаются в центр (90°). Без мёртвой зоны серво обычно дрожат: стик редко даёт ровно 512.
2. Подготовка
Программы
- Подготовка Arduino IDE
- Библиотека Servo (встроена)
- Bambu Studio + setup-bambu-p2s.html — рама pan-tilt
Инструменты
- Макетка, провода MF к пинам модулей
- USB A↔B
Компоненты
| Что | Каталог | Сколько |
|---|---|---|
| Arduino Uno | arduino-uno-r3 | 1 |
| Джойстик KY-023 | joystick-ky023 | 1 |
| Серво SG90 (наклон) | servo-sg90 | 1 |
| Серво MG90S (поворот) | servo-mg90s | 1 |
| Макетка, провода | breadboard-mb102, jumper-mf, jumper-mm | — |
3. Распиновка (Uno → модуль)
| Пин Uno | Куда | Пояснение |
|---|---|---|
| 5 V | VCC джойстика, красные обоих серво | +5 V |
| GND | GND джойстика и обоих серво | Общий минус |
| A0 | VRX (ось X) | analogRead 0…1023 |
| A1 | VRY (ось Y) | |
| D2 | SW (кнопка стика) | INPUT_PULLUP: нажатие = LOW |
| D9 | сигнал pan (MG90S) | Поворот основания |
| D10 | сигнал tilt (SG90) | Наклон «головы» |
4. Сборка по шагам
Джойстик на макетке
Поставьте модуль так, чтобы стик был удобен гостю. Подключите 5 V, GND, VRX→A0, VRY→A1, SW→D2.
Два серво
Pan на D9, tilt на D10. Пока без тяжёлой камеры/телефона — только рама или рожки.
Verify → Upload по согласию
Скомпилируйте скетч. Заливка — только после явного согласия. Крутите стик медленно.
Подстройка мёртвой зоны
Если в центре всё же дрожит — увеличьте 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
Какие детали печатаем
- Основание под MG90S (горизонтальный поворот — pan).
- Вилка / качалка под SG90 (наклон — tilt).
- Площадка под табличку талисмана или очень лёгкий гаджет (не смартфон «кирпич»).
Модель: скачать или нарисовать простое
Путь A. Ищите: pan tilt SG90, dual servo gimbal, camera pan tilt mount, MG90S bracket.
Путь C (Tinkercad). Плита-основание с отверстиями под винты MG90S; U-образная вилка с отверстиями под SG90. Отверстия под винты серво — с запасом +0,3…0,5 mm, иначе PLA «закусывает».
Проект в Bambu Studio
Импорт STL → детали плашмя → PLA, 0.2 mm, заполнение 15–20% (для рамы ок 20%). Отправка — setup-bambu-p2s.html.
Проверка качества
- Винты серво входят в отверстия без сверления «с боем»
- Вилка tilt не трещит при лёгком сгибе руками
- Нет больших наплывов на посадочных плоскостях
Примерка без клея
Закрепите оба серво винтами из комплекта. Прогоните крайние углы джойстиком.
7. Скрипт демо
- «Это двухосевая голова: как шея — влево-вправо и вверх-вниз.»
- «Джойстик даёт два числа 0…1023. Программа переводит их в углы серво.»
- «Мёртвая зона в центре — чтобы рука не дрожала и серво не жужжали зря.»
- «Нажмите стик — взгляд в центр. Дальше научим платформу крутиться сама — шаговиком.»
8. Неисправности
| Симптом | Что проверить |
|---|---|
| Дрожит в центре | Увеличить DEADZONE; плохой контакт VRx/VRy |
| Оси наоборот | Поменять A0/A1 или инвертировать map |
| Кнопка не центрирует | SW на D2, INPUT_PULLUP; на модуле SW замыкает на GND |
| Один серво мёртв | Сигнальный провод, attach на верный пин |
| Сброс Uno | Ток двух серво — отдельное 5 V + общий GND |
9. Безопасность
- Общий GND для Uno и обоих серво.
- Питание моторов/серво — с силовой линии, не с сигнального пина.
- Upload и первое включение внешнего БП — только после вашего «да».
10. Что дальше
Следующий уровень механики: Поворотный стенд на шаговике (отдельное питание мотора!).