Autor Tema: "Sonar" para robot - Ideas  (Leído 9758 veces)

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

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: "Sonar" para robot - Ideas
« Respuesta #15 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  :(

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: "Sonar" para robot - Ideas
« Respuesta #16 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.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: "Sonar" para robot - Ideas
« Respuesta #17 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!) :-/
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: "Sonar" para robot - Ideas
« Respuesta #18 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!
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: "Sonar" para robot - Ideas
« Respuesta #19 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!
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: "Sonar" para robot - Ideas
« Respuesta #20 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?

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: "Sonar" para robot - Ideas
« Respuesta #21 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:
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: "Sonar" para robot - Ideas
« Respuesta #22 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
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: "Sonar" para robot - Ideas
« Respuesta #23 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.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: "Sonar" para robot - Ideas
« Respuesta #24 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!
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: "Sonar" para robot - Ideas
« Respuesta #25 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  :?

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: "Sonar" para robot - Ideas
« Respuesta #26 en: 13 de Octubre de 2006, 08:43:07 »
Bien! Te lo paso por mail, no "entra" por aqui.....
Saludos.
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: "Sonar" para robot - Ideas
« Respuesta #27 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.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: "Sonar" para robot - Ideas
« Respuesta #28 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!
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert