Ajuda com servo motor, obrigado!

Ola, pessoal., eu quero controlar o servo com um só botao, ok, mas esse codigo sem alteração quando aperto o botao ele vai lento ate o definido e depois volta rapido, nao quero q isso aconteca, ali nos comentarios do code diz que ele ficará para do no 180, mas ele volta a zero, quero apertar o botao e ele vai lento e pare, depois apertar de novo e ele voltar lento ao zero.


#include <Servo.h>

Servo myservo; //
Servo myservo2;

bool pressionado; //estado do botao
int botao=40; //Pino a ser ligado o botao
bool estado=0; //estado atual do botao
int tempoPercurso=10; //tempo escrito em segundos (10 segundos)
int tempo;

void setup()
{
 myservo.attach(12); //pino de dados do servo conectado ao pino 9
 myservo.write(0); //inicia motor posição 0 graus

 myservo2.attach(13); //pino de dados do servo conectado ao pino 9
 myservo2.write(0); //inicia motor posição 0 graus

 pinMode(botao, INPUT_PULLUP);
 tempo=(tempoPercurso*300)/180;
}

void loop() 
{
 pressionado=digitalRead(botao);  //verifica se o botao foi pressionado
 delay(200);
 //se ele não foi pressionado o valor do pressionado será 1
  if((estado==0)&&(pressionado==0))
  //Se o esatdo é 1 e o botão não esta pressionado, ou seja é 1 tambem
  {   
      for(int pos=0; pos<=120; pos++){//Avanço de 0 a 180
        myservo.write(pos);//o Servo fica na posição 180 graus
      myservo2.write(pos);//o Servo fica na posição 180 grau
      delay(tempo);
      
      }
      estado==1;
  }
  if((estado==1)&&(pressionado==1))
  {   
      for(int pos=120; pos>=0; pos--){//retorno de 180 a zero
      myservo.write(pos);//o Servo fica na posição 0 graus
            myservo2.write(pos);//o Servo fica na posição 180 graus

      delay(tempo);
      }
      estado==0;
  }
}

Você precisa remover um desses ifs porque o que um faz o outro desfaz.


 pressionado=digitalRead(botao); // Botão pressionado retorna 0, botão livre retorna 1
 if((estado==1)&&(pressionado==1))
{
  estado==1;
}
if((estado==0)&&(pressionado==0))
{
estado==0;
}

nao deu certo, deixei só 1 if, mas ele sempre retorna rápido a posição 0. quero apertar o botão 1 vez e ele ir lento do 0 até o 120 e parar, se eu apertar o botao novamente ele ir do 120 ao 0 lentamente como foi do 0 ao 120. o botao pode ser ate chave, se ligada vai do o ao 120 e se for alta vai do 120 ao zero, ja tentei algumas vezes mas nao sei pq ele volta rapido,obrigado

Teste isso:

#include <Arduino.h>
#include <Bounce2.h> // https://github.com/thomasfredericks/Bounce2/archive/refs/heads/master.zip
#include <Servo.h>

Bounce2::Button button = Bounce2::Button();

const int buttonPin = 4;
const int servo1Pin = 9;
const int servo2Pin = 10;
const int ledPin =  LED_BUILTIN;

byte step = 1;
const int courseTime = 10;
const int time = (courseTime * 300) / 180;

Servo myservo1;
Servo myservo2;

void setup()
{
  Serial.begin(9600);

  button.attach(buttonPin, INPUT_PULLUP);
  button.interval(5); // interval im ms
  button.setPressedState(LOW);

  myservo1.write(0); //inicia motor position 0 degress
  myservo2.write(0);
  myservo1.attach(servo1Pin);
  myservo2.attach(servo2Pin);
}

void loop()
{
  button.update();

  if (button.pressed())
  {
    if (step == 0)
    {
      step = 1;
      moveServo();
    }
    else
    {
      step = 0;
      moveServo();
    }
  }
}

void moveServo()
{
  Serial.print("step = ");
  Serial.println(step);

  switch (step)
  {
    case 0:
      for (int pos = 0; pos < 120; pos++)
      {
        myservo1.write(pos);
        myservo2.write(pos);
      }
      break;
    case 1:
      for (int pos = 120; pos > 0; pos--)
      {
        myservo1.write(pos);
        myservo2.write(pos);
      }
      break;
    default:
      break;
  }
}

Agradecido, funcionou perfeitamente, só coloquei a variavel tempo dentro do void pra deslocar devagar, obrigado mesmo, tu é o cara. precisar de algo na questão eletrônica física da um tok, abraço!

Oi, o codigo ta ok, mas ele aciona o servo na hora que liga o arduino e quando ele nao liga, a primeira apertada do botao, ele ele volta rapido pro inicio e ai sim, cada vez q aciono o botao ele vai para um dos lados lentamente como esperado. o problema que quando liga ele faz tipo um teste e aciona,

#include <Arduino.h>
#include <Bounce2.h> // https://github.com/thomasfredericks/Bounce2/archive/refs/heads/master.zip
#include <Servo.h>

Bounce2::Button button = Bounce2::Button();

const int buttonPin = 40;
const int servo1Pin = 12;
const int servo2Pin = 13;
//const int ledPin =  LED_BUILTIN;

byte step = 1;
const int courseTime = 10;
const int time = (courseTime * 400) / 120;

Servo myservo1;
Servo myservo2;

void setup()
{
  Serial.begin(9600);

  button.attach(buttonPin, INPUT_PULLUP);
  button.interval(5); // interval im ms
  button.setPressedState(LOW);

  myservo1.write(0); //inicia motor position 0 degress
 myservo2.write(0);
  myservo1.attach(servo1Pin);
  myservo2.attach(servo2Pin);
}

void loop()
{
  button.update();

  if (button.pressed())
  {
    if (step == 0)
    {
      step = 1;
      moveServo();
    }
    else
    {
      step = 0;
      moveServo();
    }
  }
}

void moveServo()
{
  Serial.print("step = ");
  Serial.println(step);

  switch (step)
  {
    case 0:
      for (int pos = 0; pos < 120; pos++)
      {
        myservo1.write(pos);
        myservo2.write(pos);
         delay(time);
      }
     
      break;
    case 1:
      for (int pos = 120; pos > 0; pos--)
      {
        myservo1.write(pos);
        myservo2.write(pos);
        delay(time);
      }
      break;
    default:
      break;
  }
}

Este é um problema difícil de resolver, pois está relacionado a forma como o servo funciona.

Se você não setar uma posição antes de fazer o attach ele se move para uma posição predefinida.

Se você setar ele vai mover para a posição mesmo se ele tenha sido desligado em uma posição diferente.

Você pode fazer o teste comentando as duas linha abaixo.

myservo1.write(0);
myservo2.write(0);

imaginei, mas imagina que é um mini robocop, o acionamneto é o disparo da arma, la se foi um inocente kkkk,. mas tranquilo, vou testar, se nao der vou achar outra forma de ele nao acionar ou acionar lentamente, com o delay, valeu

no codigo ele ja ta assim
myservo1.write(0);
myservo2.write(0);

comentar = adicionar // na frente.

resolvido, é só ele sempre ficar no lado certo, que dae quando aperta o botao ele nao gira rapidamente na primeira apertada, que vai pro zero pra dai começar, enfim, dessa forma pra mim resolve o problema, obrigado, abraço

Acho que a solução do problema inicial não está neste seu post.

Você deve marcar o post correto para facilitar para que está enfrentando problema semelhante.

valeu