Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

DIY-cameraschuifregelaar met pan- en kantelkop - op Arduino gebaseerd project

In deze tutorial leren we hoe je een gemotoriseerde camera slider met pan en tilt kop maakt. Dit op Arduino gebaseerde project is 100% DIY, gebouwd met goedkope materialen zoals MDF en multiplex en bestuurd met Arduino, drie stappenmotoren, enkele knoppen en een joystick bevestigd op een speciaal ontworpen PCB. Desondanks is het eindresultaat behoorlijk indrukwekkend, met supervloeiende camerabewegingen waardoor we professioneel ogende filmische opnamen kunnen maken.

Je kunt de volgende video bekijken of de schriftelijke tutorial hieronder lezen.

Overzicht

Met behulp van de controller kunnen we de camera handmatig verplaatsen of we kunnen begin- en eindpunten instellen, waarna de camera automatisch van de ene naar de andere positie gaat. Ook met behulp van de draagarm kunnen we de slider zelfs op een kleiner statief monteren, onder elke gewenste hoek en toch stabiele bewegingen krijgen.

Om te beginnen heb ik de slider ontworpen met behulp van 3D-modelleringssoftware.

U kunt dit 3D-model vinden en downloaden en alle afmetingen van het onderstaande 3D-model krijgen, en het ook in uw browser op Thangs verkennen.

Download het 3D-assemblagemodel van Thangs.

3D-geprinte GT2-poelieverbinding:

 Thingiverse

De cameraschuifregelaar bouwen

Dus begon ik met het maken van de schuifrails waarvoor ik 22 mm dikke koperen buis gebruikte. Ik besloot om de schuif 1 meter lang te maken, dus ik sneed twee stukken op 1 meter lengte. Koperen buizen kunnen gemakkelijk oxideren, daarom moeten we ze polijsten met een metaalpoetsmiddel. In mijn geval had ik er geen, dus gebruikte ik een tandpasta voor dat doel.

Dit was niet de perfecte oplossing, maar toch merkte ik verschil en kreeg de leidingen een beetje schoner.

Daarna ging ik verder met het maken van de houten basis waarop de twee pijpen zullen worden bevestigd en ook zal het dienen om de schuif op een statief te monteren. Met een cirkelzaag heb ik twee stukken ticker multiplex van 21 mm gesneden en aan elkaar gelijmd om een ​​enkel ticker-stuk te krijgen. Vervolgens heb ik met massief hout een replica gemaakt van mijn statiefmontageplaat en deze met houtlijm en een schroef aan het stuk triplex bevestigd. Nu kan de schuifvoet eenvoudig op het statief worden gemonteerd.

Ik zal de schuifrails op de basis monteren met behulp van 8 mm draadstangen, dus ik maakte twee gaten in de basis en plaatste de 138 mm lange staven die ik eerder op maat had gesneden. Vervolgens moest ik 8 mm teekgaten in de pijpen boren, wat eigenlijk een beetje lastig kan zijn.

Voor dat doel heb ik een eenvoudige mal gemaakt waarbij ik het potlood op een hoogte van 11 mm of dat is de helft van de buisdiameter. Daarna bevestigde ik de pijp op een vlakke ondergrond en met behulp van de mal markeerde ik de pijp van beide kanten. Dit maakt het mogelijk om van beide kanten nauwkeurig uitgestoken gaten te krijgen. Dus eerst markeerde ik de boorpunten met een scherpe schroefpunt en boorde ze vervolgens progressief met een boor van 2, 4, 6 en 8 mm.

Daarna heb ik de rails door de draadstangen gestoken en met behulp van enkele ringen en moeren vastgemaakt aan de glijvoet. Op een vergelijkbare manier heb ik met een stuk triplex en een draadstang de uiteinden van de rails vastgezet.

Het volgende is het glijdende platform. Opnieuw heb ik een cirkelzaag gebruikt om de 8 mm dikke MDF-plaat op maat te zagen volgens het 3D-model. Ik heb ook een gat van 8 mm gemaakt voor de draadstangen waarop het lager wordt bevestigd. Voor het monteren van het platform heb ik houtlijm en wat schroeven gebruikt. Met behulp van een accuboormachine heb ik eerst geleidegaten gemaakt, daarna de gootstenen gemaakt en de 3 mm-schroeven op hun plaats geschroefd.

Nadat de panelen waren vastgezet, ging ik verder met het monteren van het lagersysteem. De lagers die ik gebruik zijn 608Z met een buitendiameter van 22 mm. Twee ringen en een moer tussen twee lagers zorgen voor voldoende afstand tussen hen, waardoor een goed contact met de 22 mm-rails mogelijk is.

Om het platform veiliger te maken wanneer de slider onder een hoek wordt gebruikt, heb ik op dezelfde manier nog twee sets lagers aan de onderkant van het platform geplaatst. Uiteindelijk bleek het schuifplateau perfect te werken.

Hier kunnen we opmerken dat wanneer ik het platform nu langs de schuif op mijn kleine, niet zware statief beweeg, de kop het gewicht van het platform niet kan dragen, dus ik moest een ondersteunende arm maken om de schuif te stabiliseren. Dus met behulp van twee stukken hout en wat moeren en bouten heb ik een eenvoudige klem gemaakt die aan een van de statiefpoten kan worden bevestigd.

De klem heeft een bout waarop de draagarm kan worden bevestigd. Vervolgens moest ik een gleuf maken op de draagarm om de slider onder een andere hoek te kunnen plaatsen. Ik maakte de gleuf door simpelweg veel gaten van 6 mm dicht bij elkaar te boren en vervolgens met een rasp fijne rechte lijnen te maken. Dit ondersteunende systeem werkte uiteindelijk perfect.

Ik ging door met deze build door poten aan de slider toe te voegen, voor het geval je geen statief wilt of hoeft te gebruiken. Ik heb ze gemaakt van 8 mm MDF. Met een handzaag en een rasp kreeg ik gemakkelijk de gewenste vorm van de poten. Daarna heb ik ze met wat lijm en twee moeren aan de uiteinden van de schuif vastgezet.

De volgende fase is het bouwen van het pan- en kantelsysteem dat bovenop het schuifplatform wordt bevestigd. Met behulp van de cirkelzaag heb ik alle benodigde stukken gesneden, met de afmetingen uit het 3D-model. Ik heb een paar stukjes multiplex gebruikt om het scharniermechanisme van het nivelleringsplatform voor de camera te maken wanneer de schuifregelaar schuin staat, evenals enkele MDF-platen waarop ik passende gaten heb gemaakt voor de motor en de lagers voor het panning-systeem. /P>

Ik ging verder met het installeren van de stappenmotor en de distributieriem voor het schuifplatform. Aan de ene kant van het platform heb ik de stappenmotor vastgezet met een stuk MDF-plaat en wat schroeven en bouten. En aan de andere kant van de slider heb ik een spanpoelie vastgezet zodat ik nu de distributieriem kan monteren. Met behulp van twee bouten en kabelbinders kon ik de distributieriem gemakkelijk aan het schuifplatform vastmaken.

Met deze stap was het schuifmechanisme helemaal klaar.

Ik ging verder met het maken van de bovenste delen van het pan- en tiltsysteem. Volgens het 3D-model heb ik alle passende gaten voor de stappenmotor en de lagers gemaakt en alles aan elkaar gelijmd en geschroefd.

Een vriend van mij heeft 2 80 tandschijven voor mij 3D geprint. Op deze manier kreeg ik 5 keer snelheidsvermindering ten opzichte van de 16 tands katrol die op de stappenmotor was bevestigd.

Nu moest ik een distributieriem met gesloten lus maken volgens mijn opstelling, dus ik mat de lengte van de riem die ik nodig had, knipte het en plakte het vervolgens gewoon met CA-lijm en voegde er een stuk tape op toe. De CA-lijm doet geweldig werk met rubber, zodat de riem met gesloten lus probleemloos werkt.

Vervolgens ben ik begonnen met de eindmontage van het pan- en tiltsysteem. Eerst heb ik de kantelmotor met enkele bouten vastgezet en vervolgens de twee lagers op hun plaats toegevoegd terwijl ik ze in de sleuven vastzette met wat epoxy. Daarna heb ik het kantelplatform op het panplatform vastgezet met een paar 8 mm bouten en tegelijkertijd heb ik de 80 tands poelie eraan vastgemaakt samen met de distributieriem.

Hier merkte ik dat de riem een ​​beetje los zat, maar ik voegde een klein lager toe op de plaats waar de bout van de stappenmotor gaat dienen als riemspanner. Dit ding werkte en dus nu had de riem genoeg spanning om goed te werken.

Vervolgens heb ik de panmotor vastgezet en lagers toegevoegd aan de bovenzijde van het nivelleerplatform, evenals aan de onderkant. Daarna heb ik er een bout doorheen gestoken, een druklager, de 80 tandpoelie en de distributieriem toegevoegd, en daarbovenop de eerder gemonteerde kantelkop. Uiteindelijk heb ik het met een bout vastgezet en dat is het, met deze stap is de constructie van de schuifregelaar voltooid.

Circuitdiagram

Ok, dan komt het leuke gedeelte of het installeren van de elektronische componenten. Hier is het schakelschema van dit doe-het-zelf-cameraschuifproject.

De drie NEMA 17 stappenmotoren worden dus aangestuurd via de drie A4988 stappenmotoren. Voor het aansturen van de schuifbeweging gebruiken we een potentiometer die is aangesloten op een analoge ingang van de Arduino, en voor het aansturen van de pan- en tiltkop gebruiken we een joystickmodule die eigenlijk uit twee potentiometers bestaat, dus aangesloten op twee analoge ingangen. Er is ook een andere potentiometer die wordt gebruikt voor het instellen van de snelheid van de automatische beweging vanuit de in- en uit-posities. Deze in- en uitposities worden ingesteld met behulp van een drukknop. Deze drukknop heeft een pull-up weerstand en is verbonden met een digitale pin van het Arduino-bord. Er is ook een reset-drukknop, een aan / uit-schakelaar en een stroomaansluiting, evenals een eindschakelaar voor de schuifregelaar en twee LED's voor het aangeven van de in- en uit-status. We kunnen dit project van stroom voorzien met 9 of 12V.

U kunt de benodigde componenten voor dit project vinden via de onderstaande links:

  • Stappenmotor (NEMA17)……….
  • A4988 Stepper-stuurprogramma………….
  • 12V 2A-adapter………………..….
  • Joystick ………………………………
  • Stroomaansluiting………….………….……
  • Arduino-bord ……………………

PCB-ontwerp

Vervolgens heb ik volgens het schakelschema een aangepaste PCB ontworpen om de elektronische componenten georganiseerd te houden.

Ik deed dat met behulp van de gratis EasyEDA-software voor online circuitontwerp. Het circuit had nogal wat aansluitingen, dus ik gebruikte zowel de bovenste als de onderste laag en slaagde erin om functionele en goed uitziende PCB's te krijgen. Toen ik klaar was met deze stap, heb ik de Gerber-bestandsbehoefte gegenereerd voor het vervaardigen van de PCB. Toen bestelde ik de PCB bij JLCPCB, die eigenlijk de sponsor is van deze tutorial.

Hier kunnen we eenvoudig het Gerber-bestand uploaden en eenmaal geüpload kunnen we onze PCB opnieuw bekijken in de Gerber-viewer. Als alles in orde is, kunnen we doorgaan, de eigenschappen selecteren die we voor onze PCB willen, en dan kunnen we onze PCB tegen een redelijke prijs bestellen. Houd er rekening mee dat als het uw eerste bestelling bij JLCPCB is, u tot 10 PCB's kunt krijgen voor slechts 2 dollar.

Toch zijn de PCB's na een week binnen. De kwaliteit van de PCB's is geweldig en ik moet toegeven dat het heel bevredigend is om je eigen PCB-ontwerp te laten maken.

Montage van de elektronica

Oké, dus ik ging verder met het monteren van de elektronische componenten. Ik begon met het solderen van pin headers PCB. Dit maakt het gemakkelijker om de componenten aan te sluiten en los te koppelen wanneer dat nodig is. Ik heb eigenlijk overal pin-headers voor gebruikt, behalve de condensatoren en de weerstanden die ik direct op de print heb gesoldeerd. Daarom ging ik verder met het solderen van jumperdraden naar alle elektronische componenten.

Op deze manier kan ik de componenten eenvoudig op de controllerbehuizing monteren en tegelijkertijd op de print aansluiten.

Wat betreft de behuizing van de controller, heb ik besloten om het uit 4 mm dik transparant acryl te maken omdat ik wilde dat de schoonheid van alle elektronische componenten zichtbaar zou zijn. Ik heb een cirkelzaag gebruikt om de panelen op maat te zagen. Vervolgens heb ik met behulp van een boormachine en Forstner-bits de opening op het voorpaneel gemaakt voor de knoppen, de potentiometers, de aan / uit-schakelaar en de joystick. Daarna heb ik met 5 minuten epoxy de behuizing in elkaar gezet en wat betreft de bovenkant heb ik twee bouten geplaatst en gelijmd waardoor het voorpaneel kan worden gestoken en vastgezet met behulp van moeren erop.

Uiteindelijk ben ik begonnen met het monteren van de elektronica door het Arduino-bord en de A4988-stappendrivers op de printplaat te plaatsen. Daarna ging ik verder met het plaatsen en vastzetten van de knoppen en de andere componenten op het voorpaneel.

Toen ik ze eenmaal had vastgezet, verbond ik de componenten met de juiste pin-headers op de PCB. Op het zijpaneel van de behuizing heb ik de stroomaansluiting toegevoegd en vervolgens de PCB in de behuizing gestoken. Op hetzelfde paneel is er ook een gat waardoor ik jumperdraden heb geplaatst om de drivers met de stappenmotoren te verbinden, evenals de eindschakelaar die ik aan het einde van de slider heb geplaatst.

Met behulp van wat krimpkous heb ik de jumperdraden die uit de behuizing van de controller kwamen georganiseerd en ten slotte moest ik de controller verbinden met de drie stappenmotoren en de eindschakelaar.

Wat betreft het aandrijven van de schuifregelaar heb ik drie 3.7V Li-ion-batterijen gebruikt die in serie zijn geschakeld en ongeveer 11V produceren. En dat is alles, de slider is klaar en werkt perfect.

DIY Camera Slider Arduino-code

Wat overblijft in deze tutorial is om de Arduino-code te bekijken en uit te leggen hoe het programma werkt. Omdat de code wat langer is, zal ik voor een beter begrip de broncode van het programma in secties plaatsen met een beschrijving voor elke sectie. En aan het einde van dit artikel zal ik de volledige broncode posten.

Het programma is gebaseerd op de AccelStepper-bibliotheek van Mike McCauley. Dit is een ongelooflijke bibliotheek die eenvoudige bediening van meerdere stappenmotoren tegelijk mogelijk maakt. Dus zodra we deze bibliotheek en de MultiStepper.h-bibliotheek die er deel van uitmaakt, hebben opgenomen, moeten we alle Arduino-pinnen definiëren die zullen worden gebruikt, de instanties voor de steppers definiëren, evenals enkele variabelen die nodig zijn voor het onderstaande programma.

#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)

In de setup-sectie stellen we de initiële snelheidswaarden voor de steppers in, definiëren we enkele pin-modi en voegen we de drie steppers toe aan de multi-stepper-besturingsinstantie genaamd "StepperControl". Met behulp van de while-loops verplaatsen we de schuifregelaar naar de beginpositie, of hij beweegt totdat hij op de eindschakelaar drukt en dan gaat hij 200 stappen terug om de eindschakelaar vrij te geven.

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)

In het lusgedeelte beginnen we met te controleren of de slider de eindposities heeft bereikt, of dat de eindschakelaar of 80cm aan de andere kant ervan is.

// 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)

Met de volgende if-instructie verhogen we de pan- en tilt-snelheden met elke druk op de joystickschakelaar.

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

Vervolgens controleren we of we de Set-knop hebben ingedrukt, die wordt gebruikt voor het instellen van de IN- en OUT-posities. Met de eerste druk op de knop slaan we de IN-posities van stappenmotoren op en lichten ook de IN-LED op.

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)

Op dezelfde manier slaan we met de tweede druk op de knop de OUT-posities op en lichten de OUT-LED op.

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)

Vervolgens lezen we met de volgende druk op de knop de waarde van de automatische snelheidspotentiometer die wordt gebruikt om de maximale snelheid van de motoren in te stellen. We plaatsen ook de IN-posities in de "gotoposition" -array die wordt gebruikt in de moveTo() -functie die de vereiste snelheid voor alle steppers afzonderlijk berekent. Met behulp van de runSpeedToPosition()-functie gaat de schuifregelaar automatisch naar de In-positie.

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)

Op precies dezelfde manier, in geval nummer 3 of met nog een druk op de knop, verplaatsen we de schuifregelaar naar de OUT-positie.

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)

Als we de Set-knop langer dan een halve seconde ingedrukt houden, wordt de 4e case-opdracht uitgevoerd, die de IN- en OUT-positie opnieuw instelt, zodat we nieuwe kunnen instellen.

Het volgende is de joystick Pan en Tilt controle. De analoge waarde die we van de joystick krijgen is van 0 tot 1024, of wanneer deze in het midden rust, is de waarde ongeveer 500. Dus als we de joystick naar links bewegen en de analoge waarde is groter dan 600, dan stellen we de snelheid in van de specifieke motor naar positief, en tegengesteld, of we bewegen de joystick naar rechts, we stellen de snelheid van de motor in op negatief, wat betekent dat hij in de tegenovergestelde richting zal draaien.

// 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)

Als het in het midden blijft, wordt de snelheid op 0 gezet. Deze methode wordt gebruikt voor zowel de assen van de joystick als de schuifpotentiometer. In het geval van de potentiometer gebruiken we de analoge waarde ervan om ook de snelheid van de motor te verhogen naarmate we de potentiometer verder draaien.

// 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)

Ten slotte noemen we de runSpeed()-functies voor elk van de drie stappenmotoren en die de bovenstaande opdrachten uitvoeren of de motoren op de juiste manier roteren.

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

Hier is de volledige broncode:

/*
  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)

Dus dat zou alles zijn, ik hoop dat je genoten hebt van dit Arduino-project en iets nieuws hebt geleerd. Stel gerust een vraag in de opmerkingen hieronder en bekijk mijn Arduino Projects-collectie.


Productieproces

  1. Arduino Bluetooth-gestuurde gemotoriseerde cameraschuifregelaar
  2. Maak Monitor Ambilight met Arduino
  3. Aanwezigheidssysteem met Arduino en RFID met Python
  4. DIY voltmeter met Arduino en smartphone
  5. DIY voltmeter met Arduino en een Nokia 5110-display
  6. Arduino en OLED-gebaseerde mobiele automaten
  7. Op Arduino gebaseerde RPM-teller met een nieuw en sneller algoritme
  8. FM-radio met Arduino en RDA8057M
  9. Aanwezigheidssysteem op basis van Arduino en Google Spreadsheet
  10. Muziek maken met een Arduino
  11. Slimme energiemonitor op basis van Arduino