TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: gtr2018 en 13 de Octubre de 2018, 21:22:25

Título: Seguidor de linea pic 18f4550 con PIC C
Publicado por: gtr2018 en 13 de Octubre de 2018, 21:22:25
Buen día, quería saber si por favor me podrían ayudar con un código de seguidor de linea,
voy a utilizar componentes como: cny70, motorreductores de 3000 rpm 10:1, 4 pilas AA de 1,2 a 1500mAh c/u Y en cuanto al puente H no se cual sea el mas adecuado para este proyecto.


Tengo entendido que el pic lee el sensor cny70 como "1" o "0", entonces no se hace conversiones.

El código no me genera error pero no estoy seguro que sea suficiente para qu el carrito funcione correctamente, por el momento voy a probar con 2 cny70, la velocidad de los motores es por PWM, les agradezco gracias.

codigo:

#Include <18F4550.h>
#Fuses XT, NOWDT, BORV21, PUT, NOPROTECT
#Use Delay(Clock=4MHz)
#Define sensor1 Pin_C4 // sensor 1
#Define sensor2 Pin_C5 // sensor 2
//#Define sensor3 Pin_C2 // sensor 3
//#Define sensor4 Pin_C4 // sensor 4
#Define LED1 Pin_D0 // Giro derecha
#Define LED2 Pin_D1 // Giro izquierda
#Define Bot Pin_D2 // Inicio


void main(){


 SetUp_CCP1(CCP_PWM);
  SetUp_CCP2(CCP_PWM);
 
  SetUp_Timer_2(T2_Div_By_4, 249, 1); // 1KHZ






while(Bot==1){




if(sensor1==1 && sensor2==0){
  Set_Pwm1_Duty(512);
  Set_Pwm2_Duty(512);
  Output_High(LED1);
  Output_Low(LED2);
}
  if(sensor1==1 && sensor2==0){
  Set_Pwm1_Duty(1000);
  Set_Pwm2_Duty(200);
  Output_High(LED1);
  Output_Low(LED2);
  }
  if(sensor1==0 && sensor2==1){
  Set_Pwm1_Duty(200);
  Set_Pwm2_Duty(1000);
  Output_High(LED2);
  Output_Low(LED1);
  }
   if(sensor1==0 && sensor2==0){
  Set_Pwm1_Duty(500);
  Set_Pwm2_Duty(500);
  Output_Low(LED1);
  Output_Low(LED2);
   }
}
}
Título: Re:Seguidor de linea pic 18f4550 con PIC C
Publicado por: KILLERJC en 14 de Octubre de 2018, 08:34:14
Hay varias cosas mal en tu programa..

- Siempre necesitas un loop infinito, asi que ese while, deberia ser while(1), si queres luego accionar segun un boton, ponelo dentro de un if.
- La lectura de los pines no se realiza de esa forma. necesitas usar el input(PIN_XX) para leer el pin, con poner PIN_XX NO vas a leer el pin. Ya que PIN_XX es un numero. O cambias los defines:

Código: C
  1. #Define sensor1 input(Pin_C4) // sensor 1
  2. #Define sensor2 input(Pin_C5) // sensor 2

- Para que encendes y apagas lo leds ? Deberias tenerlos encendidos siempre, y observar las salidas.
- Deberias tener unos "estados"... ejemplo si detectas 10 (me refiero a que la derecha toco la linea ) procedes a disminuir la velocidad de la derecha, pero ahora necesito reaccionar distinto. Se que deberia pasar a 00  (donde va encarrilado) y luego llegar a 01, pero que pasa si se va a 00, y luego 10 ?, A lo que me refiero es que vas a tener que tratar de reaccionar antes estos problemas.
- Despues trataste de leer el sensor 1 y 2, y que te den 1 y 0 respectivamente, pero lo repetiste 2 veces!.

Con 2 sensores es "relativamente facil" ya que hace tope 1 y corregis, para mas sensores es donde considero que se vuelve mas complejo, vas a necesitar un PID para los motores, tal ves interpolar los sensores para obtener mas resolucion, y actuar acorde a lo que obtengas.