Dolly Project II con arduino

Il Dolly Project II nasce per soddisfare la voglia di fare di tutti gli appassionati di fotografia e time-lapse che hanno acquistato il kit dolly proposto da robotics-3d

dolly-II

Ho acquistato i componenti che compongono il kit e modificato il mio sketch per adattarlo al display 16×2 e al motore passo passo bipolare fornito.

In ordine: lista della spesa, assemblaggio, sketch e demo della programmazione.

Lista della spesa

Il Kit proposto ha già al suo interno:

  • 1 starter kit 2 con arduino rev 3
  • l’arduino motor shield fe
  • 1 stepper motor
Per realizzare il tuo Dolly è sufficente ed in taluni casi anche abbondante, nel senso che puoi anche aggiungere altre particolarità al robot sfruttando i componenti aggiuntivi presenti nello starter kit 2.

Assembla il tutto

L’assemblaggio potrebbe spaventarti visto il numero di componenti coinvolti ecco perchè ho realizzato qualche foto di esempio.

I pulsanti devono essere collegati come in figura:

pulsanti e resistenze sul dolly

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.

Il motore puoi collegarlo seguendo i colori:

connessione motore dolly

i terminali giallo e bleu alla fase A e i terminali rosso e verde alla fase B sulla motor shield FE. I jumper della shield  puoi lasciarli invariati rispetto al primo progetto.

Il collegamneto dell’LCD è descritto in questo articolo.

Lo Sketch

Il vero cuore di tutto è lo sketch:

/*
* Dolly Project II
*
* Usa un LCD la motor shield FE, un motore bipolare
* tre pulsanti per la programmazione, 3 resistenze
*
* Autore: Alfieri Mauro
* Twitter: @mauroalfieri
*
* Tutorial su: https://www.mauroalfieri.it
*
*/

#include <LiquidCrystal.h>

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

// Stepper
int motorPinDirA = 2;
int motorPinDirB = 8;
int motorPinPwmA = 3;
int motorPinPwmB = 9;
int nFase=1;

// Led
int pinLed = 13;

// Menu Level
char* menu_principale[4]  =  {"Settaggio","Controllo","Reset Carrello","Avvio"};
char* submenu[3]          =  {"N. passi x scatto","Intervallo 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, 7, 6, 5, 4);

void setup() {
  lcd.begin(16, 2);
  lcd.print("Dolly Project II");
  lcd.setCursor(0, 1);
  lcd.print("mauroalfieri.it");
  delay( 1000 );
  lcd.clear();
  lcd.print( menu_principale[posizione] );

  digitalWrite( pinLed, LOW );

  pinMode(motorPinDirA, OUTPUT);
  pinMode(motorPinDirB, OUTPUT);
  pinMode(motorPinPwmA, OUTPUT);
  pinMode(motorPinPwmB, OUTPUT);

  pinMode(pinLed, OUTPUT);
}

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 = 3;

    lcd.print( menu_principale[posizione] );
    //lcd.print(millis()/1000);
    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:
          ResetCarrello();
          lcd.clear();
          lcd.print( menu_principale[2] );
        break;

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

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.setCursor(0, 0);
      lcd.print( submenu[i] );
      lcd.setCursor(0, 1);
      message = false;
    }

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

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

    if ( i == 0 ) { lcd.print( ngiri ); }
    if ( i == 1 ) { lcd.print( interv ); lcd.setCursor(6, 1); lcd.print( "sec" ); }
    if ( i == 2 ) { lcd.print( scatti ); }

    delay( 1000 );
  }
}

void ResetCarrello()
{
  lcd.clear();
  lcd.print( "+/- sposta carr" );
  lcd.setCursor(0, 1);
  lcd.print( "C esce" );
  int i = 0;

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

    if ( pnext > 1000 )
    {
      nFase++;
      if ( nFase > 4 ) nFase = 1;
      gira( nFase );
    }
    if ( pprev > 1000 )
    {
      nFase--;
      if ( nFase < 1 ) nFase = 4;
      gira( nFase );
    }
    if ( pconf > 1000 )
    {
      lcd.clear();
      i++;
    }
    delay ( 200 );
  }
}

void Go()
{
  lcd.print( "Avvio del dolly" );
  lcd.clear();

  for ( int sc=0; sc <= scatti; sc++ )
  {
    lcd.setCursor(0, 0);
    lcd.print( "scatto: " );
    lcd.setCursor(8, 0);
    lcd.print( sc );    

    for ( int ng=1; ng <= ngiri; ng++ )
    {
      lcd.setCursor(0, 1);
      lcd.print( "passo: ");
      lcd.setCursor(8, 1);
      lcd.print( ng );    

      gira( nFase );
      nFase++;
      if ( nFase > 4 ) nFase = 1;

      delay( interv * 1000 );
    }

    digitalWrite( pinLed, HIGH );
    delay( 1000 );
    digitalWrite( pinLed, LOW );

  }

}

void gira( int nFase ) {

  switch( nFase )
  {

  case 1:
    digitalWrite(motorPinDirA, HIGH);
    digitalWrite(motorPinDirB, LOW);
    digitalWrite(motorPinPwmA, HIGH);
    digitalWrite(motorPinPwmB, LOW);
  break;

  case 2:
    digitalWrite(motorPinDirA, LOW);
    digitalWrite(motorPinDirB, HIGH);
    digitalWrite(motorPinPwmA, LOW);
    digitalWrite(motorPinPwmB, HIGH);
  break;

  case 3:
    digitalWrite(motorPinDirA, LOW);
    digitalWrite(motorPinDirB, LOW);
    digitalWrite(motorPinPwmA, HIGH);
    digitalWrite(motorPinPwmB, LOW);
  break;

  case 4:
    digitalWrite(motorPinDirA, LOW);
    digitalWrite(motorPinDirB, LOW);
    digitalWrite(motorPinPwmA, LOW);
    digitalWrite(motorPinPwmB, HIGH);
  break;

  }
}

Molte linee le avrai trovate identiche a quelle del Dolly Project – prima versione – quindi ti mostro solo le differenze con questa versione.

Le linee di impostazione sono identiche e ti consentono di modificare i pin a cui è collegato l’LCD, il motore, i pulsanti ed il led che simula lo scatto.

le prima modifiche riguardano le linee 19 e 20:

char* menu_principale[4]  =  {"Settaggio","Controllo","Reset Carrello","Avvio"};
char* submenu[3]          =  {"N. passi x scatto","Intervallo passi","Numero scatti"};

in cui devi adattare i messaggi dei menu ai 16 caratteri del display (16×2) ma in compenso hai 2 righe su cui scrivere vedrai come ho pensato di fartele sfruttare nello sketch.

Nella funzione setup() linee 45-49 ti mostro il primo utilizzo:

lcd.begin(16, 2);
lcd.print("Dolly Project II");
lcd.setCursor(0, 1);
lcd.print("mauroalfieri.it");

ho ridotto e diviso il messaggio di benvenuto su due righe.

linea 46: definisci il display come 16 colonne e 2 righe;

linea 47: scrivi sulla prima riga “Dolly Project II”;

linea 48: sposta il cursore alla seconda riga del display, utilizza il metodo setCursor( carattere, riga ) in questo esempio posiziona il cursore al primo carattere della seconda riga. RICORDA: tutti i riferimenti dell’LCD partono da 0, la prima riga è 0 la seconda è 1, il primo carattere è 0, il secondo è 1 ed il sedicesimo è 15;

linea 49: scrivi “mauroalfieri.it” sulla seconda riga, puoi metterci il tuo nome o un tuo sito, se lasci il mio ogni volta che utilizzi il Dolly ti ricorderai di farmi visita 🙂

La modifica appena vista sebbene semplice ha conseguenze su tutto lo sketch, nel senso che ogni volta che scriverai un messaggio sul display dovrai considerare su quale riga e carattere sei, questo per non sovrascrivere quello che ti interessa mantenere, una caratteristica interessante è che il display non viene ripulito fino a che non decidi di utilizzare il metodo clear() o ti riposizioni in un punto e sovrascrivi il messaggio presente, questo ti permette di non doverti curare delle linee che non ti interessa utilizzare lasciando il messaggio invariato.

Tornando allo sketch altre linee modificate si trovano nelle funzioni Setting(),View(),ResetCarretto() e Go() in particolare alla linee 130-132

lcd.setCursor(0, 0);
lcd.print( submenu[i] );
lcd.setCursor(0, 1);

in cui puoi osservare che la linea 130 imposta il cursore sulla prima riga al primo carattere;

linea 131: scrive la voce di menu corrispondente al secondo menu in cui ti trovi;

linea 132: sposta il cursore al primo carattere della seconda riga, che accoglierà l’impostazione che darai con i pulsanti + e -;

anche all’interno delle linee con cui imposti i parametri del Dolly II c’è una piccola modifica che devi eseguire, le linee 140-142 e 146-148 presentano tutte l’istruzione lcd.setCursor(0,1) prima di scrivere il valore, questa modifica ti garantisce che il cursore sia sempre nella posizione corretta quando andrai a scrivere.

modifoche identiche a quelle appena viste le ritrovi anche nella funzione View() ed in particolare alle linee 165-167 e 169-171:

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

    if ( i == 0 ) { lcd.print( ngiri ); }
    if ( i == 1 ) { lcd.print( interv ); lcd.setCursor(6, 1); lcd.print( "sec" ); }
    if ( i == 2 ) { lcd.print( scatti ); }

    delay( 1000 );
  }
}

e di nuovo nella funzione di ResetCarrello() alle linee 179-182;

In ultimo la funzione Go() la più importante in quanto è quella che muove fisicamente il carrello facendo eseguire al motore i passi impostati nei tempi desiderati e lo scatto.

In questa funzione ho fatto un po di modifiche, alcune identiche alle precedenti altre per migliorare la visualizzazione infatti utilizzando le due righe puoi avere sempre sotto sontrollo lo scatto a cui sei arrivato e il passo che sta eseguendo, nella precedente versione del Dolly avevi solo una di queste informazioni in un dato momento del lavoro.

Per farlo ho deciso di utilizzare la prima riga per tener traccia degli scatti e la seconda dei passi, a tal proposito potrai vedere che le linee 219-222:

lcd.setCursor(0, 0);
lcd.print( "scatto: " );
lcd.setCursor(8, 0);
lcd.print( sc );

scrivono sulla prima riga del display (0,0) la dicitura “sactto: ” e alla posizione riga (8,0) il numero di scatto a cui il Dolly è arrivato, mentre li linee 226-229:

lcd.setCursor(0, 1);
lcd.print( "passo: ");
lcd.setCursor(8, 1);
lcd.print( ng );

ti permettono di gestire la seconda riga con le informazioni relative al passo in cui ti trovi; alla linea 226 posizioni il cursore al primo carattere della seconda riga (0,1);

linea 227: scrivi il messaggio “passo: “;

linea 228: posizioni il cursore alla posizione (8,1);

linea 229: scrivi a video il valore del passo a cui sei arrivato;

tutto il resto dello sketch resta invariato in quanto la funzione di controllo del motore come le altre coinvolte sono identiche a quelle presentate per il primo Dolly.

Il Dolly II a lavoro finito

Ecco il video su come puoi programmare il tuo dolly project II:

Buona realizzazione.

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/dolly-project-ii-con-arduino.html

33 commenti

6 ping

Vai al modulo dei commenti

  1. Interessantissimo progetto utile per dei fantastici timelapse

    1. Grazie Maurizio,
      a breve pubblicherà una versione avanzata anche con il fotoaccoppiatore per adattarlo a diverse macchine fotografiche 🙂

      Mauro

  2. Ciao Mauro sono Andrea e sono un radioamatore IW0UDP e leggendo i tuoi interessantissimi tutorial mi e
    venuto l’ idea che potrei utilizzare il tuo sistema e il software per gestire il Dolly in un diverso uso, ossia per
    gestire un rotore d’antenna tramite i controlli del PP. Utilizzando un PP da 200 step per giro ,il PP e’ un Minibea tipo 23LM-C210-03h 3,5 V / phase 1,1 A /phase 1,8 Deg / step accopiato con giunto cardanico a un ridutore
    con vite senza fine con atuazione traversale del moto in raporto 13/ 1 ,ossia a tredici giri del PP corrispondono
    un giro di atuazione overo 360 gradi o ancora 2600 passi ,ancora 7,22 step per grado.Quindi dallo Sketch
    dovrei eliminare lo scatto fotografico, inserire due input di inizio e fine corsa 0 e 360 gradi.Quindi impostando
    il numero di step saprei dopo il setup mecanico dove punta l’antenna.La velocita di rotazione serve (avanzamento) ma e bene che l’antenna ruoti lentamente.Per fare il tuttu ho comprato Arduino 2560 r3 e motor sheld r3 dispongo di alimentatore swich da 6V 40A oppure 12V 4A oppure classico con trasformatore e regolatore elettronico per varie tensioni e correnti.Mi sentirei tanto onorato dei tuoi consigli.Grazie da Andrea

    1. Ciao Andrea,
      grazie per i complimenti.
      Il tuo progetto è molto interessante e mi sembra che abbia le idee molto chiare.
      Il dubbio in questi casi è se un motore da 1,1A 3,5v possa sopperire al tuo scopo.

      Nel Blog trovi molti tutorial per pilotare i passo-passo con vari metodi: pulsanti, potenziometri, ecc.. Se ti occorre altro non hai che da commentare un articolo da cui sei partito come hai già fatto ed io cercherò di aiutarti.

      Il materiale che hai acquistato mi sembra ottimo ed abbondante per il progetto che hai in mente per cui probabilmente potrai farlo crescere in futuro.

      L’onore sarebbe mio, e di tutti i radioamatori che leggono il blog, nel pubblicare il tuo progetto una volta ultimato, se ti va.

      Mauro

  3. Grazie per avermi dato udienza.Ti informo che ho gia messo a punto e collaudato la parte mecanica del mio
    progetto e che quanto prima ti mando le foto.Posso garantirti che il motore e in grado di attuare il ridurore e di poter sollevare in asse pesi finora provati di 6Kg.Considera che il sistema quando sara in uso deve solo far ruotare un mast che di per se e suportato da cuscinetto, reggi spinta e passante.Vedro comunque di farti vedere il sistema in funzione pilotato dal cirquito di Nuova elettronica Riv.201 in modo OK. I tempi di attuazione per 360 gradi sono di un minuto e il regolatore elettronico e componenti non scaldano. Ti saluto con un buon Ferrragosto ciao da Andrea.

    1. Ciao Andrea,
      mi fa piacere rileggere del tuo progetto e sapere che sei nelle fasi finali.
      Quando sarai pronto non dimenticarti le foto,video e tutto quello che vuoi pubblicare, come già detto tempo fa è un piacere poter dar spazio a tutti i progetti interessanti come il tuo.

      Mauro

  4. Caro Mauro come ti ho comunicato sono alla fase di test pero’ non ci sono con il software perche’ inizia a darmi
    errori gia’ dal rigo 17 che diventa giallo e poi in basso una sequenza di errori in rosso.Preciso le seguenti condizioni di lavoro Arduino uno R3 e motor sheld R3 , alimentazione Arduino 9,34V esterna e 5V periferiche( display e pulsantiera ) il motorino PP e’ per le prove di un lettore di Fdisk ed e’ alimentato tramite Arduino.
    Elettricamente e tutto OK il display e’ un 16/2 e va bene con lcd di prova. Il tuo programma l’o copiato con word
    2007 e incollato dentro il software di gestione di Arduino e quando lo lancio in verifica mi da gli errori.Dimmi se la procedura e giusta oppure se mi puoi mandare il file e come posso fare per mandarti la documentazione ,foto e filmato .Ciao da Andrea

    1. Ciao Andrea,
      Lo sketch prova a copiarlo direttamente dal browser all’IDE arduino senza passare da altri programmi.
      Che errore ti da alla riga 17? Di solito è il primo che compare tra quelli in rosso, così posso provare ad aiutarti.

      Le foto e la documentazione puoi inviarmela via email, vedi sezione contatti del blog, per il video caricalo su youtube e inviami il link, mi piace che i video siano sempre riconosciuti come caricati dall’autore e non da me 🙂

      Mauro

    • marco il 13 Ottobre 2012 alle 10:50
    • Rispondi

    Ciao Mauro!perdonami ma sono ancora alle prime armi,ma grazie a i tuoi tutorial comincio a fare progressi!ho eseguito alla lettera tutto il tutorial ma non funziona xche ho uno shiel r3 e le inpostazioni sono diverse!come posso adattare il tutto?grazie ancora! ‘_’

    1. Ciao Marco,
      il progetto è realizzato con un Arduino uno rev3 ed IDE 1.0, quale problema incontri?

      Mauro

        • marco il 18 Ottobre 2012 alle 14:20
        • Rispondi

        Ciao Mauro!grazie per avermi risposto,il mio problema penso che sia nel fatto che sto usando arduino 1 e motor shield r3 e quest’ultimo a delle differenze nelle impostazioni delle uscite a e b ! dico penso ^_^ .oltretutto x questo motor shield r3 non si trovano molte informazioni in giro,faccio tutto alla lettere i tuoi passi ma non va!il motore fa rumore ma non risponde ai comandi!!grazie ancora

        1. Ciao Marco,
          in merito alla motor shield dovrai probabilmente adeguare lo script che è testato sulla Motor Shield Fe.
          Il problema che mi indichi potrebe essere dovuto a:

          a) non corretto collegamento delle fasi, prova a guardare nel Blog ci sono degli esempi e video su come riconoscere le fasi del tuo motore;
          b) stai inviando i segnali troppo velocemente per questo modello di motore e quindi non riesce ad eseguire quello che gli chiedi, inserisci tra uno step ed il succesivo un delay maggiore, prova con 1000 e poi pian piano diminuisci.

          Mauro

    • Owen il 26 Novembre 2012 alle 14:53
    • Rispondi

    Ciao Mauro, innanzitutto complimenti per il lavoro
    sto cercando di adattare lo sketch per untilizzare un lcd shield già preconfezionata, ma non riesco a settare i 5 pulsanti che sono tutti collegati ad A0
    ho preso il controllo dei pulsanti da un altro sketch e l’ho adattato così

    // defininizione dei valori utilizzati da pulsanti
    int lcd_key = 0;
    int adc_key_in = 0;
    #define next 0
    #define btnUP 1
    #define btnDOWN 2
    #define prev 3
    #define conf 4
    #define btnNONE 5

    // lettura del pulsante
    int read_LCD_buttons()
    {
    adc_key_in = analogRead(0); // lettura del valore
    if (adc_key_in > 1000) return btnNONE;
    if (adc_key_in < 50) return next;
    if (adc_key_in < 195) return btnUP;
    if (adc_key_in < 380) return btnDOWN;
    if (adc_key_in < 555) return prev;
    if (adc_key_in < 790) return conf;
    return btnNONE;
    }

    però il risultato è che il display mi fa vedere in loop tutti i parametri del primo livello del menù…. hai idea di dove stia sbagliando?

    1. Ciao Owen,
      se i pulsanti sono connessi tutti ad A5 avrai delle resistenze o altro componente che divide i valori letti dall’ADC . Forse il problema sono i valori che arrivano al pin A5′ prova a farti printare sul monitor seriale i valori letti.

      Mauro

    • Paolo il 22 Gennaio 2013 alle 00:16
    • Rispondi

    Caro Mauro,

    sono Paolo del corso di dicembre a Milano. Sono sempre alle prese con il mio slider che sta però definendosi. Per il movimento della slitta ho utilizzato due motoriduttori cc della Comodrill che variamo velocità a seconda della tensione di alimentazione (da 3 a 15 v), uno 1:500 e l’altro 1:3000, così da avere un ampio range di possibilità. Con Arduino controllo il senso di rotazione e l’inversione del senso di rotazione a fine corsa. Vorrei però controllare anche la velocità di rotazione, ma con un potenziometro ottengo una regolazione difficile in pochissimi gradi di rotazione e poi va subito alla velocità massima senza risentire della progressione nella rotazione. Ti allego lo sketch. Dove sbaglio?
    Ti sono riconoscente perché mi sto appassionando.
    Appena finito posto tutto, ma vorrei postare senza errori.
    Grazie e a presto
    Paolo

    int potPin1 = 0;
    int val1;

    const int switchPin = 2;

    // motore 1
    const int motor1Pin = 3; //contrario con la successiva
    const int motor2Pin = 4;
    const int enablePin = 9; //porta dig pin1 (3.4EN)

    void setup () {
    pinMode (switchPin, INPUT);

    //motore 1
    pinMode (motor1Pin, OUTPUT);
    pinMode (motor2Pin, OUTPUT);
    pinMode (enablePin, OUTPUT);

    //abilitazione del motore:
    digitalWrite (enablePin, HIGH);
    }
    void loop () {
    val1 = analogRead (potPin1); //legge pot1
    val1 = map (val1, 0, 1023, 0, 200);

    //interr1 on gira sn
    if (digitalRead (switchPin) == HIGH)
    {
    digitalWrite (motor1Pin, LOW);
    analogWrite (motor2Pin, 200-val1);
    }
    //interr1 off gira dx
    else {
    digitalWrite (motor1Pin, HIGH);
    analogWrite (motor2Pin, val1);
    }
    }

    1. Ciao Paolo,
      sono contento ve il tuo progetto prosegua e che la tua passione cresca anche grazie al corso.
      Nello sketch ci sono alcune imprecisioni e qualche errore che determinano questo comportamento.

      Imprecisioni:
      1. int potPin1 = 0; é meglio scriverlo int porPin1 = A0 xchè é un ingrasso analogico;
      2. nel setup() ricordati di indicare come funziona: pinMode( potPin1,INPUT )
      3. Dai alle variabili che usi dei nomi chiari, ti sarà più facile gestirle sia nello sketch che in un futuro se vorrai applicare delle modifiche, es.: se un pin regola la velocità del motore chiamarlo pinVelMotore o pinPWM, se regola la direzione chiamarlo pinDir o simile.

      Errore:

      analogWrite (motor2Pin, 200-val1); ma motor2Pin é 4 che non é un PWM, per cui non puoi chiedere che esca un segnale analogico ma digitale, anche se lo scrivi come hai fatto arduino potrà esprimere solo 0 e 1 su quel pin e lo farà in funzione del valore di 200-val1

      Infine non mi é chiaro perché la velocità la imponi una volta come 200-val1 ed un’altra come val1 se stai utilizzando un motore in Cc ed una shield per motori puoi impartire la velocità sempre nello stesso modo, solo il pin motor1Pin ad HIGH o LOW determina il verso di rotazione, di solito.

      Mauro

        • Paolo il 22 Gennaio 2013 alle 18:46
        • Rispondi

        Grazie Mauro.
        Provvedo ad una analisi alla correzione e poi ti racconto.

        Grazie ancora
        Paolo

    • Paolo il 22 Gennaio 2013 alle 20:03
    • Rispondi

    Mauro grazie!
    Perfetto.

    Paolo

    1. Ciao Paolo,
      mi fa piacere funzioni.
      Sono curioso di vederlo in funzione.

      Mauro

    • Owen il 21 Febbraio 2013 alle 21:31
    • Rispondi

    Ciao Mauro, stavo provando a miscelare un po dei progetti che hai pubblicato sul tuo sito e che ritengo fantastici!
    vorrei modificare in parte il progetto del dolly, usando al posto della motor shield, un easydriver o un pololu…
    ora, i problemi che non saprei come gestire e per i quali ti chiedo un aiuto sono 2:
    – con la motor shield faccio ruotare il motore tramite
    // Stepper
    int motorPinDirA = 2;
    int motorPinDirB = 8;
    int motorPinPwmA = 3;
    int motorPinPwmB = 9;
    int nFase=1;

    cambiando i livelli per alimentare le fasi giusto?

    case 1:
    digitalWrite(motorPinDirA, HIGH);
    digitalWrite(motorPinDirB, LOW);
    digitalWrite(motorPinPwmA, HIGH);
    digitalWrite(motorPinPwmB, LOW);
    break;

    con i pololu o easydriver invece ho solamente STEP e DIR per far ruotare il motore, quindi come potrei adattare il codice senza stravolgerlo?

    altra domanda: non avendo bisogno degli step intermedi, MS1 MS2 ed MS3 li porto a GND giusto?

    Ti ringrazio anticipatamente per la pazienza

    1. Ciao Owen,
      proprio in questi giorni sto preparando dei nuovi articoli per il dolly con shield differenti dalla motor shield fe.

      Presto saranno on-line ed avranno anche nuove funzioni.

      Per il tuo progetto ciò c’è dici é corretto, su dove collegare i pin MSx puoi seguire il mio articolo dedicato alla Easydriver per ridurre i passi e decidere con quale tipo di passo lavorare, di default lavora per singoli passi se non ne colleghi nessuno.

      La funzione da modificare é innanzitutto quella d’effetto fasi() in cui invece di avere il controllo su 4 pin devi solo dire: fai un passo ogni volta che la chiami.

      Purtroppo non è tutto così semplice senza sconvolgere il codice, perché quello sketch é pensato per usare una shield che non conosce la posizione del motore in senso che non conosce il passo a cui é arrivato e deve tracciarlo, la Easydriver gestisce tutto da sola.

      Mauro

    • Vincenzo il 1 Marzo 2015 alle 18:12
    • Rispondi

    Ciao Mauro,

    ho provato a riprodurre il tuo progetto utilizzando l’ integrato SN754410NE e un alimentazione esterna da 12V ma noto che il motore stepper, ogni tre passi in avanti ne fa uno indietro.
    Secondo te, quale può essere il problema?

    1. Ciao Vincenzo,
      sembra che tu abbia invertito una delle fasi del motore.
      Per comprendere bene come accade quello che mi scrivi ti consiglio di leggere l’articolo sui motori passo-passo e di verificare come funzionano.

    • Alessio il 31 Marzo 2015 alle 16:19
    • Rispondi

    Ciao mauro sono molto interessato alla costruzione di un dolly, ho una scheda arduino a cui vorrei collegare un motore stepper con un driver unl2003 con alimentazione esterna e un lcd l2c è possibile tramite questa configurazione eseguire il tutto devo cambiare qualche codice? esiste gia qualche schema?

    1. Ciao Alessio,
      con quella configurazione realizzare un dolly è una bella impresa in quanto l’ULN2003 non si occupa della gestione dei passi ma devi eseguire tutto via sw. Per semplificare la realizzazione di un Dolly Photo per timelapse con motori passo-passo ho deciso di realizzare un kit che trovi descritto nei miei articoli a cui puoi far riferimento.
      Per i Dolly con Slider sto realizzando una scheda di controllo dedicata che spero a breve di poter proporre a tutti gli appassionati come te.

    • Gian Marco il 19 Giugno 2015 alle 15:33
    • Rispondi

    Ciao
    Da perfetto novizio sto cercando di far funzionare il tuo sketch con un economicissimo motore stepper con drive ULN2003, senza riuscirci.
    Ho trovato qualche sketch sull’argomento, anche sul sito di Luca Dentella, e riesco a far girare il motore col suo sketch. Per far girare lo stepper, viene usata la rubrica stepper.h
    Purtroppo non riesco ad adattare il tuo sketch al driver che ho comprato in quanto il tuo sketch pilota direttamente il driver dello stepper con i comandi PWM e DIR, mentre la rubrica stepper.h lo pilota automaticamente come una variabile.
    Suggerimenti in merito?
    Grazie

    1. Ciao Gian Marco,
      ti suggerisco di studiare le differenze tra il controllo motori eseguito con il driver ULN2003 e con la motor shield, trovi molti esempi sul questo blog.

    • Simone il 3 Gennaio 2016 alle 20:33
    • Rispondi

    Ciao Mauro
    Sto costruendo un dolly ma incontro alcuni ostacoli nella parte elettronica.
    Ho a disposizione arduino uno rev3, motor shield di arduino, un motore passo passo, display led con modulo i2c, pulsanti e resistenze.
    Per la poca esperienza chiedo se è possibile avere uno schema elettrico per costruire un dolly e un programma per poter far funzionare il tutto.
    Ti ringrazio molto per un tuo aiuto
    Simone.

    1. Ciao Simone,
      io ho realizzato dei kit per dolly o eseguo lavori su commissione se sei interessato.
      In alternativa potresti seguire i miei esempi, comprenderli e modificarli come serve per i tuoi componenti.

    • Alessandro il 13 Gennaio 2016 alle 13:04
    • Rispondi

    Ciao Mauro, ho un problema con il tuo sketch.
    Considerando il solo MENU ( di fatti la parte riguardo lo stepper ed il led non mi interessa avendone già realizzata una io) ho cambiato parte del codice per due motivi: utilizzo si un lcd 16×2 ma collegato tramite i2c e poi i miei 3 tasti li ho collegati agli ingressi digital e non analog. Per questo motivo, come vedrai dal codice, ho cambiato i pin di ingresso tasti, ho sostituito l’analogread con un digitalRead e dove tu misi il valore “>1000” ho sostituito con “>0”.
    Qual’è il problema? Quando entro nel menu settaggi -> Scegli n Scatti il contatore va velocissimo, ad una velociotà di 2 o 3 numeri di incremento per secondo.
    Cosa sbaglio? Dovrebbe essere logico che si incrementasse solo se premo il tasto next.
    Grazie

    Ecco il codice:
    [[ codice rimosso in automatico ]]

    1. Ciao Alessandro,
      come hai letto non è possibile incollare sketch nei commenti, vengono cassati in automatico.
      In merito al tuo dubbio potresti aver dimenticato di mettere un corretto delay come effetto anti-rimbalzo sul pulsante o incrementato il contatore più volte per ogni pressione.
      Correggi il codice comprendendo dalle mie spiegazioni dove incremento i valori e come intervenire su quelli.

    • franco il 20 Novembre 2016 alle 10:48
    • Rispondi

    Buongiorno a tutti, mi chiamo Franco e scrivo da Vercelli.
    sto realizzando lo stesso progetto ma per macrofotografia.
    Ho costruito il supporto per il riduttore stepper che comanda un soffietto.
    Anche la circuiteria, composta da L298N con arduino uno R3 e lcd keypad shield.
    Il tutto pare funzionare ma ho un dubbio. I passi del motore vengono eseguiti non in maniera fluida….continua. Questo continuo martellamento potrebbe accorciare la vita degli ingranaggi del riduttore o del soffietto. E’ normale?
    Se cosi’ fosse dovrei forse passare ad un driver migliore per lo stepper? che so….. un easydrive?
    Grazie per le considerazioni

    1. Ciao Franco,
      il movimento irregolare lo percepisci anche se il motore non è connesso ad alcuna meccanica?

  1. […] Devi modificare la sola funzione go() presentata nel progetto: […]

  2. […] E’ una soluzione un po’ casereccia per evitare di utilizzare 2 optoisolatori, tuttavia posso consigliarti, se vuoi fare un lavoro professionale di acquistare un altro tipo di fotoaccoppiatore il: CNZ3182 della Panasonic, trovi il datasheet quì. Sostituendo l’optoisolatore con uno doppio dovrai cambiare lo sketch in modo che prima di scattare il dolly dovrà mettere a fuoco, con la soluzione iniziale non devi apportare alcuna modifica allo sketch presentato in questo articolo. […]

  3. […] Oggi ti racconto di un progetto realizzato dall’amico Alessandro, @Travis9011 su Tw: TriggerT. Il progetto si rivolge agli appassionati di fotografia come seguito del filone Dolly Project. […]

  4. […] che mi ha segnalato un appassionato di fotografia poiché già in passato ho dedicato realizzato il progetto dolly per gli appassionati di […]

  5. […] avevo promesso altri articoli dedicati alla Keypad LCD ed al Dolly ed ho deciso di unire i due progetti iniziando una serie di articoli dedicati ad un nuovo Dolly e […]

  6. […] che Matteo avrebbe voluto realizzare era differente dal progetto Dolly Photo originale, il suo scopo era poter montare sullo slider una telecamera e poterla spostare in modo automatico […]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

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