For noen år tilbake, trålet jeg som alltid Finn.no. Der snublet jeg over en ganske snasen manuell Dolly til en fornuftig penge.
Etter litt googling fant man ut at denne kunne utstyres med kontroller som gjorde det mulig å kjøre denne dollyen med motor. Men med både motor og kontroller – men da ble prisen vesentlig høyere. Men motoren alene var ikke så dyr.
Som en som raskt tenker «hvor vanskelig kan det være», kjøpe sporenstreks inn steppermotor og brakett fra leverandøren. I tillegg ble det kjøpt inn en stepper kontrollkort – og der har det ligget siden.
Hva er vel bedre enn å børste støv av et slikt prosjekt?
Steppermotor:
Motoren er av typen 17HS15-1684S-PG27X (datablad)
Det er en bipolar motor, med 1.8 grader pr step, og kan trekke 1.68Ampere pr fase. 1,8 grader betyr 200 step pr runde.

Stepperkontroller:
Kontrollerkortet var et DRV8825 fra Pololu (lenke).
I følge skjemaet på produsentens nettside burde det være grei skuring å koble sammen dette

Det ser ut til å være mulig å kjøre microstep ved å benytte M0-M2, så disse bør jeg koble opp.
Strømgrense
Etter å ha sett litt dokumentasjon på 8825-kortet, står det at man skal justere strømgrensen. Motoren kan trekk 1.68A pr fase, mens 8825 kan kun levere 1.5A med kjøling mens kun 1.2 uten. Jeg tenker uansett jeg justerer strømgrensen ned til 1.2A
Formelen for å finne korrekt vref er definert på pololu sine nettsider, men for 8825 er formelen limit = vref *2. Som betyr at jeg skal justere vref til 0.6V for å sette en grense på 1.2A.
Andre grensesnitt:
En timelapse-rigg må jo også støtte kameratilkobling. I et tidligere prosjekt har jeg lekt meg med å trigge kamera fra en Arduino med en optocoupler som legger kamera-selvutløseren til jord. Dette har fungert tidligere, og jeg tenker at det vil fungere greit også i dette scenarioet.
Valg av mikrokontroller:
Jeg har jobbet en del med ESP8266, og har begynt å bli godt kjent med dette kortet. Dog har den et begrenset sett med GPIO tilgjengelig. Konseptuelt ser jeg for meg at jeg må ha kunne bruke 9 samtidige GPIO pinner. 7 til stepper-kontroller, samt 2 til kameratrigging. Denne videoen går i gjennom hvilke pinner som er tilgjengelig i hver av kortene
Det vil da være naturlig å se på en ESP32
Diagram
Edit: R1 og R2 må sløyfes. Det oppnås ikke høy nok spenning på optoisolatorene med 220 ohms resistor i serie.

Kretskort:
Jeg syns ikke dette så ut som noe jeg ønsker prototype på vero-board, så jeg bestiller et printkort.

Kode
For å gjøre prosjektet overkommelig deler jeg det opp i tre hovedbolker.
Steppermotor-kontroll
Kamerastyring
UI
La oss starte med test av steppermotoren.
En rask kodesnutt basert på flere andre kilder på nett, så endte jeg opp med denne;
//kjører steppermotor 40000 step før den snur og kjører tilbake 4000
//step. Gjenta fra toppen.
//Trykker du på boot-knappen på ESP32 vil den også snu, og kjøre
//40k stepp fra der den snur.
#include <Button.h> #define dirPin 26 #define stepPin 25 #define resetPin 32 #define enablePin 33 #define MS1 18 #define MS2 17 #define MS3 16 Button bootButton(0); int totalSteps = 0; int idirection = 1; void setup() { Serial.begin(9600); bootButton.begin(); pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT); pinMode(resetPin, OUTPUT); pinMode(enablePin, OUTPUT); pinMode(MS1, OUTPUT); pinMode(MS2, OUTPUT); pinMode(MS2, OUTPUT); digitalWrite(dirPin, idirection); digitalWrite(resetPin, HIGH); digitalWrite(enablePin, HIGH); digitalWrite(MS1, LOW); digitalWrite(MS2, LOW); digitalWrite(MS3, LOW); } void loop() { totalSteps++; digitalWrite(stepPin, HIGH); delayMicroseconds(500); digitalWrite(stepPin, LOW); delayMicroseconds(500); if (bootButton.pressed()){ Serial.println("Button 1 pressed"); Serial.println(totalSteps); toggle(); } if (totalSteps == 40000){ toggle(); } } void toggle(){ totalSteps = 0; if (idirection == 0){ idirection = 1; } else { idirection = 0; } digitalWrite(dirPin, idirection); }
På grunn av gearkassen koblet på steppermotoren, trenger den hele 40k stepp for å komme fra en side av dollyen til den andre.
//fokuserer, trigger shutter - repeat
#define focusPin 2 #define shutterPin 4 void setup() { // Declare pins as output: Serial.begin(9600); pinMode(focusPin, OUTPUT); pinMode(shutterPin, OUTPUT); } void loop() { delay(5000); Serial.println("focus"); digitalWrite(focusPin, HIGH); delay(5000); Serial.println("shutter"); digitalWrite(shutterPin, HIGH); delay(5000); digitalWrite(focusPin, LOW); digitalWrite(shutterPin, LOW); }