TODOPIC

Mecatrónica => Robótica => Mensaje iniciado por: aitopes en 10 de Octubre de 2006, 09:35:58

Título: "Sonar" para robot - Ideas
Publicado por: aitopes en 10 de Octubre de 2006, 09:35:58
Hola!
Estoy comenzando mi primer robot, un exapodo (suavecito el comienzo), lo mas modular posible.
Para la navegacion se me ocurrio hacer una especie de sonar, con un emisor y receptor ultrasonico, movido por un servo que trace un mapa de lo que hay delante del aparatejo.
Tengo un display de 128x64 para "ver" lo que me devuelve el sonar, y pienso usar Mikrobasic para el manejo de todo.

Me gustaria que me comenten si han encarado algo asi, como para evitar cometer errores obvios...:)

Gracias!

Título: Re: "Sonar" para robot - Ideas
Publicado por: LordLafebre en 10 de Octubre de 2006, 11:44:08
Hola:

Un hexapodo es algo que tengo pendiente  :D , tengo todo, menos el sensor de ultrasonidos  :?, tambien tengo un GLCD de esos y tambien he pensado en utilizar uno para graficar "algo".  Tengo tres servos separados para el hexapodo, incluso tengo los planos para la estructura de un hexapodo que lo consegui de alguna parte. Yo te acompañare en este proyecto, creo que en una semana, ya que tengo que acabar algunas cosillas con mi otro Bot, pero ya son detalles, asi que ya somos dos en esto  :mrgreen: :-/
Título: Re: "Sonar" para robot - Ideas
Publicado por: navaismo en 10 de Octubre de 2006, 12:09:14
Hola amigos, Yo tengo un libro que han de conocer bien de como hacer un hexapodo con PBP y 3 servos, Gio creo que te lo pase en un cd por si no lo tienes y a Aitopes se lo podemos pasar -jeje espero no volver a las andadas de que me editen los post y si si sorry de una vez-

Bueno lo del barrido con un servo lo vi por aqui alguna vez pero no con ultrasonico si no con un infrarojo y era como una antena.

Saludos a ambos
PD ya no usen MKB es un asko plagado de errores :mrgreen: :D :D
Título: Re: "Sonar" para robot - Ideas
Publicado por: LordLafebre en 10 de Octubre de 2006, 12:18:37
Hola:

Gracais Max por lo del libro, no me he fijado, pero si tengo uno que indica como hacerlo, la verdad que perdería la gracia si solo lo "armamos", asi que mi idea es programar todo yo mismo, con respecto al compilador utilizaré Proton + (me gusta mas que PBP y MKB) voy a buscar las piezas de la maqueta para ponerlo por aqui  :mrgreen:
Título: Re: "Sonar" para robot - Ideas
Publicado por: navaismo en 10 de Octubre de 2006, 12:26:23
Citar
la verdad que perdería la gracia si solo lo "armamos", asi que mi idea es programar todo yo mismo,

Si eso si, aunque lo decia mas como material de apoyo no como copia, y si has de conocer le libro es de John Iovinne o algo asi se llama donde viene como cortar hasta el aluminio y eso.

Saludoss y que estes mas descansado amigo
Título: Re: "Sonar" para robot - Ideas
Publicado por: LordLafebre en 10 de Octubre de 2006, 12:35:29
Hola:

Ese mismo tengo, es muy bueno, lo malo es que no encuentro las piezas de la maqueta, creo que las perdi  :8} :8}
Título: Re: "Sonar" para robot - Ideas
Publicado por: LordLafebre en 10 de Octubre de 2006, 12:56:03
Hola:

Ya lo encontreeeeeeee  :-/ :-/ :-/, este es:

(http://img107.imageshack.us/img107/7793/planohexws5.gif)

Que les parece?  Este modelo me gusta, solo tendriamos que hacerlo, almenos lo que corresponde a la estructura estaría solucionado, o si alguien tiene alguna idea o una estructura mejor, bien venido sea  :mrgreen:
Título: Re: "Sonar" para robot - Ideas
Publicado por: navaismo en 10 de Octubre de 2006, 13:31:59
Con esas plantillas queda asi?:

(http://img201.imageshack.us/img201/2779/hexann9.jpg)

porque no se parecen mucho a las que decia
Título: Re: "Sonar" para robot - Ideas
Publicado por: LordLafebre en 10 de Octubre de 2006, 13:35:42
Hola:

Max, esta es un poco diferente, no recuerdo bien cual era el acabado, y no tengo una imagen.
Título: Re: "Sonar" para robot - Ideas
Publicado por: aitopes en 10 de Octubre de 2006, 15:22:05
Ops! No puedo ir un rato que ya se llena el hilo de posts!!!! :-)

Mi idea es un poco mas compleja!
Estoy armando piezas de aluminio tambien, pero pienso utilizar....19 servos!!! 3 por pata, mas uno para la cabeza.
Las patas tienen una articulacion en la "cadera" que les permite dos grados de libertas, mediante dos servos: uno para moverse en sentido horizontal (avanzar y retrasar la punta de la pata), y el otro para subir y bajar la "pierna". El tercer servo seria la rodilla.
3x6 = 18 servos.
Cada servo esta en un soporte que pienso fotografiar para pasarselos, de manera que se puede poner en el lado opuesto al eje otro eje mas para que haga fuerza parejo. Eso lo copie de un sitio de robotica, cuyo link pasaron en algun hilo de este foro (gracias!!).

Es mas caro, y un poco mas complicado de construir, pero he visto algunos funcionando, y son....espectaculares! Es dificil la parte mecanica, pero el autentico desafio me parece que viene por el lado de la programacion.
Yo lo voy a abordar con Mikrobasic, y supongo que terminar el proyecto me llevara unos 6 meses, sobre todo por el tema de las piezas de aluminio, que me dan bastante trabajo ya que no soy muy ducho en esto de la "metalurgia".

Saludos!

Título: Re: "Sonar" para robot - Ideas
Publicado por: dogflu66 en 10 de Octubre de 2006, 16:16:53
A mi las patas no me gustan mucho, pero lo mismo me animo... ya veremos...
seguire el hilo con interes...
Título: Re: "Sonar" para robot - Ideas
Publicado por: aitopes en 10 de Octubre de 2006, 17:04:24
A mi me gustan menos...;) Pero hacerlo con dos rueditas me parecio que era (seguro que me equivoco!) un proyecto para unas dos semanas, trucando un par de servos.
Como soy muuuy masoquista, vi un video  (Lynxmotion Aluminium H3R  (http://www.youtube.com/watch?v=G8-WqAflkPs))  que me volo la cabeza  :shock:, y aqui estamos.

Estoy termianando el PCB del sonar, al menos de la parte de manejo de los sensores, ya que pienso hacerlo todo modular. Es un PCB que lleva un par de operacionales, el par RX/TX y un conector para "unirlo" con el cerebro del robot. Incluso llegue a considerar hacer una placa algo mas inteligente, con un  12F508 o algo asi para quitar tareas a la placa principal, pero por ahora la voy a dejar "boba" y en caso de ser necesario agrego un modulito intermedio entre este y el "cerebro".

Aclaro que este hilo, al menos por mi parte, va a ser un "pensar en voz alta", y no seria raro que mas de una vez de marcha atras con algo o cambie radicalemnte de rumbo, asi que ...cuidado!!!! :)

Saludos.
Título: Re: "Sonar" para robot - Ideas
Publicado por: LordLafebre en 10 de Octubre de 2006, 18:24:35
Hola:

De ser asi, solo seguire el post  :D ,  por ahora para mi es mucho 18 servos, ando gastado con el Sentinel y el GLCD y el touch que compre, asi que solo me conformare con el hexapodo de 3 servitos humildemente  :8} ,  pero en cuanto al sistema de navegacion y esas cosas, lo podemos compartir, asi que por aqui andaré.

PD: Maistro, como la envidia te mata, se que terminarás haciendo el hexapodo  :D :D :D
Título: Re: "Sonar" para robot - Ideas
Publicado por: aitopes en 10 de Octubre de 2006, 18:31:32
El tema del costo de los servos es importante, en Argentina un Hitec se consigue en unos $ 35 (u$s 12 aprox), asi que son casi u$s 230 en servos.
En lo particular, estoy cerca de conseguir un "sponsor" para ellos, si no, los ire comprando de a los que pueda... ;)

Título: Re: "Sonar" para robot - Ideas
Publicado por: Veguepic en 10 de Octubre de 2006, 18:34:44
Hola Amigotes:

Para el sonar les recomiendo lean el EPE de Junio del 2005, trae un articulo justo sobre como implementar un sonar usando un emisor-receptor ultrasonico y un motor paso a paso, sale mas a cuenta que usar un servo.

Suerte
Título: Re: "Sonar" para robot - Ideas
Publicado por: LordLafebre en 10 de Octubre de 2006, 18:36:42
Hola:

Ariel, me imagino que eso costara un HS-311, para seleccionar los servos tendras que ver cuál será el peso de la araña para que dependiendo de eso selecciones todos, no vaya a ser que un HS-311 no sea suficiente por el torque que tiene, aqui lastimosamente no se consigue otro que no sea un HS-311 y a un precio no menor de USD $13.50  :(
Título: Re: "Sonar" para robot - Ideas
Publicado por: jfh900 en 10 de Octubre de 2006, 18:44:24
Yo tengo un trabajo ealizado parecido a lo que quieres son un SRF08, pero por razones que ahora no vienen al caso no lo puedo publicar. Mas adelante si estará disponible en Internet. Lo que te puedo adelantar es que el sistema de sonar es muy inestable y presenta mucho ruido espureo, con lo cual las medidas no son muy fiables. Tal vez sea necesario implementar un filtro, aunque las pruebas que realice con un filtro de mdia no fueron muy alentadores.

Un saludo.
Título: Re: "Sonar" para robot - Ideas
Publicado por: aitopes en 10 de Octubre de 2006, 18:47:36
Hola amigo!
Yo los uso en los modelos de aeromodelismo (mi hijo de 10 años tiene un avion y le estoy haciendo otro), y me da la sensacion de que la fuerza (3Kg de torque, si mal no recuerdo) es suficiente. Por lo pronto, acabo de encargar 3, para hacer una pata y ver que pasa. El peso total rondara los 2,5K, incluidas dos minibaterias de 6,3V-1.3A que consegui. El chasis lo estoy armando con chatarra, a partir del esqueleto de dos lectoras de CD-ROM en linea. Eso da un largo de unos 40cm para el cuerpo del robot, por unos 17 o 18cm de ancho.

Tooodo eso es como prueba. Vermos que pasa. Estoy pensando en usar remaches de aluminio para unir algunas partes, supongo que son mas livianos que los tornillos.

(me parece que me estoy metiendo un un lio....ja ja ja, pero me encanta!) :-/
Título: Re: "Sonar" para robot - Ideas
Publicado por: aitopes en 10 de Octubre de 2006, 18:57:34
Hola jfh900!
Yo me base en un esquema que tengo impreso (originalmente un PDF que circulo por el foro) "entitulado" PROTON+ EXPERIMENTERS NOTEBOOK. Lamentablemente, solo me quedo el impreso por que he perdido el PDF, pero el esquema es el que posteo aca, scaneado, junto al PCB que acabo de hacer. OJO, AUN NO LO HE PROBADO!!!!.
Por supuesto, falta el PIC y el programa, pero esa pareciera la parte facil...:)

PD: No encare con el SRF por que tengo el TX y RX, y me parecio interesante hacer algo "casero".

Saludos!
Título: Re: "Sonar" para robot - Ideas
Publicado por: aitopes en 12 de Octubre de 2006, 11:36:54
Hola otra vez...
Acabo de terminar el hard del emisor/receptor de utrasonidos. Posee un conector para unirlo mediante cable plano a la placa principal del robot. Ahora me tengo que poner con el hard, quizas necesite alguna ayuda con unas pocas lineas de asembler que me permitan emitir el pulso de 40Khz con presicion, por ahi los molesto con ese tema. :)

Saludos!
Título: Re: "Sonar" para robot - Ideas
Publicado por: LordLafebre en 12 de Octubre de 2006, 12:06:10
Hola:

Que bien te quedo Ariel, con respecto al programa en el mismo archivo de donde sacaste el esquema esta el programa para proton + ,  por que no lo pruebas a ver como te va?
Título: Re: "Sonar" para robot - Ideas
Publicado por: aitopes en 12 de Octubre de 2006, 16:44:55
El tema es que no tengro Proton....asi que estoy jugando con el MKB para ver que pasa :shock:. Igualmente, no es algo tan complejo como para no sacarlo andando rapidamente.
Te mantengo al tanto. Ahora estoy esperando visita, pero en un par de horas (espero) me pongo a terminarlo.

Saludos! :mrgreen:
Título: Re: "Sonar" para robot - Ideas
Publicado por: jfh900 en 12 de Octubre de 2006, 16:58:41
Aquí pongo el código del SRF08 en "C", tal vez puedas sacar algo en claro:

Código: C
  1. ////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  SRF08 Ultrasonic rangefinder Software - Preliminary
  4. //
  5. //  Written by Gerald Coe - November 2001
  6. //
  7. // (C) Copyright Devantech Ltd 2001
  8. //  Commercial use of this software is prohibited.
  9. //  Private and Educational use only is permitted
  10. //
  11. ////////////////////////////////////////////////////////////////////////////
  12. //
  13. // Sonar uses one of 16 addresses -> 0xe0 - 0xfe
  14. // Bit 0 is always zero - its the i2c rd/wr bit
  15. //
  16. ////////////////////////////////////////////////////////////////////////////
  17. //
  18. // This software is written for the HITECH PICC C compiler
  19. //
  20. ////////////////////////////////////////////////////////////////////////////
  21.  
  22.  
  23. #include "pic.h"
  24.  
  25. #define version  1      // software version
  26. #define echo    RA2    // 1st stage echo line
  27. #define led      RB4    // low to light led
  28. #define pot_ud    RC0    // Pot up/dw control
  29. #define pot_cs    RC1    // Pot chip select control
  30. #define anpower  RC2    // analog power - low on
  31. #define txpower   RC5    // Tx power - low on
  32. #define clamp    RC6    // comparator clamp
  33. #define clamp_en  TRISC6  // comparator clamp enable
  34. #define detect    RC7
  35.  
  36.  
  37. // initialise the eeprom with 0xea i2c address
  38. // the default shipping address is 0xe0, our test jig
  39. // will change the address to 0xe0
  40. __EEPROM_DATA (0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0xff, 0xff);
  41.  
  42.  
  43. // prototypes
  44. void setup(void);
  45. void burst(void);
  46. void multi_range(void);
  47. void ann_range(void);
  48. void set_bit(unsigned char idx);
  49. void flash_addr(void);
  50. void convert(unsigned char cmd, unsigned char idx);
  51.  
  52.  
  53. // global variables
  54. char buffer[36];
  55. char loop, dlyctr;
  56. bit timeout;
  57. unsigned char command, index;
  58. unsigned char gain, gaincnt;
  59.  
  60.  
  61. // the interrupt
  62. void interrupt the_only_one(void)
  63. {
  64. static char idx=0, wr_addr=0;
  65. char i2c_data;
  66.  
  67.   if(SSPIF) { // I2C interrupt
  68.     SSPIF = 0;
  69.  
  70.     if(!STAT_DA) { // low = address
  71.       wr_addr=0;
  72.     }
  73.     if(STAT_RW) { // high = read from this program
  74.       SSPBUF = buffer[idx]; // send data
  75.       if(idx<36) ++idx; // limit index to 32 bytes
  76.       CKP = 1; // release I2C clock line
  77.     }
  78.     else {
  79.       i2c_data = SSPBUF; // read incoming data
  80.       wr_addr++;
  81.       if(wr_addr==2) { // 1st byte written is internal location
  82.         idx = i2c_data; // lower 4 bits only (0-35 index)
  83.         if(idx>35) idx=35; // limit index
  84.       }
  85.       else {
  86.         if(idx==0 && wr_addr==3) { // register 0 is start ping command
  87.           command=i2c_data;
  88.         }
  89.       }
  90.     }
  91.     SSPOV = 0;
  92.   }
  93.  
  94.   if(TMR1IF==1) { // timer1 is the echo timer
  95.     timeout = 1; // end of echo timing when it rolls over
  96.     TMR1ON = 0;
  97.     TMR1IF = 0;
  98.     }
  99. }
  100.  
  101.  
  102.  
  103. void main(void)
  104. {
  105. static unsigned char seq=0;
  106.  
  107.   setup(); // initialise the peripherals
  108.   flash_addr(); // flash the I2C address on LED
  109.  
  110.   while(1) {
  111.     while(!command); // wait for start command
  112.  
  113.     timeout = 1; // end of echo timing when new command arrives
  114.     TMR1ON = 0;
  115.     TMR1IF = 0;
  116.  
  117.     switch(command) {
  118.       case 0x00: // Gain commands to limit max. gain in
  119.       case 0x01: // Range Mode
  120.       case 0x02:
  121.       case 0x03:
  122.       case 0x04:
  123.       case 0x05:
  124.       case 0x06:
  125.       case 0x07:
  126.       case 0x08:
  127.       case 0x09:
  128.       case 0x0A:
  129.       case 0x0B:
  130.       case 0x0C:
  131.       case 0x0D:
  132.       case 0x0E:
  133.       case 0x0F:
  134.       case 0x10:
  135.       case 0x11:
  136.       case 0x12:
  137.       case 0x13:
  138.       case 0x14:
  139.       case 0x15:
  140.       case 0x16:
  141.       case 0x17:
  142.       case 0x18:
  143.       case 0x19:
  144.       case 0x1A:
  145.       case 0x1B:
  146.       case 0x1C:
  147.       case 0x1D:
  148.       case 0x1E:
  149.       case 0x1F: gain = command;
  150.               break;
  151.      
  152.       case 0x80: // inches, centimetres or uS  
  153.       case 0x81:
  154.       case 0x82: multi_range(); // 2byte multi-ping data
  155.               seq = 0;  // reset address change sequence
  156.               break;
  157.       case 0x83:
  158.       case 0x84:
  159.       case 0x85: ann_range(); // 2byte 1st, 1byte multi-pings
  160.               seq = 0; // reset address change sequence
  161.               break;
  162.       case 0xa0:  seq = 1; // start of sequence to change address
  163.               break;
  164.       case 0xaa:  if(seq==1) ++seq; // 2nd of sequence to change address
  165.               else seq = 0;
  166.               break;
  167.       case 0xa5:  if(seq==2) ++seq; // 3rd of sequence to change address
  168.               else seq = 0;
  169.               break;
  170.       case 0xe0: // if seq=3 user is changing sonar I2C address
  171.       case 0xe2:
  172.       case 0xe4:
  173.       case 0xe6:
  174.       case 0xe8:
  175.       case 0xea:
  176.       case 0xec:
  177.       case 0xee:
  178.       case 0xf0:
  179.       case 0xf2:
  180.       case 0xf4:
  181.       case 0xf6:
  182.       case 0xf8:
  183.       case 0xfa:
  184.       case 0xfc:
  185.       case 0xfe:  if(seq==3) {
  186.                 EEPROM_WRITE(5, command);
  187.                 SSPADD = command;
  188.                 led = 0;
  189.               }
  190.               seq = 0;
  191.               break;
  192.     }      
  193.  
  194.     command = 0;
  195.     anpower = 1; // analog power off
  196.   }
  197. }
  198.  
  199.  
  200.  
  201. ////////////////////////////////////////////////////////////////////////////
  202.  
  203. // The burst routine generates an acurately timed 40khz burst of 8 cycles.
  204. // Timing assumes an 8Mhz PIC (500nS instruction rate)
  205. // I drop down to assembler here because I don't trust the compiler to
  206. // always generate accurately timed code with different versions or
  207. // optimisation settings
  208. //
  209. void burst(void) {
  210.  
  211. char x;
  212.   clamp = 0;
  213.   clamp_en = 0; // force low on clamp line
  214.    
  215.   pot_cs = 1; // deselect pot
  216.   led = 0; // on
  217.   GIE = 0; // disable interrupts for timing accuracy
  218.   txpower = 0; // turn st232 on
  219.   anpower = 0; // turn analog power on
  220.   loop = 8;  // number of cycles in burst
  221.   pot_ud = 1; // select pot inc mode
  222.   x = 0;  
  223.   while(--x); // wait for +/- 10v to charge up.
  224.   pot_cs = 0; // enable pot
  225.   for(x=2; x<36; x++) { // and take opportunity to clear echo buffer
  226.     pot_ud = 0; // and reset pot wiper
  227.     buffer[x] = 0;
  228.     pot_ud = 1;
  229.   }
  230.   clamp_en = 1; // release clamp line
  231.    
  232.   ADGO = 1; // convert light sensor
  233.   pot_cs = 1; // deselect pot
  234.   while(ADGO);
  235.   pot_ud = 0; // select pot dec mode
  236.   buffer[1] = ADRESH; // store light sensor reading
  237.    
  238. #asm
  239. burst1:  movlw    0x14 ; 1st half cycle
  240.       movwf    _PORTB
  241.       nop
  242.  
  243.       movlw    7 ; (7 * 3inst * 500nS) -500nS = 10uS
  244.       movwf    _dlyctr ; 10uS + (5*500nS) = 12.5uS
  245. burst2:  decfsz  _dlyctr,f
  246.       goto    burst2
  247.    
  248.       movlw    0x18 ; 2nd half cycle
  249.       movwf    _PORTB
  250.    
  251.       movlw    6 ; (6 * 3inst * 500nS) -500nS = 8.5uS
  252.       movwf    _dlyctr ; 8.5uS + (8*500nS) = 12.5uS
  253. burst3:  decfsz  _dlyctr,f
  254.       goto    burst3
  255.       nop
  256.       decfsz  _loop,f
  257.       goto    burst1
  258.    
  259.       movlw    0x10 ; set both drives low
  260.       movwf    _PORTB
  261. #endasm
  262.   GIE = 1;
  263.   txpower = 1; // turn st232 off
  264.   led = 1; // Led off
  265.   pot_cs = 0; // enable pot
  266. }
  267.  
  268.  
  269. ////////////////////////////////////////////////////////////////////////////
  270.  
  271. void multi_range(void) {
  272.  
  273. unsigned char tone_cnt, period, cmd;
  274.  
  275.   burst(); // send 40khz burst, reset pot wiper and clear buffer
  276.  
  277.   cmd = command; // save cmd so we know how to convert result  
  278.   TMR0 = 0;
  279.   TMR1H = 0;
  280.   TMR1L = 0;
  281.   timeout = 0;
  282.   tone_cnt = 3;
  283.   index = 2;
  284.   TMR1ON = 1;
  285.   TMR2 = 0;
  286.   TMR2IF = 0;
  287.   gaincnt = gain;
  288.    
  289.   while(timeout==0) { // while still timing stage3
  290.     while(timeout==0 && echo==0) { // wait for high
  291.       if(TMR2IF && gaincnt) {
  292.         pot_ud = 1;
  293.         --gaincnt;
  294.         TMR2IF = 0;
  295.         pot_ud = 0;
  296.       }
  297.     }        
  298.     while(timeout==0 && echo==1) { // wait for low
  299.       if(TMR2IF && gaincnt) {
  300.         pot_ud = 1;
  301.         --gaincnt;
  302.         TMR2IF = 0;
  303.         pot_ud = 0;
  304.       }
  305.     }
  306.    
  307.     if(timeout==0) {
  308.       period = TMR0;
  309.       TMR0 = 0;
  310.       if(period>40 && period<60) {
  311.         if(!(--tone_cnt)) {
  312.           do {
  313.             buffer[index] = TMR1H;
  314.             buffer[index+1] = TMR1L;
  315.           }while(buffer[index] != TMR1H);
  316.          
  317.           convert(cmd, index); // convert to in, cm or uS
  318.           if(index == 36) return;
  319.           index += 2;
  320.           tone_cnt = 3;
  321.           period = 0;
  322.           while(--period){ // delay about 5 inches of range
  323.             if(TMR2IF && gaincnt) {
  324.               pot_ud = 1;
  325.               --gaincnt;
  326.               TMR2IF = 0;
  327.               pot_ud = 0;
  328.             }
  329.           }
  330.           while(--period){
  331.             if(TMR2IF && gaincnt) {
  332.               pot_ud = 1;
  333.               --gaincnt;
  334.               TMR2IF = 0;
  335.               pot_ud = 0;
  336.             }
  337.           }
  338.           while(--period){
  339.             if(TMR2IF && gaincnt) {
  340.               pot_ud = 1;
  341.               --gaincnt;
  342.               TMR2IF = 0;
  343.               pot_ud = 0;
  344.             }
  345.           }
  346.         }
  347.       }
  348.       else tone_cnt=3;
  349.     }
  350.   }
  351. }
  352.  
  353.  
  354. ////////////////////////////////////////////////////////////////////
  355.  
  356.  
  357. void ann_range(void) {
  358.  
  359. unsigned char tone_cnt, period, index, cmd;
  360.  
  361.   burst();        // send 40khz burst and clear buffer
  362.  
  363.   cmd = command;    // save cmd so we know how to convert result  
  364.   TMR0 = 0;
  365.   TMR1H = 0;
  366.   TMR1L = 0;
  367.   timeout = 0;
  368.   tone_cnt = 3;
  369.   index = 2;
  370.   TMR1ON = 1;
  371.  
  372.   while(timeout==0) { // while still timing stage3
  373.     while(timeout==0 && echo==0) { // wait for high
  374.       if(TMR2IF) {
  375.         pot_ud = 1;
  376.         TMR2IF = 0;
  377.         pot_ud = 0;
  378.       }
  379.     }        
  380.     while(timeout==0 && echo==1) { // wait for low
  381.       if(TMR2IF) {
  382.         pot_ud = 1;
  383.         TMR2IF = 0;
  384.         pot_ud = 0;
  385.       }
  386.     }
  387.    
  388.     if(timeout==0) {
  389.       period = TMR0;
  390.       TMR0 = 0;
  391.       if(period>40 && period<60) {
  392.         if(!(--tone_cnt)) {
  393.           set_bit(TMR1H);
  394.           if(index==2) { // only 1st echo in ann mode
  395.             do {
  396.               buffer[index] = TMR1H;
  397.               buffer[index+1] = TMR1L;
  398.             }while(buffer[index] != TMR1H);
  399.             convert(cmd, index); // convert to in, cm or uS
  400.             index += 2;
  401.           }
  402.           tone_cnt = 1; // to detect continuing echo
  403.         }
  404.       }
  405.       else tone_cnt=3;
  406.     }
  407.   }
  408. }        
  409.        
  410.  
  411.  
  412. void set_bit(unsigned char idx)
  413. {
  414. char pos;
  415.  
  416.   pos = idx&7; // lower 3 bits indicate bit position
  417.   idx = (idx>>3)+4; // index into buffer
  418.   switch(pos) {
  419.     case 0: buffer[idx] |= 0x01;
  420.           break;
  421.     case 1: buffer[idx] |= 0x02;
  422.           break;
  423.     case 2: buffer[idx] |= 0x04;
  424.           break;
  425.     case 3: buffer[idx] |= 0x08;
  426.           break;
  427.     case 4: buffer[idx] |= 0x10;
  428.           break;
  429.     case 5: buffer[idx] |= 0x20;
  430.           break;
  431.     case 6: buffer[idx] |= 0x40;
  432.           break;
  433.     case 7: buffer[idx] |= 0x80;
  434.           break;
  435.   }
  436. }
  437.  
  438.  
  439. ////////////////////////////////////////////////////////////////////
  440.  
  441.  
  442. void convert(unsigned char cmd, unsigned char idx)
  443. {
  444. unsigned int x;
  445.  
  446.   x = (buffer[idx]<<8) + buffer[idx+1];
  447.   switch(cmd) {
  448.     case 0x80:
  449.     case 0x83:  x /= 148; // convert to inches
  450.             break;
  451.     case 0x81:
  452.     case 0x84:  x /= 58; // convert to cm
  453.   }
  454.   buffer[idx] = x>>8;
  455.   buffer[idx+1] = x&0xff; // replace uS with inches, cm or uS
  456. }
  457.  
  458.  
  459.  
  460. ////////////////////////////////////////////////////////////////////
  461.  
  462.  
  463. void setup(void)
  464. {
  465. //  _CONFIG(0x0d42); // code protected, hs osc
  466.   __CONFIG(0x3d72); // code not protected, hs osc
  467.  
  468.   ADCON1 = 0x0e; // PortA 0 is analog, rest are digital    
  469.   ADCON0 = 0x41; // convert ch0
  470.   PORTC = 0xff; // nothing powered at start
  471.   TRISA = 0xff; // All inputs
  472.   TRISB = 0xc3; // 11000011 PB7,6,1,0 are inputs, rest are outputs
  473.   TRISC = 0x18; // 00011000 RC3,4 are inputs
  474.   OPTION = 0x08; // portb pullups on, prescaler to wdt
  475.   T1CON = 0x10; // timer1 prescale 1:2, but not started yet
  476.   T2CON = 0x04; // 1:4 prescale and running
  477. //  T2CON = 0x06; // 1:16 prescale and running
  478.   PR2 = 140; // set TMR2IF every 280uS at 8MHz
  479.   SSPSTAT = 0x80; // slew rate disabled
  480.   SSPCON  = 0x36; // enable port in 7 bit slave mode
  481.   SSPCON2 = 0x80; // enable general call (address 0)
  482.   SSPADD  = EEPROM_READ(5); // address 0xE0 - 0xFE
  483.   if(SSPADD<0xE0)
  484.     SSPADD=0xE0; // protection against corrupted eeprom
  485.   else SSPADD &= 0xfe;
  486.   buffer[0] = version; // software revision
  487.   SSPIE = 1; // enable I2C interrupts
  488.   TMR1IE = 1; // enable timer1 interrupts
  489.   TMR1IF = 0;
  490.   SSPIF = 0;
  491.   PEIE = 1; // enable peripheal interrupts
  492.   GIE = 1; // enable global interrupts
  493.   gain = 32; // maximum gain at power-up
  494. }
  495.  
  496.  
  497. ////////////////////////////////////////////////////////////////////
  498.  
  499.  
  500. void flash_addr(void)
  501. {
  502. unsigned char count;
  503. long delay, on, off;
  504.  
  505.   on = off = 30000;
  506.  
  507.   count = ((SSPADD>>1)&0x0f)+1;
  508.   do {
  509.     delay = on;
  510.     on = 10000;
  511.     led = 0; // led on
  512.     while(--delay) if(command) return;
  513.     delay = off;
  514.     off = 20000;
  515.     led = 1; // led off
  516.     while(--delay) if(command) return;
  517.   }
  518.   while(--count);
  519. }
  520.  
  521.  
  522.  
  523. ////////////////////////////////////////////////////////////////////

Un saludo
Título: Re: "Sonar" para robot - Ideas
Publicado por: LordLafebre en 12 de Octubre de 2006, 19:05:20
El tema es que no tengro Proton....asi que estoy jugando con el MKB para ver que pasa :shock:. Igualmente, no es algo tan complejo como para no sacarlo andando rapidamente.
Te mantengo al tanto. Ahora estoy esperando visita, pero en un par de horas (espero) me pongo a terminarlo.

Saludos! :mrgreen:

Hola:

Ariel, te puedo dar compilando ese mismo codigo, para el pic que señala alli y te paso el hex para que lo pruebes, si todo va bien, lo puedes migrar a MKB. O bien puedes tomar ideas del código de jfh900.
Título: Re: "Sonar" para robot - Ideas
Publicado por: aitopes en 12 de Octubre de 2006, 19:43:34
Hola Lord!
Perfecto! Estaria barbaro probar la placa con tu HEX, y luego si todo funciona hacer mi propio programa.
El pin-out utilizado es el mismo del esquema que yo use?

Gracias!
Título: Re: "Sonar" para robot - Ideas
Publicado por: LordLafebre en 13 de Octubre de 2006, 02:29:33
Hola:

Ariel. podrias pasarme el archivo, el pdf donde esta el circuito y el codigo, no logro encontrarlo en mi maquina  :?
Título: Re: "Sonar" para robot - Ideas
Publicado por: aitopes en 13 de Octubre de 2006, 08:43:07
Bien! Te lo paso por mail, no "entra" por aqui.....
Saludos.
Título: Re: "Sonar" para robot - Ideas
Publicado por: LordLafebre en 13 de Octubre de 2006, 11:51:29
Hola:

Ariel, este es el codigo que te compile:

Código: FreeBasic
  1. xtal 4
  2. Device = 16F871 ' Fake a smaller device for a small routine
  3. WARNINGS = OFF ' Disable warning messages
  4. Symbol ECHO = PORTB.0 ' Echo signals from comparator
  5. Symbol TIMER1 = TMR1L.WORD ' Create a 16-bit variable out of TMR1L/TMR1H
  6. Symbol TMR1ON = T1CON.0 ' TIMER1 Enable/Disable
  7. Symbol TMR1IF = PIR1.0 ' TIMER1 overflow flag
  8. Dim PING_LOOP as Byte ' PING Loop counter
  9. Dim PULSE_LENGTH as Word ' TOF (Time Of Flight) value
  10. '---------------------------------------------------------------------------------
  11. ' Program starts here
  12. Delayms 500 ' Wait for PICmicro to stabilise
  13. INTCON = 0 ' Make sure all interrupts are OFF
  14. T1CON = %00000001 ' Enable Timer1 with a prescaler of 1:1
  15. TRISB = %00000001 ' Set ECHO pin as input, all others as outputs
  16. Cls ' Clear the LCD
  17. Goto MAIN_PROGRAM_LOOP ' Jump over the PING subroutine
  18. '---------------------------------------------------------------------------------
  19. ' The PING routine generates a 40khz burst of 8 cycles.
  20. PING:
  21.     PING_LOOP = 8 ' Number of cycles in ping
  22. PING1:
  23.     PORTB = %00010000 ' 1st half of cycle
  24.     Delayus 10 ' Create a delay of 10uS
  25.     PORTB = %00100000 ' 2nd half of cycle
  26.     Delayus 9 ' Create a delay of 9uS
  27.     Djnz PING_LOOP,PING1 ' Special mnemonic to form a fast loop
  28.     Return
  29. '---------------------------------------------------------------------------------
  30. ' The main program loop starts here
  31. MAIN_PROGRAM_LOOP:
  32. While 1 = 1 ' Create an infinite loop
  33.     TMR1ON = 1 ' Enable TIMER1
  34.     Delayms 100 ' Delay 100ms between samples
  35.     TMR1IF = 0 ' Clear TIMER1 overflow
  36.     Gosub PING ' Transmit a 40KHz pulse
  37.     TIMER1 = 0 ' Reset TIMER1 before entering the loop
  38.     Repeat ' Loop until TIMER1 overflows
  39.     If ECHO = 0 Then ' Capture TIMER1 if a LOW on ECHO pin detected
  40.     TMR1ON = 0 ' Disable TIMER1 at this point
  41.     PULSE_LENGTH = TIMER1 ' Store the value of TIMER1
  42.     Break ' Exit the loop
  43.     Endif
  44.     PULSE_LENGTH = 0 ' If we reached here then Out of Range
  45.     Until TMR1IF = 1 ' Timeout if TIMER1 overflows
  46.     If PULSE_LENGTH = 0 Then ' Did we reach the end of the loop ?
  47.         Print at 1,1,"OUT OF RANGE " ' Yes. So Display text if out of range
  48.     Else ' Otherwise...
  49.     ' Display distance in inches
  50.         Print at 1,1,"DIST = ",DEC PULSE_LENGTH / 146,34," "
  51.     Endif
  52. Wend

Entiendo que es para el circuito que tienes armado, pero lo que no se es para que pic lo quieres, hazmelo saber y en seguida te paso el HEX, ya que el del ejemplo es para un 16F871 y no se si quieras hacerlo con ese.
Título: Re: "Sonar" para robot - Ideas
Publicado por: aitopes en 13 de Octubre de 2006, 12:34:37
Gracias por el dato, Vaquepic!
Lo voy a mirar para sacar ideas. Aunque me parece mas liviano un servo que los PAP que tengo a mano. ;)

Saludos!