Autor Tema: Leer sensores y actuar  (Leído 2123 veces)

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

Desconectado Skualo

  • PIC10
  • *
  • Mensajes: 42
Leer sensores y actuar
« en: 27 de Marzo de 2008, 17:51:39 »
Bueno soy principiante en programacion c de micropics, estoy programando un 18f2550 mi problema ,esque nose como leer lo que tengo a mi alrededor ,y actuar ante ello.Bueno tenia una idea, que era usar el if para segun los valores de los sensores actuar ante ello ,pero es que no me funciona es muy inestable y nose si alguien ,me podria decir como va el tema de leer el entorno y actuar ante el ,dejo el programa que yo estava intentando hacer pero que no consigo nada:

Código: CSS
  1. #include <18f2550.h>
  2. #fuses xt
  3. #use delay(clock=4000000)
  4.  
  5. void main() {
  6. int8 iz1,iz2,inferior,delantero,uno,superuno;
  7. uno=0x90;
  8. superuno=0x100;
  9. do{
  10. setup_adc_ports( ALL_ANALOG );
  11. setup_adc(ADC_CLOCK_INTERNAL );
  12. set_adc_channel(0);
  13. iz2 = read_adc();//iz 2
  14. set_adc_channel(1);
  15. inferior = read_adc();//inferior
  16. set_adc_channel(2);
  17. iz1 = read_adc();//iz 1
  18. set_adc_channel(5);
  19. delantero = read_adc();//delantero
  20. delay_us(100);
  21. if ((inferior>5) && (delantero<200) && (iz1<180) && (iz2<180)){//gira a la izquierda
  22. output_low(pin_c0);//Motor izquierdo
  23. output_high(pin_b0);//Motor derecho
  24. output_low(pin_c1);
  25. output_high(pin_c2);
  26. output_low(pin_c6);
  27. output_high(pin_c7);
  28. }else if ((inferior>5) && (delantero>200) && (iz1<180) && (iz2<180)){//gira a la izquierda
  29. output_low(pin_c0);//Motor izquierdo
  30. output_high(pin_b0);//Motor derecho
  31. output_low(pin_c1);
  32. output_high(pin_c2);
  33. output_low(pin_c6);
  34. output_high(pin_c7);
  35. }else if ((inferior>5) && (delantero<200) && (iz1>180) && (iz2>180)){//corregir derecha
  36. output_high(pin_c0);//Motor izquierdo
  37. output_low(pin_b0);//Motor derecho
  38. output_low(pin_c1);
  39. output_high(pin_c2);
  40. output_low(pin_c6);
  41. output_high(pin_c7);
  42. }else if ((inferior>5) && (delantero<200) && (iz1>180) && (iz2<180)){//corregir derecha
  43. output_high(pin_c0);//Motor izquierdo
  44. output_low(pin_b0);//Motor derecho
  45. output_low(pin_c1);
  46. output_high(pin_c2);
  47. output_low(pin_c6);
  48. output_high(pin_c7);
  49. }else if ((inferior>5) && (delantero<200) && (iz1<180) && (iz2>180)){//corregir derecha
  50. output_high(pin_c0);//Motor izquierdo
  51. output_low(pin_b0);//Motor derecho
  52. output_low(pin_c1);
  53. output_high(pin_c2);
  54. output_low(pin_c6);
  55. output_high(pin_c7);
  56. }else{
  57. output_low(pin_c0);//Motor izquierdo
  58. output_low(pin_b0);//Motor derecho
  59. }
  60. }while(TRUE);
  61.  
  62. }

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: Leer sensores y actuar
« Respuesta #1 en: 28 de Marzo de 2008, 03:18:54 »
bueno,por lo que veo quieres controlar un cochecito,bueno esa es mi impresion,mira,mirando tu programa,y viendo que usas un 18f,bueno primero empezaria por configurar los #fuses,ya que veo solo configuraste para la velocidad del crystal,primero te diria que probaras conun pic queno este mas sencillo, y asi empezar poco a poco,ya que la gama 18f es mas sofisticada,y por lo tanto mas configuraciones,te recomiendo que revises el hilo de ejemplitos en c para 16f648,para empezar,si de plano nada mas tienes ese micro,ve al hilo de Mis primeros pasos con el 18f4550, rapidamente te pongo un pequeño ejemplito para el adc

#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=12000000)
#use standard_io(b)
#use standard_io(c)

int valor=0x00;

toma_adc(void){
set_adc_channel(0);
delay_ms(1);
valor=read_adc();

delay_ms(1);

}

void main()
{

   setup_adc_ports(RA0_analog);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!
   while(1){
   toma_adc();
 
   
   output_b(valor);
   if (valor>52){
   output_high(pin_c0);
   }else{
   output_low(pin_c0);
   }
   
   
   
   }

}
checa el datasheet,ahi comprenderas mas del micro, espero haberte ayudado
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado Skualo

  • PIC10
  • *
  • Mensajes: 42
Re: Leer sensores y actuar
« Respuesta #2 en: 28 de Marzo de 2008, 09:16:18 »
Me voy a poner a mirar los ejermplos y lo de inciacion al 18f que e visto que esta muy bien explicado pero al margen, me gustaria saber si tal y como esta el programa añadiendo los fuses que tocan, crees que los if se pueden utilizar para hacer comparaciones grandes o no es correcto usarlos de esa manera?

Saludos y gracias por la ayuda  :)

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Re: Leer sensores y actuar
« Respuesta #3 en: 28 de Marzo de 2008, 11:54:43 »
Hola

Mira los ejemplos de CCS sobre ADCs, pues me parece que entre read_adc y read_adc, hay que dejar cierto delay_us para que el ADC se cargue otra vez.

Un IF claro que se puede usar para hacer comparaciones grandes. Todo lo grandes que quieras. Pero recuerda que cuantos mas terminos metas en la expresion, mas tardará el micro en procesarlo, aunque lo crítico que es eso, depende de la aplicacion. Aun asi, se pueden simplificar las cosas, con un poco de logica.

Echandole un vistazo rapido a tu codigo, veo que inferior>5 en todos los IFs.

Eso lo puedes poner asi:

if(inferior>5)
{
     ...otras condiciones...
}
else
{
   ...condiciones en las que inferior<=5
}

No te cortes en anidar IFs. Es mucho mas optimo. Y aunque el compilador corrige esos aspectos por ti, mejor que los corrijas tú desde el principio, pues nunca se sabe lo que se puede esperar de un compilador  :x.

Un saludo!

Desconectado Skualo

  • PIC10
  • *
  • Mensajes: 42
Re: Leer sensores y actuar
« Respuesta #4 en: 28 de Marzo de 2008, 14:43:16 »
vale gracias, empiezo a pensar que el problema puede ser del circuito que tengo para el pic, concretamente el oscilador creo que es el problema. Porque aveces va otras y otras no y toco el crystal o los condensadores y acaba funcionando.

Yo cuando consegui que todo me fuera bien me di cuenta que cuando ponia por ejemplo 3 sensores dava igual cual estuviera con un valor alto porque siempre se activava como si leyera el que el quisiera, y mire si era porque la señal entrava por otra entrada y no era por eso y prove con miles de maneras y nunca conseguia que me funcionara con mas de 2 sensores.

Los sensores que utilizo son muy chapuzas en el sentido de que son dos emisores ir resistencia y dos receptores ir con su resistencia...

Saludos

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Re: Leer sensores y actuar
« Respuesta #5 en: 29 de Marzo de 2008, 08:32:32 »
Ok, te doy la solucion (uno que ha vivido eso de que el pic solo funciona cuando tocas el oscilador y aun apenas): condensador de 100nF entre VCC y MASA, lo mas cerca posible de las patillas de alimentacion del PIC.

PD: El condensador que sea no-polarizado... los de 100nf son como una cajitas amarillas, los q yo tengo al menos.

PD2: No se supone que los emisores y receptores IR dan una salida casi-digital? No se, yo he trabajado con CNY70s y la verdad, la mejor opcion es la de calibrarlos con un potenciometro y un comparador... y tratarlos como entradas digitales. Pero nose, tu sabras.
« Última modificación: 29 de Marzo de 2008, 08:35:03 por manex_1987 »

Desconectado Skualo

  • PIC10
  • *
  • Mensajes: 42
Re: Leer sensores y actuar
« Respuesta #6 en: 29 de Marzo de 2008, 12:44:46 »
Vaya tio mano de santo el condensador de 100 nF, increible aora me va perfecto   :mrgreen:  Muchas Gracias.

Es que el de seguidor de lineas si que es mejor digital, pero lo de los if "grandes" lo estoy usando, para un robot que recorra un laberinto y lo de analogico lo uso para corregir la direccion que en las rectas intente ir lo mas recto posible.
Hoy e estado haciendo pruevas y me funciona ya muy bien con el tema del condesador, y haver añadido la configuracion correcta pero el problema que tengo, que me parece un poco raro y seguro que es algo de configuracion es con el Ra5 del 18f2550 parece como si estuviese conectado con el Ra2 porque cuando ocurre alguna condicion en el programa da igual tocar Ra2 que Ra5, siempre que los uso juntos en una condicion al usarlos por separados van perfectos  :? .

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Re: Leer sensores y actuar
« Respuesta #7 en: 31 de Marzo de 2008, 11:41:27 »
Echale un vistazo al datasheet... que funciones hay en esos pines? Has desactivado el ADC en esos pines? No seran colector abierto? Esque no tengo data a mano, y tengo prisa aver si otro dia te miro.



 

anything