oi galera boa noite, eu tenho um projeto para ser desenvolvido, é um carro seguidor de linha, mas não to conseguindo desenvolver.
alguém tem algo programa desse tipo em C?
ou alguém poderia me dar um ideia de como fazer?
// — Frequência do Oscilador Externo —
#define F_CPU 16000000 //Configurado para 16MHz
// — Bibliotecas Auxiliares —
#include <avr/io.h> //biblioteca de entradas e saídas padrão
#include <util/delay.h> //biblioteca com as funções de delay
// — Mapeamento de Hardware —
#define sentido1 PORTD4 //bit de controle de sentido do motor1
#define pwm1 PORTD5 //bit de ajuste de pwm do motor1
#define sentido2 PORTD6 //bit de controle de sentido do motor2
#define pwm2 PORTD7 //bit de ajuste de pwm do motor2
#define sensor_esq PORTB0 //sensor da esquerda (inframervelho)
#define sensor_dir PORTB1 //sensor da direita (inframervelho)
// — Mnemônicos —
#define set_bit(reg,bit) (reg |= (1<<bit)) //macro para setar um bit de determinado registrador
#define clr_bit(reg,bit) (reg &= ~(1<<bit)) //macro para limpar um bit de determinado registrador
// — Protótipo das Funções Auxiliares —
void robotAhead(); //move robô para frente
void robotLeft(); //move robô para esquerda
void robotRight(); //move robô para direita
void robotStop(); //para robô
// — Função Principal —
int main(void)
{
set_bit(DDRD,PORTD4); //configura PD4 como saída
set_bit(DDRD,PORTD5); //configura PD5 como saída
set_bit(DDRD,PORTD6); //configura PD6 como saída
set_bit(DDRD,PORTD7); //configura PD7 como saída
clr_bit(DDRB,PORTB0); //configura PB0 como entrada
clr_bit(DDRB,PORTB1); //configura PB1 como entrada
set_bit(PORTB,sensor_dir); //habilita pull-up interno
set_bit(PORTB,sensor_esq); //habilita pull-up interno
PORTD = 0x00; //inicia PORTD em nivel baixo
robotAhead(); //robô inicia movendo-se para frente
while(1) //Loop infinito
{
if(!(PINB & 0x01)) //detectou linha preta da direita, se sim
{
robotRight(); //desvia para direita
_delay_ms(200); //durante este tempo
robotAhead(); //robô volta a se mover para frente
} //end if right
if(!(PINB & 0x02)) //detectou linha preta da esquerda, se sim
{
robotLeft(); //desvia para esquerda
_delay_ms(200); //durante este tempo
robotAhead(); //robô volta a se mover para frente
} //end if left
if(!(PINB & 0x01) && (PINB & 0x02))
{
robotStop(); //para o robô
}//end stop
} //end while
} //end main
// — Desenvolvimento das Funções —
void robotAhead() //move robo para frente
{
clr_bit(PORTD,sentido1); //motor 1 gira no sentido anti horario
clr_bit(PORTD,sentido2); //motor 2 gira no sentido horario
set_bit(PORTD,pwm1); //velocidade máxima pwm1
set_bit(PORTD,pwm2); //velocidade máxima pwm2
} //end robotAhead
void robotLeft() //move robo para esquerda
{
set_bit(PORTD,sentido1); //motor 1 gira no sentido horario
clr_bit(PORTD,sentido2); //motor 2 gira no sentido horario
set_bit(PORTD,pwm1); //velocidade máxima pwm1
set_bit(PORTD,pwm2); //velocidade máxima pwm2
} //end robotLeft
void robotRight() //move robo para direita
{
clr_bit(PORTD,sentido1); //motor 1 gira no sentido anti horario
set_bit(PORTD,sentido2); //motor 2 gira no sentido anti horario
set_bit(PORTD,pwm1); //velocidade máxima pwm1
set_bit(PORTD,pwm2); //velocidade máxima pwm2
} //end robotRight
void robotStop() //para o robo
{
clr_bit(PORTD,pwm1); //velocidade mínima pwm1
clr_bit(PORTD,pwm2); //velocidade mínima pwm2
} //end robotStop
como eu faço para esse robo da uma volta de 360 sobre seu eixo e parar?