Slider caméra motorisé Pan & Tilt DIY – Projet piloté par Arduino
Dans ce tutoriel, nous allons apprendre à réaliser un slider caméra motorisé avec tête panoramique et tilt (inclinaison). Ce projet Arduino 100% DIY est construit avec des matériaux peu coûteux comme du MDF et du contreplaqué, et piloté par Arduino, trois moteurs pas-à-pas, des boutons et un joystick sur un PCB personnalisé. Malgré cela, le résultat est impressionnant, avec des mouvements de caméra ultra-fluides permettant d'obtenir des plans cinématographiques dignes de professionnels. Vous pouvez regarder la vidéo suivante ou lire le tutoriel écrit ci-dessous. À l'aide du contrôleur, nous pouvons soit déplacer manuellement la caméra, soit définir des points de départ et d'arrivée pour que la caméra se déplace automatiquement entre les deux positions. Grâce au bras de support, nous pouvons monter le slider même sur un petit trépied, à n'importe quel angle, tout en conservant des mouvements stables. Pour commencer, j'ai conçu le slider à l'aide d'un logiciel de modélisation 3D. Vous pouvez trouver et télécharger ce modèle 3D avec toutes les dimensions ci-dessous, ainsi que l'explorer dans votre navigateur sur Thangs. Télécharger le modèle 3D d'assemblage depuis Thangs Poulie GT2 imprimée en 3D : Thingiverse J'ai commencé par fabriquer les rails du slider en utilisant des tubes en cuivre de 22mm de diamètre. J'ai décidé de faire un slider de 1 mètre de long, j'ai donc coupé deux pièces à 1 mètre. Le cuivre s'oxyde facilement, il faut donc le polir avec un produit pour métaux. N'en ayant pas, j'ai utilisé du dentifrice. Ce n'était pas la solution parfaite, mais j'ai tout de même pu constater une différence et les tubes sont devenus plus propres. Ensuite, j'ai fabriqué la base en bois sur laquelle les deux tubes seront fixés et qui servira aussi à monter le slider sur un trépied. À l'aide d'une scie circulaire, j'ai découpé deux pièces de contreplaqué de 21mm d'épaisseur et les ai collées ensemble pour obtenir une pièce plus épaisse. Puis, avec du bois massif, j'ai réalisé une réplique de la plaque de fixation de mon trépied et l'ai fixée au contreplaqué avec de la colle à bois et une vis. La base du slider peut maintenant être facilement montée sur le trépied. Je fixerai les rails du slider à la base à l'aide de tiges filetées de 8mm. J'ai percé deux trous dans la base et inséré des tiges de 138mm coupées à la bonne longueur. Ensuite, j'ai dû percer des trous de 8mm dans les tubes, ce qui peut être délicat. Pour cela, j'ai fabriqué un gabarit simple où j'ai surélevé le crayon à 11mm (la moitié du diamètre du tube). J'ai bloqué le tube sur une surface plane et, avec le gabarit, j'ai marqué le tube des deux côtés pour obtenir des trous parfaitement alignés. J'ai d'abord marqué les points de perçage avec une pointe de vis acérée, puis percé progressivement avec des mèches de 2, 4, 6 et 8mm. Après cela, j'ai inséré les rails à travers les tiges filetées et, avec des rondelles et des écrous, je les ai fixés à la base du slider. De manière similaire, avec une pièce de contreplaqué et une tige filetée, j'ai fixé les extrémités des rails. Vient ensuite la plateforme coulissante. J'ai à nouveau utilisé la scie circulaire pour découper du MDF de 8mm selon les dimensions du modèle 3D. J'ai aussi fait des trous de 8mm pour les tiges filetées sur lesquelles seront fixés les roulements. Pour l'assemblage, j'ai utilisé de la colle à bois et des vis. Avec une perceuse-visseuse, j'ai d'abord fait des trous de pré-perçage, puis des alésages et vissé les vis de 3mm en place. Une fois les panneaux fixés, j'ai continué avec le système de roulements. J'utilise des roulements 608Z de 22mm de diamètre extérieur. Deux rondelles et un écrou entre deux roulements créent l'espacement nécessaire pour un bon contact avec les rails de 22mm. Pour rendre la plateforme plus sécurisée lors de l'utilisation du slider à un angle, j'ai inséré de la même manière deux autres jeux de roulements sous la plateforme. Au final, la plateforme coulissante fonctionne parfaitement. Ici, on remarque que sur mon petit trépied pas très robuste, la tête ne supporte pas le poids de la plateforme. J'ai dû fabriquer un bras de support pour stabiliser le slider. Avec deux pièces de bois et des écrous et boulons, j'ai fait un collier simple qui se fixe sur l'un des pieds du trépied. Le collier a un boulon sur lequel le bras de support peut être fixé. J'ai ensuite dû faire une fente sur le bras pour pouvoir positionner le slider à différents angles. J'ai fait la fente en perçant de nombreux trous de 6mm rapprochés, puis en limant pour obtenir des lignes droites. Ce système de support fonctionne parfaitement. J'ai continué en ajoutant des pieds au slider, au cas où on ne voudrait pas utiliser de trépied. Je les ai faits en MDF de 8mm. Avec une scie à main et une râpe, j'ai facilement obtenu la forme désirée. Puis avec un peu de colle et deux écrous, je les ai fixés aux extrémités du slider. L'étape suivante est la construction du système pan et tilt qui sera fixé sur le dessus de la plateforme coulissante. Avec la scie circulaire, j'ai découpé toutes les pièces nécessaires, aux dimensions du modèle 3D. J'ai utilisé quelques pièces de contreplaqué pour le mécanisme de charnière de la plateforme de nivellement de la caméra (quand le slider est incliné), ainsi que des panneaux MDF avec les trous appropriés pour le moteur et les roulements du système de panoramique. J'ai continué avec l'installation du moteur pas-à-pas et de la courroie crantée pour la plateforme coulissante. D'un côté, j'ai fixé le moteur pas-à-pas avec une pièce de MDF et des vis/boulons. De l'autre côté du slider, j'ai fixé une poulie folle pour pouvoir installer la courroie. Avec deux boulons et des colliers de serrage, j'ai facilement fixé la courroie à la plateforme coulissante. Avec cette étape, le mécanisme de translation était terminé. J'ai poursuivi avec la fabrication des parties supérieures du système pan et tilt. Selon le modèle 3D, j'ai fait tous les trous appropriés pour le moteur pas-à-pas et les roulements, puis collé et vissé le tout. Un ami a imprimé en 3D deux poulies de 80 dents pour moi. Cela me donne une réduction de vitesse de 5 fois par rapport à la poulie de 16 dents sur le moteur pas-à-pas. J'ai dû fabriquer une courroie crantée en boucle fermée adaptée à mon montage. J'ai mesuré la longueur nécessaire, coupé et collé avec de la colle cyanoacrylate, en ajoutant un morceau de ruban adhésif par-dessus. La colle cyanoacrylate fait un excellent travail sur le caoutchouc, la courroie en boucle fermée fonctionne sans problème. Ensuite, j'ai commencé l'assemblage final du système pan et tilt. D'abord, j'ai fixé le moteur de tilt avec des boulons, puis ajouté les deux roulements en place en les fixant dans les fentes avec de l'époxy. Ensuite, j'ai fixé la plateforme de tilt sur la plateforme de pan avec des boulons de 8mm, et en même temps j'ai attaché la poulie de 80 dents avec la courroie. J'ai remarqué que la courroie était un peu lâche, mais j'ai ajouté un petit roulement à l'endroit où passe le boulon du moteur pas-à-pas pour agir comme tendeur de courroie. Cela a fonctionné et la courroie avait maintenant assez de tension. Ensuite, j'ai fixé le moteur de pan et ajouté des roulements sur le côté supérieur de la plateforme de nivellement, ainsi que sur le côté inférieur. J'ai inséré un boulon à travers eux, ajouté un roulement à butée, la poulie de 80 dents et la courroie, et par-dessus l'ensemble tilt précédemment assemblé. Finalement, j'ai fixé le tout avec un boulon. L'assemblage mécanique du slider est terminé. Vient maintenant la partie amusante : l'installation des composants électroniques. Voici le schéma de câblage de ce projet de slider caméra DIY. Les trois moteurs pas-à-pas NEMA 17 sont pilotés via trois drivers A4988. Pour contrôler le déplacement du slider, nous utilisons un potentiomètre connecté à une entrée analogique de l'Arduino. Pour la tête pan/tilt, nous utilisons un module joystick (qui contient en fait deux potentiomètres) connecté à deux entrées analogiques. Un autre potentiomètre sert à régler la vitesse du mouvement automatique entre les positions IN et OUT. Ces positions IN/OUT sont définies à l'aide d'un bouton poussoir avec résistance de pull-up, connecté à une broche numérique. Il y a aussi un bouton de réinitialisation, un interrupteur d'alimentation, une prise d'alimentation, un fin de course pour le slider et deux LEDs pour indiquer l'état IN/OUT. Le projet peut être alimenté en 9V ou 12V. Vous pouvez vous procurer les composants nécessaires via les liens ci-dessous : Selon le schéma de câblage, j'ai conçu un PCB personnalisé pour organiser les composants électroniques. J'ai utilisé le logiciel gratuit EasyEDA. Le circuit avait pas mal de connexions, j'ai donc utilisé les deux couches (top et bottom) et obtenu un PCB fonctionnel et esthétique. Une fois fini, j'ai généré le fichier Gerber pour la fabrication. J'ai commandé le PCB chez JLCPCB, sponsor de ce tutoriel. On télécharge le fichier Gerber, on vérifie dans le visualiseur, on choisit les options, et on commande à prix raisonnable. Pour une première commande, jusqu'à 10 PCB pour 2$. Après une semaine, les PCB sont arrivés. La qualité est excellente et c'est très satisfaisant d'avoir son propre PCB fabriqué. J'ai commencé par souder des connecteurs à broches sur le PCB pour faciliter la connexion/déconnexion des composants. J'ai utilisé des connecteurs pour tout sauf les condensateurs et résistances soudés directement. J'ai ensuite soudé des fils de liaison sur tous les composants électroniques. Pour le boîtier du contrôleur, j'ai choisi de l'acrylique transparent de 4mm pour laisser visible la beauté de l'électronique. J'ai découpé les panneaux à la scie circulaire. Avec une perceuse et des mèches à méplat, j'ai fait les ouvertures sur le panneau avant pour les boutons, potentiomètres, interrupteur d'alimentation et joystick. J'ai assemblé le boîtier avec de l'époxy 5 minutes. Pour le couvercle, j'ai inséré et collé deux boulons à travers lesquels le panneau avant s'insère et se fixe avec des écrous. J'ai commencé l'assemblage électronique en insérant la carte Arduino et les drivers A4988 sur le PCB. Puis j'ai inséré et fixé les boutons et autres composants sur le panneau avant. Une fois fixés, j'ai connecté les composants aux connecteurs appropriés du PCB. Sur le panneau latéral, j'ai ajouté la prise d'alimentation, puis inséré le PCB dans le boîtier. Sur le même panneau, un trou laisse passer les fils de liaison pour connecter les drivers aux moteurs pas-à-pas et le fin de course placé au bout du slider. Avec de la gaine thermorétractable, j'ai organisé les fils sortant du boîtier. Il ne restait plus qu'à connecter le contrôleur aux trois moteurs pas-à-pas et au fin de course. Pour l'alimentation, j'ai utilisé trois batteries Li-ion 3.7V en série produisant environ 11V. Et voilà, le slider est terminé et fonctionne parfaitement. Il ne reste plus qu'à examiner le code Arduino et expliquer son fonctionnement. Comme le code est long, je le posterai par sections avec description pour chacune. À la fin de l'article, je donnerai le code complet. Le programme est basé sur la bibliothèque AccelStepper de Mike McCauley, une bibliothèque incroyable qui permet de contrôler facilement plusieurs moteurs pas-à-pas simultanément. Une fois cette bibliothèque et MultiStepper.h (qui en fait partie) incluses, nous définissons toutes les broches Arduino utilisées, les instances pour les steppers, et les variables nécessaires. Dans le setup, nous définissons les vitesses initiales des steppers, les modes de broches, et ajoutons les trois steppers à l'instance de contrôle multi "StepperControl". Avec des boucles while, nous déplaçons le slider vers la position initiale (homing) : il avance jusqu'à actionner le fin de course, puis recule de 200 pas pour le relâcher. Dans la boucle loop, nous commençons par vérifier si le slider a atteint les positions limites (fin de course ou 80cm de l'autre côté). À chaque appui sur l'interrupteur du joystick, nous augmentons la vitesse du Pan et Tilt. Ensuite, nous vérifions si le bouton Set est pressé (pour définir positions IN/OUT). Au premier appui, on stocke la position IN et on allume la LED IN. Au second appui, on stocke la position OUT et on allume la LED OUT. Au troisième appui, on lit le potentiomètre de vitesse auto, on place la position IN dans le tableau "gotoposition" utilisé par moveTo() qui calcule la vitesse requise pour chaque stepper. Puis runSpeedToPosition() déplace automatiquement le slider vers la position IN. De la même façon, au case 3 (quatrième appui), on se déplace vers la position OUT. Si on maintient le bouton Set enfoncé plus d'une demi-seconde, le case 4 s'exécute et réinitialise les positions IN/OUT pour en définir de nouvelles. Vient ensuite le contrôle Pan/Tilt au joystick. La valeur analogique du joystick va de 0 à 1024 (environ 500 au centre). Si on bouge le joystick à gauche (valeur > 600), on met la vitesse du moteur concerné à positif ; à droite (< 400), à négatif (rotation inverse). Au centre, vitesse à 0. Cette méthode s'applique aux deux axes du joystick ainsi qu'au potentiomètre du slider. Pour le potentiomètre, on utilise aussi sa valeur analogique pour augmenter la vitesse du moteur plus on le tourne. Enfin, nous appelons runSpeed() pour chaque moteur pas-à-pas pour exécuter les commandes. C'est tout pour ce tutoriel. J'espère que vous avez apprécié ce projet Arduino et appris quelque chose de nouveau. N'hésitez pas à poser vos questions dans les commentaires ci-dessous et consultez ma collection de projets Arduino.Vue d'ensemble



Construction du slider caméra















Schéma de câblage

Conception du PCB




Assemblage de l'électronique






Code Arduino du slider caméra DIY
#include <AccelStepper.h>
#include <MultiStepper.h>
#define JoyX A0 // Broche X du joystick
#define JoyY A1 // Broche Y du joystick
#define slider A2 // Potentiomètre du slider
#define inOutPot A3 // Potentiomètre vitesse IN/OUT
#define JoySwitch 10 // Interrupteur joystick
#define InOutSet 12 // Bouton Set
#define limitSwitch 11 // Fin de course
#define inLED 8
#define outLED 9
// Définition des moteurs pas-à-pas et leurs broches
AccelStepper stepper1(1, 7, 6); // (Type:driver, STEP, DIR)
AccelStepper stepper2(1, 5, 4);
AccelStepper stepper3(1, 3, 2);
MultiStepper StepperControl; // Instance MultiStepper
long gotoposition[3]; // Tableau pour stocker positions IN/OUT
int JoyXPos = 0;
int JoyYPos = 0;
int sliderPos = 0;
int currentSpeed = 100;
int inOutSpeed = 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 - aller au fin de course
while (digitalRead(limitSwitch) != 0) {
stepper1.setSpeed(3000);
stepper1.runSpeed();
stepper1.setCurrentPosition(0);
}
delay(20);
// Reculer de 200 pas depuis le fin de course
while (stepper1.currentPosition() != -200) {
stepper1.setSpeed(-3000);
stepper1.run();
}
}// Limitation du mouvement - ne rien faire si fin de course actionné ou distance > 80cm
while (digitalRead(limitSwitch) == 0 || stepper1.currentPosition() < -64800) {}// Si joystick pressé, augmenter vitesse Pan/Tilt
if (digitalRead(JoySwitch) == 0) {
currentSpeed = currentSpeed + 50;
delay(200);
}switch (InandOut) {
case 0: // Définir position IN
InandOut = 1;
XInPoint = stepper1.currentPosition();
YInPoint = stepper2.currentPosition();
ZInPoint = stepper3.currentPosition();
digitalWrite(inLED, HIGH);
break; case 1: // Définir position OUT
InandOut = 2;
XOutPoint = stepper1.currentPosition();
YOutPoint = stepper2.currentPosition();
ZOutPoint = stepper3.currentPosition();
digitalWrite(outLED, HIGH);
break; case 2: // Aller à position IN / passer au case 3
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: // Aller à position OUT / revenir au case 2
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;// Joystick X - Mouvement Pan
JoyXPos = analogRead(JoyX);
if (JoyXPos > 600) {
stepper2.setSpeed(currentSpeed);
} else if (JoyXPos < 400) {
stepper2.setSpeed(-currentSpeed);
} else {
stepper2.setSpeed(0);
}// Potentiomètre slider
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);
}// Exécuter les commandes - faire tourner les moteurs
stepper1.runSpeed();
stepper2.runSpeed();
stepper3.runSpeed();Code source complet :
/* DIY Camera Slider with Pan and Tilt Head
by Dejan Nedelkovski www.HowToMechatronics.com
Bibliothèque - AccelStepper by Mike McCauley: https://www.airspayce.com/mikem/arduino/AccelStepper/index.html */
#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);
AccelStepper stepper2(1, 5, 4);
AccelStepper stepper3(1, 3, 2);
MultiStepper StepperControl;
long gotoposition[3];
int JoyXPos = 0, JoyYPos = 0, sliderPos = 0;
int currentSpeed = 100, inOutSpeed = 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);
while (digitalRead(limitSwitch) != 0) {
stepper1.setSpeed(3000);
stepper1.runSpeed();
stepper1.setCurrentPosition(0);
}
delay(20);
while (stepper1.currentPosition() != -200) {
stepper1.setSpeed(-3000);
stepper1.run();
}
}
void loop() {
while (digitalRead(limitSwitch) == 0 || stepper1.currentPosition() < -64800) {}
if (digitalRead(JoySwitch) == 0) {
currentSpeed = currentSpeed + 50;
delay(200);
}
if (digitalRead(InOutSet) == 0) {
delay(500);
if (digitalRead(InOutSet) == 0) { InandOut = 4; }
switch (InandOut) {
case 0: InandOut = 1; XInPoint = stepper1.currentPosition(); YInPoint = stepper2.currentPosition(); ZInPoint = stepper3.currentPosition(); digitalWrite(inLED, HIGH); break;
case 1: InandOut = 2; XOutPoint = stepper1.currentPosition(); YOutPoint = stepper2.currentPosition(); ZOutPoint = stepper3.currentPosition(); digitalWrite(outLED, HIGH); break;
case 2: 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: 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;
}
}
JoyXPos = analogRead(JoyX);
if (JoyXPos > 600) stepper2.setSpeed(currentSpeed);
else if (JoyXPos < 400) stepper2.setSpeed(-currentSpeed);
else stepper2.setSpeed(0);
JoyYPos = analogRead(JoyY);
if (JoyYPos > 600) stepper3.setSpeed(currentSpeed);
else if (JoyYPos < 400) stepper3.setSpeed(-currentSpeed);
else stepper3.setSpeed(0);
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();
}
Processus de fabrication
- Slider Motorisé pour Caméra Contrôlé par Bluetooth avec Arduino : Pour des Plans Cinématiques Fluides
- Créer un système Ambilight spectaculaire pour moniteur avec Arduino
- Système de pointage RFID fiable avec Arduino et Python (base de données phpMyAdmin)
- Construire un Voltmètre Intelligent avec Arduino et Smartphone – Projet DIY Facile
- Construire un voltmètre DIY avec Arduino et écran Nokia 5110
- Automates Cellulaires Temps Réel sur Arduino avec Écran OLED 128x64
- Compteur RPM Haute Vitesse Arduino – Algorithme « Single Shot » Novelty
- Construire une Radio FM Compacte avec Arduino Nano et RDA5807M
- Système de pointage RFID temps réel avec Arduino et Google Sheets