Galera eu gostaria de uma ajuda, eu vi um projeto de abrir lixeira sem as mãos na net peguei o codigo e montei o esquema mas o servo nao se meche, não acontece acontece nada, alguem me ajuda.

Segue esquema abaixo

#include <NewPing.h>
#include <Servo.h>
 
#define TRIGGER_PIN  12  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     11  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
 
//representa o sonar
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
 
//representa o servo
Servo myservo;  // create servo object to control a servo
 
//armazena o estado da aplicacao
int state = 0; //0= leitura, 1=lendo, 2= abrindo, 3= mantendo aberto, 4= fechando
 
//guardo as leituras de marcos de tempo
unsigned long firstRead;
 
//abre a lixeira
void openTrash () {
  myservo.write(105);
  delay(500)  ;
}
 
//fecha a lixeira devagar
void closeTrash () {
  int i = 105;
  for (i = 105; i< 177; i+=1) {
   myservo.write(i);
  delay(20);
  }
 
}
 
void setup()
{
    myservo.attach(14);  //analog pin 0
    Serial.begin(9600);
    myservo.write(176); //fecha a lixeira
 
}
 
void loop()
{
 
  unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
  //calcula os CMs do sonar
  unsigned int cm = uS / US_ROUNDTRIP_CM;
 
  //se for 0, a medida nao eh valida e jogamos para o infinito
  if (cm==0)
   cm = 1000;
 
 //estado 0. Leu medicao > 10 cm
 if (state == 0) {
    if (cm < 10) {
       firstRead = millis ();
       state = 1;
     }
 } else //estado 1. se continuar lendo a medicao por meio segundo, manda pro proximo estado //senao volta pro estado inicial
 if (state == 1) {
    if (cm > 10) {
       state = 0;
    } else {
       unsigned long now = millis();
       if (now - firstRead > 500) {
          state = 2;
       }
     }
 } else
 //estado 2. abre a lixeira e inicia o marco para calcular
 //o tempo de fechamento 1seg, e passa para o proximo estado
 if (state == 2) {
    openTrash ();
    firstRead = millis ();
    state = 3;
 } else
 //estado 3. Se a mao continuar a menos de 10cm, zerar o marco
 //se jah passou 1seg do marco, entao vai para o estado 4 de fechamento
 if (state == 3) {
    if (cm < 10)
    firstRead = millis ();
    unsigned long now = millis();
    if (now - firstRead > 1000) {
       state = 4;
    }
 } else
 //fecha o lixo
 if (state == 4) {
    closeTrash ();
    state = 0;
 }
 
}

Exibições: 1698

Responder esta

Respostas a este tópico

Rogério, boa noite.

Qual modulo de UltraSon  voce está usando para medir a distancia?

Pode postar o esquema das ligações aqui?

Isto ajuda.

veja este link, 

http://playground.arduino.cc/Code/NewPing#Download

acho que falta alguma coisa no setup.

Rui

Rogério, bom dia

Faça uma revisão na sua montagem ,

pois eu compilei, gravei e testei  o seu código com um servo e funcionou.

Usei um HC-SR04 tb.

Teste com o motor fora da lixeira pra ver se ele gira.

Talvez a tampa seja pesada pra ele.

Rui

Rogério Santos,

Está é uma lixeira que montei há algum tempo atrás, acredito ser mais simples a montagem.

 

#include <Servo.h>

Servo motor;

#define echo 2
#define trigger 3

int aberto = 140;
int fechado = 80;
int aberto_ = 0;


long duration, distance;

void setup() {
motor.attach(A0);
Serial.begin (9600);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
}

void loop() {

digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
duration = pulseIn(echo, HIGH);
distance = duration / 58;

if ((distance >= 150) || (distance <= 2))
distance = -1;
Serial.println(distance);
delay(150);

if (distance < 25 and distance > -1 and aberto_ == 0 ) {
aberto_ = 1;
for (int i = fechado; i < aberto; i++) {
motor.write(i);
delay(5);
    }
delay(3000);
   }

if (distance > 25 and aberto_ == 1 ) {
aberto_ = 0;
for (int i = aberto; i > fechado; i--) {
motor.write(i);
delay(10);
    }
  }
}

Abs.

Mauricio Ortega

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço