Home | Código e Software | Desenvolvimento | Equipamentos

Código e Software


Software


O programa foi desenvolvido para fazer uma "porta" se abrir quando algo se
aproximasse do sensor ultrassônico. Para isso tivemos que criar 3 funções:

1. sensor(); - Ativa o sensor ultrassônico e como ele deve agir;
2. motor(); - Ativa o motor, fazendo-o rodar de acordo com a quantidade de
passos necessária para abrir a porta;
3. motorReverso(); - Ativa o motor, fazendo-o rodar ao contrario da função motor();,
com a mesma quantidade de passos, afim de fechar a porta.

Com essas funções, o loop sempre mantém o sensor funcionando. Quando
algo passar na frente do sensor, faz com que o motor abra a porta, e quando se afastar,
faz com que o motor reverso feche a porta.

Problemas


Quando testamos o código, notamos alguns problemas:

1. Se o objeto permanece na frente do sensor, a porta abre e fecha constantemente,
até que o objeto saia da frente do sensor.
2. Após a porta ser aberta uma vez, a função motorReverso(); entra em um loop infinito,
fazendo com que a porta tente fechar a cada 1 segundo (1000 milissegundos).

Soluções


As soluções encontradas para o problema são:

1.Fazer um laço e uma verificação, se o objeto ainda estiver na frente do sensor, verificar
novamente, assim só irá para o próximo passo quando o objeto for embora.
2.A ideia era fazer o Arduino saber quando a porta estava aberta/fechada, para que
não abra duas vezes ou feche duas vezes. Fiz isso utilizando uma flag. Quando
o motor abre a porta, a variável flag tem valor 1 e, quando o motor fecha a porta, a variável
volta a ter valor 0. Inserindo uma verificação simples, o motor não abre a porta se a flag for
igual a 1, assim como não fecha se a flag for igual a 0.

Código


Abaixo o código fonte, comentado para melhor entendimento:
int bob1 = 9; // Bobinas do
int bob2 = 10; // Motor
int bob3 = 11; // de
int bob4 = 12; // Passo
 
int echo = 7;// Sensor
int trig = 8;// Ultrassonico
 
long passo = 0; //Contador de passos do motor
int sensorDis = 40; //Distancia entre o sensor fixo e um objeto fixo
int passoVolta = 75; // Numero de passos que a porta deve correr para abrir
int flag = 0; // Determina se a porta esta aberta ou fechada
 
long distancia;
 
void setup() {
  pinMode(bob1, OUTPUT);
  pinMode(bob2, OUTPUT);
  pinMode(bob3, OUTPUT);
  pinMode(bob4, OUTPUT);
 
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
}
 
void loop() {
 
  distancia = 0;
  sensor();
  if(distancia < sensorDis){
    motor();
    delay(1000);
    flag = 1;
    distancia = 0; //Se algo passar entre o sensor e o objeto fixo, então o motor ativa,
                   //porta aberta, e variavel do sensor resetada
  }
  sensor();
  while(distancia < sensorDis){
    sensor(); // Enquanto tiver algo entre o sensor e o objeto, ficar medindo
  }
  if (flag == 1){
    if(distancia > sensorDis){
      motorReverso();
      delay(1000);
      flag = 0;  // Se a porta esta aberta e não tiver nada entre o sensor e o objeto,
                 // então o motor vira ao contrario, porta fechada
    }
  }
}
 
void motor()  {           // Funcionamento do motor
 
  while(passo < passoVolta){
  digitalWrite(bob1, HIGH); delay(1);
      digitalWrite(bob4, LOW); delay(1);
  digitalWrite(bob2, HIGH ); delay(1);
      digitalWrite(bob1, LOW); delay(1);
  digitalWrite(bob3, HIGH); delay(1);
      digitalWrite(bob2, LOW); delay(1);
  digitalWrite(bob4, HIGH); delay(1);
      digitalWrite(bob3, LOW); delay(1);
 
  passo = passo + 4;
  }
  passo = 0;
  digitalWrite(bob4, LOW); // Desligar o motor para economizar bateria
}
 
void motorReverso()  {      // Funcionamento do motor reverso
 
  while(passo < passoVolta){
  digitalWrite(bob4, HIGH); delay(1);
      digitalWrite(bob1, LOW); delay(1);
  digitalWrite(bob3, HIGH ); delay(1);
      digitalWrite(bob4, LOW); delay(1);
  digitalWrite(bob2, HIGH); delay(1);
      digitalWrite(bob3, LOW); delay(1);
  digitalWrite(bob1, HIGH); delay(1);
      digitalWrite(bob2, LOW); delay(1);
 
  passo = passo +4;
  }
  passo = 0;
  digitalWrite(bob1, LOW); // Desligar o motor para economizar bateria
}
 
void sensor()  {         //Funcionamento do sensor ultrassonico
 
   digitalWrite(trig, LOW); delayMicroseconds(2);
   digitalWrite(trig, HIGH); delayMicroseconds(10);
   digitalWrite(trig, LOW);
 
   long duracao = pulseIn(echo, HIGH);
 
   distancia = duracao /29/2; // Formula para transformar tempo em distancia, baseada na
                              // velocidade do som
 
 
delay(50);
}

...