Intro:
Tempo fa ho comprato un aggeggio che vantava la possibilità di fare dei bei timelapse con effetto rotazione (al posto del solito dolly che si muove in linea retta):
MUVI X-Lapse
Con mia amara sorpresa, mi sono reso subito conto che altro non è che un normalissimo timer a carica da cucina ! praticamente ha solo di più la vite per la macchina fotografica!
Onestamente mi aspettavo qualche possibilità in più, così invece il prodotto è molto limitante:
- non è possibile decidere la durata slegata alla rotazione
- la durata max è di un'ora
- non è possibile scegliere un verso
Morale della favola: l'ho distrutto.
Il progetto:
L'idea è quindi di creare qualcosa che rispetti le aspettative iniziali, rimuovendo quindi i difetti del prodotto comprato.
E' venuto spontaneo l'idea di utilizzare uno stepper per poter avere la libertà di rotazione, direzione e velocità.
Per il "prodotto finito" ho ancora le idee un po' vaghe, pensavo di farlo configurabile via bluetooth anzichè con display, in modo da configurarlo da cellulare, è vero che questo da una limitazione, ma anche il vantaggio che la configurazione dovrebbe essere più intuitiva e pratica.
Materiali:
(la lista è temporanea, corrispondente allo stato attuale dello sviluppo)
- arduino uno
- batteria piombo 12v 1.2A
- easy driver
- Stepper 6v 0.8A di recupero (cod: PK244-02A-C58)
Lo stato attuale
dopo varie ricerche ho trovato un buon punto di riferimento il codice trovato su questo tutorial:
http://bildr.org/2011/06/easydriver/
Ho quindi creato un programmino di prova.
In questo caso fa una rotazione completa in mezz'ora (ma basta cambiare le variabili per settare durata e rotazione):
//////////////////////////////////////////////////////////////////
// Rotary TimeLapse Test
// by Lorenzo Boasso
// Reference project: http://bildr.org/2011/06/easydriver/
/////////////////////////////////////////////////////////////////
#define DIR_PIN 8
#define STEP_PIN 9
unsigned long time;
long currentPos = 0;
long finalPos;
long finalTime;
void setup() {
Serial.begin(9600);
time = millis();
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
finalPos = 1600;
finalTime = (millis() / 1000) + (60 * 30);
Serial.print("Partito - ");
Serial.print(millis() / 1000);
Serial.print(" - ");
Serial.println( finalTime);
}
void loop(){
checkStep();
}
void checkStep(){
long currTime = (millis()/1000);
Serial.print("-CURRTIME: ");
Serial.println(currTime);
if (currentPos < finalPos){
int tempStep = (finalPos * currTime) / finalTime;
Serial.print("-TEMP: ");
Serial.println(tempStep);
if (tempStep > currentPos){
rotate(tempStep - currentPos, 0.2);
currentPos = tempStep;
}
}else{
Serial.print("Finito");
}
delay(1000);
}
void rotate(int steps, float speed){
//rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (steps > 0)? HIGH:LOW;
steps = abs(steps);
digitalWrite(DIR_PIN,dir);
float usDelay = (1/speed) * 70;
for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay);
}
}
Differentemente dal codice di riferimento ho cercato di fare in modo che il codice non sia bloccato finchè la rotazione non si completa.
Dovrei studiarmi la funzione rotate() in modo da integrarla maggiormente col codice e le mie necessità.