martedì 19 maggio 2015

Delay() & Get Moving State

Una volta "perso" un po' di tempo su questi esempi, risolviamo i problemi relativo alla funzione delay() nel programma.

Analizziamo questo piccolo pezzo di codice a titolo d'esempio:
maestro.setTarget(0, 6000);
delay(3000);
maestro.setTarget(0, 4000);

Una volta impartito un comando di posizione maestro.setTarget il programma non attende il tempo effettivo necessario al braccio per arrivare fisicamente a quella posizione, ma esegue immediatamente la funzione successiva, in questo caso delay(3000) .

Questo si traduce nel fatto che il braccio non aspetterà realmente 3 secondi prima della posizione successiva.

Per poter sviare a questo non piccolo inconveniente si utilizza un'altra funzione offerta dalla Maestro library, Get Moving State.
Questa funzione attende l'effettivo completamente del movimento da parte del braccio, prima d'eseguire la funzione successiva.

Proviamo a modificare il primo esempio visto aggiungendo questa nuova funzione:
#include <PololuMaestro.h>

#ifdef SERIAL_PORT_HARDWARE_OPEN
#define maestroSerial SERIAL_PORT_HARDWARE_OPEN
#else
#include
SoftwareSerial maestroSerial(10, 11);
#endif

MicroMaestro maestro(maestroSerial);

void setup()
{
maestroSerial.begin(9600);
}

void loop()
{
maestro.setSpeed(0, 20);
maestro.setAcceleration(0, 200);

maestro.setTarget(0, 6000);
maestro.getMovingState();
delay(3000);

maestro.setTarget(0, 4000);
maestro.getMovingState();
delay(3000);
}

Riassumendo la funzione maestro.getMovingState() è sempre accoppiata alla funzione maestro.setTarget per attendere l'effettivo completamento del movimento da parte del braccio.

Nessun commento:

Posta un commento