Pages: 1 ... 7 8 [9] 10 11 ... 13   Go Down
Author Topic: Protipo shield intervallometro  (Read 15322 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si ora funziona correttamente! pensi che 300000 millisecondi possa "reggerli" il quarzo dell' arduino? Nel senso che può essere preciso nel tempo? vorrei fare un time lapse di 6 mesi..con uno scatto ogni 5 minuti!
Logged

Senago - Milano
Offline Offline
God Member
*****
Karma: 3
Posts: 508
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

onestamente non ti so dire, credo di sì, però se vuoi che siano 5 minuti esatti devi contare, la pausa + i tempi di scatto + i tempi del motore.
quello che mi pare difficile è mantenere alimentato tutto per 6 mesi, sia arduino che macchina fotografica.
ma iniziare con cosa più semplici? già 12 ore son tante!
io l'intervallometro l'ho usato con pause di 10 secondi e fotografavo per un'oretta al tramonto ..
ciao
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

eheh!
no, le cose semplici nn mi piacciono! skerzo, più che altro l' ho già fatto con 1 minuto, ma ora vorrei documentare un evento per 6 mesi (circa).

tutto verrà alimentato a 220v (con alimentatore 12v) sia reflex che arduino, e cambio la SD ogni "tot" settimane..

Comunque ho provato, in 10 minuti ho già 2 scatti...funziona!
Logged

ITALY
Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Lollotek
dopo aver acquistato il libro consigliatomi....mi sono ammalato di Arduinite...e di conseguenza non sono ancora soddisfatto totalmente del risultato,anche se è eccezionale dal punto di vista funzionamento!
Mi sono messo in testa di regolare la velocita del motore tramite potenziometro.
Vorrei però arrivarci da solo, ma mi servirebbe un aiutino per capire dove prendere le nozioni per poter cimentarmi.non sono riuscito a trovare niente nel libro e nel web, quel che ho trovato si riferisce a motori passo passo o dc comandati però da transistor e non da shield come la mia.
Servono per caso delle librerie particolari? dedicate?possibile che nessuno ha avuto un'esigenza come la mia?
PS:
Volevo informare che si riesce benissimo a realizzare un dolly x time lapse con motori dc (motoriduttori) di potenza e ingombri modestistissimi ed ottenere risultati di assoluta precisione nei movimenti del dollly.
Purtroppo non ho dati che si riferiscono in particolare al motore da me utilizzato, perchè trattasi di recupero!, ma quì http://www.robotstore.it/producer/8/MicroMotors.html
ve ne è un campionario x tutte le occasioni!
Ciao.
Logged

Senago - Milano
Offline Offline
God Member
*****
Karma: 3
Posts: 508
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non è per forza necessario trovare il codice già pronto, basta mettere i pezzi assieme.
iniziamo dal potenziometro:
qui ( http://www.arduino.cc/en/Tutorial/Potentiometer ) ed anche di qua ( http://www.arduino.cc/en/Tutorial/AnalogInput) trovi tutte le info necessarie. i fili ai lati vanno messi uno al + ed uno al gnd. mentre l'ultimo ad una porta analogica.
per leggere il valore basta semplicemente un analogRead
Code:
val = analogRead(portaAnalogica);    // in val mi ritrovo la lettura del valore preso dalla porta corrispondente alla variabile portaAnalogica

la seconda parte è capire come regolare la velocità del motore, ed a naso dovrebbe essere questo punto:
Code:
    int value = 255;
     [...]
    analogWrite(E1, value);   
    analogWrite(E2, value);   
qui dovrebbe settare la velocità dei 2 motori (la variabile value è sempre fissa a 255, quindi il massimo).
dobbiamo quindi modificare la variabile value in base al settaggio che fai con il potenziometro.

terzo passaggio: non puoi brutalmente usare il valore letto da potenziometro per regolare la velocità dei motori perchè questi hanno 2 scale diverse. il potenziometro va da 0 a 1023 (vedi link in precedenza), mentre il motore da 0 a 255.
ma non c'è nulla di cui preccuparsi, c'è una simpatica funzione chiamata "map" che riproporziona i valori http://www.arduino.cc/en/Reference/map

Code:
var = map (<numero da riscalare>,<minimo valore scala>,<massimo numero scala>,<minimo valore scala di destinazione>,<massimo valore scala di destinazione> )

alla fine della fiera sono solo 3 righe da aggiungere:
  • la dichiarazione di una variabile dove mettere la porta di lettura potenziometro
  • lettura del valore del potenziometro
  • scalare il valore letto a quello da mandare ai motorini

Code:
   
int potPin = 2; // collegare il piedino centrale del potenziometro alla porta analogica 2
[..]
int value = analogRead(potPin);; // leggo dal potenziometro
value = map(value, 0, 1023, 0, 255); // riproporziono il valore sulla scala dei motorini


che unito al tutto dovrebbe essere così:

Code:
//Arduino PWM Speed Control:
int E1 = 6;   
int M1 = 7;
int E2 = 5;                         
int M2 = 4;                           

unsigned long startTime;
long timeout = 1800000; // qui va espresso in millisecondi la durata del programma
int enabled = 1;

int outpin = 11;
int wakepin = 8;

int shutter_on = 200;
int wakeup = 500;

int potPin = 2; // collegare il piedino centrale del potenziometro alla porta analogica 2

void setup()
{
    pinMode(M1, OUTPUT);   
    pinMode(M2, OUTPUT);
   
    pinMode(outpin, OUTPUT);
    pinMode(wakepin, OUTPUT);
 
    startTime = millis();
}

void loop()
{
  if (enabled){
    int value = analogRead(potPin);; // leggo dal potenziometro
    value = map(value, 0, 1023, 0, 255); // riproporziono il valore sulla scala dei motorini
    digitalWrite(M1,HIGH);   
    digitalWrite(M2, HIGH);       
    analogWrite(E1, value);   
    analogWrite(E2, value);   
    delay(2000);
    analogWrite(E1, 0);   
    analogWrite(E2, 0); 
    delay(1000);
   
    scatta();
   
    if ((millis()-startTime) >timeout){
      enabled = 0;
    }
  }
}

void scatta(){
    digitalWrite(wakepin, HIGH);
    delay(wakeup);
    digitalWrite(outpin, HIGH);
    delay(shutter_on);
    digitalWrite(outpin, LOW);   
    digitalWrite(wakepin, LOW);
    delay(50);

}

Note aggiuntive:
  • Se il potenziometro funziona al contrario rispetto a come ti aspetti inverti le polarità
  • Se mettendo al minimo non vuoi che il motore sia proprio a zero puoi cambiare il map tipo così:
    value = map(value, 0, 1023, 150, 255); 
    cioè regoli il valore minimo non a zero, ma un valore più alto

Ovviamente come al solito il codice non è testato, ma ci fidiamo !! smiley-razz

Buon Natale !! smiley-grin

Logged

ITALY
Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vediamo se ho capito!:
Supponiamo che volessi aggiungere altri potenziometri x variare anche i tempi di pausa e di lavoro ; dovrebbe essere all'incirca una cosa simile?:
Code:
//Arduino PWM Speed Control:
int E1 = 6;   
int M1 = 7;
int E2 = 5;                         
int M2 = 4;                           

unsigned long startTime;
long timeout = 1800000; // qui va espresso in millisecondi la durata del programma
int enabled = 1;

int outpin = 11;
int wakepin = 8;

int shutter_on = 200;
int wakeup = 500;

int potPin = 2; // collegare il piedino centrale del potenziometro alla porta analogica 2
int potPin2= 3; // collegare il piedino centrale del potenziometro alla porta analogica 3
int potPin3= 4; // collegare il piedino centrale del potenziometro alla porta analogica 4

void setup()
{
    pinMode(M1, OUTPUT);   
    pinMode(M2, OUTPUT);
   
    pinMode(outpin, OUTPUT);
    pinMode(wakepin, OUTPUT);
 
    startTime = millis();
}

void loop()
{
  if (enabled){
    int value = analogRead(potPin);; // leggo dal potenziometro
    value = map(value, 0, 1023, 0, 255); // riproporziono il valore sulla scala dei motorini
    digitalWrite(M1,HIGH);   
    digitalWrite(M2, HIGH);       
    analogWrite(E1, value);   
    analogWrite(E2, value);
int value = analogRead(potPin2);; // leggo dal potenziometro 3
    value = map(value, 0, 1023, 500, 2000); // riproporziono il valore sulla scala del tempo min 0,5 secondi-max 2 secondi
    delay(potPin2); //tempo di funzionamento dato dal potenziometro 2
    analogWrite(E1, 0);   
    analogWrite(E2, 0);
int value = analogRead(potPin3);; // leggo dal potenziometro 4
    value = map(value, 0, 1023, 500, 6000); // riproporziono il valore sulla scala del tempo min 0,5 secondi-max 6 secondi 
    delay(potPin3); //tempo di pausa dato dal potenziometro 3
   
    scatta();
   
    if ((millis()-startTime) >timeout){
      enabled = 0;
    }
  }
}

void scatta(){
    digitalWrite(wakepin, HIGH);
    delay(wakeup);
    digitalWrite(outpin, HIGH);
    delay(shutter_on);
    digitalWrite(outpin, LOW);   
    digitalWrite(wakepin, LOW);
    delay(50);

}
E' giusto dare un nome come potPin2....3...4...5..6 ecc.?
Ciao.
Logged

Senago - Milano
Offline Offline
God Member
*****
Karma: 3
Posts: 508
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

quasi..
siccome riutilizzi la variabile value non c'è bisogno di reinizializzarla (cioè l' int davanti). quindi o togli davanti l'int oppure cambi il nome della variabile.

Quote
E' giusto dare un nome come potPin2....3...4...5..6 ecc.?
si puoi farlo tranquillamente, però attenzione che non influisce sul comportamento. nel senso che se anche lo chiami potPit342, quello che conta è il valore che gli dichiari in assegnazione, quello è solo un nome. Ed occhio che le porte analogiche vanno dalla 0 alla 5.
ciao
Logged

ITALY
Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho capito! (almeno spero!)
Cosi?
Code:
int potPin = 2; // collegare il piedino centrale del potenziometro alla porta analogica 2
int potPin3= 3; // collegare il piedino centrale del potenziometro alla porta analogica 3
int potPin4= 4; // collegare il piedino centrale del potenziometro alla porta analogica 4

e poi ho corretto così:
Code:
void loop()
{
  if (enabled){
    int value = analogRead(potPin);; // leggo dal potenziometro collegato alla porta analogica 2
    value = map(value, 0, 1023, 0, 255); // riproporziono il valore sulla scala dei motorini
    digitalWrite(M1,HIGH);   
    digitalWrite(M2, HIGH);       
    analogWrite(E1, value);   
    analogWrite(E2, value);
    value = analogRead(potPin3);; // leggo dal potenziometro collegato alla porta analogica 3
    value = map(value, 0, 1023, 500, 2000); // riproporziono il valore sulla scala del tempo min 0,5 secondi-max 2 secondi
    delay(potPin3); //tempo di funzionamento dato dal potenziometro 3
    analogWrite(E1, 0);   
    analogWrite(E2, 0);
    value = analogRead(potPin4);; // leggo dal potenziometro collegato alla porta analogica 4
    value = map(value, 0, 1023, 500, 6000); // riproporziono il valore sulla scala del tempo min 0,5 secondi-max 6 secondi 
    delay(potPin4); //tempo di pausa dato dal potenziometro 4
Mi è sembrato più facile togliere l'int

Tutto questo per evitare l'uso del PC!
Purtroppo ho già realizzato la parte elettronica e racchiuso già il tutto in un contenitore ; testerò i potenziometri su una breadboard, penso poi in seguito di munirla di un connettore a più poli e fare una piccola scatola aggiuntiva con i tre potenziometri che non userò quando realizzerò time lapse con tempi in posa BULB (notturni) ovviamente caricando uno scketch dedicato.
Ciao.
Logged

Senago - Milano
Offline Offline
God Member
*****
Karma: 3
Posts: 508
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

si mi sembra tutto ok, poi voglio vedere i risultati finali !!
ciao
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

per quanto riguarda il progetto con lo stepper, come posso invertire il senso di rotazione?
Logged

Senago - Milano
Offline Offline
God Member
*****
Karma: 3
Posts: 508
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

per quanto riguarda il progetto con lo stepper, come posso invertire il senso di rotazione?

dovrebbe funzionare invertendo l'ordine degli step.
in fondo, sostituisci:
Code:
step ++;
   if (step > 4){
      step = 1;
   }

con :

Code:
step --;
   if (step == 0){
      step = 4;
   }
Logged

ITALY
Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ecco il risultato! smiley
http://youtu.be/hOZ9sHKEwtk
Che ne dici? Tra poco seguirà anche il timelapse! smiley-cool
Logged

Senago - Milano
Offline Offline
God Member
*****
Karma: 3
Posts: 508
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Cavoli è bellissimo !!! :O
Ma tutta la parte meccanica, binari eccetera te li sei fatti da te? voglio un tutorial !!
ciao!
Logged

ITALY
Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allego alcune immagini di quello che ne è scaturito dalle nostre discussioni .......


* barra-dolly.jpg (47.18 KB, 450x338 - viewed 20 times.)

* arduino-da-sopra.jpg (32.96 KB, 450x338 - viewed 23 times.)

* particolare-puleggia.jpg (27.19 KB, 450x338 - viewed 21 times.)

* arduino-messo-sotto-lato-in.jpg (28.43 KB, 338x450 - viewed 20 times.)
Logged

Lago di Como
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Veramente ottimo bombardone! Che batteria utilizzi?
Logged

Pages: 1 ... 7 8 [9] 10 11 ... 13   Go Up
Jump to: