Pagina 1 di 1

Servo e sensore conflitto

MessaggioInviato: 29 mag 2017, 17:54
da andrea080690
Ciao a tutti, sto provando a realizzare un progetto che permetta di muovere un servo dopo che un lettore di impronte digitali abbia riconosciuto una impronta previamente registrata. Ho gia scritto il codice e funziona abbastanza bene, il problema è che il servo fa dei micromovimenti strani e non riesco a risolvere il problema.
Sto utilizzando un servo DXW90 ed un lettore GT 511 e le loro librerie.
Il circuito è cosi realizzato:

LYD2ojC.png


Il codice è questo:
Codice: Seleziona tutto
#include "FPS_GT511C3.h"
#include "SoftwareSerial.h" // usata dalla FPS_GT511C3.h
#include "Arduino.h"
#include "ServoTimer2.h"  // the servo library

#define rollPin  13// define the pins for the servos
int pos = 0;    // variable to store the servo position
FPS_GT511C3 fps(8, 7);
ServoTimer2 servoRoll;    // declare variables for up to eight servos

void setup() {
  Serial.begin(9600);
  delay(100);
  fps.Open();
  fps.SetLED(true);
  servoRoll.attach(rollPin);     // attach a pin to the servos and they will start pulsing
}

void loop()
{
  if ((fps.IsPressFinger()) == true)
  {
    fps.CaptureFinger (true);         // cattura l’impronta del dito sul sensore e la memorizza nella memoria del sensore stesso. Andrà poi confrontata con il DB per individuare l’id. Restituisce true se la cattura ha successo, false se il sensore è vuoto.
    if (fps.Verify1_1(0) == 0 || fps.Verify1_1(1) == 0 || fps.Verify1_1(2) == 0 || fps.Verify1_1(3) == 0 || fps.Verify1_1(4) == 0 || fps.Verify1_1(5) == 0 || fps.Verify1_1(6) == 0 || fps.Verify1_1(7) == 0 || fps.Verify1_1(8) == 0 || fps.Verify1_1(9) == 0 || fps.Verify1_1(10) == 0 || fps.Verify1_1(11) == 0 || fps.Verify1_1(12) == 0 || fps.Verify1_1(13) == 0 || fps.Verify1_1(14) == 0 || fps.Verify1_1(15) == 0 || fps.Verify1_1(16) == 0 || fps.Verify1_1(17) == 0 || fps.Verify1_1(18) == 0 || fps.Verify1_1(19) == 0)
      // int Verify1_1(int id): verifica se l’impronta catturata con la funzione CaptureFinger corrisponde all’impronta memorizzata nello slot identificato da id (da 0 a 199). Ritorna: 0 se corrispondono, 1 se la posizione non è valida (id < 0 o id > 199), 2 se l’id non in uso (vuoto), 3 se l’impronta non corrisponde a quella nello slot id
    {
      pos = 0;
      servoRoll.write(pos);              // motore in posizione 0 gradi
      delay (2000);
    }
    pos = 75;
    servoRoll.write(pos);              // motore in posizione 75 gradi
    delay (500);
  }
}


Ed il problema che da è possibile vederlo qui:
https://www.youtube.com/watch?v=vxnQHaX2LfA

Qualcuno sa cosa puo essere e come risolverlo?
Ho gia provato ad utilizzare una tensione esterna con 3 batteria ma niente, il problema non sembra essere di corrente, inoltre il servo singolarmente funziona bene, non fa questi micromovimenti qundi sembra che sia un problema di interferenza tra la comunicazioni dei due componenti.

Re: Servo e sensore conflitto

MessaggioInviato: 29 mag 2017, 21:36
da WALTERmwp
Ciao @andrea080690, dal video si osserva quel che accade ma non si capisce come invece si dovrebbe comportare.
Ho qualche dubbio che il codice riportato sia esattamente quello dell'applicazione, devi inserire esattamente quello che staresti provando.
Se le librerie non hanno problemi, una delle ipotesi è che tu non gestisci le isteresi temporali: dopo il tentativo di lettura dell'impronta, a prescindere dall'esito, è bene evitare la quasi immediata ripetizione dello stesso codice.
Non penso ci siano errori a livello di collegamenti ma se intendi proporre uno schema, anche semplicficato, leggi qui !

Saluti

Re: Servo e sensore conflitto

MessaggioInviato: 3 giu 2017, 8:19
da pgiagno
Ho avuto un'esperienza simile con quel servo. Sembra che i micromovimenti siano dovuti ad una non precisa "traduzione" dei gradi in ampiezza dell'onda quadra di comando, per certi valori dei gradi impostati. Puoi provare a risolvere il problema cambiando i gradi di posizionamento (ad esempio sostituendo pos = 0 con pos = 1, oppure pos = 2 e così via) e vedere se il fenomeno si attenua o sparisce.

Ciao,
P.

Re: Servo e sensore conflitto

MessaggioInviato: 3 giu 2017, 13:03
da xyz
Ho esaminato le due librerie in questione, da una rapida occhiata non hanno parti in conflitto.

Mettere il test dell'impronta e il controllo del servo nello stesso loop principale può generare problemi dovuti ai ritardi di elaborazione delle varie parti. Se il sensore impiegato tanto tempo a elaborare l'impronta questo genera problemi al comando del servo basato sui ritardi presenti sempre nel loop principale.

Re: Servo e sensore conflitto

MessaggioInviato: 3 giu 2017, 13:58
da WALTERmwp
pgiagno ha scritto:(...) Sembra che i micromovimenti siano dovuti ad una non precisa "traduzione" dei gradi in ampiezza dell'onda quadra di comando (...)
può darsi sia come scrivi, in tal caso però bisognerebbe risolvere la contraddizione perché lo OP afferma che la sola gestione del servo soddisfa le aspettative; non ho letto il suo datasheet ma il principio di controllo presumo sia simile a quello applicato ad altri.

Resto dell'idea che il problema risieda nella scrittura di un programma che non considera le implicazioni del caso, come ha ripreso anche @xyz.
Ad esempio, anche quei delay() riportati dopo il pilotaggio sembrerebbero più che azzardati.
Comunque, per avere qualche informazione in più sarebbe buona cosa se lo OP riportasse anche il codice riferito al solo test del servo.

Saluti