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.