Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Curseur de caméra DIY avec tête panoramique et inclinable - Projet basé sur Arduino

Dans ce didacticiel, nous allons apprendre à fabriquer un curseur de caméra motorisé avec une tête panoramique et inclinable. Ce projet basé sur Arduino est 100% bricolage, construit avec des matériaux bon marché comme le MDF et le contreplaqué et contrôlé à l'aide d'Arduino, de trois moteurs pas à pas, de quelques boutons et d'un joystick fixé sur un PCB conçu sur mesure. Malgré cela, le résultat final est assez impressionnant, avec des mouvements de caméra super fluides nous permettant d'obtenir des prises de vue cinématographiques de qualité professionnelle.

Vous pouvez regarder la vidéo suivante ou lire le didacticiel écrit ci-dessous.

Aperçu

À l'aide du contrôleur, nous pouvons soit déplacer manuellement la caméra, soit définir des points de début et de fin, puis la caméra se déplacera automatiquement de l'une à l'autre position. En utilisant également le bras de support, nous pouvons monter le curseur même sur un trépied plus petit, à n'importe quel angle que nous voulons et toujours obtenir des mouvements stables.

Pour commencer, j'ai conçu le curseur à l'aide d'un logiciel de modélisation 3D.

Vous pouvez trouver et télécharger ce modèle 3D et obtenir toutes les dimensions du modèle 3D ci-dessous, ainsi que l'explorer dans votre navigateur sur Thangs.

Téléchargez le modèle 3D d'assemblage à partir de Thangs.

Lien de poulie GT2 imprimé en 3D :

 Thingiverse

Construire le curseur de la caméra

J'ai donc commencé par fabriquer les glissières pour lesquelles j'ai utilisé un tuyau en cuivre de 22 mm. J'ai décidé de faire le slider de 1 mètre de long donc j'ai coupé deux morceaux à 1 mètre de long. Les tuyaux en cuivre peuvent facilement s'oxyder, nous devons donc les polir avec un produit de polissage pour métaux. Dans mon cas, je n'en avais pas donc j'ai utilisé un dentifrice à cet effet.

Ce n'était pas la solution parfaite, mais j'ai quand même remarqué une différence et j'ai rendu les tuyaux un peu plus propres.

Ensuite, je suis passé à la fabrication de la base en bois sur laquelle les deux tuyaux seront fixés et qui servira également à monter le curseur sur un trépied. À l'aide d'une scie circulaire, j'ai coupé deux morceaux de contreplaqué de 21 mm et les ai collés ensemble afin d'obtenir un seul morceau de ticker. Ensuite, en utilisant un bois massif, j'ai fabriqué une réplique de ma plaque de montage de trépied et je l'ai fixée à la pièce de contreplaqué à l'aide d'une colle à bois et d'une vis. Maintenant, la base coulissante peut être facilement montée sur le trépied.

Je vais monter les rails coulissants sur la base à l'aide de tiges filetées de 8 mm. J'ai donc fait deux trous dans la base et inséré les tiges de 138 mm de long que je les ai préalablement coupées à la bonne taille. Ensuite, j'ai dû percer des trous de 8 mm dans les tuyaux, ce qui peut être un peu délicat.

À cette fin, j'ai fait un gabarit simple où j'ai soulevé le crayon à une hauteur de 11 mm ou c'est la moitié du diamètre du tuyau. Ensuite, j'ai fixé le tuyau sur une surface plane et à l'aide du gabarit, j'ai marqué le tuyau des deux côtés. Cela permet d'obtenir des trous éclairés avec précision des deux côtés. J'ai donc d'abord marqué les points de perçage avec une pointe de vis pointue, puis je les ai percés progressivement à l'aide de mèches de 2, 4, 6 et 8 mm.

Après cela, j'ai inséré les rails à travers les tiges filetées et à l'aide de rondelles et d'écrous, je les ai fixés à la base du curseur. De la même manière, à l'aide d'un morceau de contreplaqué et d'une tige filetée, j'ai fixé les extrémités des rails.

Vient ensuite la plate-forme coulissante. Encore une fois, j'ai utilisé une scie circulaire pour couper le panneau MDF de 8 mm à la taille selon le modèle 3D. J'ai également fait un trou de 8 mm pour les tiges filetées sur lesquelles le roulement va être fixé. Pour assembler la plate-forme, j'ai utilisé une colle à bois et quelques vis. À l'aide d'une perceuse sans fil, j'ai d'abord fait des avant-trous, puis j'ai fait couler le comptoir et j'ai vissé les vis de 3 mm en place.

Une fois les panneaux fixés, j'ai continué à assembler le système de roulement. Les roulements que j'utilise sont des 608Z avec un diamètre extérieur de 22 mm. Deux rondelles et un écrou entre deux roulements permettent une distance suffisante entre eux permettant ainsi un bon contact avec les rails de 22 mm.

Afin de rendre la plate-forme plus sûre lors de l'utilisation du curseur à un angle, de la même manière, j'ai inséré deux autres jeux de roulements sur le côté inférieur de la plate-forme. À la fin, la plate-forme coulissante s'est avérée fonctionner parfaitement.

Ici, nous pouvons remarquer que maintenant, lors du déplacement de la plate-forme le long du curseur sur mon petit trépied pas très résistant, la tête ne peut pas supporter le poids de la plate-forme, j'ai donc dû fabriquer un bras de support afin de stabiliser le curseur. Donc, en utilisant deux morceaux de bois et quelques écrous et boulons, j'ai fabriqué une simple pince qui peut être fixée à l'une des jambes du trépied.

La pince a un boulon sur lequel le bras de support peut être fixé. Ensuite, j'ai dû faire une fente sur le bras de support afin de pouvoir positionner le curseur à un angle différent. J'ai fait la fente en perçant simplement de nombreux trous de 6 mm les uns à côté des autres, puis en utilisant une râpe, j'ai fait de fines lignes droites. Ce système de support a fini par fonctionner parfaitement.

J'ai continué cette construction en ajoutant des pieds au curseur, au cas où vous ne voudriez pas ou n'auriez pas besoin d'utiliser un trépied. Je les ai fabriqués en MDF de 8 mm. À l'aide d'une scie à main et d'une râpe, j'ai facilement obtenu la forme souhaitée des jambes. Ensuite, en utilisant un peu de colle et deux écrous, je les ai fixés aux extrémités du curseur.

La prochaine étape consiste à construire le système de panoramique et d'inclinaison qui sera fixé sur le dessus de la plate-forme coulissante. À l'aide de la scie circulaire, j'ai coupé toutes les pièces nécessaires, avec les dimensions tirées du modèle 3D. J'ai utilisé quelques morceaux de contreplaqué pour fabriquer le mécanisme de charnière de la plate-forme de mise à niveau de la caméra lorsque le curseur est incliné, ainsi que des panneaux MDF sur lesquels j'ai fait des trous appropriés pour le moteur et les roulements pour le système de panoramique.

Je suis passé à l'installation du moteur pas à pas et de la courroie de distribution de la plate-forme coulissante. D'un côté de la plate-forme, j'ai fixé le moteur pas à pas avec un morceau de panneau MDF et des vis et des boulons. Et de l'autre côté du curseur, j'ai fixé une poulie folle pour que je puisse maintenant installer la courroie de distribution. À l'aide de deux boulons et d'attaches à glissière, j'ai facilement fixé la courroie de distribution à la plate-forme coulissante.

Avec cette étape, le mécanisme coulissant a été complètement terminé.

J'ai continué avec la fabrication des parties supérieures du système pan and tilt. Selon le modèle 3D, j'ai fait tous les trous appropriés pour le moteur pas à pas et les roulements, et j'ai collé et vissé le tout ensemble.

Un de mes amis a imprimé en 3D 2 poulies de 80 dents pour moi. De cette façon, j'ai obtenu une réduction de vitesse de 5 fois par rapport à la poulie à 16 dents fixée sur le moteur pas à pas.

Maintenant, j'avais besoin de fabriquer une courroie de distribution en boucle fermée en fonction de ma configuration, j'ai donc mesuré la longueur de courroie dont j'avais besoin, je l'ai coupée, puis je l'ai simplement collée avec une colle CA et j'ai ajouté un morceau de ruban adhésif par-dessus. La colle CA fait un excellent travail avec le caoutchouc afin que la ceinture à boucle fermée fonctionne sans problème.

Ensuite, j'ai commencé l'assemblage final du système de panoramique et d'inclinaison. J'ai d'abord fixé le moteur d'inclinaison à l'aide de boulons, puis j'ai ajouté les deux roulements en place tout en les fixant dans les fentes avec de l'époxy. Ensuite, j'ai fixé la plate-forme inclinable sur la plate-forme panoramique à l'aide de boulons de 8 mm et, en même temps, j'y ai fixé la poulie à 80 dents avec la courroie de distribution.

Ici, j'ai remarqué que la courroie était un peu lâche mais j'ai ajouté un petit roulement à l'endroit où le boulon du moteur pas à pas va agir comme un tendeur de courroie. Cette chose a fonctionné et maintenant la courroie avait assez de tension pour fonctionner correctement.

Ensuite, j'ai sécurisé le moteur panoramique et ajouté des roulements sur le côté supérieur de la plate-forme de nivellement, ainsi que sur le côté inférieur. Ensuite, j'ai inséré un boulon à travers eux, j'ai ajouté un palier de butée, la poulie à 80 dents et la courroie de distribution, et par-dessus, j'ai ajouté la tête inclinable précédemment assemblée. Enfin, je l'ai fixé à l'aide d'un boulon et c'est tout, avec cette étape, la construction du curseur est terminée.

Schéma du circuit

Ok, vient ensuite la partie amusante ou l'installation des composants électroniques. Voici le schéma de circuit de ce projet de curseur de caméra DIY.

Ainsi, les trois moteurs pas à pas NEMA 17 sont contrôlés via les trois pilotes pas à pas A4988. Pour contrôler le mouvement du curseur, nous utilisons un potentiomètre connecté à une entrée analogique de l'Arduino, et pour contrôler la tête panoramique et d'inclinaison, nous utilisons un module de joystick qui se compose en fait de deux potentiomètres, il est donc connecté à deux entrées analogiques. Il existe également un autre potentiomètre utilisé pour régler la vitesse du mouvement automatique à partir des positions d'entrée et de sortie. Ces positions d'entrée et de sortie sont réglées à l'aide d'un bouton-poussoir. Ce bouton-poussoir a une résistance de rappel et il est connecté à une broche numérique de la carte Arduino. Il y a aussi un bouton-poussoir de réinitialisation, un interrupteur d'alimentation et une prise d'alimentation, ainsi qu'un interrupteur de fin de course pour le curseur et deux LED pour indiquer l'état d'entrée et de sortie. Nous pouvons alimenter ce projet avec 9 ou 12 V.

Vous pouvez obtenir les composants nécessaires à ce projet à partir des liens ci-dessous :

  • Moteur pas à pas (NEMA17)……….
  • Pilote pas à pas A4988…………….
  • Adaptateur 12V 2A…………………..….
  • Joystick …………………………………
  • Prise d'alimentation…………….………….……
  • Carte Arduino ………………………

Conception de circuits imprimés

Ensuite, selon le schéma de circuit, j'ai conçu un PCB personnalisé afin de garder les composants électroniques organisés.

Je l'ai fait en utilisant le logiciel de conception de circuits en ligne gratuit EasyEDA. Le circuit avait pas mal de connexions, j'ai donc utilisé à la fois la couche supérieure et la couche inférieure et j'ai réussi à obtenir un PCB fonctionnel et beau. Une fois cette étape terminée j'ai généré le fichier Gerber nécessaire à la fabrication du PCB. Ensuite, j'ai commandé le PCB à JLCPCB, qui est en fait le sponsor de ce tutoriel.

Ici, nous pouvons simplement télécharger le fichier Gerber et une fois téléchargé, nous pouvons à nouveau revoir notre PCB dans le visualiseur Gerber. Si tout va bien, nous pouvons continuer, sélectionner les propriétés que nous voulons pour notre PCB, puis nous pouvons commander notre PCB à un prix raisonnable. Notez que s'il s'agit de votre première commande chez JLCPCB, vous pouvez obtenir jusqu'à 10 PCB pour seulement 2 dollars.

Néanmoins, après une semaine, les PCB sont arrivés. La qualité des PCB est excellente et je dois admettre qu'il est assez satisfaisant de faire fabriquer votre propre conception de PCB.

Assemblage de l'électronique

Ok, alors je suis ensuite passé à l'assemblage des composants électroniques. J'ai commencé par souder les pin-headers PCB. Cela facilite la connexion et la déconnexion des composants en cas de besoin. J'ai en fait utilisé des en-têtes de broches pour tout sauf les condensateurs et les résistances que j'ai soudés directement sur le PCB. Par conséquent, j'ai continué à souder des fils de connexion à tous les composants électroniques.

De cette façon, je peux facilement monter les composants sur le boîtier du contrôleur et en même temps les connecter au PCB.

Quant au boîtier du contrôleur, j'ai décidé de le fabriquer en acrylique transparent de 4 mm car je voulais que la beauté de tous les composants électroniques soit visible. J'ai utilisé une scie circulaire pour couper les panneaux pour la caisse à la taille. Ensuite, à l'aide d'une perceuse et de forets Forstner, j'ai fait l'ouverture sur le panneau avant pour les boutons, les potentiomètres, l'interrupteur d'alimentation et le joystick. Après cela, à l'aide d'un époxy de 5 minutes, j'ai assemblé le boîtier, et en ce qui concerne le dessus, j'ai inséré et collé deux boulons à travers lesquels le panneau avant peut être inséré et fixé à l'aide d'écrous sur le dessus.

Enfin, j'ai commencé à assembler l'électronique en insérant la carte Arduino et les pilotes pas à pas A4988 sur le PCB. Ensuite, j'ai continué en insérant et en fixant les boutons et les autres composants sur le panneau avant.

Une fois que je les ai sécurisés, j'ai connecté les composants aux en-têtes de broches appropriés sur le PCB. Sur le panneau latéral du boîtier, j'ai ajouté la prise d'alimentation, puis inséré le PCB dans le boîtier. Sur le même panneau, il y a aussi un trou à travers lequel j'ai mis des fils de connexion pour connecter les pilotes avec les moteurs pas à pas, ainsi que l'interrupteur de fin de course que j'ai placé à l'extrémité du curseur.

À l'aide de gaines thermorétractables, j'ai organisé les fils de raccordement sortant du boîtier du contrôleur et enfin, il ne restait plus qu'à connecter le contrôleur aux trois moteurs pas à pas et à l'interrupteur de fin de course.

En ce qui concerne l'alimentation du curseur, j'ai utilisé trois batteries Li-ion de 3,7 V connectées en série produisant environ 11 V. Et voilà, le slider est fait et fonctionne parfaitement.

Code Arduino du curseur de caméra DIY

Maintenant, ce qui reste dans ce tutoriel est de jeter un œil au code Arduino et d'expliquer comment le programme fonctionne. Comme le code est un peu plus long, pour une meilleure compréhension, je posterai le code source du programme dans des sections avec une description pour chaque section. Et à la fin de cet article, je posterai le code source complet.

Le programme est basé sur la bibliothèque AccelStepper de Mike McCauley. Il s'agit d'une bibliothèque incroyable qui permet de contrôler facilement plusieurs moteurs pas à pas en même temps. Donc, une fois que nous avons inclus cette bibliothèque et la bibliothèque MultiStepper.h qui en fait partie, nous devons définir toutes les broches Arduino qui vont être utilisées, définir les instances pour les steppers, ainsi que certaines variables nécessaires au programme ci-dessous.

#include <AccelStepper.h>
#include <MultiStepper.h>

#define JoyX A0       // Joystick X pin
#define JoyY A1       // Joystick Y pin
#define slider A2     // Slider potentiometer
#define inOutPot A3   // In and Out speed potentiometer
#define JoySwitch 10  // Joystick switch connected
#define InOutSet 12   // Set Button
#define limitSwitch 11
#define inLED 8
#define outLED 9

// Define the stepper motors and the pins the will use
AccelStepper stepper1(1, 7, 6); // (Type:driver, STEP, DIR)
AccelStepper stepper2(1, 5, 4);
AccelStepper stepper3(1, 3, 2);

MultiStepper StepperControl;  // Create instance of MultiStepper

long gotoposition[3]; // An array to store the In or Out position for each stepper motor

int JoyXPos = 0;
int JoyYPos = 0;
int sliderPos = 0;
int currentSpeed = 100;
int inOutSpeed = 100;

int XInPoint = 0;
int YInPoint = 0;
int ZInPoint = 0;
int XOutPoint = 0;
int YOutPoint = 0;
int ZOutPoint = 0;
int InandOut = 0;Code language: Arduino (arduino)

Dans la section de configuration, nous définissons les valeurs de vitesse initiales pour les steppers, définissons certains modes de broche et ajoutons les trois steppers à l'instance de contrôle multi-stepper appelée "StepperControl". En utilisant les boucles while, nous déplaçons le curseur vers la position initiale, ou il se déplace jusqu'à ce qu'il appuie sur l'interrupteur de fin de course, puis il recule de 200 pas afin de libérer l'interrupteur de fin de course.

void setup() {
  // Set initial seed values for the steppers
  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);

  // Create instances for MultiStepper - Adding the 3 steppers to the StepperControl instance for multi control
  StepperControl.addStepper(stepper1);
  StepperControl.addStepper(stepper2);
  StepperControl.addStepper(stepper3);

  // Move the slider to the initial position - homing
  while (digitalRead(limitSwitch) != 0) {
    stepper1.setSpeed(3000);
    stepper1.runSpeed();
    stepper1.setCurrentPosition(0); // When limit switch pressed set position to 0 steps
  }
  delay(20);
  // Move 200 steps back from the limit switch
  while (stepper1.currentPosition() != -200) {
    stepper1.setSpeed(-3000);
    stepper1.run();
  }
}Code language: Arduino (arduino)

Dans la section de la boucle, nous commençons par vérifier si le curseur a atteint les positions limites, ou s'il s'agit de l'interrupteur de fin de course ou 80 cm de l'autre côté.

// Limiting the movement - Do nothing if limit switch pressed or distance traveled in other direction greater then 80cm
  while (digitalRead(limitSwitch) == 0 || stepper1.currentPosition() < -64800) {}Code language: Arduino (arduino)

Avec l'instruction if suivante, nous augmentons les vitesses de panoramique et d'inclinaison à chaque pression sur le commutateur du joystick.

// If Joystick pressed increase the Pan and Tilt speeds
  if (digitalRead(JoySwitch) == 0) {
    currentSpeed = currentSpeed + 50;
    delay(200);
  }Code language: Arduino (arduino)

Ensuite, nous vérifions si nous avons appuyé sur le bouton Set, qui est utilisé pour régler les positions IN et OUT. Avec la première pression sur le bouton, nous mémorisons les positions IN des moteurs pas à pas et allumons également la LED IN.

switch (InandOut) { 
      case 0:   // Set IN position
        InandOut = 1;
        XInPoint = stepper1.currentPosition(); // Set the IN position for steppers 1
        YInPoint = stepper2.currentPosition(); // Set the IN position for steppers 2
        ZInPoint = stepper3.currentPosition(); // Set the IN position for steppers 3
        digitalWrite(inLED, HIGH); // Light up inLed
        break;Code language: Arduino (arduino)

De la même manière, avec la deuxième pression, nous mémorisons les positions OUT et allumons la LED OUT.

case 1: // Set OUT position
        InandOut = 2;
        XOutPoint = stepper1.currentPosition(); //  Set the OUT Points for both steppers
        YOutPoint = stepper2.currentPosition();
        ZOutPoint = stepper3.currentPosition();
        digitalWrite(outLED, HIGH);
        break;Code language: Arduino (arduino)

Ensuite, à la prochaine pression sur le bouton, nous lisons la valeur du potentiomètre de vitesse automatique qui sert à régler la vitesse maximale des moteurs. Nous plaçons également les positions IN dans le tableau "gotoposition" qui est utilisé dans la fonction moveTo () qui calcule la vitesse requise pour tous les steppers séparément. Ensuite, en utilisant la fonction runSpeedToPosition(), le curseur se déplace automatiquement en position In.

case 2: // Move to IN position / go to case 3
        InandOut = 3;
        inOutSpeed = analogRead(inOutPot); // Auto speed potentiometer
        // Place the IN position into the Array
        gotoposition[0] = XInPoint;
        gotoposition[1] = YInPoint;
        gotoposition[2] = ZInPoint;
        stepper1.setMaxSpeed(inOutSpeed);
        stepper2.setMaxSpeed(inOutSpeed);
        stepper3.setMaxSpeed(inOutSpeed);
        StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors
        StepperControl.runSpeedToPosition(); // Blocks until all steppers are in position
        delay(200);
        break;Code language: Arduino (arduino)

Exactement de la même manière, dans le cas numéro 3 ou avec une autre pression sur le bouton, nous déplaçons le curseur vers la position OUT.

case 3: // Move to OUT position / go back to case 2
        InandOut = 2;
        inOutSpeed = analogRead(inOutPot);
        // Place the OUT position into the Array
        gotoposition[0] = XOutPoint;
        gotoposition[1] = YOutPoint;
        gotoposition[2] = ZOutPoint;
        stepper1.setMaxSpeed(inOutSpeed);
        stepper2.setMaxSpeed(inOutSpeed);
        stepper3.setMaxSpeed(inOutSpeed);
        StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors
        StepperControl.runSpeedToPosition(); // Blocks until all are in position
        delay(200);
        break;Code language: Arduino (arduino)

Si nous maintenons le bouton Set enfoncé pendant plus d'une demi-seconde, la 4ème déclaration de cas sera exécutée, ce qui réinitialise les positions IN et OUT afin que nous puissions en définir de nouvelles.

Vient ensuite le contrôle du joystick Pan et Tilt. La valeur analogique que nous obtenons du joystick est de 0 à 1024, ou lorsqu'il repose au milieu, les valeurs sont d'environ 500. Donc, si nous déplaçons le joystick vers la gauche et que la valeur analogique est supérieure à 600, nous réglerons la vitesse du moteur particulier au positif, et à l'opposé, si nous déplaçons le joystick vers la droite, nous réglerons la vitesse du moteur sur le négatif, ce qui signifie qu'il tournera dans le sens opposé.

// Joystick X - Pan movement
  JoyXPos = analogRead(JoyX);
  // if Joystick is moved left, move stepper 2 or pan to left
  if (JoyXPos > 600) {
    stepper2.setSpeed(currentSpeed);
  }
  // if Joystick is moved right, move stepper 2 or pan to right
  else if (JoyXPos < 400) {
    stepper2.setSpeed(-currentSpeed);
  }
  // if Joystick stays in middle, no movement
  else {
    stepper2.setSpeed(0);
  }Code language: Arduino (arduino)

S'il reste au milieu, la vitesse est réglée sur 0. Cette méthode est utilisée pour les deux axes du joystick ainsi que pour le potentiomètre à curseur. En fait, dans le cas du potentiomètre, nous utilisons sa valeur analogique pour augmenter également la vitesse du moteur lorsque nous tournons davantage le potentiomètre.

// Slider potentiometer
  sliderPos = analogRead(slider);
  // If potentiometer is turned left, move slider left
  if (sliderPos > 600) {
    sliderPos = map(sliderPos, 600, 1024, 0, 3000);
    stepper1.setSpeed(sliderPos); // Increase speed as turning
  }
  // If potentiometer is turned right, move slider right
  else if (sliderPos < 400 ) {
    sliderPos = map(sliderPos, 400, 0, 0, 3000);
    stepper1.setSpeed(-sliderPos); // Increase speed as turning
  }
  // If potentiometer in middle, no movement
  else {
    stepper1.setSpeed(0);
  }Code language: Arduino (arduino)

Enfin, nous appelons les fonctions runSpeed() pour chacun des trois moteurs pas à pas et qui exécutent les commandes ci-dessus ou font tourner les moteurs de manière appropriée.

// Execute the above commands - run the stepper motors
  stepper1.runSpeed();
  stepper2.runSpeed();
  stepper3.runSpeed();Code language: Arduino (arduino)

Voici le code source complet :

/*
  DIY Camera Slider with Pan and Tilt Head
  by Dejan Nedelkovski
  www.HowToMechatronics.com

  Library - AccelStepper by Mike McCauley:
  http://www.airspayce.com/mikem/arduino/AccelStepper/index.html

*/

#include <AccelStepper.h>
#include <MultiStepper.h>

#define JoyX A0       // Joystick X pin
#define JoyY A1       // Joystick Y pin
#define slider A2     // Slider potentiometer
#define inOutPot A3   // In and Out speed potentiometer
#define JoySwitch 10  // Joystick switch connected
#define InOutSet 12   // Set Button
#define limitSwitch 11
#define inLED 8
#define outLED 9

// Define the stepper motors and the pins the will use
AccelStepper stepper1(1, 7, 6); // (Type:driver, STEP, DIR)
AccelStepper stepper2(1, 5, 4);
AccelStepper stepper3(1, 3, 2);

MultiStepper StepperControl;  // Create instance of MultiStepper

long gotoposition[3]; // An array to store the In or Out position for each stepper motor

int JoyXPos = 0;
int JoyYPos = 0;
int sliderPos = 0;
int currentSpeed = 100;
int inOutSpeed = 100;

int XInPoint = 0;
int YInPoint = 0;
int ZInPoint = 0;
int XOutPoint = 0;
int YOutPoint = 0;
int ZOutPoint = 0;
int InandOut = 0;

void setup() {
  // Set initial seed values for the steppers
  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);

  // Create instances for MultiStepper - Adding the 3 steppers to the StepperControl instance for multi control
  StepperControl.addStepper(stepper1);
  StepperControl.addStepper(stepper2);
  StepperControl.addStepper(stepper3);

  // Move the slider to the initial position - homing
  while (digitalRead(limitSwitch) != 0) {
    stepper1.setSpeed(3000);
    stepper1.runSpeed();
    stepper1.setCurrentPosition(0); // When limit switch pressed set position to 0 steps
  }
  delay(20);
  // Move 200 steps back from the limit switch
  while (stepper1.currentPosition() != -200) {
    stepper1.setSpeed(-3000);
    stepper1.run();
  }

}

void loop() {
  // Limiting the movement - Do nothing if limit switch pressed or distance traveled in other direction greater then 80cm
  while (digitalRead(limitSwitch) == 0 || stepper1.currentPosition() < -64800) {}

  // If Joystick pressed increase the Pan and Tilt speeds
  if (digitalRead(JoySwitch) == 0) {
    currentSpeed = currentSpeed + 50;
    delay(200);
  }
  // If Set button is pressed - toggle between the switch cases
  if (digitalRead(InOutSet) == 0) {
    delay(500);
    // If we hold set button pressed longer then half a second, reset the in and out positions
    if (digitalRead(InOutSet) == 0) {
      InandOut = 4;
    }
    switch (InandOut) { 
      case 0:   // Set IN position
        InandOut = 1;
        XInPoint = stepper1.currentPosition(); // Set the IN position for steppers 1
        YInPoint = stepper2.currentPosition(); // Set the IN position for steppers 2
        ZInPoint = stepper3.currentPosition(); // Set the IN position for steppers 3
        digitalWrite(inLED, HIGH); // Light up inLed
        break;

      case 1: // Set OUT position
        InandOut = 2;
        XOutPoint = stepper1.currentPosition(); //  Set the OUT Points for both steppers
        YOutPoint = stepper2.currentPosition();
        ZOutPoint = stepper3.currentPosition();
        digitalWrite(outLED, HIGH);
        break;

      case 2: // Move to IN position / go to case 3
        InandOut = 3;
        inOutSpeed = analogRead(inOutPot); // Auto speed potentiometer
        // Place the IN position into the Array
        gotoposition[0] = XInPoint;
        gotoposition[1] = YInPoint;
        gotoposition[2] = ZInPoint;
        stepper1.setMaxSpeed(inOutSpeed);
        stepper2.setMaxSpeed(inOutSpeed);
        stepper3.setMaxSpeed(inOutSpeed);
        StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors
        StepperControl.runSpeedToPosition(); // Blocks until all steppers are in position
        delay(200);
        break;

      case 3: // Move to OUT position / go back to case 2
        InandOut = 2;
        inOutSpeed = analogRead(inOutPot);
        // Place the OUT position into the Array
        gotoposition[0] = XOutPoint;
        gotoposition[1] = YOutPoint;
        gotoposition[2] = ZOutPoint;
        stepper1.setMaxSpeed(inOutSpeed);
        stepper2.setMaxSpeed(inOutSpeed);
        stepper3.setMaxSpeed(inOutSpeed);
        StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors
        StepperControl.runSpeedToPosition(); // Blocks until all are in position
        delay(200);
        break;

      case 4: // If Set button is held longer then half a second go back to case 0
        InandOut = 0;
        digitalWrite(inLED, LOW);
        digitalWrite(outLED, LOW);
        delay(1000);
        break;
    }
  }

  // Joystick X - Pan movement
  JoyXPos = analogRead(JoyX);
  // if Joystick is moved left, move stepper 2 or pan to left
  if (JoyXPos > 600) {
    stepper2.setSpeed(currentSpeed);
  }
  // if Joystick is moved right, move stepper 2 or pan to right
  else if (JoyXPos < 400) {
    stepper2.setSpeed(-currentSpeed);
  }
  // if Joystick stays in middle, no movement
  else {
    stepper2.setSpeed(0);
  }

  //Joystick Y - Tilt movement
  JoyYPos = analogRead(JoyY);
  if (JoyYPos > 600) {
    stepper3.setSpeed(currentSpeed);
  }
  else if (JoyYPos < 400) {
    stepper3.setSpeed(-currentSpeed);
  }
  else {
    stepper3.setSpeed(0);
  }

  // Slider potentiometer
  sliderPos = analogRead(slider);
  // If potentiometer is turned left, move slider left
  if (sliderPos > 600) {
    sliderPos = map(sliderPos, 600, 1024, 0, 3000);
    stepper1.setSpeed(sliderPos); // Increase speed as turning
  }
  // If potentiometer is turned right, move slider right
  else if (sliderPos < 400 ) {
    sliderPos = map(sliderPos, 400, 0, 0, 3000);
    stepper1.setSpeed(-sliderPos); // Increase speed as turning
  }
  // If potentiometer in middle, no movement
  else {
    stepper1.setSpeed(0);
  }
  // Execute the above commands - run the stepper motors
  stepper1.runSpeed();
  stepper2.runSpeed();
  stepper3.runSpeed();
}Code language: Arduino (arduino)

Donc ce serait tout, j'espère que vous avez apprécié ce projet Arduino et appris quelque chose de nouveau. N'hésitez pas à poser des questions dans la section des commentaires ci-dessous et à consulter ma collection de projets Arduino.


Processus de fabrication

  1. Curseur de caméra motorisé Arduino contrôlé par Bluetooth
  2. Créer un moniteur Ambilight à l'aide d'Arduino
  3. Système de présence utilisant Arduino et RFID avec Python
  4. Voltmètre DIY utilisant Arduino et Smartphone
  5. Voltmètre DIY avec Arduino et un écran Nokia 5110
  6. Automates cellulaires basés sur Arduino et OLED
  7. Compteur RPM basé sur Arduino avec un nouvel algorithme plus rapide
  8. Radio FM utilisant Arduino et RDA8057M
  9. Système de présence basé sur Arduino et la feuille de calcul Google