Prezados,
Bom dia, sou novo no mundo do Arduino, tenho pesquisado muitos códigos para fazer um alimentador automático para os meus pets usando o servo Ds04-nfc de 360. Porem estou com um grande problema em fazer o servo rotacionar por 10s e parar por 2hs. O código abaixo foi o que peguei nestas consultas que fiz, o que acontece atualmente e que o servo ou fica girando sem fim ou fica no vai e vem.
Codigo 1: Fica rotacionando sem parar
#include <Servo.h>
Servo myservo;
int pos=0;
void setup()
{
myservo.attach(9);
Serial.begin(9600);
}
void loop()
{
for (pos=0; pos<=180; pos=pos+1)
{
Serial.println("Anti-Horario");
myservo.write(pos);
Serial.println(pos);
delay(15);
}
for (pos=180; pos>=0; pos=pos-1)
{
myservo.write(pos);
Serial.println("Horario");
Serial.println(pos);
delay(15);
}
}
Codigo 2: Ele fica no vai e vem direto nao para nunca.
# include <Servo.h>
Servo myservo;
int pos=0;
int voltas=0;
void setup()
{
myservo.attach(9);
Serial.begin(9600);
}
void loop()
{
for (pos=70; pos>=0; pos=pos-1)
{
Serial.println("Anti-Horario");
myservo.write(pos);
Serial.println(pos);
delay(15);
}
pos=70;
voltas=voltas+1;
Serial.println(voltas);
if (voltas>10) { voltas = 0;
delayMicroseconds(60000);
}
}
A minha ideia e fazer ele rodar por 10s para liberar a racao, e depois ficar aguardando por 2hs para liberar novamente a racao, isso num loop infinito, pois deixarei ligado direto.
Se alguém puder me ajudar, agradeceria muito.
Olá,
por favor refaça seu tópico colocando o código ente tags </>.
Ajustado, como foi a primeira vez que postei, nao me atentei.
Olá,
veja se é isto que você precisa.
//include <Servo.h>
#include <Servo.h>
Servo myservo;
int pos = 180;
int voltas = 0;
unsigned long rodando; // 1000 * 10; // Tempo rodando
unsigned long parado; // 1000 * 60 * 60 * 2; // Tempo rodando
//-------------------------------------------------
void setup()
{
Serial.begin(9600);
myservo.attach(9);
rodando = millis();
}
//-------------------------------------------------
void loop()
{
Serial.println("Anti-Horario");
//while (millis() - rodando < 10 * 1000); // 10 seg
while (millis() - rodando < 10 * 1000) // 10 seg
//while (millis() - rodando < 1000); // Teste
{
Serial.println(180);
delay(15);
}
Serial.println("Parado");
parado = millis();
//while (millis() - parado < 1000 * 60 * 60 * 2); // 2 Horas
while (millis() - parado < 1000 * 60 * 60 * 2) // 2 Horas
//while (millis() - parado < 1000 ); // teste
{
Serial.println(0);
myservo.write(0);
delay(15);
}
rodando = millis();
}
Caro @ruilviana, você esqueceu de abrir o servo, e atente para o ";" entre o while e suas ações.
while (millis() - rodando < 10 * 1000) // ; // 10 seg
//while (millis() - rodando < 1000); // Teste
{
Serial.println(180);
myservo.write(180);
delay(15);
}
Saudações.
Obrigado pela observação.
Corrigi
Carreguei o codigo, porem ele ficou parado nao roda mais.
#include <Servo.h>
Servo myservo;
int pos = 180;
int voltas = 0;
unsigned long rodando; // 1000 * 10; // Tempo rodando
unsigned long parado; // 1000 * 60 * 60 * 2; // Tempo rodando
//-------------------------------------------------
void setup()
{
Serial.begin(9600);
myservo.attach(9);
rodando = millis();
}
//-------------------------------------------------
void loop()
{
Serial.println("Anti-Horario");
//while (millis() - rodando < 10 * 1000); // 10 seg
while (millis() - rodando < 10 * 1000); // 10 seg
//while (millis() - rodando < 1000); // Teste
{
Serial.println(180);
delay(15);
}
Serial.println("Parado");
parado = millis();
//while (millis() - parado < 1000 * 60 * 60 * 2); // 2 Horas
while (millis() - parado < 1000 * 60 * 60 * 2); // 2 Horas
//while (millis() - parado < 1000 ); // teste
{
Serial.println(0);
myservo.write(0);
delay(15);
}
rodando = millis();
}
Por que você adicionou o ";" removido por @ruilviana? O código deve ficar assim:
#include <Servo.h>
Servo myservo;
int pos = 180;
int voltas = 0;
unsigned long rodando; // 1000 * 10; // Tempo rodando
unsigned long parado; // 1000 * 60 * 60 * 2; // Tempo rodando
//-------------------------------------------------
void setup()
{
Serial.begin(9600);
myservo.attach(9);
rodando = millis();
}
//-------------------------------------------------
void loop()
{
Serial.println("Anti-Horario");
while (millis() - rodando < 10 * 1000) // 10 seg
//while (millis() - rodando < 1000); // Teste
{
Serial.println(180);
myservo.write(180);
delay(15);
}
Serial.println("Parado");
parado = millis();
while (millis() - parado < 1000 * 60 * 60 * 2) // 2 Horas
//while (millis() - parado < 1000 ); // teste
{
Serial.println(0);
myservo.write(0);
delay(15);
}
rodando = millis();
}
Try separate power supply for servo motor. Maybe it will work.
Carreguei o codigo, porem o comportamento é igual. Ele iniciou sentido horario (180) e depois ficou rodando direto no anti-horario.(0)
E assim continuará por duas horas, que é o que você queria que fizesse, e repetirá o ciclo. Altere o tempo no while para menores para teste.
Can you explain what you are trying to say?
But I am guessing that you are trying to ask how to that with your current materials.
This project is configured like this today.
I don't know how to configure this configuration you suggested.
O que achei estranho, foi que fiz um primeiro codigo que funcionou. Porem acho que apaguei e nao consigo mais fazer igual.
No meu primeiro codigo nao tinha o serialprint. Sera que isso pode estar influenciando? (Posso estar escrevendo besteira)
Eu alterei tambem a pos para 70. Para ficar rodando so anti-horario. Essa parte ficou ok.
Porem diminui o tempo coloquei 1 ao maximo e ele continua girando sem parar.
Desculpe, estávamos errados desde o início, é um servo 360 Ds04-nfc, é de rotação contínua e difícil de parar em um ângulo específico. Com o comando " myservo.write(0); " ele irá girar em uma direção , com o comando " myservo.write(180); " no outro e com " myservo.write(90); " ele deve parar. E é muito difícil pará-lo em um determinado ângulo. Você tem um servo normal de 180º ?
Consegui fazer funcionar do jeito que queria.
Veja abaixo o código que funcionou.
#include "Servo.h" // Inclui a Biblioteca Servo.h
Servo meuservo; // Cria o objeto servo para programação
int angulo = 0; // Ajusta o ângulo inicial do Servo
void setup()
{
meuservo.attach(9); // Declara o pino do servo
}
void loop()
{
for (angulo = 15; angulo < 70; angulo += 15)
{ // Executa movimentos no sentido anti-horário
meuservo.write(angulo); // Altera sua velocidade de 15 em 15
delay(2000); // Cada velocidade funciona por 2 segundos
}
meuservo.write(90); // Para o servo motor
delay(60000); // Aguarda 60 segundos para continuar
}
Quero agradecer a todos pela ajuda.