Servo che non si muove

Salve,

sto cercando di realizzare un gripper meccanico con apre e chiude la "pinza" tramite servo azionato da un pulsante, questo il codice:

#include <Servo.h>
Servo myservo;  // create servo object to control a servo
#define servoPin 3 //~
#define pushButtonPin 2 

int angle =90;    // initial angle  for servo
int angleStep =5;
const int minAngle = 50;
const int maxAngle = 110;

int buttonPushed =0;

void setup() {
  // Servo button demo by Robojax.com
  Serial.begin(9600);          //  setup serial
  myservo.attach(servoPin);  // attaches the servo on pin 3 to the servo object
  pinMode(pushButtonPin,INPUT_PULLUP);
   Serial.println("Robojax Servo Button ");
}

void loop() {
  if(digitalRead(pushButtonPin) == LOW){
    buttonPushed = 1;
  }
   if( buttonPushed ){
  // change the angle for next time through the loop:
  angle = angle + angleStep;

    // reverse the direction of the moving at the ends of the angle:
    if (angle <= minAngle || angle >= maxAngle) {
      angleStep = -angleStep;
       buttonPushed = 0;
    }
    myservo.write(angle); // move the servo to desired angle
      Serial.print("Moved to: ");
      Serial.print(angle);   // print the angle
      Serial.println(" degree");    
  delay(100); // waits for the servo to get there
   }
}

Quando spingo il pulsante sento che il servo prova a girare ma senza rotazioni si sentono tipo degli scatti ma non ruota!
Il servo è connesso con arancio sul pin arduino, rosso ad alimentazione esterna +5, marrone gnd alimentazione esterna e gnd arudino.
Dove sta il problema?

Ciao!
Non sembra un problema di codice, hai messo il condensatore sull'alimentazione?
Quando esegue il comando

myservo.attach(servoPin);

il servo si posiziona a 90 gradi?
Inserisci un piccolo delay dopo quella istruzione


Sul progetto c'era scritto di mettere una resistenza da 10, cmq si sente il rumore di movimento del motore ma non ruota. Al monitor seriale le rotazioni vengono scritte
correttamente

... Non hai risposto alle mie domande....

la resistenza credo che sia per il pulsante non per il servo...
Il cavo arancio non era collegato al servo?
Prova a postare una foto completa del cablaggio (servo + pulsante), magari il problema è li

Sei sicuro che non si muove...
Premi il pulsante e l'angolo cambia di 5 gradi, da seriale si vede l'incremento dell'angolo.
Il fatto è che uno spostamento di 5 gradi del servo non è visibile.
Fai una prova invece di incrementare la variabile di 5, incrementa di 30-40, e vedi se il servo si muove, se fosse vuol dire semplicemente che 5 gradi sono troppo pochi per percepire il movimento :slight_smile:

In realtà quello è solo l'incremento.
Il servo dovrebbe arrivare al limite massimo o minimo, una volta raggiunto azzera la variabile buttonPushed e interrompe il comando in quanto questo

risulta False

Errore mio nell' interpretazione, premi pulsante e la variabile diventa uno ma resta uno fino a posizione zero o max :slight_smile:
Poi un programma del genere usato al posto di un semplice servo.write(), serve solo per rallentare il movimento con un delay(), se necessaria lo sa solo l'autore.

Allora si in effetti impostando delay a 10 e angleStep a 10 adesso funziona perfettamente!
Ora però vorrei ad esempio stoppare la rotazione quando il grip afferra un oggetto.... che tipo di sensore mi servirebbe?

Potresti mettere un sensore a pressione. Quando chiude apre il contatto che (collegato ad un ingresso di interrupt) ferma la rotazione.

Se vuoi esercitare pressione diverse allora un sensore di pressione.
Ma spesso in robot amatoriali non abbiamo un sistema del genere, allora possiamo usare un pulsante con accorgimenti "meccanici", esempio una gomma sulla pinza che solo dopo essere compressa attiva il pulsante.Ma lavora dove ti è più congegnale, la meccanica o elettronica e programma.