DIY моторизированный камерный слайдер с панорамированием и наклоном — управление Arduino
Обзор
Полностью самодельный камерный слайдер с головкой pan/tilt. Основа — МДФ и фанера, три шаговых двигателя NEMA 17, управление Arduino через джойстик и кнопки на самодельной плате. Результат: плавные кинематографические движения, установка на штатив под любым углом благодаря опорной руке.

Механическая часть
Рейки и база
Рейки — медные трубы 22 мм, длина 1 м. Очищены пастой (зубная) от окислов. База — два листа фанеры 21 мм, склеенные, с креплением под штатив (копия плиты штатива). Рейки закреплены на шпильках М8, просверленными в трубах (джиг для точных отверстий с двух сторон).


Подвижная платформа
МДФ 8 мм, подшипники 608Z (вн. диаметр 22 мм) — две пары сверху и снизу для устойчивости на наклоне. Привод: шаговый двигатель + ремень GT2, натяжён на ролик с другой стороны.

Опорная рука
Для стабилизации на лёгком штативе: зажим на ногу штатива + рука со шлицем (сверлены ряд отверстий 6 мм, вышлифованы рашпилем). Позволяет устанавливать слайдер под любым углом.

Голова Pan/Tilt
Сборка по 3D-модели (файл на Thangs). Панорама и тильт — шаговые двигатели с редукцией 5:1 (3D-печатные шкивы 80 зубьев на 16-зубевые на валу). Ремни замкнуты в кольца цианакрилатом + скотч. Натяжение ремня тильта — подшипник на болте двигателя.


Электроника: схема и PCB
Три драйвера A4988 управляют двигателями. Управление: потенциометр (слайдер), джойстик (pan/tilt), потенциометр скорости авто-движения, кнопка Set (запись точек In/Out), лимитный выключатель (парковка слайдера), два индикатора In/Out, питание 9–12 В.

Печатная плата
Разработана в EasyEDA (двухслойная), заказ в JLCPCB. Паяем pin headers для модулей, джамперы к компонентам на лицевой панели.


Корпус контроллера
Прозрачный акрил 4 мм — видна начинка. Фронтальная панель на болтах/гайках. Внутрь: Arduino, три A4988, кнопки, потенциометры, джойстик, джек питания. Выводы к двигателям и лимитке — через боковую стенку с термоусадкой.


Программа (библиотека AccelStepper)
Код разбит на логические блоки. Полный листинг в конце.
Инициализация и парковка
#include <AccelStepper.h>
#include <MultiStepper.h>
#define JoyX A0
#define JoyY A1
#define slider A2
#define inOutPot A3
#define JoySwitch 10
#define InOutSet 12
#define limitSwitch 11
#define inLED 8
#define outLED 9
AccelStepper stepper1(1, 7, 6); // slider
AccelStepper stepper2(1, 5, 4); // pan
AccelStepper stepper3(1, 3, 2); // tilt
MultiStepper StepperControl;
long gotoposition[3];
int currentSpeed = 100;
int XInPoint=0, YInPoint=0, ZInPoint=0;
int XOutPoint=0, YOutPoint=0, ZOutPoint=0;
int InandOut = 0;
void setup() {
stepper1.setMaxSpeed(3000); stepper1.setSpeed(200);
stepper2.setMaxSpeed(3000); stepper2.setSpeed(200);
stepper3.setMaxSpeed(3000); stepper3.setSpeed(200);
pinMode(JoySwitch, INPUT_PULLUP);
pinMode(InOutSet, INPUT_PULLUP);
pinMode(limitSwitch, INPUT_PULLUP);
pinMode(inLED, OUTPUT); pinMode(outLED, OUTPUT);
StepperControl.addStepper(stepper1);
StepperControl.addStepper(stepper2);
StepperControl.addStepper(stepper3);
// Homing: едем к лимитке, ставим 0, отъезжаем 200 шагов
while (digitalRead(limitSwitch) != 0) {
stepper1.setSpeed(3000); stepper1.runSpeed();
stepper1.setCurrentPosition(0);
}
delay(20);
while (stepper1.currentPosition() != -200) {
stepper1.setSpeed(-3000); stepper1.run();
}
}
Основной цикл: ограничение хода, скорость pan/tilt, запись точек, авто-движение
void loop() {
// Ограничение: лимитка или 80 см (64800 шагов) в другую сторону
while (digitalRead(limitSwitch) == 0 || stepper1.currentPosition() < -64800) {}
// Нажатие джойстика — увеличиваем скорость pan/tilt
if (digitalRead(JoySwitch) == 0) { currentSpeed += 50; delay(200); }
// Кнопка Set — машина состояний InandOut
if (digitalRead(InOutSet) == 0) {
delay(500); // долгое нажатие >0.5с — сброс
if (digitalRead(InOutSet) == 0) { InandOut = 4; }
switch (InandOut) {
case 0: // Записать IN
InandOut = 1;
XInPoint = stepper1.currentPosition();
YInPoint = stepper2.currentPosition();
ZInPoint = stepper3.currentPosition();
digitalWrite(inLED, HIGH);
break;
case 1: // Записать OUT
InandOut = 2;
XOutPoint = stepper1.currentPosition();
YOutPoint = stepper2.currentPosition();
ZOutPoint = stepper3.currentPosition();
digitalWrite(outLED, HIGH);
break;
case 2: // Движение к IN
InandOut = 3;
inOutSpeed = analogRead(inOutPot);
gotoposition[0] = XInPoint; gotoposition[1] = YInPoint; gotoposition[2] = ZInPoint;
stepper1.setMaxSpeed(inOutSpeed); stepper2.setMaxSpeed(inOutSpeed); stepper3.setMaxSpeed(inOutSpeed);
StepperControl.moveTo(gotoposition);
StepperControl.runSpeedToPosition(); // Блокирующий вызов
delay(200);
break;
case 3: // Движение к OUT
InandOut = 2;
inOutSpeed = analogRead(inOutPot);
gotoposition[0] = XOutPoint; gotoposition[1] = YOutPoint; gotoposition[2] = ZOutPoint;
stepper1.setMaxSpeed(inOutSpeed); stepper2.setMaxSpeed(inOutSpeed); stepper3.setMaxSpeed(inOutSpeed);
StepperControl.moveTo(gotoposition);
StepperControl.runSpeedToPosition();
delay(200);
break;
case 4: // Сброс
InandOut = 0; digitalWrite(inLED, LOW); digitalWrite(outLED, LOW); delay(1000);
break;
}
}
// Джойстик X — Pan
int JoyXPos = analogRead(JoyX);
if (JoyXPos > 600) stepper2.setSpeed(currentSpeed);
else if (JoyXPos < 400) stepper2.setSpeed(-currentSpeed);
else stepper2.setSpeed(0);
// Джойстик Y — Tilt
int JoyYPos = analogRead(JoyY);
if (JoyYPos > 600) stepper3.setSpeed(currentSpeed);
else if (JoyYPos < 400) stepper3.setSpeed(-currentSpeed);
else stepper3.setSpeed(0);
// Потенциометр слайдера — переменная скорость
int sliderPos = analogRead(slider);
if (sliderPos > 600) {
sliderPos = map(sliderPos, 600, 1024, 0, 3000);
stepper1.setSpeed(sliderPos);
} else if (sliderPos < 400) {
sliderPos = map(sliderPos, 400, 0, 0, 3000);
stepper1.setSpeed(-sliderPos);
} else stepper1.setSpeed(0);
// Запуск двигателей
stepper1.runSpeed();
stepper2.runSpeed();
stepper3.runSpeed();
}
Полный код
/* DIY Camera Slider with Pan and Tilt Head
by Dejan Nedelkovski, www.HowToMechatronics.com
Library: AccelStepper by Mike McCauley */
// ... (полный листинг как выше, без комментариев к частям)
Заключение
Слайдер получился плавным, универсальным (ручное/авто управление, любой угол установки) и недорогим. Все чертежи, 3D-модели, Gerber-файлы и код доступны в описании проекта.
Производственный процесс
- Bluetooth-контролируемый моторизированный камерный слайдер на Arduino для плавных кинематографических кадров
- Создание потрясающей системы Ambilight для монитора на Arduino
- Надежная система учета рабочего времени на Arduino с RFID и Python
- Умный вольтметр на Arduino и смартфоне — простое DIY-проект
- Сборка вольтметра на Arduino с дисплеем Nokia 5110 — Пошаговое руководство
- Клеточный автомат «Жизнь» Конвея на Arduino Nano с OLED 128x64
- Высокоскоростной тахометр на Arduino: новый алгоритм измерения RPM до 2 знаков после запятой
- Сборка компактного FM-радио на Arduino Nano и RDA5807M
- Система учёта рабочего времени на RFID, Arduino и Google Таблицах
- Генерация музыкальных тонов на Arduino: полный спектр 88 клавиш пианино