Slider per fotografia con Nema 17 - aiuto per codice -

Realizzazioni home made di attrezzature, macchine e/o parti di esse di qualsiasi tipologia diversa da quelle normalmente trattate nel Forum.
Rispondi
geko68
Newbie
Newbie
Messaggi: 15
Iscritto il: venerdì 7 giugno 2019, 11:39
Località: Roma

Re: Slider per fotografia con Nema 17 - aiuto per codice -

Messaggio da geko68 » giovedì 13 giugno 2019, 22:27

Qualche foto della preparazione della parte "meccanica". Lo sketch lo voglio fare bene, in onore all'aiuto ricevuto, e stò studiando un bel po di cose; poi posterò anche quello :wink:

Buona serata a tutti! =D>
Non hai i permessi necessari per visualizzare i file e le foto allegati in questo messaggio. Per visualizzare tali file devi registrarti ed effettuare il Login

safe60
Senior
Senior
Messaggi: 728
Iscritto il: venerdì 29 maggio 2009, 8:43
Località: Ferrara
Contatta:

Re: Slider per fotografia con Nema 17 - aiuto per codice -

Messaggio da safe60 » venerdì 14 giugno 2019, 8:35

E' sicuramente un bell' oggetto. Ma a cosa serve in particolare ? HO capito che serve a spostare una macchina fotografica, ma per quale motivo ?
More Maiorum

geko68
Newbie
Newbie
Messaggi: 15
Iscritto il: venerdì 7 giugno 2019, 11:39
Località: Roma

Re: Slider per fotografia con Nema 17 - aiuto per codice -

Messaggio da geko68 » venerdì 14 giugno 2019, 12:46

Ci monti sopra una Cam (nel mio caso GoPro), setti la quantità di spostamento, la velocità e poi avvii.
Lo userò per fare i video in studio, mentre suoniamo (in realtà sono solo io e la cantante, un Duo). Per esempio può fare una ripresa lineare lenta che scorre davanti al manico della chitarra, o della persona o un oggetto, un esterna...oppure inclinando lo slider puoi fare una ripresa che parta dal basso verso l'alto o viceversa...tutto quello che vuoi, ripreso in quel modo. Nasce come Slider per Time Lapse, lo si usa piu che altro per quello.

Mangusta

Re: Slider per fotografia con Nema 17 - aiuto per codice -

Messaggio da Mangusta » venerdì 14 giugno 2019, 20:38

Hai commesso diverse infrazioni, alla prossima questo argomento verrà chiuso e cestinato.

geko68
Newbie
Newbie
Messaggi: 15
Iscritto il: venerdì 7 giugno 2019, 11:39
Località: Roma

Re: Slider per fotografia con Nema 17 - aiuto per codice -

Messaggio da geko68 » venerdì 14 giugno 2019, 23:04

Ciao Mangusta, si, lo sò, sono stato avvisato ieri degli errori che mi stai indicando. Purtroppo non ho fatto in tempo a correggerli, tant'è che le foto successive le ho allegate.

Chiedo scusa per non aver letto correttamente il regolamento.

Grazie e buona serata a tutti.

geko68
Newbie
Newbie
Messaggi: 15
Iscritto il: venerdì 7 giugno 2019, 11:39
Località: Roma

Re: Slider per fotografia con Nema 17 - aiuto per codice -

Messaggio da geko68 » domenica 16 giugno 2019, 12:43

Buongiorno, sono riuscito ad inserire correttamente le indicazioni di Billielliot e hellfire39 (grazie ragazzi).
In fase di collaudo mettendo lo slider in verticale, il motore non riusciva a tirare su il carrello (con il peso degli accessori realizzati) e quindi perdeva passi. Ho pensato subito di sostituire una delle due pulegge, quella sul motore (40T), con una da 20T. Il problema si è risolto ma la distanza di spostamento era ovviamente dimezzata. Cercando in rete ho trovato indicazioni circa un'altra variabile da poter usare e cioè:
long calculatedmove=(z*XL); che ho adattato a long calculatedmove=(z*40L);. Adesso copre tutta la distanza, come se avesse entrambe le pulegge da 40T e tira su il carrello senza nessuna fatica (in realtà non ho capito la variabile ma sono ugualmente contento di essere riuscito ad inserirla bene ed adattarla.
Nelle foto, il particolare costruttivo del carrello.

Non è essenziale, ma vorrei provare a mettere dei fine corsa, per precauzione, tuttavia non sono ancora riuscito a capire se serva una libreria particolare o se devo fare riferimento sempre ad accelStepper (magari mi è sfuggito qualcosa). Tutte le prove che ho fatto hanno solo generato errori. Cercherò comunque di riuscirci in autonomia.

Questo il codice finale, magari può servire a qualcuno, modificato ed adattato per un carrello lungo 90cm, Nema17 0,4A-1.8°x step, barre in acciaio da D8mm-L1000mm, puleggia motore da 20T e puleggia di rinvio da 40T, con segnalazione LED pre avvio:

Codice: Seleziona tutto

#include "AccelStepper.h" // AccelStepper Library
#include <Keypad.h>  // Keypad Library
#include "U8glib.h"  // U8glib for Nokia LCD



int step_speed = 10;  // Speed of Stepper motor (higher = slower)
int sensorPin = A2;    // select the input pin for the potentiometer
int sensorValue = 0;  // variable to store the value coming from the sensor
int val = 0;

// Variables to hold entered number on Keypad
volatile int firstnumber=99;  // used to tell how many numbers were entered on keypad
volatile int secondnumber=99;
volatile int thirdnumber=99;

// Variables to hold Distance and CurrentPosition
int keyfullnumber=0;  // used to store the final calculated distance value
String currentposition = "";  // Used for display on Nokia LCD


// Keypad Setup
const byte ROWS = 4; // Four Rows
const byte COLS = 4; // Four Columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {22, 24, 26, 28}; // Arduino pins connected to the row pins of the keypad
byte colPins[COLS] = {31, 33, 35, 37}; // Arduino pins connected to the column pins of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );  // Keypad Library definition


// U8glib Setup for Nokia LCD

U8GLIB_PCD8544 u8g(3, 4, 6, 5, 7);  // Arduino pins connected to Nokia pins:
                                    // CLK=3, DIN=4, CE=6, DC=5, RST=7
                                    
                                    
// AccelStepper Setup
AccelStepper stepper(1, A0, A1);  // 1 = Easy Driver interface
                                  // Arduino A0 connected to STEP pin of Easy Driver
                                  // Arduino A1 connected to DIR pin of Easy Driver
                                  
void setup(void) {

  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
           
  //  Light up the LCD backlight LEDS
  #define backlight_pin 11
  analogWrite(backlight_pin, 255);  // Set the Backlight intensity (0=Bright, 255=Dim)
    
  //  AccelStepper speed and acceleration setup
  
  stepper.setAcceleration(2500);  //  Same here
  
  // Draw starting screen on Nokia LCD
  u8g.firstPage();
  do {
  u8g.drawHLine(0, 15, 84);
  u8g.drawVLine(50, 16, 38);
  u8g.drawHLine(0, 35, 84); 
  u8g.setFont(u8g_font_profont11);
  u8g.drawStr(0, 10, "ENTER DISTANCE");
  u8g.drawStr(62, 29, "MM");
  u8g.drawStr(4, 46, "cur-pos");

  }
  while( u8g.nextPage() );
  
}


void loop(){

  char keypressed = keypad.getKey();  // Get value of keypad button if pressed
  if (keypressed != NO_KEY){  // If keypad button pressed check which key it was
    switch (keypressed) {
      
      case '1':
        checknumber(1);
      break;
        
      case '2':
        checknumber(2);
      break;

      case '3':
        checknumber(3);
      break;

      case '4':
        checknumber(4);
      break;

      case '5':
        checknumber(5);
      break;

      case '6':
        checknumber(6);
      break;

      case '7':
        checknumber(7);
      break;

      case '8':
        checknumber(8);
      break;

      case '9':
        checknumber(9);
      break;

      case '0':
        checknumber(0);
      break;

      case '*':
        deletenumber();
      break;

      case '#':
        calculatedistance();
      break;

    
    }
  }

}

void checknumber(int x){
  if (firstnumber == 99) { // Check if this is the first number entered
    firstnumber=x;
    String displayvalue = String(firstnumber);  //  Transform int to a string for display
    drawnokiascreen(displayvalue); // Redraw Nokia lcd
    
  } else {
    if (secondnumber == 99) {  // Check if it's the second number entered
      secondnumber=x;
      String displayvalue = (String(firstnumber) + String(secondnumber));
      drawnokiascreen(displayvalue);

    } else {  // It must be the 3rd number entered
      thirdnumber=x;
      String displayvalue = (String(firstnumber) + String(secondnumber) + String(thirdnumber));
      drawnokiascreen(displayvalue);

    }
  }
}

 
void deletenumber() {  // Used to backspace entered numbers
  if (thirdnumber !=99) {
      String displayvalue = (String(firstnumber) + String(secondnumber));
      drawnokiascreen(displayvalue);

    thirdnumber=99;
  } 
  else {
    if (secondnumber !=99) {
      String displayvalue = String(firstnumber);
      drawnokiascreen(displayvalue);

      secondnumber=99;
   } 
   else {
     if (firstnumber !=99) {
       String displayvalue = "";
       drawnokiascreen(displayvalue);

       firstnumber=99;
      }
    }
  }
}
  
void calculatedistance() {  // Used to create a full number from entered numbers

    if (thirdnumber == 99 && secondnumber == 99 && firstnumber != 99) {
      keyfullnumber=firstnumber;
      movestepper(keyfullnumber);
    }
    
    if (secondnumber != 99 && thirdnumber == 99) {
      keyfullnumber=(firstnumber*10)+secondnumber;
      movestepper(keyfullnumber);
    }
    
    if (thirdnumber != 99) {
      keyfullnumber=(firstnumber*100)+(secondnumber*10)+thirdnumber;
      movestepper(keyfullnumber);
    }
    
    resetnumbers(); // Reset numbers to get ready for new entry
  } 


void movestepper(int z) {  //  Move the stepper
  
  // Aggiungo il controllo velocita'
  // read the sensor value:
  int sensorReading = analogRead(A2); //uso l'ingresso ADC A2. A0 e A1 sono occupati dall'Easy Driver
  // map it to a range from 100 to 3000:  //modifico il valore massimo per adeguarmi allo sketch dell'Americano
  int motorSpeed = map(sensorReading, 0, 1023, 100, 3000); //Potenziometro al minimo = 100 Al massimo = 3000
  // set the motor speed:
  if (motorSpeed > 0) { // se il potenziometro NON e' al minimo
    stepper.setMaxSpeed(motorSpeed);  // cambio la velocita' del motore. Not to fast or you will have missed steps
    
  }
        
 long calculatedmove=(z*40L);  //  Calculate number of steps needed in mm

  
  digitalWrite(12,HIGH);  // accendi led ROSSO
  delay(100);            // attendi acceso
  digitalWrite(12, LOW);  // spegni led ROSSO
  delay(500);            // attendi spento
  digitalWrite(12,HIGH);  // accendi led ROSSO
  delay(100);            // attendi acceso
  digitalWrite(12, LOW);  // spegni led ROSSO
  delay(500);            // attendi spento
  digitalWrite(12,HIGH);  // accendi led ROSSO
  delay(100);            // attendi acceso
  digitalWrite(12, LOW);  // spegni led ROSSO
  delay(500);            // attendi spento
  digitalWrite(12,HIGH);  // accendi led ROSSO
  delay(100);            // attendi acceso
  digitalWrite(12, LOW);  // spegni led ROSSO
  delay(500);            // attendi spento
  digitalWrite(12,HIGH);  // accendi led ROSSO
  delay(100);            // attendi acceso
  digitalWrite(12, LOW);  // spegni led ROSSO
  delay(500);            // attendi spento
  digitalWrite(12,HIGH);  // accendi led ROSSO
  delay(100);            // attendi acceso
  digitalWrite(12, LOW);  // spegni led ROSSO
  delay(500);            // attendi spento
  digitalWrite(12,HIGH);  // accendi led ROSSO
  delay(100);            // attendi acceso
  digitalWrite(12, LOW);  // spegni led ROSSO
  delay(500);            // attendi spento
  digitalWrite(12,HIGH);  // accendi led ROSSO
  delay(100);            // attendi acceso
  digitalWrite(12, LOW);  // spegni led ROSSO
  delay(500);            // attendi spento
  
  digitalWrite(13,HIGH);  // accendi led VERDE
  delay(100);            // attendi acceso
  digitalWrite(13, LOW);  // spegni led VERDE
  delay(100);            // attendi spento
  digitalWrite(13,HIGH);  // accendi led VERDE
  delay(100);            // attendi acceso
  digitalWrite(13, LOW);  // spegni led VERDE
  delay(100);            // attendi spento
  digitalWrite(13,HIGH);  // accendi led VERDE
  delay(100);            // attendi acceso
  digitalWrite(13, LOW);  // spegni led VERDE
  delay(100);            // attendi spento
  digitalWrite(13,HIGH);  // accendi led VERDE
  delay(100);            // attendi acceso
  digitalWrite(13, LOW);  // spegni led VERDE
  delay(100);            // attendi spento
  digitalWrite(13,HIGH);  // accendi led VERDE
  delay(100);            // attendi acceso
  digitalWrite(13, LOW);  // spegni led VERDE
  delay(100);            // attendi spento
  digitalWrite(13,HIGH);  // accendi led VERDE
  delay(100);            // attendi acceso
  digitalWrite(13, LOW);  // spegni led VERDE
  delay(100);            // attendi spento
  digitalWrite(13,HIGH);  // accendi led VERDE
  delay(100);            // attendi acceso
  digitalWrite(13, LOW);  // spegni led VERDE
  delay(100);            // attendi spento
  digitalWrite(13,HIGH);  // accendi led VERDE
  delay(100);            // attendi acceso
  digitalWrite(13, LOW);  // spegni led VERDE
  delay(100);            // attendi spento
  digitalWrite(13,HIGH);  // accendi led VERDE
  delay(100);            // attendi acceso
  digitalWrite(13, LOW);  // spegni led VERDE
  delay(100);            // attendi spento
  digitalWrite(13,HIGH);  // accendi led VERDE
  delay(100);            // attendi acceso
  digitalWrite(13, LOW);  // spegni led VERDE
  delay(100);            // attendi spento
  digitalWrite(13,HIGH);  // accendi led VERDE
  delay(100);            // attendi acceso
  digitalWrite(13, LOW);  // spegni led VERDE
  delay(100);            // attendi spento
  digitalWrite(13,HIGH);  // accendi led VERDE
  delay(100);            // attendi acceso
  digitalWrite(13, LOW);  // spegni led VERDE
  delay(100);            // attendi spento
  digitalWrite(13,HIGH);  // accendi led VERDE
  delay(100);            // attendi acceso
  digitalWrite(13, LOW);  // spegni led VERDE
  delay(100);            // attendi spento
  
  digitalWrite(13,HIGH);  // accendi led VERDE
  delay(1000);            // attendi acceso
  digitalWrite(13, LOW);  // spegni led VERDE
  
  
  stepper.runToNewPosition(calculatedmove);
  currentposition = String(z);

  
  
  u8g.firstPage();
  do {
    u8g.drawHLine(0, 15, 84);
    u8g.drawVLine(50, 16, 38);
    u8g.drawHLine(0, 35, 84); 
    u8g.setFont(u8g_font_profont11);
    u8g.drawStr(0, 10, "ENTER DISTANCE");
    u8g.drawStr(62, 29, "MM");
    u8g.drawStr(4, 46, "cur-pos");
    u8g.setPrintPos(57,47);
    u8g.print(currentposition);       
 
  }
  while( u8g.nextPage() ); 
}
                
void resetnumbers() {  // Reset numbers for next entry
  firstnumber=99;
  secondnumber=99;
  thirdnumber=99;
} 
  

void drawnokiascreen(String y) {

    u8g.firstPage();
    do {
      u8g.drawHLine(0, 15, 84);
      u8g.drawVLine(50, 16, 38);
      u8g.drawHLine(0, 35, 84); 
      u8g.setFont(u8g_font_profont11);
      u8g.drawStr(0, 10, "ENTER DISTANCE");
      u8g.setPrintPos(0,29);
      u8g.print(y);  // Put entered number on Nokia lcd    
      u8g.drawStr(62, 29, "MM");
      u8g.drawStr(4, 46, "cur-pos");
      u8g.setPrintPos(57,47); 
      u8g.print(currentposition);  //  Display current position of stepper

    }
      while( u8g.nextPage() );
}
Non hai i permessi necessari per visualizzare i file e le foto allegati in questo messaggio. Per visualizzare tali file devi registrarti ed effettuare il Login

Avatar utente
hellfire39
God
God
Messaggi: 3402
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Slider per fotografia con Nema 17 - aiuto per codice -

Messaggio da hellfire39 » domenica 16 giugno 2019, 14:02

La variabile a cui fai riferimento sembra calcolare la conversione tra passi motore (utilizzata da AccelStepper) e i mm.

Se usi uno stepper classico da 200 passi/giro (e non utilizzi i microstep), farai un giro motore ogni 200 step.
Se le pulegge hanno un rapporto di riduzione 1:2, ogni giro motre fai mezzo giro alla puleggia del carrello.
Se la puleggia ha 40 denti ed è una T5 (ipotizzo), allora ogni giro motore fai mezzo giro della puleggia quindi 40 / 2 denti per 5 mm al dente.
Totale 20*5=100 mm ogni giro motore.
Quindi hai il rapporto 200 step = 100 mm. Se utilizzi i microstep, il rapporto di moltiplicherà di conseguenza.
Ad esempio, con step da 1/16, avresti 3200 step = 100 mm, quindi il valore della funzione sarebbe dovuto essere 32L.

------------------------

Per quello che posso vedere nella documentazione, AccellStepper non prevede l'utilizzo di ingressi per finecorsa.
Per cui bisognerebbe utilizzare degli interrupt (https://www.arduino.cc/reference/en/lan ... interrupt/) per accorgersi immediatamente dell'intervento del micro e fermare il motore.

geko68
Newbie
Newbie
Messaggi: 15
Iscritto il: venerdì 7 giugno 2019, 11:39
Località: Roma

Re: Slider per fotografia con Nema 17 - aiuto per codice -

Messaggio da geko68 » domenica 16 giugno 2019, 14:40

Ciao Hell, le pulegge previste originariamente dal progetto erano delle 40T GT2. Per avere piu potenza ho inserito sullo stepper una 20T GT2 e adesso tira una bomba.

Il motore ha questi dati in targa:
360°/1,8°(x step)= 200 step
quindi 200 step= un giro motore (non ho attivato i microstep)
Pignone 40T - 200 step=40mm percorsi dal carrello (20x2mm)


Con la nuova variabile che ho usato, modificata "long calculatedmove=(z*40L)", ottengo per ogni giro motore 40mm percorsi dal carrello. Se inserivo il valore 20 il carrello continuava a fare la metà del percorso impostato. Per logica mi sono detto "raddoppio la variabile e vediamo cosa succede" (....lo sò, non è a naso che si và, però un pizzico di qualcosa l'ho intuito).
Non conosco ancora il funzionamento di questa variabile. Ad esempio non sò cosa significhi Z. Ma, adesso che ho completato il progetto, ho molte cose da studiare e voglio capire il codice e se e come potrò inserire i finecorsa (che sono un optional, uno sfizio....funziona lo stesso anche senza).

Ok, dò un'occhiata al link, grazie :wink:

Che dici, è venuto bene il carrello?...ho tolto i cuscinetti i ci ho messo gli "Igus autolubrificati 8 mm - DryLin R - rj4jp 01 - 08"....molto silenziosi rispetto ai cinesi a ricircolo.

Avatar utente
hellfire39
God
God
Messaggi: 3402
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Slider per fotografia con Nema 17 - aiuto per codice -

Messaggio da hellfire39 » domenica 16 giugno 2019, 16:21

Il carrello è venuto molto bene!

Con z, il programma intende la distanza da percorrerre in mm, che viene moltiplicata per il fattore di conversione per ottenere il numero di passi, perché AcceStepper lavora con i passi e non con i mm.

geko68
Newbie
Newbie
Messaggi: 15
Iscritto il: venerdì 7 giugno 2019, 11:39
Località: Roma

Re: Slider per fotografia con Nema 17 - aiuto per codice -

Messaggio da geko68 » domenica 16 giugno 2019, 19:03

Ah, ok.

Comunque, devo rimettermi a studiare Arduino, e credo sia meglio ricominciare dalle basi.

Sarò impegnato su due fronti: farmi una base sulle cnc, qui, e rifarmi una base su Arduino (sul forum ufficiale).

....c'ho da fare a quanto pare :roll: :lol:

Vi seguo :wink:

Rispondi

Torna a “Autocostruzioni meccaniche varie”