Autor Tema: Programa para robot siguelineas  (Leído 2037 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado norbert_1111

  • PIC10
  • *
  • Mensajes: 9
Programa para robot siguelineas
« en: 16 de Enero de 2016, 19:17:44 »
Buen dia colegas traigo aqui un codigo realizado en mikroc utilizando el pic16f1827 para un robot seguidor de linea tricilo, acabo de sustituir comparadores por las entradas analogicas del pic, el problema es como hacer la funcion de los comparadores con el pic, osea calibrar los sensores(qrd1114),ya que asi como esta el codigo el robot es muy inestable , de antemano gracias por leer
Código: C
  1. int sensor[6];
  2. int sensor_an[6];
  3. int i;
  4. int x=400;
  5. void izquierda(){
  6. portb.f4=1;
  7. portb.f5=0;
  8. }
  9. void derecha(){
  10. portb.f4=0;
  11. portb.f5=1;
  12. }
  13. void singiro(){
  14. portb.f4=0;
  15. portb.f5=0;
  16. }
  17.  
  18. void main() {
  19.  
  20. trisa = 0b11111111;
  21. trisb = 0b00000000;
  22. ansela=0b11111111;
  23. anselb=0b00000000;
  24. ADC_Init();
  25. while(1){
  26. sensor[1]=ADC_Read(0);
  27. sensor[2]=ADC_Read(1);
  28. sensor[3]=ADC_Read(2);
  29. sensor[4]=ADC_Read(3);
  30. sensor[5]=ADC_Read(4);
  31.  
  32. for(i=0; i<6; i++){
  33. if(sensor[i]<x){
  34. sensor_an[i]=0;
  35. }
  36. else
  37. {
  38. sensor_an[i]=1;
  39. }
  40. }
  41. if (( sensor_an[1]==1)&&( sensor_an[2]==0)&&( sensor_an[3]==0)&&( sensor_an[4]==0)&&( sensor_an[5]==0)){izquierda();}
  42.  if (( sensor_an[1]==1)&&( sensor_an[2]==1)&&( sensor_an[3]==0)&&( sensor_an[4]==0)&&( sensor_an[5]==0)){izquierda();}
  43.  if (( sensor_an[1]==1)&&( sensor_an[2]==1)&&( sensor_an[3]==1)&&( sensor_an[4]==0)&&( sensor_an[5]==0)){izquierda();}
  44. if (( sensor_an[1]==1)&&( sensor_an[2]==1)&&( sensor_an[3]==0)&&( sensor_an[4]==0)&&( sensor_an[5]==0)){izquierda();}
  45. if (( sensor_an[1]==0)&&( sensor_an[2]==1)&&( sensor_an[3]==1)&&( sensor_an[4]==0)&&( sensor_an[5]==0)){izquierda();}
  46.  if (( sensor_an[1]==0)&&( sensor_an[2]==0)&&( sensor_an[3]==1)&&( sensor_an[4]==0)&&( sensor_an[5]==0)){singiro();}
  47.  if (( sensor_an[1]==0)&&( sensor_an[2]==0)&&( sensor_an[3]==1)&&( sensor_an[4]==1)&&( sensor_an[5]==0)){derecha();}
  48. if (( sensor_an[1]==0)&&( sensor_an[2]==0)&&( sensor_an[3]==0)&&( sensor_an[4]==1)&&( sensor_an[5]==0)){derecha();}
  49. if (( sensor_an[1]==0)&&( sensor_an[2]==0)&&( sensor_an[3]==0)&&( sensor_an[4]==1)&&( sensor_an[5]==1)){derecha();}
  50. if (( sensor_an[1]==0)&&( sensor_an[2]==0)&&( sensor_an[3]==1)&&( sensor_an[4]==1)&&( sensor_an[5]==1)){derecha();}
  51. if (( sensor_an[1]==0)&&( sensor_an[2]==0)&&( sensor_an[3]==0)&&( sensor_an[4]==0)&&( sensor_an[5]==1)){derecha();}
  52.  
  53. }}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Programa para robot siguelineas
« Respuesta #1 en: 17 de Enero de 2016, 04:41:14 »
No crees otro tema con la misma problematica de antes.

Aunque te lo respondi antes te lo repito, o mejor dicho te lo digo mas claro. Tenes 2 problemas.

1- Estas haciendo de tus sensores un ON/OFF  (0 o 1) perdiendo todo lo bueno de ADC (0 a 1023)
2- Tu accionamiento es malo, por que tambien es un ON/OFF, mientras que deberia ser "frenar" ( bajar la velocidad ) de una rueda y aumentar la otra, o solo dismuir la velocidad de una nomas segun los datos de los sensores.

Basicamente el codigo nuevo no cambio de lo anterior.

Desconectado norbert_1111

  • PIC10
  • *
  • Mensajes: 9
Re:Programa para robot siguelineas
« Respuesta #2 en: 18 de Enero de 2016, 16:16:55 »
este seguidor no tiene traccion diferencial, es del modo tricilco por lo cual el tipo de control cambia

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Programa para robot siguelineas
« Respuesta #3 en: 18 de Enero de 2016, 19:36:29 »
Entonces deberias cambiar tu sistema  de alimentacion del motor de continua para la direccion. usando el puente H y aliemntandolo con una frecuencia de PWM mas grande para poder manejar el giro del motor.. sino la que queda es usar un motor paso a paso.

De todas formas se aplica lo mismo que dije antes.. olvidate de la logica ON/OFF