Go Down

Topic: Projecto com arduino (Read 3087 times) previous topic - next topic

Gouveia

Boas pessoal.
Queria pedir uma ajuda.
Eu mais um colega meu estamos a fazer um projecto com o arduino.
Que consiste em fazer um programa para um portão que irá ser automático, e estamos com algumas dificuldades, pois não dominamos muito isto. Já temos um pedaço de código desenvolvido, mas agora não estamos a conseguir avançar mais porque nos deparamos com um problema na questão do delay().

Codigo:

int motor_abre = 12;
int motor_fecha = 13;
int chave_a = 11;
int chave_f = 8;
int fotoc = 7;
int fc_f = 9;
int fc_a = 10;
int botao=6;

int aberto = 0;
int fechado = 0;
int ordem = 0;
int abrir_c=0;
int fechar_c=0;
int sensor=0;

void setup() {
 
  pinMode(motor_abre, OUTPUT); 
  pinMode(motor_fecha, OUTPUT);
  pinMode(chave_a, INPUT);
  pinMode(chave_f, INPUT);
  pinMode(fc_f, INPUT);
  pinMode(fc_a, INPUT);
  pinMode(fotoc, INPUT);
  pinMode(botao, INPUT);
}



void loop(){
   
  aberto=digitalRead(fc_a);           
  fechado=digitalRead(fc_f);   
  ordem=digitalRead(botao);
  sensor=digitalRead(fotoc);
 
    if(fechado==0 & ordem==1){
        digitalWrite(motor_abre, HIGH); 
      }
      else{
        if(aberto==0){
          digitalWrite(motor_abre, LOW);
         delay (5000);}
        }
    }
   
   
    if(aberto==0 ){
     
        digitalWrite(motor_fecha, HIGH); 
      }
      else{
        if(fechado==0){
          digitalWrite(motor_fecha, LOW);
    }
    }
  }

No delay que temos no programa, ele está a funcionar, o portão abre, activa o fim de curso "fc_a" e faz o delay de 5s, passados esses 5 segundos começa a fechar, mas se manualmente carregarmos no fim de curso "fc_f" o portão não vai parar, só pára passados outros 5s, e não estamos a perceber porque, pois não estamos a mandar fazer isso.

Se alguém poder ajudar, agradecia-mos.
Obrigado

robtillaart

Please translate to English with www.google.com/translate on the international forum,
and please use the # button to properly tag your code
---
Por favor, traduzir para Inglês com www.google.com / translate no fórum internacional,
e por favor, use o botão # para adequadamente tag seu código

(strange I replied on the same post in the international section , sorry)

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

bubulindo

O problema com o delay() (que é constantemente mal usado) é que bloqueia o programa, ou seja:

Code: [Select]

void loop(){

    if(fechado==0 & ordem==1){
        digitalWrite(motor_abre, HIGH); 
      }
      else{
        if(aberto==0){
          digitalWrite(motor_abre, LOW);
         delay (5000);}  \\  <-  O PROGRAMA PARA AQUI DURANTE 5 SEGUNDOS
        }
    }
   
   
    if(aberto==0 ){
     
        digitalWrite(motor_fecha, HIGH); 
      }
      else{
        if(fechado==0){
          digitalWrite(motor_fecha, LOW);
    }
    }
  }



Se queres usar temporizacões, experimenta com a funcão millis().

Para tornar o código mais perceptível, não seria pior colocares o desenho ou então definires o que é o 0 e o 1.

Quanto ao problema... acho que é algo como:

Code: [Select]


    if(fechado==0 & ordem==1){    //O portão não está fechado e provavelmente não estás a enviar comando nenhum para activar a ordem. Então, este if falha.
        digitalWrite(motor_abre, HIGH); 
      }
      else{
        if(aberto==0){   //como o portão está a fechar, os sensores de aberto e fechado estão desactivos e este if vai estar correcto, iniciando um delay().
          digitalWrite(motor_abre, LOW);
         delay (5000);}
        }
    }


Tenta fazer uma máquina de estados deste género:

Code: [Select]

#define PORTAO_ABERTO   10
#define PORTAO_FECHADO 20
#define PORTAO_ABRIR      30
#define PORTAO_FECHAR   40

int estado = 0;
unsigned long inicio = 0;
unsigned long agora = 0;

loop() {

switch (estado) {
    case PORTAO_FECHADO : {
        if (ordem == true)  {
            //liga motor para abrir portão.
            estado = PORTAO_ABRIR;
            }
        break; }
    case PORTAO_ABRIR: {
        if (aberto == true) {
            //para motor.
            estado = PORTAO_ABERTO;
            inicio = millis();
            }
            break;}
    case PORTAO_ABERTO: {
        agora = millis();
        if (agora-inicio > 5000) {//5 segundos
             //ligar motor para fechar portão
             estado = PORTAO_FECHAR;
             }
        if (ordem_para_fechar_portao == true)  {
            //ligar motor para fechar portão
             estado = PORTAO_FECHAR;
             }
        break;}
    case PORTAO_FECHAR: {
        if (fechado == true)  {
            //desliga motor.
            estado = PORTAO_FECHADO;
            }
        break; }
    }


Desta forma apenas testas determinadas condicões se o portão estiver no estado pretendido e permite-te adicionar muito mais condicões que não entrem em conflito como tens agora. Por exemplo, se o portão estiver a fechar e tu pretenderes abrir, ou vice-versa, etc, etc...
This... is a hobby.

lordskynner

Tenta usar isto, deixei meio comentado, testei com leds somente, e na corrida, mas no lugar de leds, acionariam os delés, que acionariam os motores.


Code: [Select]
int motor_abre = 6;
int motor_fecha = 7;
int fc_f = 4;
int fc_a = 5;
int comando=3;

int sentido = 0;  // Sentido da movimentação do motor
int movendo = 0;  // Verifica se o motor está em movimento
int posicao = 0;  // POsição inicial do Motor  0 Aberto 1 Fechado
int tempoAuto = 5000;  //Tempo de fechamento Automatico em Milisegundos

int aberto;      // Fim de curso de abertura
int fechado;    //  Fim de curso Fechamento
int com;        //  Botoeira de acionamento
int startTime;
int autoFech;

void initSen(){    // Verifica a posição do motor e fim de curso, ao alimentar a placa, caso o fim de curso
  if (digitalRead(fc_a) == 0){ posicao = 1; }       // dos lados esteja acionado, para evitar tranco no motor
  else if(digitalRead(fc_f) == 0){posicao = 0; }
}

void setup() {
  pinMode(motor_abre, OUTPUT); 
  pinMode(motor_fecha, OUTPUT);
  pinMode(fc_f, INPUT);
  pinMode(fc_a, INPUT);
  pinMode(comando, INPUT);
  digitalWrite(motor_fecha,LOW);    //Seta ambas as posições do motor como paradas ao iniciar a placa
  digitalWrite(motor_abre,LOW);
  initSen();
}



void loop(){
  if ((millis()-startTime > tempoAuto)&&(autoFech == 1)) fecha();    //Verifica e fecha o portão automatico no tempo programado
  aberto=digitalRead(fc_a);    // Pega acionamento Fim de Curso Abertura
  fechado=digitalRead(fc_f);  // Pega acionamento Fim de Curso Fechamento
  com=digitalRead(comando);   // Pega acionamento do botão de comando, para abrir, fechar e parar o motor
     if (com == 0){
      if (movendo == 1){      // Se motor estiver se movendo faz ele parar com a botoeira
        if (sentido == 0){
        movendo = 0;
        posicao = 1;
        sentido = 0;
        digitalWrite(motor_abre,LOW);
        } else if (sentido == 1){
        delay(50);
        movendo = 0;
        posicao = 0; 
        sentido = 1;
        digitalWrite(motor_fecha,LOW); 
        }     
      } else if(movendo == 0){    // Se o motor está parado, faz aciona o motor
        if ((posicao == 0)){
            abre();
        } else if ((posicao == 1)){
            fecha();
        }     
      }
        delay(300);     
    }
      if ((aberto == 0)&&(movendo == 1)&&(sentido == 0)){    // Desliga no fim de curso de abertura
        movendo = 0;
        posicao = 1;
        sentido = 1;
        startTime = millis();
        autoFech = 1;
        digitalWrite(motor_abre,LOW);
      } else if ((fechado == 0)&&(movendo == 1)&&(sentido == 1)){  // Desliga no fim de curso de fechamento
        movendo = 0;
        posicao = 0; 
        sentido = 1;
        digitalWrite(motor_fecha,LOW);

      }
}

void abre(){
  digitalWrite(motor_abre,HIGH);
  sentido = 0;
  movendo = 1;
}

void fecha(){
  digitalWrite(motor_fecha,HIGH); 
  sentido = 1;
  movendo = 1;
  autoFech = 0;
}


julio_locks

estou fazendo algo similar no tcc e  precisava de uma ajuda com a parte fisica do projeto, alguem me daria uma luz de como fazer a conexao dos sensores com o arduino?

Go Up