Dolly Project con arduino – prima parte

Mesi fa ho promesso che avrei ralizzato un esempio di Dolly project prendendo spunto da quanto realizzato e mostrato in un video da Trevis, appassionato arduino e fotografia come tanti che seguono questo Blog.

dolly project montato

Oggi vedrai la prima parte di questo progetto e potrai iniziare a progettare la parte meccanica del tuo Dolly da pilotare con gli sketch che ti propongo.

Se non sai cosa sia un dolly per la fotografia ecco alcune informazioni:

Cos’é un Dolly ?

Un dolly è un cavalletto o carrello per macchina fotografica solitamente utilizzato per eseguire foto con la tecnica del time lapse, ci son molte versioni di dolly la più comune vista su internet è quella in cui il carrello è fisso e la macchina fotografica è montata su una testa mobile che scorre lungo le barre del carrello.

Dolly Project tipo Standard

Navigando in internet ho trovato anche versioni più complesse di questo progetto:

Dolly project tipo Tripod

Cos’é la fotografia time-lapse o timelapse ?

Direttamente da Wikipedia:

La fotografia time-lapse (dall’inglese time: tempo e lapse: intervallo quindi fotografia ad intervallo di tempo), o semplicemente time-lapse, è una tecnica cinematografica nella quale la frequenza di cattura di ogni fotogramma è molto inferiore a quella di riproduzione. A causa di questa discrepanza, la proiezione con un frame rate standard di 24 fps fa sì che il tempo, nel filmato, sembri scorrere più velocemente del normale

Dove trovo tutto il materiale elettronico ?

Io ho acquistato tutto il materiale da Robot-Domestici che in un paio di giorni mi ha inviato sia l’arduino sia la motor shield fe, il motore passo paso che ho utilizzato per il progetto l’ho recuperato da una stampante epson rotta ed è un em257. Ho visto che nei giorni scorsi sul sito robot-domestici è comparso già un kit completo per realizzare la parte elettronica del Dolly, lasciano a te la parte meccanica da realizzare secondo la tua fantasia.

La parte elettrica, ossia i collegamenti del Display LCD e dei pulsanti, per non complicarti la vita ho realizzato il Dolly con soli 3 pulsanti, l’occorrente per questo primo tutorial:

  • 1 Arduino 2009/Uno/Mega
  • 3 pulsanti NA (normalmente aperti)
  • 3 resistenze da 10KΩ
  • 1 potenziometro da 10KΩ
  • 1 LCD da una riga o più, io ho utilizzato un 1×40 ( 1 linea, 40 caratteri )
completano la parte elettrica del dolly:
  • la motor shield fe
  • un motore passo-passo bipolare

Passa a collegare l’LCD come mostrato nello schema e come hai già visto in altri articoli su Arduino e i display LCD:

schema collegamento LCD per Dolly

collega anche i pulsanti e le resistenze da 10KΩ come nello schema.

Ora sei pronto per caricare lo sketch su Arduino e iniziare i tuoi esperimenti:

#include <LiquidCrystal.h>

// Input Digitali
int prev = A0;
int next = A1;
int conf = A2;

// Menu Level
char* menu_principale[3]  =  {"Settaggio","Controllo","Avvio"};
char* submenu[3]          =  {"Numero passi x scatto","Intervallo tra i passi","Numero scatti"};

// Init level
int ngiri=0;
float interv=0;
int scatti=0;

int posizione=0;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  lcd.begin(40, 1);
  lcd.print("Dolli Project - mauroalfieri.it");
  delay( 1000 );
  lcd.clear();
  lcd.print( menu_principale[posizione] );
}

void loop() {
  lcd.setCursor(0, 1);
  int pnext = analogRead( next );
  int pprev = analogRead( prev );
  int pconf = analogRead( conf );

  if ( pnext > 1000 || pprev > 1000 || pconf > 1000)
  {
    if ( pnext > 1000 ) { posizione++; lcd.clear(); }
    if ( pprev > 1000 ) { posizione--; lcd.clear(); }

    if ( posizione >= 3 ) posizione = 0;
    if ( posizione < 0 )  posizione = 2;

    lcd.print( menu_principale[posizione] );
    delay(200);

    if ( pconf > 1000 ) {
      lcd.clear();
      switch ( posizione )
      {
        case 0:
          ngiri=0;
          interv=0;
          scatti=0;
          Setting();
          lcd.clear();
          lcd.print( menu_principale[0] );
        break;

        case 1:
          View();
          lcd.clear();
          lcd.print( menu_principale[1] );
        break;

        case 2:
          Go();
          lcd.clear();
          lcd.print( menu_principale[2] );
        break;
      }
    }
  }
}

void View()
{
  for (int i=0; i<3; i++)
  {
    lcd.clear();
    lcd.print( submenu[i] );
    lcd.setCursor(strlen( submenu[i] ), 1);
    lcd.print( ": " );
    lcd.setCursor(strlen( submenu[i] )+2, 1);

    if ( i == 0 ) { lcd.print( ngiri ); }
    if ( i == 1 ) { lcd.print( interv ); lcd.setCursor(strlen( submenu[i] )+8, 1); lcd.print( "sec" ); }
    if ( i == 2 ) { lcd.print( scatti ); }

    delay( 1000 );
  }
}

void Setting()
{
  int i = 0;
  boolean message = true;

  while ( i < 3 )
  {
    int pnext = analogRead( next );
    int pprev = analogRead( prev );
    int pconf = analogRead( conf );

    if ( message )
    {
      lcd.print( submenu[i] );
      lcd.setCursor(strlen( submenu[i] ), 1);
      lcd.print( ": " );
      message = false;
    }

    if ( pnext > 1000 || pprev > 1000 || pconf > 1000)
    {
      if ( pnext > 1000 )
      {
        lcd.setCursor(strlen( submenu[i] )+2, 1);
        if ( i == 0 ) { ngiri++; lcd.print( ngiri ); }
        if ( i == 1 ) { interv += 0.5; lcd.print( interv ); lcd.setCursor(strlen( submenu[i] )+8, 1); lcd.print( "sec" ); }
        if ( i == 2 ) { scatti++; lcd.print( scatti ); }
      }
      if ( pprev > 1000 )
      {
        lcd.setCursor(strlen( submenu[i] )+2, 1);
        if ( i == 0 ) { ngiri--; lcd.print( ngiri ); }
        if ( i == 1 ) { interv -= 0.5; lcd.print( interv ); lcd.setCursor(strlen( submenu[i] )+8, 1); lcd.print( "sec" ); }
        if ( i == 2 ) { scatti--; lcd.print( scatti ); }
      }
      if ( pconf > 1000 )
      {
        lcd.clear();
        i++;
        message = true;
      }
    }
   delay( 200 );
  }
}

void Go()
{
  lcd.print( "Avvio del dolly" );
  delay( 3000 );
}

Avrai notato sia nello schema sia nello sketch manca un parte importante quella di connessione al motore passo-passo e la parte di sketch per pilotarlo, nei miei articoli si sono molti articoli in cui puoi comprendere come collegare il tuo motore passo-passo e come pilotarlo, cmq nei prossimi articoli ti mostro come collegare e pilotare sia un motore passo passo bipolare sia unipolare; li ho volutamente separati da questo articolo per poter dedicare la spiegazione al codice di impostazione dei settaggi del dolly.

linea 01: includi la libreria LiquidCrystal.h necessaria a semplificarti la gestione dell’LCD;

linee 04-06: imposta i pin di input analogico: A0,A1 e A2

linea 09: definisci un array di tipo char con le voci del menu principale;

linea 10: definisci un array di tipo char con le voci del menu secondario;

linee 13-15: definisci le tre variabili che utilizzerai per memorizzare le informazioni di funzionamento: numero di passi x scatto, intervallo tra i passi e numero di scatti. In pratica definendo 5 passi x scatto con un intervallo di 0,5sec e 10 scatti da eseguire otterrai che ciascuno scatto avverrà a 2,5 sec dall’altro (5 x 0,5) e dovendone realizzare 10 tutta la sequenza durerà 25 sec ( 2,5 x 10 );

linea 17: definisci un puntatore di posizione in cui memorizzerai il menu in cui ti trovi;

linea 20: inizializza l’oggetto lcd come istanza della classe LiquidCrystal.h;

linea 23: imposta il tipo di display, nel mio esempio è un 40 caratteri 1 linea;

linea 24: scrivi sul display un messaggio, questo indica che il display è collegato bene e precede l’inizio del programma;

liena 25: attendi 1 secondo prima di procedere oltre, il tempo necessario a leggere il messaggio sul display;

linea 26: pulisci il messaggio sul display;

linea 27: scrivi la prima voce di menu sul display;

linea 31: imposta il cursore al primo carattere della prima linea, il primo carattere di un display è 0;

linee 32-34: leggi con il comando analogRead il valore sui pin analogici A0,A1 e A2 e assegnali ciascuno alla variabile corrispondente;

linea 36: verifica che almeno uno dei pulsanti sia stato premuto, fino a quando non premi alcun pulsante il ciclo loop() continua senza eseguire modifiche al messaggio o avanzare tra i menu. Considera che i pin analogici, collegati come nello schema, ricevono costantemente il valore 0, alla pressione di uno di essi il valore letto da analogRead() diventa 1023, ho impostato il controllo come > 1000 per evitare falsi positivi dovuti a insufficiente pressione o collegamenti fallaci;

linee 38-39: sono simili, variano il valore della variabile posizione in funzione della pressione del pulsante definito come next o come prev, questi due pulsanti saranno sempre utilizzati per incrementare o decrementare un valore, il terzo pulsante ti serve come conferma della scelta fatta;

linea 41: imposta il controllo sul margine superiore, le voci di menu sono 3, ossia da 0 a 2 come indice dell’array, per cui il valore assegnato alla variabile posizione non può essere superiore a 2 e non deve mai andare sotto 0;

linea 42: imposta il controllo sul margine inferiore della variabile posizione;

linea 44: scrivi sul display il valore della voce di menu principale corrispondente alla posizione in cui ti trovi;

linea 45: imposta un tempo di attesa di 200 millisecondi in cui ogni pressione dei pulsanti non causa nessuna variazione, questo passaggio è molto importante e puoi regolarlo con il tempo che ritieni più adeguato al tuo modo di utilizzare il dolly, se aumenti questo valore ottieni una risposta meno immediata del cambio menu alla pressione dei pulsanti next o prev, se lo diminuisci aumenta la velocità in cui cambi da un menu all’altro.

linea 47: imposta un controllo sulla pressione del pulsante “conf” conferma o invio con il quale confermi la scelta effettuata;

linea 48: pulisce il display per mostrare la frase succesiva;

linea 49: con la funzione switch() controlla la posizione del cursore sul menu principale e seleziona la funzione corrispondente;

linea 51: se la posizione è 0, il menu principale è nella posizione Settaggio, alla pressione del pulsante conferma il sotto menu ti consente di impostare i valori relativi alle voci del Dolly;

linee 52-54: reimposta a 0 i 3 valori dei parametri relativi ai settaggi del Dolly;

linea 55: richiama la funzione Setting() che provvede a farti impostare i parametri del Dolly;

linee 56-57: dopo l’eseguzione della funzione Setting() è necessario pulire il display e scrivere la voce del menu principale da cui sei partito;

linee 60-64: richiamano la funzione View() allo stesso modo della funzione Setting, senza reimpostare i parametri;

linee 66-70: richiamano la funzione Go() che esegue il movimento del motore passo passo secondo i parametri impostati;

linea 76: definisci la funzione View() di tipo void in quanto non deve restituire alcun valore;

partiamo dalla funzione View anche se non è la prima in ordine di visualizzazione nel menu principale in quanto è la più semplice e allo stesso tempo racchiude concetti utili anche alle altre funzioni.

linea 78: inizia un ciclo da 0 a 2 ( 0,1 e 2 ) quante sono le voci del sottomenu;

linea 80: pulisce il display ad ogni giro del for;

linea 81: scrive la label del sottomenu corrispondente alla posizione i del ciclo for;

linea 82: sposta il cursore oltre la frase del menu, per farlo puoi utilizzare il metodo setCursor della classe lcd che accetta 2 parametri: il primo è il carattere a cui deve posizionare il cursore ed il secondo è la linea a cui posizionarsi. Per il primo parametro puoi ricavarlo dinamicamente con la funzione strlen() usata su una Stringa;

linea 83: scrivo la stringa “: ” alla fine del testo;

linea 84: come alla linea 82 sposto il cursore alla fine del testo sommando alla lunghezza della voce di menu i 2 caratteri appena aggiunti;

linee 86-88: per ciascun valore di i printo a video il valore del parametro corrispondente, al primo utilizzo della funzione di controllo saranno tutti a 0 se non li hai impostati precedentemente;

linea 90: attendi 1 sec prima di avanzare nel ciclo for, questo ti permette di leggere i valori impostati per i 3 menu;

linea 94: definisci la funzione Setting()

linee 96-97: imposta due valori che utilizzerai in seguito nella funzione;

linea 99: utilizzando il comando while() inizia un ciclo verificando il valore di i impostato alla linea 96;

linee 101-103: imposta i valori dei pulsanti leggendoli come segnale analogico dalle rispettive uscite, l’operazione è identica a quella già eseguita alle linee 32-34 e serve per rileggere questo valore ad ogni ciclo while.

linea 105: verifica che la variabile message sia a true per scrivere sul display il messaggio relativo al sottomenu corrente, questo controllo evita che il testo lampeggi ad ogni pressione dei pulsanti;

linee 107-109: sono identiche alle linee 81-83;

linea 110: imposta a false il valore di message per evitare il lampeggiare del testo sul display;

linea 113: è identica alla linea 36;

linea 115: controlla la pressione del pulsante next;

linea 117: posiziona il cursore oltre il testo sul display, vedi linea 84;

linee 118-120: in funzione del valore di i incrementa la variabile corrispondente e ne scrive il valore a video. La linea 119 scrive in più l’unità di misura dopo il valore impostato;

linee 122-128: esegui le stesse operazioni viste per le linee da 115 a 121 con la variante che decrementa ogni valore alla pressione del pulsante assegnato ad A1 e definito come prev;

linea 129: controlla la pressione del pulsante conferma;

linea 131: pulisci il display;

linea 132: incrementa il valore di i questo serve per navigare nel sottomenu ad ogni pressione del pulsante conf;

linea 133: imposta il valore di message a true perchè alla linea 105 il controllo sia positivo e il nuovo messaggio venga scritto sul display;

linea 136: attendi un tempo di 200 millisecondi prima di far ripartire un nuovo ciclo del while questa attesa ha la stessa funzione della linea 45, attendere che la pressione ed il rilascio del pulsante o una differenza di segnale dovuta al contatto interno al pulsante causino una variazione non prevista nell’impostazione dei parametri;

linee 140-144: definisci la funzione Go() all’interno della quale scriverai le righe di sketch necessarie a spostare il motore e premere il pulsante di scatto della macchina fotografica.

Come ho scritto sopra in questo articolo ho volutamente evitato di scrivere linee di codice relative alla funzione Go() in quanto vorrei che questo codice possa essere utilizzato sia con motori passo-passo di tipo unipolare sia di tipo bipolare.

In futuri articoli provvederò a scrivere sia il codice per un motore bipolare sia per uno unipolare, ti invito intento a leggere i miei articoli su questi motori ed in particolare le differenze tra uno e l’altro al fine di riconoscere quello che già possiedi o di effettuare la scelta migliore se ne devi acquistare uno per il tuo progetto.

Buona scelta.

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/dolly-project-arduino.html

21 pings

Skip to comment form

  1. […] l’articolo sulla prima parte del progetto Dolly in questo tutorial vedrai come realizzare la parte elettronica del tuo Dolly […]

  2. […] Un contatto del pulsante lo colleghi al polo positivo e l’altro al polo negativo attraverso una resistenza da 330Ω di quelle fornite nel kit, allo stesso pin del pulsante colleghi una delle uscite arduino A0, A1 e A2 come descritto nel progetto Dolly I. […]

  3. […] I test li ho realizzati con un motore bipolare, identico a quello mostrato negli articoli del Dolly Project. […]

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.