132.08+Código+e+Software


 * 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, <span style="font-family: Arial,Helvetica,sans-serif; font-size: 120%;"> fazendo com que a porta tente fechar a cada 1 segundo (1000 milissegundos).

<span style="font-family: Arial,Helvetica,sans-serif; font-size: 120%;">Soluções
<span style="font-family: Arial,Helvetica,sans-serif; font-size: 120%;">As soluções encontradas para o problema são:

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

<span style="font-family: Arial,Helvetica,sans-serif; font-size: 120%;">Código
<span style="font-family: Arial,Helvetica,sans-serif; font-size: 120%;">Abaixo o código fonte, comentado para melhor entendimento: code format="c" 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); } code

...