Medir distancias con ToF.

Subforo dedicado exclusivamente a la electrónica y a la robótica, incluyendo la programación orientada a la robótica en sí.
Robots con patas, ruedas, orugas, humanoides, insectoides, ... ¡Sed todos bienvenidos!

Moderador: nake

Avatar de Usuario
barkeg
Robot, ¡mata a Flanders!
Mensajes: 391
Registrado: Lun Jun 07, 2010 8:56 pm

Medir distancias con ToF.

Mensajepor barkeg » Lun Ene 19, 2015 4:05 pm

Tengo un nuevo proyecto que estoy pensando hacer. El tema es una especie de escáner 3D pero no por triangulación sino por tiempo de vuelo de la luz (time of flight). La venaja frente a la triangulación es que no tiene sobras y partes no vistas desde el mismo punto, precisión constante a toda la profundidad y que se podría usar con ondas no visibles en vez de la luz.

Lo último podría ser interesante para frecuencias de 2.4GHz (wifi) que atraviesan paredes pero parcialmente reflejan. Con lo que teóricamente se podría sacar el 3D de lo que hay detrás de una pared!

Pensando como funcionan los ultrasonidas, no debería ser muy díficil de implementar un sistema así.....

Hasta que te das cuenta que la luz viaja a 299 792 458 m/s y para medir distancias de 1cm necesitarias un reloj de casi 30GHz para medir con un solo ciclo. Lo normal es que esto no es algo que uno pueda conseguir en casa. Además con un microcontrolador lo mas normal es que pasarán varios cíclos de reloj para detectar una entrada.

Otra cosa es que, en vez de poder detectar diferencias de 1 cm me gustaría detectar diferencias de por debajo de 1mm, o incluso 0.5mm [flipao este! :facepalm: ].

Como punto de partida pienso usar mi FPGA, con esto puedo leer en un ciclo de reloj la entrada y hacer cualquier otro procesamiento en paralelo. La FPGA tienen una frecuencia de reloj de 50MHz. Bastante poco. Pero con la ayuda de detectores de flancos y los PLL (phase lock loop) se podrá multiplicar varias veces. Aunque no creo que pueda superar los 200MHz porque los pines de entrada también estarán limitados en frecuencia.

De momento voy a partir de una frecuencia de 100MHz que sé seguro que puedo conseguir. Esto es 10ns por cíclo, esto es ~3m de distancia que recorre la luz en un cíclo. Hasta allí llegamos.

Ahora, como se puede mejorar esto? He llegado a la coclusión que digitalmente y con poca pasta poco se puede hacer. Por eso voy a pasar a analógica y de momento voy a suponer que solo se mide un único punto usando un módulo láser y un fotodiodo como receptor.

Se me han ocurrido dos ideas. La segunda me gusta un poco más.

La base en ambas es usar condensadores y cargar y descargar estos.

Spoiler: show
1. Si tenemos una red RC con una resistencia de 1Ohmio y un condensador de 1pF tendrémos una constante de tiempo de 10^-12 , es decir, en un pico secundo se cargaria el condensador al 63% de su carga. Un pico segundo es menos de 1mm de distancia que recorre la luz.

Habrá que diseñar un circuito que detecta el flanco de subida y pone a cargar el condensador y cuando el photodiodo detecta otro escalón (el de vuelta) lo para. No es demasiado complicado, solo que el timing tiene que ser muy exacto. Aunque no me preocupan offsets constantes. Se tendrá que calcular el condensador con mucho cuidado para obtener resultados buenos (este cálculo tengo hecho)

Desde este punto podríamos convertir el tiempo a digital con un simple ADC. El problema es que, dependemos mucho del numero de bits del ADC y esto influye al rango y precisión del sistema.


Spoiler: show
2. Consiste en lo mismo que lo anterior, es decir, cargar un condensador pero no convertir la tensión a digital sino que descargar lentamente el condensador con otra constante de tiempo (cambiando la resistencia).
Con esto se cargaría rápidamente y se descargaría lentamente. Si ahora ponemos un comparador en la salida (tensión de descarga) se puede sacar una señal digital. Será el mismo pulso de entrada pero mucho más lento, con lo que podríamos aplicar un contador con un reloj de frecuencia inferior y aun así conseguir medidas a nivel de pico segundos. Es una especie de time stretching. Lo único que nos influye en la resolución es la resistencia de descara, es decir, el factor de ralentizacion y la frecuencio del reloj de nuestro contador. Estos cálculos tengo hechos también y optimizados para mi aplicación.


Qué os parece? Podría funcionar? En cuanto me lleguen los componentes voy a probarlo experimentalmente.
Qué otras ideas teneís?
El conocimiento humano pertenece al mundo!
Avatar de Usuario
nake
管理者 (Admin)
Mensajes: 1994
Registrado: Vie Jun 04, 2010 4:10 pm
Ubicación: (sin(3t), 0, 0, t+10)
Contactar:

Re: Medir distancias con ToF.

Mensajepor nake » Lun Ene 19, 2015 11:21 pm

Madre mía. Me parece algo imposible, pero bueno, por intentarlo y ver qué sale no se pierde nada.
No se me ocurren muchos otros métodos de medir distancias a no ser que sean ultrasonidos o infrarrojos, que obviamente no te valen, aunque tu idea es la de los ultrasonidos pero utilizando ondas electromagnéticas...

El mayor problema que le veo es la frecuencia, pero ya no tanto por el reloj del micro, si no por las capacidades e inductancias parásitas de los cables. Todos los cables los tienen y es lo que realmente los limita en frecuencia. Y ya no solo los cables, todos los elementos electrónicos (especialmente los transistores) tienen este problema a frecuencias altas.
Sinceramente creo que sin un equipo ultrasensible y mucho ensayo-error no conseguirás mucho porque tendrá todo demasiado ruido y además a esas frecuencias es imposible debuggear para ver qué está pasando.
De todas formas no te quiero desilusionar, yo personalmente no lo veo nada claro pero ya te digo que lo intentes. Todos los visionarios parecen locos para los ojos de los demás no? xD
Mi clave pública de correo electrónico: http://www.nakerium.com/nakerium.gpg (Si no sabes lo que es lee este artículo)
Click aquí para ver mi email.


Programo aplicaciones a la carta (con soporte de por vida, para ingeniería o informática) y doy asesoramiento en seguridad informática. Si quieres más información mándame un email o un mensaje privado.
Avatar de Usuario
barkeg
Robot, ¡mata a Flanders!
Mensajes: 391
Registrado: Lun Jun 07, 2010 8:56 pm

Re: Medir distancias con ToF.

Mensajepor barkeg » Mar Ene 20, 2015 9:02 am

Lo de las inductancias había pensado también. Por eso habra que hacer pruebas con varios valores de condensadores y mantener los cables lo más cortos posible.

Pero la ventaja de lo que había pensado es que no trabajo a frecuencia. Emito un flanco de subida, un escalón, pero no me importa el ancho de pulso. Como si quisiera ponerlo de varios segundos. Lo que voy a detectar es el flanco de subida que viene reflejado. Por tanto el circuito no trabaja a mucha frecuencia y si los transistores son lentos mediré más tiempo. Pero este tiempo se podrá quitar con un offset (siempre que sea constante, y eso no lo tengo claro. Supongo que variará con temperatura, humedad, etc.)

Para hacer pruebas usare un espejo a varios metros de distancia que refleja el láser directamente al fotodiodo. Con esto me olvido del ruido al principio.
Lo montaré a varios metros de distancia de forma que pueda intentar medir el tiempo con el reloj de la FPGA sin la necesidad del circuito de condensadores y a ver que resultados me da. En teoría debería detectar cambios de varios metros.

Para debuggear usaré la pantalla por VGA conectada directamente a la FPGA. Pondré trazas o simplemente dibujando píxeles sueltos. En todo caso, como va en paralelo no tiene díficultad.

De alguna forma se tendrá que poder hacer porque existen sistemas así (muy muy caros) pero no he visto ninguno casero.

La gracia está un poco en ver hasta qué punto puedo llegar ;)
El conocimiento humano pertenece al mundo!
Avatar de Usuario
barkeg
Robot, ¡mata a Flanders!
Mensajes: 391
Registrado: Lun Jun 07, 2010 8:56 pm

Re: Medir distancias con ToF.

Mensajepor barkeg » Mar Ene 27, 2015 10:02 am

Sabíais que se puede usar un LED como detector de luz? Yo lo acabo de descubrir.

Este fin de semana compraré los componentes que me faltan y empezaré a hacer pruebas experimentales. El diseño tengo acabado. A ver como se comporta en la prácica. Lo posteare aquí.
El conocimiento humano pertenece al mundo!
Avatar de Usuario
nake
管理者 (Admin)
Mensajes: 1994
Registrado: Vie Jun 04, 2010 4:10 pm
Ubicación: (sin(3t), 0, 0, t+10)
Contactar:

Re: Medir distancias con ToF.

Mensajepor nake » Mar Ene 27, 2015 1:26 pm

barkeg escribió:Sabíais que se puede usar un LED como detector de luz? Yo lo acabo de descubrir.

¿What?
¿Cómo se hace eso?
Mi clave pública de correo electrónico: http://www.nakerium.com/nakerium.gpg (Si no sabes lo que es lee este artículo)
Click aquí para ver mi email.


Programo aplicaciones a la carta (con soporte de por vida, para ingeniería o informática) y doy asesoramiento en seguridad informática. Si quieres más información mándame un email o un mensaje privado.
Avatar de Usuario
barkeg
Robot, ¡mata a Flanders!
Mensajes: 391
Registrado: Lun Jun 07, 2010 8:56 pm

Re: Medir distancias con ToF.

Mensajepor barkeg » Jue Ene 29, 2015 9:36 am

Conectandolo como si fuese un fotodiodo. Son menos sensibles y solo detectan longitudes de onda inferiores a la del LED. Por ejemplo, un LED rojo será capaz de detectar verde y azul pero un LED verde sólo el azul.

El rollo es que solo tengo LEDs naranjas y el las es rojo... :facepalm:

Pero lo puedes probar con un multimetro y luz blanca. Mides la tensión y lo vas acercando a la lampára. Pon lo en escala de milivoltios ;)
El conocimiento humano pertenece al mundo!
Avatar de Usuario
barkeg
Robot, ¡mata a Flanders!
Mensajes: 391
Registrado: Lun Jun 07, 2010 8:56 pm

Re: Medir distancias con ToF.

Mensajepor barkeg » Jue Feb 12, 2015 9:58 am

Después de haber conseguido por fin todos los componentes me he pueso a trastear.

El circuito montado funciona de la siguiente manera:

- Se conecta los fototransistores a traves de una resistencia a unos amplificadores operacionales que
actuen como comparador (LM741). El problema es que estos funcionan a más de 5V. En la otra entrada he
conectado un potenciometro con el que se puede cambiar el umbral.

- La salida del AO se conecta a un transistor que trabaja en corte o saturación y se alimenta con 3.3V. Con
esto acondicionaba la señal a la entrada de la FPGA.

Haciendo pruebas con este circuito poniendo los dos fototransistores directamente delante del diodo láser he descubierto que el tiempo medido no era cero (lo que debería ser), ni nada constante. Cada vez daba un tiempo distinto y fluctuaba en el orden de varios microsegundos. Trabajando siempre bajo las mismas condiciones.

Ayer quité todo el circuito de AOs y transistores del medio y ajusté la resistencia de los fototransistores y los conecté directamente a la entrada de la FPGA. Y mira, funciona a la perfección!

Poniendo los sensores delante del láser sale el tiempo de diferencia cero. He subido la frecuencia de reloj de la FPGA a 250MHz y sigue saliendo cero! Con esta frecuencia el periodo será de 4ns con lo que teóricamente seré capaz de medir en pasos de 60cm. Comprobar esto será el siguiente paso.

Luego me tendré que apañar para diseñar un circuito muy simple y con componentes de alta calidad para conseguir tiempos del orden de varios picosegundos.

Además el pulso del láser tiene una duración de unos pocos microsegundos y con el ojo no se percibe. La ventaja es que puedo emplear láseres de alta potencia sin que se haga peligroso.
Siempre que me aseguro que se apaga a tiempo :twisted:

Aún no tengo fotos pero no tardaré en subir.
El conocimiento humano pertenece al mundo!
Avatar de Usuario
barkeg
Robot, ¡mata a Flanders!
Mensajes: 391
Registrado: Lun Jun 07, 2010 8:56 pm

Re: Medir distancias con ToF.

Mensajepor barkeg » Vie Feb 13, 2015 9:15 pm

He seguido con las pruebas pero no saco resultados coherentes.

En primer lugar tenía que cambiar el diodo láser porque el que usaba tenía muy poca potencia y los fototransistores no lo detectaban a distancia. Por tanto he metido un láser verde de 100mW (!!).

He situado un espejo a una distancia de 1.20m con lo que la distancia recorrida serán 2.4m lo cual se traduciría en 4 cíclos de reloj (a 250MHz).

Me ha costado un montón alinear el láser con el sensor que detecta la salida de la luz, el espejo y el sensor que detecta la vuelta. (Sobre todo porque tenía que tener mucho cuidado por el láser tan potente, no se debería ni mirar el punto que proyecta!)

El tema es que los resultados que da son aleatorios. En las mismas condiciones sin mover nada mide tiempos muy distintos(y altos). No sé porque es. Sospecho que tiene que ver con la diferencia de cantidad de fotónes que le llega a cada fototransistor. Pero aún así no me lo explico porque debería ser suficiente potencia para saturar ambos.

Adjunto fotos del setup.

DSC01578r.jpg


DSC01580r.jpg


DSC01584r.jpg


Video call snapshot 4r.jpg
El conocimiento humano pertenece al mundo!
alondra
¿Ordenador?¿Qué es eso? [Limitado]
Mensajes: 1
Registrado: Mié May 16, 2018 10:00 pm

Re: Medir distancias con ToF.

Mensajepor alondra » Mié May 16, 2018 10:07 pm

como te fue? realizaste el proyecto.?

Volver a “Robótica y electrónica”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado