Carro seguidor de linha


#1

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?


#2

as rodas do lado esquerdo devem se mover ao contrario das rodas do lado direto, quanto? depende do tamanho do seu eixo, ou diâmetro que seu carro ocupa projetado em uma circunferência.


#3

Consegui fazer amigo


#4

Eu fiz umseguidor de linha totalmente construido com palitos de sorvete e espeto de churrasco.