Controlador de Slider Motorizado para Cámara con Bluetooth y Arduino para Tomas Cinematográficas Suaves
Componentes y Suministros
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino UNO | 1 | |
| PCB Personalizada PCBWay | 1 | Proyecto compartido en PCBWay |
| Riel Lineal V-Slot 20×40 | 1 | Longitud según necesidad |
| Kit de Ruedas V Sólidas | 4 | |
| Tuercas en T Deslizantes | 4 | |
| Separadores Excéntricos | 2 | |
| Separadores de Aluminio 9mm | 2 | |
| Separadores de Aluminio 3mm | 2 | |
| Tornillos M5 de Perfil Bajo 20mm con tuercas | 4 | |
| Tornillos M5 de Perfil Bajo 10mm | 4 | |
| Tornillos Allen M3 16mm con tuercas | 8 | |
| Rodamientos de Brida Autoadherentes 8mm | 2 | |
| Polea de Aluminio GT2 20 Dientes Agujero 8mm | 1 | |
| Eje Lineal 8mm | 1 | Longitud 60mm |
| Polea de Aluminio GT2 20 Dientes Agujero 5mm | 1 | |
| Correa Dentada GT2 6mm Abierta | 1 | Longitud según riel |
| Motor Paso a Paso Bipolar NEMA17 | 1 | |
| Driver de Motor Paso a Paso A4988 | 1 | |
| Batería Recargable 12V 3A | 1 | |
| Módulo Bluetooth HC-05 | 1 |
Herramientas Necesarias
- Impresora 3D (genérica)
Aplicaciones y Servicios Online
- Autodesk Fusion 360
- Autodesk Eagle
- Arduino IDE
Descripción del Proyecto
Visión General
Para los aficionados que graban videos, comprar un slider motorizado resulta costoso. En este tutorial construimos uno propio controlado por Bluetooth mediante una app Android personalizada. Usamos MIT App Inventor para crear la aplicación, permitiendo controlar velocidad, distancia de recorrido, aceleración/desaceleración y más. La app es muy robusta: permite configurar la longitud del slider (hasta 10 metros) sin modificar el código.
Empleamos un motor NEMA17 como actuador para control preciso de pasos. Para gobernarlo desde Arduino usamos el driver A4988 Pololu, que ofrece 5 resoluciones de micro-paso (hasta 1/16) para máxima precisión y suavidad.
El diseño está pensado para fabricarse en fablabs/makerspaces/hackerspaces.
Diseño CAD y Modelado 3D
Usamos Fusion 360 para diseñar el slider, eligiendo componentes mecánicos estándar fáciles de conseguir en cualquier tienda online o física.
La estructura mecánica usa hardware OpenBuilds: riel lineal V-Slot 2040 como guía. Dos poleas (una en el eje del motor, otra en un eje lineal de 8mm en el extremo opuesto) con correa dentada abierta convierten el movimiento rotativo en lineal.
El eje lineal de 8mm se monta entre dos rodamientos de brida autoadherentes fijados a las placas superior e inferior con 4 tornillos M5.
Cuatro ruedas Delrin V-Slot sólidas ruedan en la ranura en V del riel para movimiento extremadamente suave. La placa de la cámara tiene un orificio central de 1/4" para tornillo de trípode estándar.
Finalmente, una carcasa para la electrónica. Todas las piezas se fijan con tornillos M3×16mm y tuercas.
Fabricación Digital (Impresión 3D)
Todo el cuerpo se imprime en 3D con altura de capa 0.2mm y 20% de relleno, excepto las patas izquierda y derecha que usan 50% de relleno.
Archivos STL disponibles en Thingiverse.
Montaje del Kit de Ruedas V
El proceso es sencillo. Cada rueda V sólida incluye: rueda de goma, dos rodamientos, dos arandelas de precisión y tuerca de bloqueo.
Inserte un rodamiento por un lado de la rueda, déle la vuelta, inserte una arandela de precisión dentro, y finalmente el segundo rodamiento por la otra cara.
Montaje Mecánico del Slider
- Placa de cámara y ruedas: Use separadores de aluminio 9mm, arandelas de precisión y tuercas de bloqueo para las dos ruedas derechas. Para las dos izquierdas use separador excéntrico + separador 3mm.
- Inserte la placa en el perfil V-Slot. Si queda suelta, apriete la tuerca excéntrica hasta eliminar el juego.
- Inserte tuercas en T en cada extremo del perfil para unir las patas.
- Fije las patas al perfil con 4 tornillos M5×10mm.
- Monte el motor NEMA17 en su placa con 4 tornillos M3×16mm.
- Fije la placa del motor a la pata izquierda con 2 tornillos M3×16mm.
- Instale polea GT2 5mm en el eje del motor y apriete el tornillo de fijación.
- En la pata derecha: inserte 4 tuercas M3, coloque las dos placas de rodamientos, fíjelas con 4 tornillos M3×16mm.
- Monte los dos rodamientos de brida 8mm (superior e inferior) con tornillos M5×20mm y tuercas M5.
- Inserte el eje lineal 8mm por la parte inferior, empuje hacia arriba, y monte la polea GT2 8mm apretando su tornillo.
- Correa dentada: enróllela en ambas poleas y tensela fijándola a la placa de la cámara.
- Electrónica: inserte el shield "Cairo Camera Slider" sobre el Arduino, colóquelo en la carcasa, y fije la carcasa a la pata izquierda con tornillos M3×16mm. Cierre la tapa con 2 tornillos M3.
Prueba de Control del Motor Paso a Paso
Driver A4988
Para controlar un motor paso a paso con Arduino se necesita un driver que traduzca las órdenes. El A4988 permite controlar un motor bipolar hasta 2A por bobina, interfaz simple (2 pines digitales: step y dir), ajuste de corriente mediante potenciómetro, y 5 resoluciones de micro-paso (hasta 1/16).
Pines principales:
- VMOT, GND: Alimentación del motor (8-35V). Usamos 12V 3A con condensador 100µF de desacople.
- 2B, 2A / 1A, 1B: Salidas a las dos bobinas del motor (hasta 2A cada una).
- VDD, GND: Lógica interna (3-5.5V), aislada de VMOT.
- EN (Enable): Activo en LOW (0V). Por defecto LOW → chip habilitado.
- MS1, MS2, MS3: Selección de resolución de micro-paso (ver tabla). Por defecto pull-down → paso completo.
- RST, SLP: Reset y Sleep (activos en LOW). Por defecto SLP en HIGH.
- STP (Step), DIR (Direction): Cada pulso en STP = 1 micro-paso en la dirección de DIR (HIGH = horario, LOW = antihorario).
Motor NEMA17 Bipolar
Motores DC que rotan en incrementos precisos (ángulo de paso 1.8°). Se controlan mediante pulsos eléctricos a sus bobinas internas. Ventajas: precisión, posicionamiento exacto, par a baja velocidad sin detenerse. El NEMA17 bipolar tiene 4 hilos (2 por bobina), trabaja a 9V (máx. potencia a 12V).
Diagrama de Cableado
Conectamos: motor NEMA17 → driver A4988 → Arduino UNO → batería Li-Ion 12V 3A.
Código Arduino (Prueba Básica)
Usamos la librería AccelStepper (Mike McCauley). Instalación: Sketch → Incluir Librería → Gestionar Librerías → buscar "AccelStepper".
// Test rebote motor paso a paso
#include <AccelStepper.h>
#define stepPin 2
#define dirPin 3
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);
void setup() {
stepper.setMaxSpeed(100);
stepper.setAcceleration(20);
stepper.moveTo(500);
}
void loop() {
if (stepper.distanceToGo() == 0)
stepper.moveTo(-stepper.currentPosition());
stepper.run();
}
Lógica: inicializa objeto AccelStepper con pines step/dir. En setup() configura velocidad máxima (100 pasos/s), aceleración (20 pasos/s²) y objetivo inicial (500 pasos). En loop() invierte dirección al llegar al objetivo.
Control Inalámbrico Completo
Construcción de la App Móvil
Creamos la app con MIT App Inventor (drag-and-drop de bloques). Comunicación Bluetooth con el slider. Código fuente abierto (enlace en proyecto original).
La app envía códigos numéricos por Bluetooth para cada acción: flecha izquierda (1), derecha (2), stop (3), longitud riel (201-1200), aceleración (11-15), velocidad (5001-9000), inicio retardado (7/8), homing (16/17), tipo movimiento (18/19).
Diagrama de Cableado con Bluetooth
Añadimos módulo HC-05 (configurable como maestro/esclavo, protocolo SPP). Conexiones serie cruzadas:
- Tx (Arduino) → Rx (HC-05)
- Rx (Arduino) → Tx (HC-05)
- 5V (Arduino) → VCC (HC-05)
- GND (Arduino) → GND (HC-05)
Esquemático y Fabricación PCB
Diseñamos un shield Arduino UNO a medida (PCBWay, $5, calidad excelente). Integra: zócalo para HC-05, zócalo para A4988, conector batería, y pines para motor. Solo hay que insertar componentes y montar el shield sobre el Arduino.
Archivos fuente PCB y pedido en PCBWay
Código Arduino Final y Comunicación Bluetooth
El código completo gestiona: configuración inicial (homing, micro-paso, longitud riel), control de movimiento (ida/vuelta, stop, velocidad, distancia, aceleración), inicio retardado (15s), y retorno a origen. Usa MultiStepper y AccelStepper. Protocolo serie de 2 bytes (MSB + LSB) para recibir comandos de la app.
/* Resumen de códigos de datos:
1: Izquierda 2: Derecha 3: Stop
16: Homing izq 17: Homing der
18: Micro-paso 1/4 (Suave) 19: Micro-paso 1/16 (Muy suave)
201-1200: Longitud riel (cm) 1301-2300: Longitud riel setup (cm)
5001-9000: Velocidad (pasos/s) 11-15: Aceleración
7: Inicio retardado ON 8: Inicio retardado OFF
*/
#include <MultiStepper.h>
#include <AccelStepper.h>
#define stepPin 2
#define dirPin 3
bool homingPositionFlag = false;
int startupSetupFlag = 0;
bool delayedStart = false;
int incomingData = 0;
int movementDistance = 50;
long steps = 0;
int microStepResolution = 0; // 4 o 16
long railLength = 0;
int sliderSpeed = 10;
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);
void setup() {
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
Serial.begin(9600);
stepper.setMaxSpeed(10.00);
stepper.setAcceleration(500.00);
while (startupSetupFlag < 3) {
if (Serial.available() > 1) {
unsigned int dataOne = Serial.read();
unsigned int dataOne1 = Serial.read();
unsigned int incomingData = (dataOne1 * 256) + dataOne;
// Homing
if (incomingData == 16) { stepper.setCurrentPosition(steps); homingPositionFlag = false; startupSetupFlag++; }
else if (incomingData == 17) { stepper.setCurrentPosition(-steps); homingPositionFlag = true; startupSetupFlag++; }
// Micro-paso
if (incomingData == 18) { microStepResolution = 4; startupSetupFlag++; }
else if (incomingData == 19) { microStepResolution = 16; startupSetupFlag++; }
// Longitud riel
if (incomingData >= 1301 && incomingData <= 2300) {
railLength = incomingData - 1300;
if (microStepResolution == 4) steps = ((6100L * railLength) / 50L);
else if (microStepResolution == 16) steps = ((25000L * railLength) / 50L);
startupSetupFlag++;
}
}
}
}
void loop() {
if (Serial.available() > 1) {
unsigned int dataOne = Serial.read();
unsigned int dataOne1 = Serial.read();
unsigned int incomingData = (dataOne1 * 256) + dataOne;
// Control motor
if (incomingData == 1 && !stepper.isRunning() && stepper.currentPosition() != 6050 && homingPositionFlag) {
if (delayedStart) delay(15000);
stepper.setCurrentPosition(0);
stepper.moveTo(steps);
homingPositionFlag = false;
}
else if (incomingData == 2 && !stepper.isRunning() && stepper.currentPosition() != -6050 && !homingPositionFlag) {
if (delayedStart) delay(15000);
stepper.setCurrentPosition(0);
stepper.moveTo(-steps);
homingPositionFlag = true;
}
else if (incomingData == 3 && stepper.isRunning()) homing();
// Velocidad
else if (incomingData >= 5001 && incomingData <= 9000) {
sliderSpeed = incomingData - 5000;
stepper.setMaxSpeed(sliderSpeed);
}
// Inicio retardado
else if (incomingData == 7) delayedStart = true;
else if (incomingData == 8) delayedStart = false;
// Distancia movimiento
else if (incomingData >= 201 && incomingData <= 1200) {
movementDistance = incomingData - 200;
if (microStepResolution == 4) steps = ((6100L * movementDistance) / 50L);
else if (microStepResolution == 16) steps = ((25000L * movementDistance) / 50L);
}
// Aceleración
else if (incomingData == 11 && !stepper.isRunning()) stepper.setAcceleration(3000); // Muy alta
else if (incomingData == 12 && !stepper.isRunning()) stepper.setAcceleration(1000); // Media
else if (incomingData == 13 && !stepper.isRunning()) stepper.setAcceleration(500); // Baja
else if (incomingData == 14 && !stepper.isRunning()) stepper.setAcceleration(4000); // Muy alta
else if (incomingData == 15 && !stepper.isRunning()) stepper.setAcceleration(10); // Muy baja
}
stepper.run();
}
void homing() {
homingPositionFlag = (stepper.currentPosition() > 0);
stepper.moveTo(0);
}
Guía de Usuario y Solución de Problemas
- Conecte batería 12V al Arduino (alimenta también el shield).
- Active Bluetooth en el móvil, empareje con HC-05 (PIN usual: 1234 o 0000).
- Abra la app y pulse "Conectar con Cairo Camera Slider", seleccione HC-05.
- La app pedirá: resolución micro-paso (Suave 1/4 o Muy Suave 1/16) → debe coincidir con jumpers MS1-MS3 del A4988.
- Ingrese longitud del riel en cm (ej. 50).
- Seleccione homing: coloque el carro en un extremo (izq/der) y elija ese extremo.
- Confirme parámetros y ¡a grabar!
Importante: Si el carro no está en un extremo al iniciar, chocará contra los límites al moverse.
Slider en Acción
¡Disfrute de tomas cinematográficas suaves y precisas con su slider DIY!
Código Completo
Disponible en la sección Code del proyecto original (archivo Cairo Camera Slider Final Code.ino).
Piezas Personalizadas y Carcasas
Archivos CAD/STL en Thingiverse.
Esquemáticos
Proceso de manufactura
- La evolución y diseño de las cámaras modernas
- Objetivos de cámara: diseño, historia e innovaciones futuras
- BrickPi Bookreader: Automatice la lectura de Kindle con Raspberry Pi y LEGO Mindstorms
- Construye un Spybot controlado por Bluetooth con Arduino
- FlickMote: Mando IR por gestos para Smart Home
- TV‑B‑Gone DIY con Arduino: Mando universal para apagar cualquier TV
- Construye un Reloj Maestro LED Personalizado con Alarma – Visible desde 12 Metros
- Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
- Soluciones de Alimentación Optimizadas para Proyectos Arduino
- Tres en raya con Arduino, matriz LED MAX7219 y carcasa de cartón
- Cámara de Imagen THz Avanzada Revela Vistas Internas de Alta Resolución de Objetos Sólidos