Aiuto per compilare uno sketch per Arduino

Saverio Stenta

Donatore generoso
#62
Hai ragione Mamo, ho fatto le dovute verifiche. Sono andato sul forum ed ho trovato pure come rimediare, ma per me è sempre una "cosa" nuova da studiare e il tempo mi manca, faccio prima ad ordinarlo. Ciao
 

Saverio Stenta

Donatore generoso
#63
Ciao Mamo spero ti sia riposato durante queste vacanze pasquali perché ho intenzione ancora di avvalermi della tua competenza e pazienza. Il mio problema è ( come ti avevo già fatto notare) sostituire con il motore pp nema23 da 2A il progetto precedentemente realizzato. Ho usato il driver PoStep25 ( lavora fino ad un carico di 2,5A) con uno sketch di prova ma non si muove neanche di uno step mentre con il driver A4988 Pololu funziona. Le connessioni sono identiche (solo 2 pin ... pinDIR e pinSTEP) l'unica differenza sta in un pin del driver PoStep25 "enable" che io non so come gestire nello sketch. Puoi aiutarmi? Se si ti posto la mia prova sketch e ti ringrazio anticipatamente.
 

Allegati

Mamo

Donatore generoso
#64
Da quel poco che ho visto, questo driver necessita l'abilitazione del relativo Pin.
E' abbastanza semplice.
Prendi un pin libero di arduino (per esempio il n°4) e lo colleghi al pin enable.
Per sicurezza, collega anche le due masse.
Quando inizi il ciclo, porti questo pin allo stato ON (con il solito digitalWrite(4,HIGH);)
Quando fermi o finisce il ciclo, lo metti OFF (digitalWrite(4,LOW);)
 

Saverio Stenta

Donatore generoso
#66
Perfetto, Mamo, tutto funziona bene. Ho capito la funzione di "enable" del driver, in pratica attivandolo con HIGH e LOW il pp gira e tiene bloccato il movimento,(utile per lavoro in verticale ed immagino il consumo di batteria!!) mentre escludendo LOW anche se gira rimane però libero il movimento del pp ( lavoro per uso orizzontale con risparmio di energia). Quindi è una "specie" di freno?
 

Mamo

Donatore generoso
#67
Esatto. Puo' essere utilizzato come freno.
 

Saverio Stenta

Donatore generoso
#68
Ciao, Mamo, ho completato (seguendo le tue dritte :) ) lo sketch per pp che funziona perfettamente, ma non riesco a capire come invertire il movimento (DirHIGH e DirLOW). Mi gira solo in antiorario :)( il motore pp) hahaha....ho provato in diversi modi ma non va, puoi spiegarmi come fare? Ti posto la parte dello sketch dove penso sia il problema. Grazie
 

Allegati

Mamo

Donatore generoso
#69
Saverio, la prossima volta invece di fare un pdf, fai un copia ed incolla del listato COMPLETO. E' molto piu' pratico.
Inoltre se puoi essere un pò piu' preciso nel dare le informazioni, non sarebbe male.
Scusa ma faccio queste puntualizzazioni perchè altrimenti chi legge, e non è pratico, potrebbe interpretare in modo sbagliato quelle che scrivi.
Per esempio
Ho usato il driver PoStep25 ( lavora fino ad un carico di 2,5A) con uno sketch di prova ma non si muove neanche di uno step mentre con il driver A4988 Pololu funziona.
Qui sembra che il motore (avendo l'enable scollegato) non gira in nessun caso.
Perfetto, Mamo, tutto funziona bene. Ho capito la funzione di "enable" del driver, in pratica attivandolo con HIGH e LOW il pp gira e tiene bloccato il movimento
Qui invece sembra che per farlo funzionare devi prima impostare enable ad ON poi ad OFF e solo dopo questa alternanza gira.
mentre escludendo LOW anche se gira rimane però libero il movimento del pp
Qui invece sembra che se metti in LOW il motore funziona (non a mano ma tramite il driver) .
Io credo di aver capito cosa intendi, ma persone poco esperte potrebbero andare nella confusione piu' totale.
In definitiva il tuo driver fa ruotare il motore solo quando:
il pin enable è ON (cioè impostandolo digitalWrite(pinEnable,HIGH)) e quando vengono dati gli impulsi analogWrite( pinStep,HIGH );
Con il pin Enable ON (digitalWrite(pinEnable,HIGH)) ma senza impulsi analogWrite( pinStep,LOW ); il motore è fermo e frenato
Con il pin Enable OFF (digitalWrite(pinEnable,HIGH)) con o senza impulsi il motore comunque non gira e non è frenato.
Quindi per venire al tuo listato avevi messo il Pin Ebable On solamente in un caso.
o copi quella riga del programma anche per l'altro caso o piu' semplicemente lo abiliti sempre.
Lo puoi fare, spostando l'abilitazione al di fuori delle parti condizionate.

digitalWrite(pinEnable,HIGH); //attiva il "freno" 0
if (Direzione)
{
digitalWrite( pinDir,HIGH ); //antiorario
}
else
{
digitalWrite(pinDir,LOW );
}

Ciao
 

Saverio Stenta

Donatore generoso
#70
Hai ragione Mamo, mi scuso anche per chi segue il nostro progetto. Ho rivisto è messo in ordine lo sketch per motore pp che incollo per chi vuole utilizzarlo.

Grazie ancora Mamo, un saluto


#include <LiquidCrystal.h>
#include <avr/eeprom.h> // necessaria per memorizzare i dati
LiquidCrystal lcd(12, 11, 8, 7, 6, 5);

int BottonePagina = A0;
int BottonePiu = A1;
int BottoneMeno = A2;
int pinDir=2;
int pinStep=3;
int pinEnable=4;

// 5-6-7-8 -11-12 per Lcd

int pinScatto = 13; //uscita controllo scatto foto

unsigned long MovimentoStep;
int Direzione;
unsigned long TempoAttesa;
int Pagina;
int Stato;
unsigned long AttesaScatto;
unsigned long DurataScatto;
int NumeroFoto;
int Foto;
int Freno;


//Struttura per memorizzare i dati nella eeprom di Arduino ***************************************************************************************
struct settings_t
{
unsigned long MovimentoStep;
int Direzione;
unsigned long TempoAttesa;
unsigned long AttesaScatto;
unsigned long DurataScatto;
int NumeroFoto;
int Freno;
} settings;


//#############################################################################################################################
//#############################################################################################################################
//LIBRERIA PER EEPROM PER MEMORIZZARE I DATI
//LIBRERIA PER EEPROM PER MEMORIZZARE I DATI
//LIBRERIA PER EEPROM PER MEMORIZZARE I DATI
//LIBRERIA PER EEPROM PER MEMORIZZARE I DATI
//LIBRERIA PER EEPROM PER MEMORIZZARE I DATI
//#############################################################################################################################
//#############################################################################################################################
//*********************************************************************************************************************
void CorreggiValori(void)
{
if (MovimentoStep>30000) MovimentoStep=5000; //???????da vedere
if (Direzione>1 || Direzione <0) Direzione=1;
if (TempoAttesa>30000) TempoAttesa=1000;
if (AttesaScatto>30000) AttesaScatto=2000;
if (DurataScatto>3000) DurataScatto=1000;
if (NumeroFoto>500 || NumeroFoto <0) NumeroFoto=200;
if (Freno>1 || Freno <0) Freno=1;
}
void SalvaConfigurazione(void)
{
CorreggiValori();
settings.MovimentoStep=MovimentoStep ;
settings.Direzione=Direzione ;
settings.TempoAttesa=TempoAttesa ;
settings.AttesaScatto=AttesaScatto ;
settings.DurataScatto=DurataScatto ;
settings.NumeroFoto=NumeroFoto ;
settings.Freno=Freno ;
eeprom_write_block((const void*)&settings, (void*)0, sizeof(settings));
}
//*********************************************************************************************************************
void LeggiConfigurazione(void)
{
MovimentoStep=settings.MovimentoStep;
Direzione=settings.Direzione;
TempoAttesa=settings.TempoAttesa;
AttesaScatto=settings.AttesaScatto;
DurataScatto=settings.DurataScatto;
NumeroFoto=settings.NumeroFoto;
Freno=settings.Freno;
CorreggiValori();
}

void setup()
{
pinMode(BottonePagina, INPUT); // imposto gli ingressi per la tastiera
pinMode(BottonePiu, INPUT);
pinMode(BottoneMeno, INPUT);
pinMode( pinDir,OUTPUT ); //uscita per direzione motore
pinMode( pinStep,OUTPUT ); // uscita per numero passo
pinMode(pinEnable, OUTPUT); // uscita per abilitare motore pp

pinMode(pinScatto, OUTPUT);

lcd.begin(16, 2);
lcd.print("MProject2013 ");
lcd.setCursor(0, 1);
lcd.print("2013");
delay( 3000 );
lcd.clear();
digitalWrite( pinScatto, LOW );

LeggiConfigurazione();
Pagina=1;
Stato=0;
Foto=0;
DisegnaPagina();
}

void loop()
{
int LetturaBottonePagina = digitalRead(BottonePagina);
if (LetturaBottonePagina==HIGH)
{
Pagina++;
if (Pagina>8) Pagina=1; // se superiamo il numero delle pagine disponibili torniamo alla prima
DisegnaPagina();
}
int LetturaBottonePiu = digitalRead(BottonePiu);
if (LetturaBottonePiu==HIGH)
{
switch(Pagina)
{
case 1:{Stato=1;Foto=0;}break;
case 2:{MovimentoStep=MovimentoStep+10;}break;
case 3:{Direzione=1;}break;
case 4:{TempoAttesa=TempoAttesa+1000;}break;
case 5:{NumeroFoto=NumeroFoto+10;}break;
case 6:{AttesaScatto=AttesaScatto+100;}break;
case 7:{DurataScatto=DurataScatto+100;}break;
case 8:{Freno=1;}break; //disabilita il freno
}
SalvaConfigurazione();
DisegnaPagina();
}
int LetturaBottoneMeno = digitalRead(BottoneMeno);
if (LetturaBottoneMeno==HIGH)
{
switch(Pagina)
{
case 1:{Stato=0;}break;
case 2:{MovimentoStep=MovimentoStep-10;}break; //
case 3:{Direzione=0;}break;
case 4:{TempoAttesa=TempoAttesa-1000;}break;
case 5:{NumeroFoto=NumeroFoto-1;}break;
case 6:{AttesaScatto=AttesaScatto-100;}break;
case 7:{DurataScatto=DurataScatto-100;}break;
case 8:{Freno=0;}break; //abilita il freno
}
SalvaConfigurazione();
DisegnaPagina();
}
if (Stato==1)
{
Foto++;
DisegnaPagina();

digitalWrite(pinEnable,HIGH); //attiva il "freno" 0
if (Direzione)
{
digitalWrite( pinDir,HIGH ); //antiorario
}
else
{
digitalWrite(pinDir,LOW ); //orario
}
analogWrite( pinStep,HIGH );
delay(MovimentoStep);
analogWrite( pinStep,LOW );


delay( AttesaScatto ); //attesa prima dello scatto
digitalWrite( pinScatto, HIGH ); //impulso per scatto fotografico
delay( DurataScatto );
digitalWrite( pinScatto, LOW );
delay(TempoAttesa);
if (Foto>=NumeroFoto && NumeroFoto!=199) Stato=0;
}

if(Freno)
{
digitalWrite(pinEnable,LOW); // disattiva il "freno" 1
}
{

}

}


void DisegnaPagina(void)
{
lcd.clear();
switch(Pagina)
{
case 1:
{
if (Stato==0)
{
lcd.print("Controllo");
}
else
{
lcd.print("In funzione");
lcd.setCursor(0, 1);
if (NumeroFoto!=199)
{
lcd.print(Foto);
lcd.print(" di ");
lcd.print(NumeroFoto);
}
else
{
lcd.print(Foto);
lcd.print(" No limite");
}
}
}
break;
case 2:
{
lcd.print("MovimentoStep");
lcd.setCursor(0, 1);
lcd.print(MovimentoStep);
}
break;
case 3:
{
lcd.print("Direzione");
lcd.setCursor(0, 1);
lcd.print(Direzione);
}
break;
case 4:
{
lcd.print("Attesa");
lcd.setCursor(0, 1);
lcd.print(TempoAttesa);
}
break;
case 5:
{
lcd.print("Numero Foto");
lcd.setCursor(0, 1);
if (NumeroFoto!=199)
{
lcd.print(NumeroFoto);
}
else
{
lcd.print("Nessun limite");
}
}
break;
case 6:
{
lcd.print("Attesa Scatto");
lcd.setCursor(0, 1);
lcd.print(AttesaScatto);
}
break;
case 7:
{
lcd.print("Durata Scatto");
lcd.setCursor(0, 1);
lcd.print(DurataScatto);
}
break;
case 8:
{
lcd.print("Freno");
lcd.setCursor(0, 1);
lcd.print(Freno);
}
break;
}
delay(1000);
}
 

chi siamo

Time Lapse Italia è la community italiana dedicata alla fotografia time-lapse.

Impara la tecnica, condividi le tue esperienze e migliorati guardando i video più belli... gratuitamente ed in italiano!

© 2013-18 Time Lapse Italia - Creato da Marco Famà

invia il tuo video

Segui BENE tutte le istruzioni disponibili in questo breve tutorial e raggiungi la home-page di Time Lapse Italia
Alto