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