# Programar pic para control de sensores de ultrasonido SRF05



## tachcha (Mar 29, 2011)

Hola! estoy haciendo un proyecto con un robot el cual tiene 4 botones para que uno elija el movimiento q desea q haga el robot, entonces le voy a poner 4 sensores de ultrasonido para detectar obstaculos, la idea es q si se presiona el boton de movimiento adelante, se active el sensor delantero, si se oprime el boton derecha, se active el sonsor de la derecha y asi sucesivamente, este control lo quiero hacer con un pic 16F876A o 16F877 pero estoy un poquito perdida en la programacion en picc, no he podido hacer el programa, si alguien me puede ayudar con esto se lo agradeceria en el alma!
Gracias


----------



## Joseph (Mar 30, 2011)

Que es lo que quieres programar, un programa que seleccione salidas, o un programa que genera la frecuencia para el sensor?


----------



## tachcha (Mar 30, 2011)

mira mi circuito tiene 4 pulsadores, y 4 sensores, lo que deseo es que por ejemplo si el robot va caminando de frente(la eleccion de la direccion del movimiento se hace con un pulsador), se active unicamente el sensor ultrasonido que esta ubicado al frente del robot.
Si oprimo el boton de la derecha el robot girar a la derecha y necesito que se active unicamente ese sensor, el que esta a la derecha. Quiero hacer este control con un pic.
Gracias por cualquier ayuda q me puedas brindr


----------



## FaintMX (Mar 30, 2011)

Lo que se me ocurre es asignarle un numero a cada boton por ejemplo

 void loop ()


si boton adelante == high 
  boton=1

si boton atras == high 
  boton=2

si boton izquierda == high 
  boton=3

si boton derecha == high 
  boton=4

caso
  boton == 1
     activar motor sentido adelante
    activar sensor delantero

  boton==2
 ....

....

Todo depende en que lenguaje estas programando


----------



## tachcha (Mar 30, 2011)

Estoy usando pic-c


----------



## ecastle (Mar 31, 2011)

hola a todos desviando un poco el tema, quisiera preguntar algo diferente, estoy tratando con el lenguaje assembler, ps quiero atreverme a utilizar el lenguaje C, pero no se por donde empezar
alguien que me pueda hacer el favor de enviarme algun documento, pdf, pagina donde yo pueda ver como funciona el lenguaje, y que estas indicaciones tengan ejemplos para poder comprobarlos!!!
gracias a todos los que me ayuden!!!bye


----------



## EINNER C (Abr 1, 2011)

hola tachcha

quisiera saber si lo que necesitas es ayuda, acerca de como obtener los datos del sensor, ya que como creo habras visto, estos trabajan con el protocolo i2c, y pues cuando los montas en el bus debes asignarle una direccion a cada uno por lo que no es dificil saber de que sensor se quiere leer, la rutina seria mas o menos asi, estructura


```
definiciones...

leer_sensor(recibe como parametro la direccion)

{
rutina de lectura
}

void main()
{
while (true)
{
if(input_pinA0)
   {
a=direccion del sensor frente

}

f(input_pinA0)
   {
a=direccion del sensor atras

}

f(input_pinA0)
   {
a=direccion del sensor derecha

}

f(input_pinA0)
   {
a=direccion del sensor izquierda

}

leer_sensor(a);
}
}
```

saludos

y ecastle te recomiendo que busques este libro.. Compilador C Ccs Y Simulador Proteus Para Microcontroladores Pic  esta muy bn explicado y trae ejemplos

saludos...


----------



## tachcha (Abr 4, 2011)

Hola! es q tengo una duda, estos sensores tienen emisor y receptor, la idea es q por un puerto del pic ingresen los datos del receptor y por otro puerto del pic salgan nos los datos del emisor. AYUDA PLEASE


----------



## EINNER C (Abr 6, 2011)

tachcha dijo:


> Hola! es q tengo una duda, estos sensores tienen emisor y receptor, la idea es q por un puerto del pic ingresen los datos del receptor y por otro puerto del pic salgan nos los datos del emisor. AYUDA PLEASE



hola

pues la verdad no se a que te refiers, cuando se habla de que tiene emisor y receptor, se refiere a que tiene el emisor de infrarojos y el recptor, alli mismo, lo que indica que cuando le das la orden de tomar una nueva lectura, el envia el haz de infrarojos, y los que rebotan los recibe el receptor, para asi calcular la distancia que te entregara (despues de enviar la orden debes esperar por lo menos 70ms)

por ello lo unico que puedes hacer es dar la orden y recibir el dato de la distancia, y ademas esto se hace por i2c o por serial, asi que solo necesitarias dos pines del pic, podiendo colocar hasta 16 sensores en el mismo bus;;;

cualquier duda comental, o explica mejor lo que quieres,,

saludos////


----------



## shala (Jul 28, 2011)

lo que tu quieres hacer la verdad es bastante fácil pero consumes muchos recursos del pic, te "llevarías" 2 puertos del pic y la verdad te recomiendo, específicamente para el SRF05, puedes en un solo puerto mandar y recibir... primero defines el puerto como salida y mandas la señal, luego defines el puerto como entrada y recibes la señal... ya tu dirás cuál te conviene mas...

Saludos!!!


----------



## EDWIN SANCHEZ MILLA (Oct 7, 2015)

Hola, amigos. 
 Viendo este tema voy de frente al punto.
Quiero medir la distancia de dos sensores ultrasónicos con PIC partiendo del programa adjunto, pero tengo dificultades en cómo realizarlo.
No sé si usar el mismo timer para tomar el tiempo de los 2 sensores para luego convertirlos en distancia.

Adjunto el programa que realicé para la medición de un solo sensor de ultrasonido.

Espero me puedan ayudar con la duda. De antemano, gracias.

```
#INCLUDE <16F877A.H>
#FUSES XT
#USE DELAY (CLOCK = 4M)
#define LCD_ENABLE_PIN PIN_B2 
#define LCD_RS_PIN PIN_B0 
#define LCD_RW_PIN PIN_B1 
#define LCD_DATA4 PIN_B4 
#define LCD_DATA5 PIN_B5 
#define LCD_DATA6 PIN_B6 
#define LCD_DATA7 PIN_B7 
#BYTE TRISD = 0X88
#BYTE PORTD = 0X08
#BIT TRIG = 0X08.0
#BIT ECHO = 0X08.1
#INCLUDE <LCD.C>
INT16 TIEMPO;
FLOAT DISTANCIA; 
VOID MAIN ()
{
TRISD=0X02;
PORTD=0X02;
TRIG=0;
ECHO =1;
SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_1);
SET_TRIS_B(0B00000010);
OUTPUT_B(0);
LCD_INIT();
PRINTF(LCD_PUTC," MEDICION ");

WHILE (TRUE)
{
TRIG=1;
DELAY_US(10);
TRIG=0;
DO 
{}
WHILE (ECHO==0);
SET_TIMER1(0);

DO
{}
WHILE(ECHO==1);
TIEMPO=GET_TIMER1();

DISTANCIA=TIEMPO/58.12;
lcd_gotoxy(4,2);
printf(lcd_putc," %3.1F CM ",DISTANCIA);
DELAY_MS(500);
}
}
```


----------



## D@rkbytes (Oct 7, 2015)

EDWIN SANCHEZ MILLA dijo:


> No sé si usar el mismo timer para tomar el tiempo de los 2 sensores para luego convertirlos en distancia.


Si puedes usar el mismo timer para leer varios sensores, pero lo debes hacer en cascada.
Primero uno, después el otro, y así en secuencia.
Si los quieres leer al mismo tiempo, tendrás que usar interrupciones externas y timers independientes.


----------

