Aiuto per codice e costruzione tavola equatoriale

Buonasera, con dei miei amici stiamo cercando di costruire la tavola equatoriale di questo progetto (http://www.thingiverse.com/make:163555) però ci siamo imbattuti in un problema con la parte di programmazione e realizzazione del circuito.

Ho modificato alcuni parametri del codice in base alle esigenze, ma non riesco a capire cosa siano alcune cose (quelle segnate con “Boh”) potete aiutarci?

Secondo voi come posso realizzare il circuito?

Io ho un arduino UNO non cambia nulla vero?

int x; 

unsigned long time, t=0, t1000=0;
float a=0.0;
float dt;
int sdt, s_delay;

#define BAUD (9600)
#define STEPS_PER_REV (200.0*16.0) //il 16 cos'é?
#define DA (360.0/(23.93*3600.0))
#define INTERNAL_LED   13   //OK
#define DIR            2    //Giallo
#define STEP           3    //Verde
#define SLP            4  // Grigio
#define RST            5  // Arancione
#define MS3            6  // Marrone
#define MS2            7  // Ciano
#define MS1            8  // Viola
#define EN             9  // Blu
#define ENDSTOP        10 // Boh

void setup() 
{
  Serial.begin(9600);
  pinMode(EN,OUTPUT); // Enable
  pinMode(STEP,OUTPUT); // Step
  pinMode(DIR,OUTPUT); // Dir
  pinMode(SLP,OUTPUT); // Dir
  pinMode(RST,OUTPUT); // Dir
  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);
  pinMode(MS3, OUTPUT);
  pinMode(ENDSTOP, INPUT);
  pinMode(INTERNAL_LED,OUTPUT); // Internal LED (Pin 13)
  digitalWrite(EN,LOW); // Set Enable low
  digitalWrite(MS1, HIGH);
  digitalWrite(MS2, HIGH);
  digitalWrite(MS3, HIGH);
  digitalWrite(SLP, HIGH);
  digitalWrite(RST, HIGH);

  //home
  digitalWrite(DIR, HIGH);

  while(digitalRead(ENDSTOP))
  {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(20);
    digitalWrite(STEP, LOW);
    delayMicroseconds(100);
  }
  digitalWrite(DIR, LOW);

  dt = getMMperSec(a);
  sdt = getStepsperSec(dt);
  s_delay = getStepDelayMs(sdt);
  time = millis();
  t = time;
}

void loop() 
{

  time = millis();

  if(time >= t1000 + 1000){
    t1000 = time;

    dt = getMMperSec(a);
    sdt = getStepsperSec(dt);
    s_delay = getStepDelayMs(sdt);

    Serial.print("Time(ms): ");
    Serial.print(time);
    Serial.print('\t');

    Serial.print("Angle: ");
    Serial.print(a);
    Serial.print('\t');

    Serial.print("mm/s: ");
    Serial.print(dt);
    Serial.print('\t');

    Serial.print("Stepdelay(ms): ");
    Serial.print(s_delay);
    Serial.print('\t');

    Serial.print("Steps/s: ");
    Serial.print(sdt);
    Serial.print('\n');
    a += DA;  //Angle to second
    digitalWrite(INTERNAL_LED, HIGH);
    delay(2);
    digitalWrite(INTERNAL_LED, LOW);
  }
  if(time >= t+s_delay)
  {
    t += s_delay;
    digitalWrite(STEP, HIGH);
    delayMicroseconds(20);
    digitalWrite(STEP, LOW);
  }
}

int getStepsperSec(float dist)
{
  return(dist * STEPS_PER_REV / 1.25);
}

int getStepDelayMs(int sps)
{
  return(1000.0/sps);
}

float getMMperSec(float angle)
{
  return (((270.0*sin((angle+DA)*PI/180.0)) / sin(90.0*PI/180.0-((angle+DA)*PI/180.0)/2.0)) 
         - (270.0*sin(angle*PI/180.0))      / sin(90.0*PI/180.0-(angle*PI/180.0)/2.0));          
}

(deleted)

Ciao, questi penso siano riferiti al driver del motore passo passo

#define SLP            4  // sleep 
#define RST            5  // reset 
#define MS3            6  // la combinazione di MS3, MS2 MS1 high/low definisce il tipo di pilotaggio, step o microstep
#define MS2            7  
#define MS1            8  
#define EN             9  // enable

EDIT: preceduto da pierduino ma ormai avevo scritto :slight_smile:

Ah ok grazie, secondo voi è possibile adattare il codice per usare una scheda EasyDriver 4.4 o mi tocca comprare quel driver?

pierduino76:
Il 16 credo sia riferito ai microstep, in pratica dividi la risoluzione minima dello stepper per 16 (200/16)
ENDSTOP è un sensore di fine corsa, a seconda di come costruisci il tuo progetto potrebbe anche non servirti.

non li dividi ma li moltiplichi.
un stepper con 200 passi per giro in 16 microstepping ha 3200 passi per giro.

Il Easydriver ha il A3967, che ha fino a 1/8 microstepping. Puoi usarlo al posto del A4988 se é adatto per il motore. Nel codice devi diminuire i step per giro da 3200 a 1600

Ciao Uwe

(deleted)

Allora il motore che ho io ha uno step di 1,8° quindi 200 a giro cosa devo fare?
Moltiplico per 8 così da arrivare a 1600?
Posso alimentare il circuito tramite arduino collegato ad un power bank con la presa USB secondo voi?

(deleted)

Il motore che ho è questo:

Non posso banalmente eliminare dal codice il pin MS3 per poter usare l'easydriver vero?

Per quanto riguarda l'alimentazione proverò con un pacco da 8 batterie AA ad alimentare il tutto

Più che altro l'Easydriver non è adatto a pilotare codesto stepper, visto che il motore richiede una corrente di circa 1.7A, che l'Easydriver non riuscirà mai a fornire

Ah mannaggia, esiste una scheda che possa gestire queste correnti?
O eventualmente posso usare un transistor comandato dalla scheda per chiudere un circuito di alimentazione del motore?

...... esiste una scheda che possa gestire queste correnti?

In genere si usa un DRV8825 Link che si trova facilmente da tutte le parti. E arriva anche a 1/32

O eventualmente posso usare un transistor comandato dalla scheda per chiudere un circuito di alimentazione del motore?

Cosa c'entra un transistor ? A te serve un driver che regga la corrente richiesta dallo Stepper....... e basta !