Slider Motorisé pour Caméra Contrôlé par Bluetooth avec Arduino : Pour des Plans Cinématiques Fluides
Composants et Fournitures
| Composant | Quantité | Notes |
|---|---|---|
| Arduino UNO | 1 | |
| PCB Personnalisé PCBWay | 1 | Fichiers de conception |
| Rail Linéaire V-Slot 20×40 | 1 | Longueur au choix |
| Kit Roues V Solides | 4 | |
| Écrous en T à Insertion | 4 | |
| Entretroise Excentrique | 2 | |
| Entretroise Aluminium 9 mm | 2 | |
| Entretroise Aluminium 3 mm | 2 | |
| Vis M5 Tête Basse 20 mm avec Écrou | 4 | |
| Vis M5 Tête Basse 10 mm | 4 | |
| Vis M3 Allen HEX 16 mm avec Écrou | 8 | |
| Palier à Bride Auto-alignant 8 mm | 2 | |
| Poulie Aluminium GT2 Alésage 8 mm, 20 Dents | 1 | |
| Arbre Linéaire 8 mm | 1 | Longueur 60 mm |
| Poulie Aluminium GT2 Alésage 5 mm, 20 Dents | 1 | |
| Courroie Dentée GT2 6 mm (Open) | 1 | Longueur selon le rail |
| Moteur Pas à Pas Bipolaire NEMA 17 | 1 | |
| Driver Moteur Pas à Pas A4988 | 1 | |
| Batterie Rechargeable 12V 3A | 1 | |
| Module Bluetooth HC-05 | 1 |
Outils et Machines Nécessaires
- Imprimante 3D (générique)
Applications et Services en Ligne
- Autodesk Fusion 360 (CAO)
- Autodesk Eagle (Conception PCB)
- Arduino IDE
À Propos du Projet
Vue d'Ensemble
Pour les amateurs de vidéo, l'achat d'un slider motorisé représente un investissement conséquent. Ce tutoriel vous guide pas à pas dans la construction de votre propre slider motorisé contrôlé par Bluetooth.
Nous allons réaliser un slider pilotable sans fil depuis une application Android personnalisée, développée avec MIT App Inventor. L'application offre un contrôle complet : vitesse de déplacement, distance de parcours, taux d'accélération/décélération, et bien plus. Elle permet de définir la longueur de votre rail (jusqu'à 10 mètres), vous offrant une grande liberté de conception.
L'actionneur est un moteur pas à pas NEMA 17, piloté via un driver A4988 Pololu. Ce dernier propose cinq résolutions de micro-pas (jusqu'au 1/16 de pas), garantissant une précision et une fluidité de mouvement maximales.
Le projet est conçu pour être réalisable en fablab, makerspace ou hackerspace.
CAO et Modélisation 3D
La conception a été réalisée sous Fusion 360, en privilégiant des composants mécaniques standards, faciles à se procurer partout dans le monde.
La structure mécanique utilise du matériel OpenBuilds :
- Rail V-Slot 2040 comme guide de déplacement
- Deux poulies : une sur l'arbre du moteur, l'autre sur un arbre lisse 8 mm côté opposé
- Courroie dentée ouverte entre les deux pour convertir le mouvement rotatif en translation
L'arbre lisse 8 mm est maintenu par deux paliers à bride auto-alignants, fixés sur les plaques supérieure et inférieure par quatre vis M5.
Quatre roues V-Slot en Delrin assurent un glissement extrêmement fluide dans la gorge du rail. La plaque caméra intègre un filetage standard 1/4 pouce pour le montage direct.
Un boîtier accueille l'électronique. L'ensemble est assemblé avec des vis M3×16 mm et écrous.
Fabrication Numérique (Impression 3D)
Toutes les pièces du corps du slider sont imprimées en 3D :
- Hauteur de couche : 0,2 mm
- Remplissage : 20 % (sauf pattes gauche/droite : 50 %)
Fichiers STL disponibles sur Thingiverse.
Assemblage du Kit Roues V
Chaque roue V solide se compose d'une roue en caoutchouc, deux roulements, deux bagues de précision et un écrou de blocage.
Procédure :
- Insérer un premier roulement d'un côté de la roue
- Retourner la roue, insérer une bague de précision
- Insérer le second roulement de l'autre face
- Serrer l'écrou de blocage
Assemblage Mécanique du Slider
1. Plaque Caméra et Roues V
Monter les quatre roues sur la plaque caméra :
- Deux roues droites : entretoise aluminium 9 mm + bague de précision + écrou
- Deux roues gauches : entretoise excentrique + entretoise 3 mm + bague de précision + écrou
Insérer la plaque dans le profilé V-Slot. Si du jeu subsiste, serrer l'écrou excentrique jusqu'à obtention d'un guidage ferme sans point dur.
2. Fixation du Rail sur les Pattes
Insérer deux écrous en T à chaque extrémité du profilé, puis emboîter les pattes gauche et droite. Fixer avec quatre vis M5×10 mm.
3. Montage du Moteur NEMA 17
Fixer le moteur sur sa plaque avec quatre vis M3×16 mm, puis installer l'ensemble sur la patte gauche (deux vis M3×16 mm dans les écrous pré-insérés).
4. Installation des Poulies et Courroie
- Poulie GT2 alésage 5 mm sur l'arbre moteur (serrer la vis de pression)
- Côté droit : installer les deux plaques support de paliers sur la patte (quatre vis M3×16 mm)
- Fixer les deux paliers à bride 8 mm (vis M5×20 mm + écrous)
- Insérer l'arbre lisse 8 mm par le bas, monter la poulie GT2 alésage 8 mm et serrer
5. Pose de la Courroie
Enrouler la courroie GT2 6 mm sur les deux poulies, puis la tendre et la fixer sur la plaque caméra.
6. Électronique et Boîtier de Contrôle
Enficher le shield Arduino « Cairo Camera Slider » sur l'Arduino UNO, insérer le tout dans le boîtier, puis fixer celui-ci sur la patte gauche (deux écrous M3 + vis M3×16 mm). Fermer le boîtier.
Test de Contrôle du Moteur Pas à Pas
Le Driver A4988
Le driver A4988 fait l'interface entre l'Arduino et le moteur bipolaire. Caractéristiques clés :
- Courant de sortie jusqu'à 2 A par bobine
- Contrôle simple : 2 pins numériques (STEP, DIR)
- Réglage du courant max via potentiomètre embarqué
- 5 résolutions de micro-pas : pas entier, 1/2, 1/4, 1/8, 1/16
- Alimentation moteur (VMOT) : 8–35 V (ici 12 V + condensateur 100 µF anti-pics)
- Logique (VDD) : 3–5,5 V (isolée de VMOT)
Pins de configuration micro-pas (MS1, MS2, MS3) : tirées à l'état bas par défaut → mode pas entier. Appliquer les niveaux logiques appropriés pour sélectionner la résolution souhaitée.
Pins de contrôle :
- EN (Enable) : actif bas (0 V = activé, 5 V = désactivé)
- RST (Reset) : actif bas, ignore les impulsions STEP
- SLP (Sleep) : actif bas, mode veille basse consommation
- STEP : chaque impulsion = 1 micro-pas
- DIR : HIGH = horaire, LOW = anti-horaire (selon câblage)
Moteur NEMA 17 Bipolaire
Angle de pas : 1,8° (200 pas/révolution en pas entier). Tension nominale 9 V, 12 V recommandé pour couple maximal. 4 fils (2 bobines).
Schéma de Câblage (Test)
Connexion : Moteur → A4988 → Arduino UNO + Batterie 12 V 3 A.
Code Arduino (Test avec AccelStepper)
Installer la bibliothèque AccelStepper (Mike McCauley) via le gestionnaire de bibliothèques de l'IDE Arduino.
// Test rebond simple
#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();
}
Logique : l'objet AccelStepper gère l'accélération/décélération. En setup(), on définit vitesse max, accélération et position cible. En loop(), le moteur fait l'aller-retour entre les positions extrêmes.
Contrôle Sans Fil Complet
Application Mobile (MIT App Inventor)
L'application communique en Bluetooth avec le slider. Elle permet de régler :
- Vitesse (curseur)
- Distance de déplacement
- Accélération (5 niveaux : Très Faible à Très Élevée)
- Démarrage différé (15 s)
- Position de référence (homing) : gauche ou droite
- Résolution micro-pas : 1/4 (Fluide) ou 1/16 (Très Fluide)
- Longueur du rail (1 cm – 1000 cm)
Code source de l'application open-source disponible.
Schéma de Câblage Final (avec HC-05)
Le module HC-05 (configurable maître/esclave, protocole SPP) se câble en série sur l'UART de l'Arduino :
- Tx Arduino → Rx HC-05
- Rx Arduino → Tx HC-05
- 5 V Arduino → VCC HC-05
- GND Arduino → GND HC-05
Conception PCB : Shield Arduino « Cairo Camera Slider »
Un shield PCB personnalisé élimine le câblage volant. Composants à souder : connecteur HC-05, support A4988, connecteur batterie. Fabrication chez PCBWay (qualité excellente, ~5 $).
Fichiers source et commande PCB : PCBWay
Code Arduino Final & Communication Bluetooth
Le code utilise AccelStepper et implémente un protocole série 2 octets (poids fort + poids faible) pour recevoir les commandes de l'application.
Principaux paramètres reçus :
1: Flèche gauche (déplacement vers position homing opposée)2: Flèche droite3: Stop + retour homing201–1200: Longueur rail / distance (cm) →valeur - 2005001–9000: Vitesse (pas/s) →valeur - 50007/8: Démarrage différé activé/désactivé11–15: Niveaux d'accélération16/17: Homing gauche/droite18/19: Micro-pas 1/4 (Fluide) / 1/16 (Très Fluide)1301–2300: Longueur rail initiale (cm) →valeur - 1300
Calcul du nombre de pas :
- Micro-pas 1/4 :
steps = (6100 × rail_cm) / 50 - Micro-pas 1/16 :
steps = (25000 × rail_cm) / 50
Le setup() attend trois paramètres critiques (homing, micro-pas, longueur rail) avant de passer à la boucle principale. La loop() traite les commandes entrantes en temps réel et pilote le moteur via stepper.run().
Afficher le code complet (cliquer pour déplier)
/* Cairo Camera Slider - Code Final */
#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;
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-pas
if (incomingData == 18) { microStepResolution = 4; startupSetupFlag++; }
else if (incomingData == 19) { microStepResolution = 16; startupSetupFlag++; }
// Longueur rail
if (incomingData >= 1301 && incomingData <= 2300) {
railLength = incomingData - 1300;
if (microStepResolution == 4) { steps = ((6100L * railLength) / 50L); startupSetupFlag++; }
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;
// Contrôle moteur
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();
}
// Vitesse
else if (incomingData >= 5001 && incomingData <= 9000) {
sliderSpeed = incomingData - 5000;
stepper.setMaxSpeed(sliderSpeed);
}
// Démarrage différé
else if (incomingData == 7) delayedStart = true;
else if (incomingData == 8) delayedStart = false;
// Distance
else if (incomingData >= 201 && incomingData <= 1200) {
movementDistance = incomingData - 200;
if (microStepResolution == 4) steps = ((6100L * movementDistance) / 50L);
else if (microStepResolution == 16) steps = ((25000L * movementDistance) / 50L);
}
// Accélération
else if (incomingData == 11 && !stepper.isRunning()) stepper.setAcceleration(3000);
else if (incomingData == 12 && !stepper.isRunning()) stepper.setAcceleration(1000);
else if (incomingData == 13 && !stepper.isRunning()) stepper.setAcceleration(500);
else if (incomingData == 14 && !stepper.isRunning()) stepper.setAcceleration(4000);
else if (incomingData == 15 && !stepper.isRunning()) stepper.setAcceleration(10);
}
stepper.run();
}
void homing() {
homingPositionFlag = (stepper.currentPosition() > 0);
stepper.moveTo(0);
}
Guide Utilisateur & Dépannage
- Alimenter l'Arduino (12 V) → le shield est alimenté.
- Activer Bluetooth sur le smartphone, appairer le module HC-05 (code par défaut : 1234 ou 0000).
- Lancer l'application, appuyer sur « Press here to connect with Cairo camera slider », sélectionner HC-05.
L'application demande ensuite :
- Résolution micro-pas : « Smooth » (1/4) ou « Very Smooth » (1/16) — doit correspondre aux jumpers MS1-MS3 sur l'A4988.
- Longueur du rail (cm) : ex. 50 cm.
- Position de homing : placer le chariot sur l'extrémité gauche OU droite, puis sélectionner l'option correspondante.
Attention : si le chariot n'est pas en butée au démarrage, il risque de heurter les limites.
Après validation, l'écran principal affiche les paramètres et les commandes de mouvement.
Slider en Action
Le slider est désormais opérationnel pour réaliser des travellings fluides, des timelapses ou des plans cinématiques précis, le tout piloté depuis votre smartphone.
Code Source
Le code complet est disponible dans la section « Code » du projet original (fichier Cairo Camera Slider Final Code.ino).
Pièces Imprimées 3D
Fichiers CAO (STL) sur Thingiverse : « Cairo Camera Slider STLs ».
Schémas
Processus de fabrication
- L'Évolution et la Conception des Appareils Photo Modernes
- Comprendre les objectifs d'appareil photo : conception, histoire et innovations futures
- BrickPi Bookreader : Automatiser la lecture Kindle avec Raspberry Pi et LEGO Mindstorms
- Construire un Spybot Arduino piloté par Bluetooth
- FlickMote : Télécommande IR à gestes pour maison connectée
- TV-B-Gone DIY Arduino : Télécommande universelle pour toutes les TV
- Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
- Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
- Caméra d'imagerie THz avancée révèle des vues internes haute résolution d'objets solides