TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: halowin en 03 de Junio de 2008, 13:25:57
-
Hola a todos.
Soy nuevo en este foro que llevo ojeando varios días y me encanta.
Me he metido en los PICs con el 16F84A, estoy intentando desarrollar un proyectin pequeño porque acabo de empezar, se trata de un cochecito que se desplaza en linea recta. Cuando choca con una pared empieza a andar para atras hasta que choca otra vez y asi hasta el infinito.
Tengo escrito el programa y probado. Utilizo para grabar el PIC una placa MicroPic Trainner y quería preguntar unas cosillas.
1.-¿Cual es el mejor sistema (sensor o lo que sea) para detectar el choque fisicamente? estoy poniendo un pequeño interruptor pero no me convence, quizás haya cosas mas óptima por ahí.
y 2º.- creo que los rebotes del interruptor me estan arruinando el proyecto.
Bueno gracias a todos y un saludo.
-
Saludos halowin!
No sé qué tan sofisticado quieras ser... pero... qué tal un sensor de proximidad?
Ok nos leemos!
P.D. No entiendo la idea de que el pobre cochecito choque y choque contra la pared.. :? se trata de un proyecto de cómo destruir cochecitos? :D
-
Bienvenido Hallowin:
1. El interruptor no me parece mala opción para detectar la colisión: ¿quizás uno como los que utiliza este robot en las antenas: http://members.tripod.com/robomaniac_2001/id77.htm? Aquí tienes un tutorial: http://members.tripod.com/robomaniac_2001/id149.htm
(http://img227.imageshack.us/img227/9986/insectotg1.th.jpg) (http://img227.imageshack.us/my.php?image=insectotg1.jpg)
2. En esta página de RedPIC tienes información sobre cómo evitar los rebotes: http://picmania.garcia-cuervo.com/Proyectos_AUX_Botones.php
-
Hola halowin.
Con respecto a los censores, siempre hay alguno más eficiente, pero esto no quiere decir que lo tengas que usar. Un pulsador como método de saber cuando chocas contra un obstáculo, no es mala idea pero deberás saber utilizar.
Un pulsador, siempre genera una señal de rebote, esto es, cuando se pulsa, genera mucho ruido debido a que cierra el contacto y lo vuelve a abrir (por más que esté precionado). Esto es así, porque los contactos, no son eficientes. Este ruido, el PIC es capaz de leerlo y lo toma como múltiples pulsadas.
Para solucionar esto, lo que debes hacer es lo siguiente:
En el primer pulso recibido, llevar al CP a una espera de 50ms. En este tiempo puedes aprovechar al que el PC haga otro trabajo o hacerle consumir ciclos. De esta manera, una vez que el CP alla detectado el primer pulso y se dirija a otro sitio, no chequeará el puerto y así, no detectará otro pulso.
-
Excelentes respuestas de los maestros del foro!
Por cierto, lo olvidaba... bienvenido al foro halowin! :-/
Nos leemos! :mrgreen:
-
Saludos halowin!
No sé qué tan sofisticado quieras ser... pero... qué tal un sensor de proximidad?
No estaría mal firepic, es solo por economía.
-
Para solucionar esto, lo que debes hacer es lo siguiente:
En el primer pulso recibido, llevar al CP a una espera de 50ms. En este tiempo puedes aprovechar al que el PC haga otro trabajo o hacerle consumir ciclos. De esta manera, una vez que el CP alla detectado el primer pulso y se dirija a otro sitio, no chequeará el puerto y así, no detectará otro pulso.
A ver si he entendido bien: detecto el choque, inicio una pausa de 50 ms y vuelvo a leer el port... pues me quedo en las mismas no?.
A ver si me explico. Si no hay choque vamos a suponer que en esa pata hay un 0, si ahora choca detecto un 1, pues actuo u punto no????
-
A ver si me explico. Si no hay choque vamos a suponer que en esa pata hay un 0, si ahora choca detecto un 1, pues actuo u punto no????
No, porque si hay un choque, al principio la señal de la pata oscilará de 0 a 1 (el efecto rebote), tienes que esperar esos 50ms para que se estabilice la señal y entonces volver a testear la pata: si está a 0 es que el pic había pillado uno de los rebotes, y si está a 1 es que de verdad se había pulsado el botón.
Para esperar los 50ms simplemente consume tiempo.
Si quieres, te paso una librería para pic 16f84a con un montón de subrutinas de retardo (desde 4ms hasta 20 segundos), a mí me ha venido muy bien para mis proyectos :mrgreen:
Es la primera vez que pongo un mensajito para contestar a alguien, espero no haberme explicado muy mal :D
-
Yo creo que te explicaste bien merycr, gracias por tu aporte!
La opción que te han comentado de implementar retardos por software para evitar los rebotes es excelente halowin...
Ahora bien, para reforzar la cuestión también podrías implementar anti-rebotes por hardware... ya lo tienes así?
Aquí en el foro se ha comentado que si la detección del pulsador es importante (como en tu caso) es buena idea colocar anti-rebotes por hard y por soft.
Ok ya nos comentaras tus avances.
Nos leemos! :mrgreen:
-
Os entiendo perfectamente pero quizás no me se explicar.
Si el cochecito avanza todo feliz (sin choque) en la pata x habrá un 0, si ahora choca leeré de esa pata un 1 con lo cual entiendo que ya ha chocado y por tanto me da igual que se priduzca la secuencia 10101010101010 con detectar el primer 1 me vale no?
Seguro que teneis razón perdonar mi ingenuidad.
-
Si no vas a necesitar decectar otro choque, sí que te vale con detectar solamente el primer 1.
Pero como lo que quieres es que choque varias veces, supongo que necesitarías el retardo para distinguir cuando el 1 producido es un segundo (o tercer o cuarto..) choque de cuándo es un rebote de un choque anterior.
De todas maneras esto del retardo por software (el de hardware ya no sé) es muy sencillo y son sólo un par de instrucciones, que nunca vienen mal =)
-
Perfecto merycr.
Ahora si nos entendemos, claro en mi caso los choques se producirán espaciados quizas medio minuto en lo que recorre la distancia entre dos paredes.
Ahora comprendo lo del retardo en caso de ¡ salvar obstaculos ! en el que los choques se pueden producir muy seguidos y ahí si es necesario lo que tu me dices.
Vale aclarado.
-
Me alegro de haberte ayudado :-/
Suerte con tu cochecito! :mrgreen:
-
Merycr, ya eres todo un maestro de los uC, felicitaciones! :-/
Halowin, acuérdate de los anti-rebotes por hardware, también te pueden ayudar. Que tengas éxito en tu proyecto!
Nos leemos! :mrgreen:
-
Gracias firepic, la cosa es que intento evitar hardware ya que no es mi fuerte y todo lo que pueda resolver con sw mejor.
Quería preguntar otra cosilla abusando de vuestros conocimientos:
1.- Veo en muchos esquemas que para encender un led ponen una resistencia en serie con el led de 330 oh y la pata del PIC, que a 5V me da una intensidad de 15 mA, ¿Es suficiente para encender el led?
2.- Para el circuito del reset veo que ponen una resistencia de 10 K que da una intensidad de 0.5 mA ¿ Es esto correcto? ¿No es muy poca corriente en ambos casos?
Gracias.
-
Bueno halowin, el anti-rebote por hard no es nada complicado, se trata de un sencillo circuito RC (ya sabes, el condensador se opone a los cambios bruscos de tensión)... la R y la C las calculas de acuerdo al retardo que desees... no sé si recuerdas lo del t=RC... por la web conseguirás muchos ejemplos sobre cómo implementar el anti-rebote por hard... y te repito, nada del otro mundo. Claro que es tu decisión pues al fin y al cabo es tu proyecto, pero no deberías descartar esa posibilidad... pues también te aligera el trabajo del software.
En cuanto a tus preguntas.
1- 330 funcionan perfectamente. Yo suelo usar 470 y también va de maravilla.
2- En este hilo (http://www.todopic.com.ar/foros/index.php?topic=21525.0) se consideró bastante sobre el circuito reset para el pic.
Recuerda siempre usar el buscador del foro, pues hay muchos temas que ya se han tratado en otros hilos y hay un montón de información ya cargada que puede serte útil.
Ok por ahora es todo.
Saludos, nos leemos! :mrgreen:
-
Ambos son correctos halowin.
Te explico el caso del LED que es más sencillo. Un LED típico está preparado para aguantar unos 20 mA de corriente, que al atravesarlo provocan una caída de tensión de aproximadamente 2V. Si conectamos el LED a más de 2V (de forma continua) se quemará, pues estaremos obligándole a soportar más corriente de la que admite. Para poder conectar el LED a 5 V necesitamos que a él sólo le lleguen 2V, de modo que debemos perder 3V en algún otro lugar, y ese lugar es una resistencia.
Según la ley de ohm V=IxR, si despejo R para V=3V e I=0,020A obtengo R=150 ohm (en tu caso son 330ohm porque habrán querido que pase menos corriente por el LED o porque su caída de tensión es menor).
Ten en cuenta que cada tipo de LED (según su color e intensidad) posee una corriente y tensión típicas, que son las que debes utilizar en los cálculos para obtener el valor óptiomo de la resistencia.
-
Muchas gracias por vuestras respuestas.
Cada vez tengo las cositas mas claras.
Un saludo.
-
Bienvenido al foro halowin!, espero que tu proyecto llegue a buen puerto, espero que éste foro te sirva y nos sirvas.
Saludos! 8)
-
Gracias NANO1985.
Como ves el proyecto es muy simple, pero quiero empezar con las bases aclaradas que para complicarlo hay tiempo.
Ya tengo mi diagrama de flujo y lo he programado en la MicroPic Trainer y funciona al 100%.
Mi problema está a la hora del montaje. Utilizo una plaquita de esas amarillas con agujeros y eso es una chapuza total, los cables bailan, el motor gira cuando le da la gana en fin, un poco de frustración; me consola saber que en el Trainer funciona.
Estoy buscando a mi alrededor algún manitas que me haga la placa o a ver como puedo mejorar los prototipos porque ya te digo que esto de las plaquitas con agujeros no me convence en absoluto, pero bueno tiempo al tiempo.
Muchas gracias a todos.
-
.....el motor gira cuando le da la gana en fin.....
El problema que el motor gire errático se debe a que la conmutación de las escobillas del motor cuando éste está en funcionamiento introducen mucho ruido en los cables y hacen que el pic pierda el control (es decir el programa va a parar a cualquier lado). Esto lo puedes solucionar colocando capacitores de filtrado, te aconsejo que coloques un capacitor de alrededor de 470uf en la salida de alimentación(en los bornes de las baterías), y un capacitor de 100nf muy cerquita de las patitas de alimentación del pic y otro en los bornes del motor.
-
Hola de nuevo.
Sigo con este hilo para no abrir otro.
A ver que os parece este nuevo planteamiento de mi "cochecito":
Ahora lo tengo planteado con dos "detectores" de choque, uno por alante y otro por atrás. Uso como detectores dos pulsadores del tipo "reset".
Si no choca el cacharro, pues NO mete un "1", ambos pulsadores los estoy metiendo ahora por RA0 y RA1 de tal forma que un extremo está a +5v con una resistencia y el otro a RA0/RA1.
Pregunto que os parece si hago:
Meter las señales por RB0/RB1 sin resistencias de tal forma que un extremo vaya a +5v y el otro a RB0/1, pero activando las resistencias Pull-Up por software.
Salu2
(Halowin)
-
Pues la resistencia de PULL UP son para mantener a 1 en la entrada hasta que se mande un 0, en tu caso por un pulsador.
Para que te funcione, tienes que cambiar el sof y que se active con un 0 y no con un 1.
-
OK, ¿ serviría tambien llevar un extremos del pulsador a masa en vez de +5v sin tocar el soft?
-
No.
El pulsador lo que hace es unir un extro de otro (los contactos), si es un pulsador NA (normal abierto) cuando esté en reposo, tendrás el pin del pic al aire y podrás tener cualquier lectura. Para ello, deberás poner una resistencia en configuración PULL DOWN, así, continuamente estarás leyendo 0 lógico y cuando se precione el pulsador, leerás un 1 lógico.
-
Perdona por mi ignorancia pero en el libro que estoy siguiendo veo que las resistencias Pull-Up están dentro del PIC, pero de las Pull-Down no veo nada.
¿Me puedes aclarar un poco los de las pull-down, si están dentro o hay que ponerlas externas?
Gracias.
-
No hay problema y nada que perdonar. Siempre hay que preguntar.
Las resistencias Pull Up, están internas por lo que no hacen falta agregarle en forma externa, y su funcionamiento, es mantener un nivel alto hasta que se ingrese en forma externa un 0 lógico.
Las resistencia Pull Down, son inversa a la anterior, o sea, mentienen un nivel bajo hasta que se ingrese un 1 lógico en forma externa. Y como acabas de decir no están implementadas dentro del PIC, por lo que tendrás que hacerlo tu.
¿De qué forma? muy facil, colocas en cada pata del puerto que necesitas, una resistencia de 100K conectada a GND.
Entonces cuando no tengas conectado nada en la pata (el pulsador está en NA, contactos abierto) el pic leerá un 0 lógico, pero cuando el pulsador cierre sus contactos, entregará 5 voltios que junto con la resistencia, habrá una pequeña caida de tensión, pero que será suficiente par que el pic leea un 1 lógico.
-
OK LeonPic, esto me acaba de aclarar el porque me funciona mal el prototipo.
Las Pull-Up integradas ¿serán tambien de 100K?, ese dato no lo veo por aqui.
Gracias de todas formas.
-
No se de que valores son. Pero no es importante. SI no, microchips daría esa información.
-
Si vas a colocar resistencias de pull down, tienes que desactivar las de pullup que trae el micro, porque si no colocas los valores correctos de resistencias, puede que no funcione, es decir que al colocar las resistencias mencionadas, lo que estás haciendo es un divisor resistivo con las resistencias que tiene el micro en su interior y con las que colocas. En este caso en vez de tener 0v si no está presionado vas a tener un voltaje distinto de cero y el micro puede leerlo como un uno y no ta va a funcionar. Yo diría que si colocas las pull down desactives las pull up
-
Interesante puntualización Pablomanieri.
Por cierto, según veo en esquemas, las pull-down son de 10K.
Gracias
-
Hola de nuevo y sigo en el mismo hilo.
Dos dudillas que tengo:
1.- El sábado aprovechando un viaje compré unos cuantos componentes, entre ellos había los típicos condensadores de 22pF para el cristal, pero por no fijarme bien en el momento me los dió de 22pF pero electrolíticos, los prové y me frustré al ver que no funcionaba el invento. Partiendo de la base que la electrónica no es mi fuerte alguien puede explicarme porqué no funcionan.
2.- Siguiendo con mi "cochecito" y aclaradas unas dudas aqui de las resistencias pull-down y pull-up, mejoré considerablemente el prototipo, ahora funciona mejor, pero cuando el motor está girando si lo tienes en la mano se notas unas pequñas interrupciones que no llegan a parar el motor pero se notan, ¿se puede evitar eso o a que es debido?.
Saludos