Buongiorno,
sto tornado ad utilizzare arduino per realizzare un progetto che ho nel cassetto da qualche anno : pilotare degli indicatori analogici (tipo cruscotto) in funzione della telemetria di alcuni giochi di auto.
Riesco ad interfacciarmi e comandare il tutto ma non sono molto soddisfatto del risultato.
I motori che utilizzo sono degli stepper motor per strumentazione del tipo : x27_168 (https://www.jukenswisstech.com/JSTFiles/downloads/2011/06/X27_Flyer_v1.3.pdf)
Per pilotarli utilizzo un driver apposito : https://guy.carpenter.id.au/gaugette/resources/vid/2009111391612_VID6606%20manual%20060927.pdf
Il driver si basa su due segnali : uno che indica la direzione di rotazione CW-CCW ed un secondo che è un treno di impulsi, ad ogni impulso corrisponde uno step.
Il mio algoritmo deve :
-
- ricevere N byte di dati dalla seriale
-
- capire il valore di un parametro ex: Velocità e calcolarne il delta rispetto alla Velocità del ciclo precedente
-3) convertire questo delta nel numero di impulsi da fornire al driver.
- capire il valore di un parametro ex: Velocità e calcolarne il delta rispetto alla Velocità del ciclo precedente
Questo funziona correttamente se utilizzo solo uno strumento analogico e qualche led di indicazione.
Nel momento in cui vado ad inserire anche l'indicatore di RPM noto che viene introdotta della latenza tra il salire di giri del gioco e l'attuazione.
Questo è dovuto al modo in cui creo gli impulsi, purtroppo sto utilizzando dei delay non conoscendo un modo più efficiente.
Questo è il codice di controllo di uno degli indicatori, l'altro è identico :
void Spd_Motor(float spd){
int new_spd ;
static int old_spd;
int i= 0;
new_spd = map(spd,0,320,0,270*12);
//*************AUMENTO NUMERO DI GIRI *******************
if(new_spd > old_spd) //aumento di giri
{
fastWrite(4, HIGH); //senso orario
for(i=0; i<(new_spd-old_spd);i++)
{
fastWrite(3, HIGH); // set pin high
delayMicroseconds(DELAY);
fastWrite(3, LOW); // set pin low
delayMicroseconds(DELAY);
}
}
//**************RIDUCO NUMERO DI GIRI ****************
if(new_spd < old_spd) //diminuisco di giri
{
fastWrite(4, LOW); //senso antiorario
for(i=0; i<(old_spd-new_spd);i++)
{
fastWrite(3, HIGH); // set pin high
delayMicroseconds(DELAY);
fastWrite(3, LOW); // set pin low
delayMicroseconds(DELAY);
}
}
old_spd=new_spd;
}
Vorrei chiedervi se conoscete un modo più efficiente o addirittura corretto per generare un numero preciso di impulsi senza incappare in ritardi indesiderati.
Ringrazio anticipatamente chiunque voglia aiutarmi.