Posicionamento de câmera por acelerômetro

Engenharia Elétrica - PUCPR

 

Alunos: Adalberto Veloso Júnior ([email protected])

             Rodolfo Barbosa de Siqueira ([email protected])

Professor orientador: Altair Olivo Santin ([email protected])

 

Introdução

 

            Acelerômetros são sensores capazes de converter a aceleração da gravidade ou o movimento em sinais elétricos. O seu princípio de funcionamento é o mesmo que imaginarmos um copo com água, quando o colocamos em uma superfície plana e empurramos pra frente notamos que a água dentro do copo se mexe, e quanto maior for a força exercida no copo maior será a oscilação, e o que o acelerômetro faz é justamente medir estes movimentos, através do ângulo em que o liquido forma em relação ao estado original, fornecendo assim uma tensão.

            O servo motor é um dispositivo eletromecânico que, a partir de um sinal elétrico em sua entrada, pode ter seu eixo posicionado em uma determinada posição angular. Por serem pequenos e compactos, além de permitir um posicionamento preciso de seu eixo, os servos motores são largamente utilizados em robótica e modelismo. O ângulo do eixo é determinado a partir da duração da largura de pulso.

Figura 1 – Principio de funcionamento do servo motor.

Figura 2 – Ligação do acelerômetro no microcontrolador.

Objetivo

 

            O objetivo do projeto é poder controlar uma câmera utilizando o acelerômetro, acoplando o acelerômetro ao PIC16F87 e esse controlar dois servos motores, um no eixo x e o outro no eixo y, podendo assim movimentar a câmera.

 

Descrição

 

            O projeto propõe o controle de uma câmera utilizando o acelerômetro, esse acelerômetro quando movimentado no eixo x ou no eixo y provoca uma variação em sua tensão, essa tensão é passada ao PIC16F87, o microcontrolador recebe esse valor, converte em um valor analógico e “distribui” para a rotina correta.

            Após identificar o quão variou o acelerômetro o PIC seta um pino de saída que está acoplado a um servo motor, fazendo com que ele se posicione no ângulo mais próximo a variação do acelerômetro, identificando se a variação ocorreu no eixo x ou y e se essa variação foi maior ou menor que seu estado normal.

 

Fotos do Projeto

 

Figura 3 – Vista do projeto.

Figura 4 – Vista frontal.

Figura 5 – Acelerômetro.

Figura 6 – Projeto.

Figura 7 – Diagrama de blocos.

 

Materiais utilizados

 

          PIC 16F87

            2 Servos motores

            1 acelerômetro MMA7260Q

 

 

Sites Relacionados

http://picmania.garcia-cuervo.net/PICC2.php

http://www.maxwellbohr.com.br/downloads/Tutorial%20Programacao%20-%20Servo-Motor.pdf

http://www.youtube.com/watch?v=6lOOh9ejo_g

 

Código Fonte

#include <16f877A.h>

#use delay(clock=11059200)

#fuses HS,NOWDT,PUT

#use rs232(baud=19200, xmit=PIN_C6,rcv=PIN_C7)

void main()

{//main

long int valor_acx = 0;

long int valor_acy = 0;

long int aux_x;

long int aux_y;

setup_ADC_ports (RA0_RA1_RA3_analog);

setup_adc(ADC_CLOCK_INTERNAL);

output_high(PIN_D7);

while (true){

int x = 0;

int y = 0;

int aux = 0;

while(aux < 4){

set_adc_channel(0);

delay_us(10);

aux_x = read_adc();

set_adc_channel(1);

delay_us(10);

aux_y = read_adc();

valor_acx = valor_acx + aux_x;

valor_acy = valor_acy + aux_y;

aux++;

}

valor_acx = valor_acx / 5;

valor_acy = valor_acy / 5;

printf("valor_acx = %lu\n", valor_acx);

printf("valor_acy = %lu\n", valor_acy);

//delay_ms(1000);

//}

//--------------------------------eixo x----------------------------------------

if(valor_acx > 64 && valor_acx < 70)

{//1

printf("Loop 1");

while(x<=1){

output_low(PIN_D0);

output_high(PIN_D0);

delay_us(1500);

output_low(PIN_D0);

delay_us(18500);

x++;

}

}//1

else

{//2

if(valor_acx > 56  && valor_acx < 60)

{//3

printf("Loop 2");

while(x<=1){

output_low(PIN_D0);

output_high(PIN_D0);

delay_us(1000);

output_low(PIN_D0);

delay_us(19000);

x++;

}

}//3

else

{//4

if(valor_acx > 43  && valor_acx < 49)

{//5

printf("Loop 3");

while(x<=1){

output_low(PIN_D0);

output_high(PIN_D0);

delay_us(500);

output_low(PIN_D0);

delay_us(19500);

x++;

}

}//5

else

{//6

if(valor_acx > 78 && valor_acx < 85)

{//7

printf("Loop 4");

while(x<=1){

output_low(PIN_D0);

output_high(PIN_D0);

delay_us(2000);

output_low(PIN_D0);

delay_us(18000);

x++;

}}//7

else

{//8

if(valor_acx > 97 && valor_acx < 105)

{//9

printf("Loop 5");

while(x<=1){

output_low(PIN_D0);

output_high(PIN_D0);

delay_us(2500);

output_low(PIN_D0);

delay_us(17500);

x++;

}

}//9

else

{//10

if(valor_acx > 59 && valor_acx < 64)

{//11

while(x<=1){

output_low(PIN_D0);

output_high(PIN_D0);

delay_us(1350);

output_low(PIN_D0);

delay_us(18650);

x++;

}

}//11

else

{//12

if(valor_acx > 50 && valor_acx < 55)

{//15

while(x<=1){

output_low(PIN_D0);

output_high(PIN_D0);

delay_us(750);

output_low(PIN_D0);

delay_us(19250);

x++;

}

}//15

else

{//16

if(valor_acx > 71 && valor_acx < 77)

{//19

while(x<=1){

output_low(PIN_D0);

output_high(PIN_D0);

delay_us(1750);

output_low(PIN_D0);

delay_us(18250);

x++;

}

}//19

else

{//24

if(valor_acx > 86 && valor_acx < 97)

{//25

while(x<=1){

output_low(PIN_D0);

output_high(PIN_D0);

delay_us(2350);

output_low(PIN_D0);

delay_us(17650);

x++;

}

}//25

else

{//26

//-------------------------eixo y-----------------------------------------------

if(valor_acy > 53 && valor_acy < 59)

{//1

while(y<=1){

output_low(PIN_D1);

output_high(PIN_D1);

delay_us(500);

output_low(PIN_D1);

delay_us(19500);

y++;

}

}//1

else

{//2

if(valor_acy > 60 && valor_acy < 64)

{//3

while(y<=1){

output_low(PIN_D1);

output_high(PIN_D1);

delay_us(750);

output_low(PIN_D1);

delay_us(19250);

y++;

}

}//3

else

{//4

if(valor_acy > 65 && valor_acy < 70)

{//5

while(y<=1){

output_low(PIN_D1);

output_high(PIN_D1);

delay_us(1000);

output_low(PIN_D1);

delay_us(19000);

y++;

}

}//5

else

{//6

 

if(valor_acy > 71 && valor_acy < 76)

{//7

while(y<=1){

output_low(PIN_D1);

output_high(PIN_D1);

delay_us(1350);

output_low(PIN_D1);

delay_us(18650);

y++;

}

}//7

else

{//8

if(valor_acy > 77  && valor_acy < 83)

{//9

while(y<=1){

output_low(PIN_D1);

output_high(PIN_D1);

delay_us(1500);

output_low(PIN_D1);

delay_us(18500);

y++;

}

}//9

else

{//10

if(valor_acy > 84 && valor_acy < 90)

{//11

while(y<=1){

output_low(PIN_D1);

output_high(PIN_D1);

delay_us(1750);

output_low(PIN_D1);

delay_us(18250);

y++;

}

}//11

else

{//12

if(valor_acy > 91 && valor_acy < 96)

{//13

while(y<=1){

output_low(PIN_D1);

output_high(PIN_D1);

delay_us(2000);

output_low(PIN_D1);

delay_us(18000);

y++;

}

}//13

else

{//14

if(valor_acy > 97 && valor_acy < 103)

{//15

while(y<=1){

output_low(PIN_D1);

output_high(PIN_D1);

delay_us(2350);

output_low(PIN_D1);

delay_us(17500);

y++;

}

}//15

else

{//16

if(valor_acy > 104 && valor_acy < 115)

{//17

while(y<=1){

output_low(PIN_D1);

output_high(PIN_D1);

delay_us(2500);

output_low(PIN_D1);

delay_us(17500);

y++;

}

}//17

//-----------------------fim else-----------------------------------------------

}//26

}//16

}//14

}//12

}//10

}//8

}//6

}//4

}//2

}//24

}//16

}//12

}//10

}//8

}//6

}//4

}//2

}

}//main