Escáner láser de ingeniería inversa Leuze RS4
Anteriormente, hablé sobre ingeniería inversa de un sensor de distancia láser . Esta vez hablaremos de un dispositivo más complejo: un escáner láser Leuze RS4. Al igual que el sensor, este escáner vino a mí en un estado roto, por lo que tuve que abordar la restauración de su trabajo y, en el proceso, mejorar algunas de sus características y, de hecho, rehacerlo en otro dispositivo.¿Qué es este escáner láser?
Leuze RS4 es un escáner de seguridad láser, es decir, está diseñado para evitar que las personas entren en áreas peligrosas en el lugar de trabajo, para evitar colisiones de vehículos de producción, etc. Tiene características bastante decentes: rango máximo: 15/50 m (dependiendo del modo de operación ), la precisión de medición de la distancia en todo el rango de medición es de 5 mm, la resolución angular es de 0,36 grados, la velocidad de exploración es de 25 rpm (25000 mediciones / seg).Vale la pena señalar que este escáner se coloca precisamente como un dispositivo de seguridad, es decir, almacena la ubicación de las zonas de alarma y advertencia en la memoria, y cuando un objeto ingresa a estas zonas, una de las teclas se abre en el escáner. Para configurar la ubicación de las zonas, el escáner se puede conectar a una computadora y observar la ubicación de los obstáculos en la pantalla. Incluso hay un paquete ROS que le permite recibir datos de este escáner.Tengo un escáner sin estuche, desmontado en sus componentes. El escáner se estrelló debido a un fuerte golpe en el cuerpo; en qué dejó de funcionar exactamente, todavía no lo entendía: tal vez la óptica estaba desalineada, el contacto en uno de los conectores se apagó, o el sensor del codificador se movió, o algo más. Traté de ensamblar todas las partes juntas, el escáner se vio en el software nativo, pero el escaneo no comenzó. Entonces, solo tengo una forma de iniciarlo: restaurar el circuito del escáner lo más completamente posible y escribir mi propio firmware de microcontrolador del escáner.Así es como se veían las partes: aquí deberían ubicarse en el estuche (foto de la documentación, se puede ver que el diseño y la electrónica son ligeramente diferentes):
También una parte importante del escáner es el espejo de exploración (resaltado en azul en la foto de arriba) instalado en su centro:
Diagrama esquemático del escáner:
Como se puede ver en el diagrama, toda la electrónica del escáner consta de módulos (placas) separados conectados por conectores y bucles.Hay muchos módulos: módulo de fuente de alimentación (DC-DC), módulo de interfaz, módulo de procesador, módulo de fotodetector (APD), módulo láser. Además, también hay un módulo codificador y dos tableros con forma de herradura, que al principio parecían extraños.En primer lugar, vale la pena prestarles atención:
Obviamente, una de las placas contiene LED, y la segunda contiene fotodiodos. Inicialmente, pensé que era algún tipo de codificador, o algún tipo de mecanismo para controlar la radiación láser. Sin embargo, más tarde, después de leer la documentación del escáner y examinar las fotografías en detalle, me di cuenta de que este es un sistema para monitorear el estado de la superficie del vidrio protector del escáner.Los agujeros para los LED son visibles en la foto:
al medir el nivel de señal de los fotodiodos, puede estimar el nivel de transmisión del vidrio protector. Obviamente, este sistema no es crítico para el escáner, por lo que no utilicé estas placas en el futuro.El módulo procesador es la parte más difícil del escáner. Así es como se ve la electrónica del módulo desde dos lados:
Por primera vez que miré el tablero, inmediatamente me di cuenta de que el escáner usa el método de tiempo de vuelo para medir la distancia (TOF): el chip con la marca más grande resultó ser " ACAM TDC-GPX ", del que ya había oído hablar. TDC - "Time-to-Digital Converter", es decir, un chip especializado diseñado para medir intervalos de tiempo con muy alta precisión, es el que se usa para medir el tiempo de "vuelo" de un pulso láser.También a bordo se encontraba un microcontrolador Infineon C167 con un chip de memoria FLASH externo (que agradó) y ASIC (que molestó enormemente). En más detalle sobre este módulo, lo contaré a continuación.Módulo de potenciacontiene un convertidor DC-DC aislado galvánicamente personalizado con varios voltajes de salida y varios condensadores:
el voltaje de alimentación del convertidor es de 24V. Su característica principal es que proporciona un alto voltaje (~ 230V), que es necesario para el funcionamiento del láser y el fotodetector, a un conector pequeño separado.También emite los siguientes voltajes al conector principal: + 5V, -5V, ~ 15V, aislados galvánicamente del resto + 5V para la interfaz RS232.Parte óptica del escáner
A primera vista, no está muy claro dónde están las ópticas del escáner. En este caso, una pequeña ventana con un espejo en el centro de la foto sirve para emitir el rayo láser, y una gran superficie brillante a su alrededor es la superficie del filtro de luz de interferencia instalado frente a la lente del fotodetector. Este filtro transmite solo la radiación cuya longitud de onda está cerca de la longitud de onda del láser.Así es como se muestra en la documentación del escáner:
la lente en sí está montada dentro de una carcasa de plástico negro, por lo que es problemático verla. Al final de esta carcasa, opuesto a lo que se ve en la foto de arriba, el módulo láser y el fotodetector son fijos : módulo láser
Vista del módulo láser (algunos de los detalles están marcados por mí durante el dibujo del circuito): Como puede ver, la circuitería de este módulo es bastante simple, por lo que podría restaurar completamente su circuito: una gran parte redonda en el tablero es un emisor láser especializado. Desafortunadamente, no había marcas en él, por lo que no se pudo encontrar documentación. A partir de la descripción en el escáner puede encontrar: "Longitud de onda de luz láser - 905 nm", "Clase de láser - 1", "Duración del pulso - 0.003 µs", "Frecuencia de repetición - 25 kHz". Lo que fue posible entender restaurando el circuito del módulo y analizando su funcionamiento:

- El emisor láser se alimenta constantemente con una tensión de alimentación de 143 V, limitada por diodos zener.
- , «3» . , , .
- , , . ( ) «» .
Todo el control del láser se realiza en una línea: "LASER_PULSE". La mayor parte del tiempo en la línea debe ser de nivel "alto". Cuando se aplica un pulso negativo, el disparador DD1 se restablece a 0 en su borde anterior, y en el borde posterior, el disparador comienza a "esperar" la señal del fotodiodo y comienza el láser. Cuando aparece una señal del fotodiodo, el disparador cambia a 1.Puede notar dos cables coaxiales utilizando los conectores conectados al módulo. Se utilizan para transmitir la señal diferencial del disparador al chip TDC.También en este módulo hay cinco LED. El módulo procesador los controla. MódulofotodetectorEl módulo en sí se ve así: Fotografía del propio fotodetector cerca de:
El letrero de alto voltaje en la esquina de la placa muestra claramente que aquí se usa un fotodiodo de avalancha (APD) : requieren un voltaje bastante alto para funcionar.Desafortunadamente, no había marcas visibles en el cuerpo del fotodetector. Por el emblema en el fotodiodo mismo (en el centro), solo era posible determinar que fue fabricado por Pacific Silicon Sensor (primer sensor)Sin embargo, no había más información sobre él, tal vez está hecho a medida. Se puede ver en la foto que este fotodetector es un híbrido, es decir contiene un amplificador incorporado: es claramente visible sobre el fotodiodo. Obviamente, el amplificador y el fotodiodo necesitan energía: se alimenta a través de los terminales inferiores (los condensadores están soldados a ellos). Un gran misterio fue el pequeño detalle a la izquierda del fotodiodo, al que hay tres conductores. La investigación adicional mostró que este es un sensor térmico analógico.Este módulo es mucho más complicado que el anterior, utiliza una placa de circuito impreso multicapa, al menos 4 capas, con la mayoría de las líneas de señal ubicadas en la capa externa de la placa, lo que facilita enormemente su análisis. En este módulo, restauré aproximadamente el 80% del circuito, el resto no era realmente necesario para mí.El circuito resultante del módulo fotodetector: en la parte superior del circuito hay una fuente de alto voltaje lineal ajustable para un fotodiodo de avalancha. Puede generar un voltaje estable de al menos 150 V. Esta fuente está controlada por el DA1 DAC (LTC1451).
Dado que el escáner se basa en un buscador de rango pulsado, la tarea principal del módulo fotodetector es detectar rápidamente una señal láser suficientemente débil reflejada por un obstáculo. Dado que el nivel de la señal de luz es muy pequeño, solo se puede detectar utilizando un fototodiodo de avalancha, que tiene su propia ganancia. En este caso, la señal del fotodiodo se amplifica adicionalmente por un amplificador integrado integrado en el fotodetector. Debido al hecho de que el amplificador está integrado en el cuerpo del fotodetector, se reduce la influencia de la interferencia en la señal útil. La señal generada por el fotodetector (OUT_B) se transmite a un determinado chip DA4, que, al parecer, es otro amplificador de alta frecuencia. Después de eso, la señal se transmite a la entrada directa del comparador de alta velocidad D1 (MAX9601).La señal de referencia del divisor de resistencia (aproximadamente 50 mV) se alimenta a la entrada inversa de este comparador.La señal en la salida del comparador es diferencial, se transmite a través de un cable coaxial directamente a la placa del módulo del procesador.Además, la señal de la salida del amplificador DA4 se transmite a algún tipo de detector de pico, que "recuerda" el nivel máximo del pulso recibido. No comencé a restaurar el circuito de este nodo, y dibujé en el circuito solo su etapa de salida (chip U1), cuya señal también se transmite al módulo del procesador.Una de las partes del escáner que me resulta menos clara es el transistor Q3 instalado en la salida del amplificador de RF. A juzgar por los circuitos, es necesario para permitir la atenuación de la señal en la salida del amplificador. Este transistor puede controlarse utilizando una señal de la placa del procesador (línea 10 - "digi").Puede notar que la placa tiene un chip EEPROM. Todas las salidas de señal de este chip están conectadas a la placa del procesador. Aparentemente, en este microcircuito se almacenaron algunos parámetros, únicos para cada placa de fotodetector, y se registraron al probar la placa. En particular, esto puede ser una curva de la dependencia de la ganancia APD de la tensión de alimentación, la dependencia de la tensión en la salida del sensor de temperatura en su temperatura y otras características similares.Puede ver que la potencia del fotodetector se puede controlar configurando ciertos niveles en las líneas CLK, CS, CS2 conectadas al DAC y EEPROM.La placa contiene varios circuitos diseñados para controlar su estado. Puede controlar el nivel de voltaje del APD, su temperatura (línea 7) y el umbral del comparador. Estos voltajes son convertidos por amplificadores operacionales DA3-DA5 y transmitidos a la placa del módulo procesador.Volviendo al
módulo procesador Este módulo es el más complejo de todos, contiene una gran cantidad de microcircuitos de múltiples salidas, la placa de circuito impreso es nuevamente de cuatro capas y la mayoría de las líneas de señal están separadas en las capas internas, lo que complica significativamente la restauración del circuito. Muy a menudo resultó que las pistas cambiaron a otro lado del tablero. Para buscar rápidamente dónde está conectada una determinada pista, tuve que usar un pincel así, conectado a un multímetro (en modo de marcación):
Restablecí aproximadamente el 70% del esquema, el resto no lo necesitaba realmente. Diagrama de bloques del módulo procesador:
El diagrama resultante del módulo procesador: a pesar de que llamo a este módulo "módulo procesador" en todas partes, en realidad se basa en el microcontrolador Infineon SAK-C167CR-L33M . Tiene 144 pines y está construido sobre la arquitectura bastante antigua C166. Este microcontrolador no tiene su propia memoria no volátil; es necesario conectarle una memoria externa a través de un bus paralelo. Para estos fines, el escáner tiene un chip de memoria Flash M29F400B (512K x 8 / 256K x 16). Además, dos chips RAM están conectados al microcontrolador: IS61C6416AL-12 (64K x 16) y K6R4016C1D (256K x 16).
Puede ver que el bus de direcciones está conectado a todos los microcircuitos de memoria con un desplazamiento de un bit: las líneas de memoria A0 están conectadas a la línea A1 del microcontrolador. Esto se debe al hecho de que las direcciones se establecen en el bus de direcciones en bytes, pero el controlador y la memoria son de 16 bits. Para que el controlador escriba bytes individuales en la RAM sin afectar los bytes vecinos en una palabra de 16 bits, los chips de memoria tienen líneas especiales UBn, LBn. Esta solución es muy común en dispositivos con buses paralelos y se describe en detalle en la documentación del controlador.Pero otra solución en el módulo del procesador no me quedó completamente clara. Si observa el chip de memoria flash U1, notará que la línea A14 del chip está conectada a tierra. La línea de bus de dirección del controlador A15 correspondiente no está conectada al chip en absoluto. El resultado es que el controlador solo tiene acceso a la mitad de la memoria Flash. Una situación completamente similar con el chip RAM2 (DD3).Con el chip RAM1 (DD2), la situación es algo diferente: la línea del controlador A15 tampoco está conectada a él, pero al mismo tiempo todas las entradas de dirección de este chip están conectadas al bus de direcciones, de modo que el controlador tiene acceso a toda la memoria del chip.Y ahora debe prestar atención al nodo en los elementos lógicos DX1, DX2, DD4. Son estos microcircuitos los que determinan cuál de los microcircuitos de memoria es seleccionado por el microcontrolador. Se puede ver que están controlados por las siguientes señales:- WRn - señal de grabación, nivel activo - bajo. En esta línea, el microcontrolador establece un nivel bajo cuando necesita escribir algunos datos en la memoria RAM externa
- A15 es la misma línea de bus de datos que no está conectada directamente a ninguno de los chips de memoria.
- CSn0 es una señal de selección de chip especializada, el nivel activo es bajo. Esta línea está conectada al decodificador de direcciones integrado en el controlador. Después de un reinicio, el controlador está bajo.
- RAM2_CE: conectado al GPIO del controlador con un elevador al suelo.
La lógica del funcionamiento de este nodo está bien descrita en la tabla:
Como puede ver, dependiendo del estado de la línea RAM2_CE, el microcontrolador funcionará con memoria Flash o con el microcircuito RAM2 (DD3), y los espacios de direcciones para ellos coinciden. Vale la pena señalar que la capacidad de memoria de estos microcircuitos es la misma. Quizás esto se haga para simplificar la actualización del firmware del dispositivo. Hay otra opción: la RAM instalada es 3 veces más rápida que la memoria Flash, por lo que después de iniciar el controlador puede copiar el contenido de FLASH a RAM2, después de lo cual el programa se ejecuta desde él.Pero el alto nivel en la línea A15 determina claramente que el controlador funcionará con el chip RAM (DD2).Como resultado, resulta que la memoria FLASH y RAM1 se alternan en el espacio de direcciones del controlador:
El área de RAM que ya se encontró se resalta en rojo: al acceder a ella, el controlador en realidad obtendrá acceso a los datos ubicados en las direcciones (0x8000-0xFFFF).La configuración del compilador no es trivial y, como mencioné anteriormente, se pierde la mitad de Flash / RAM2. No está claro por qué los desarrolladores del escáner no cambiaron entre los chips FLASH y RAM utilizando la línea CSnX especializada del controlador.Como ya mencioné, el controlador usado no tiene memoria Flash, y por lo tanto, Fuse-bits. Para configurar algunos parámetros del controlador: ancho y dirección del bus de datos, los parámetros PLL se utilizan resistencias desplegables conectadas al bus de datos. El controlador en sí tiene resistencias Pull-Up incorporadas de alta resistencia (> 100 KOhm) conectadas a todo el bus. Por lo tanto, debido a las resistencias externas, se establece una cierta combinación de señales en el bus, que el controlador lee cuando se enciende. Determina la configuración necesaria del controlador.En este caso, estamos hablando de resistencias R3-R6. La configuración seleccionada de las resistencias es consistente con las conexiones de señal de bus resultantes y proporciona una velocidad de reloj del controlador de 33 MHz.La señal de pulso del codificador espejo se alimenta a la entrada del temporizador "T2IN" del microcontrolador a través del elemento lógico OR D6. La segunda entrada de este chip está conectada al GPIO del controlador, lo que le permite desactivar el suministro de pulsos a la entrada del temporizador. Por qué se necesita una solución de este tipo y por qué es imposible apagar el temporizador mediante programación, todavía no lo entiendo.Ahora debe prestar atención al chip TDC (DD1).El escáner tiene un chip TDC-GPX, el más "avanzado" de todos los que está en el rango de ACAM. La precisión reclamada de medir intervalos de tiempo de hasta 10 ps RMS. El microcircuito tiene 8 canales de entrada de líneas LVTTL y 2 canales de LVECL (diferencial).En este escáner, para obtener la máxima precisión en la medición del tiempo, son las entradas LVECL las que se utilizan para recibir señales del módulo láser y el módulo fotodetector utilizando cuatro cables coaxiales. Las señales del módulo láser se envían a las entradas de DStart / DStartN y comienzan el conteo de tiempo. Las señales del módulo fotodetector se envían a las entradas DStop1 / DStop1N, DStop2 / DStop2N y detienen el conteo de tiempo. Como se puede ver en el diagrama, las señales de parada se aplican inmediatamente a dos canales TDC, con polaridad inversa. Debido a esto, es posible medir no solo la duración del "vuelo" del pulso de luz, sino también el ancho del pulso recibido.TDC-GPX tiene un bus de datos de 28 bits, pero se puede cambiar al modo de 16 bits, que es lo que se usa en el escáner. El bus de direcciones es de 4 bits, también se desplaza en 1 bit, como con los chips de memoria. Los chips DD8, DD9, U2 se utilizan para generar señales de control del chip y hacer coincidir los niveles: el microcontrolador funciona desde 5V y TDC, desde 3.3V. En general, el sistema de alimentación TDC es bastante complejo, incluso hay un ajuste automático de la tensión de alimentación. Debido a su complejidad, no comencé a dibujar su diagrama; sospecho que no es muy diferente de una hoja de datos.La programación del microcontrolador y TDC se discutirá más adelante.Como mencioné anteriormente, un chip ASIC personalizado con las inscripciones "LEUZE98" y "WATCHDOG" está instalado en la placa. Lo que es es desconocido. Se puede ver que un oscilador de cristal de 20 MHz está conectado a este microcircuito. Después de que pude programar el microcontrolador, me aseguré de que el ASIC no interfiera con su funcionamiento y no restauré el diagrama de conexión del ASIC. Hasta donde entiendo, este chip se comunica con el controlador a través de un bus paralelo. Es posible que sea el ASIC el que genera la señal de reinicio RESETn, que restablece el controlador y el TDC.Sin embargo, era necesario tratar algunas cadenas con más detalle.Al final resultó que, la señal de control láser "LASER_PULSE" puede ser generada tanto por el microcontrolador como por el ASIC utilizando un nodo en los transistores T1, T2. En este caso, cuando se enciende, el ASIC abre el transistor T1, de modo que el controlador no puede controlar el láser. Debido a esto, tuve que quitar la resistencia R24, y el controlador comenzó a controlar normalmente el láser.La señal de control del motor espejo line_motor1 también vino del ASIC (a través del diodo D2). Debido a esto, tuve que cortar la pista en el tablero y conectar esta señal directamente a la salida libre del controlador GPIO - P3.15.Lo más extraño es que la línea CS2 conectada al DAC instalado en la placa de circuito del módulo fotodetector también resultó estar conectada al ASIC. Debido a esto, el controlador no pudo establecer de manera independiente el voltaje de suministro APD y encender el amplificador APD. Tal vez esto se hizo para aumentar la confiabilidad del escáner: una configuración incorrecta de DAC puede provocar el fallo del APD. También tuve que conectar esta línea al pin GPIO gratuito del controlador P3.4.Es bien sabido que es el ASIC el que controla los tres LED montados en el módulo láser. Desde el controlador se controlan dos LED más que muestran el estado del escáner (la presencia de un obstáculo en el área de trabajo): líneas LN1, LN2. Estas líneas también van a la placa del módulo de interfaz.Dado que el escáner puede funcionar en sistemas de seguridad, la placa del procesador tiene una gran cantidad de nodos para diagnosticar su condición. El procesador (y posiblemente ASIC) puede detectar la inclusión de un láser (usando el chip U3), controlar el nivel de varios voltajes de suministro, voltaje de suministro APD, temperatura APD y el umbral del comparador en la placa del fotodetector.Debido al hecho de que el voltaje de referencia del controlador ADC es de 4.1V, una parte de los voltajes medidos se reduce mediante divisores de resistencia, que se pueden ver en el diagrama de la derecha.Y ahora vale la pena echar un vistazo más de cerca al método de generar la inusual señal "digi", que mencioné anteriormente al describir el módulo del fotodetector.El siguiente diagrama muestra los nodos del módulo del procesador (parte inferior) y del módulo del fotodetector (parte superior):
Las flechas muestran la conexión de los módulos mediante cables. A continuación describiré el funcionamiento de estos nodos, tal como lo entiendo. En el módulo fotodetector, la señal de la salida APD es amplificada por el chip DA4, después de lo cual se transfiere al comparador D1. Si el nivel de señal en la entrada del comparador es superior a 50 mV, se establece un nivel alto en la salida del comparador. La señal de la salida del comparador se transmite al módulo procesador. En primer lugar, ingresa a la entrada TDC, que cuenta el tiempo desde el comienzo del pulso láser. Pero además, esta señal se alimenta a la entrada de reloj del D-trigger DD1. Siempre se suministra una unidad lógica a la entrada de señal de disparo, y el disparo en sí mismo se puede restablecer a cero utilizando la línea GPIO del controlador BASE5. Por lo tanto, la operación del comparador conduce a un disparador instantáneo "1". Este disparador tiene una salida diferencial,la señal desde la cual se alimenta a la entrada del chip D3, que la convierte al formato LVTTL. Esta señal se alimenta a la entrada "digi" del módulo fotodetector. Como mencioné anteriormente, en mi opinión, la aparición de esta señal conduce a un debilitamiento del nivel de señal en la entrada del comparador.La pregunta principal es ¿por qué es necesario y por qué es tan difícil de implementar? ¿Por qué era imposible hacer ambos nodos en la placa del módulo fotodetector?Solo puedo expresar mis suposiciones. Quizás la señal necesita ser atenuada para evitar la transición del comparador o detector de amplitud a saturación. Quizás, para reducir la longitud del pulso recibido. Para ambos nodos, simplemente no podría haber un lugar en la placa del fotodetector. También es posible otra opción: la señal debe debilitarse solo después de que tenga tiempo de llegar al TDC a través de cables coaxiales, lo que justifica un diseño tan complejo.El estudio mostró que antes de comenzar un nuevo pulso láser, es necesario reiniciar el gatillo, de lo contrario, los pulsos no son aceptados.Módulo de interfazLamentablemente, no encontré una buena foto de este módulo. Solo hay este:
es en este módulo donde se instalan los dos únicos conectores, a los que puede conectarse fuera del escáner. Uno de ellos es RS-232 / RS-422, según el segundo, se suministra alimentación al escáner, se suministran señales de control y aquí se conecta un circuito de seguridad.Este módulo contiene convertidores y optoacopladores UART-RS232 / RS485 de aislamiento galvánico (se instalan en una pequeña placa separada que se muestra a la derecha), teclas de alimentación del circuito de seguridad, circuitos de entrada de las líneas de control del telémetro, un circuito de control del motor, un convertidor de señal del codificador.El módulo de alimentación y el módulo del procesador, así como el módulo del codificador y el motor del espejo están conectados a este módulo (usando los conectores en la parte inferior del módulo, no son visibles en la foto).Diagrama parcial del módulo de interfaz: restauré solo una parte del diagrama de circuito de este módulo (alrededor del 20%), porque no estaba interesado en las teclas y las líneas de entrada necesarias para garantizar la seguridad. Y hay bastantes allí, la documentación menciona el límite de corriente en el circuito de seguridad, la supervisión de cortocircuitos y otras funciones.
Algo extrañamente hizo el control de la velocidad de rotación del motor del espejo. El control de velocidad se implementa cambiando el voltaje del motor; con esto, todo está claro. Pero el ajuste de este voltaje en sí se lleva a cabo con la ayuda de cierta cadena integradora en un amplificador operacional. Para aumentar el voltaje, el controlador establece 0 en la línea line_mot1 para bajarlo: 1. Obviamente, sin retroalimentación constante del codificador, el motor se detiene o acelera a la velocidad máxima a través del controlador.Al final resultó que, el chip convertidor UART-RS232 LTC1387 es bastante lento: a una velocidad de 500 kbit / s, los datos se distorsionaron. Debido a esto, tuve que quitar una placa pequeña con este chip y conectar el convertidor USB-UART directamente a la placa del módulo de interfaz.Ahora que he hablado sobre el diseño de todos los módulos, vale la pena desarrollar el proceso de ingeniería inversa en sí.Cuando comencé a tratar con la electrónica del escáner, tenía mucho miedo de que un láser o un fotodetector pudieran dañarse como resultado de un impacto. Al mismo tiempo, no estaba seguro de poder lanzar el módulo del procesador; el microcontrolador desconocido y el ASIC estaban avergonzados. Por lo tanto, en primer lugar, restauré el circuito del módulo láser y luego el módulo fotodetector. Después de que pude entender la circuitería de estos módulos y determinar el propósito de todos los contactos en sus conectores, fue posible pasar al módulo procesador. Como último recurso, si no podía iniciarlo, tuve la idea de hacer un análogo de este módulo en microcircuitos STM32 + TDC-GP2.Obviamente, para verificar el módulo, debe ejecutar su propio programa en el microcontrolador Infineon SAK-C167CR instalado en él. Nuevamente, vale la pena recordar que este controlador no tiene memoria Flash incorporada. Además, resultó que el controlador no tiene interfaces de depuración especializadas (incluido JTAG). Con un alto grado de probabilidad, el firmware se escribe en un Flash externo en el programador de fábrica. Sin embargo, resultó que no todo está tan mal: el controlador tiene un cargador de arranque ("Bootstrap Loader"), que funciona en UART. Este gestor de arranque se almacena en el ROM de arranque incorporado del controlador, por lo que debe haber estado en mi controlador. Y funciona de manera bastante peculiar: para activarlo al inicio, debe establecer la línea de bus de datos P0L.4 en baja,después de lo cual el controlador comienza a esperar a que aparezca el byte 0x00 del host. Una vez aceptado este byte, el gestor de arranque determina automáticamente la velocidad de transferencia y comienza a esperar 32 bytes de datos que copia en la RAM interna del controlador. Después de recibir los datos, el controlador comienza la ejecución del programa recibido (16 palabras del controlador).De hecho, en estos 32 bytes necesita empujar otro cargador ("preloader"), que recibirá el cargador principal "Cargador externo" del host, y comenzará su ejecución.Aquí tuve suerte: para este procesador ya hay un programa FLASHit listo para usar que puede hacer todas las operaciones mencionadas automáticamente. El cargador incorporado tiene una gran funcionalidad: con él puede determinar automáticamente el modelo de memoria Flash instalada, editar y ver el contenido de los registros del controlador, puede ver el estado de los canales ADC.No pude encontrar ninguna almohadilla de prueba en la placa conectada a la línea P0L.4 del controlador, por lo que para iniciar el gestor de arranque, tuve que soldar un pin especial a esta línea. Pegué el pin a la caja de uno de los chips de RAM. Para iniciar el gestor de arranque, debe conectar este pin a través de una resistencia de 8 kΩ a tierra.Después de conectar la placa a la computadora y aplicar energía al módulo del procesador, el microcontrolador realmente apareció en FLASHit. Después de eso, escribí un pequeño programa en Keil que cambió uno de los pines del controlador y lo escribió en Flash. El programa funcionó bien, ASIC no interfirió (tenía miedo de algún tipo de mecanismo de vigilancia incorporado o conflictos en los autobuses), para poder seguir adelante.Después de eso, restauré el circuito del módulo del procesador, lo que me permitió verificar el funcionamiento de todos los módulos en el ensamblaje.La primera vez que verifiqué el funcionamiento del módulo láser, como escribí antes, para iniciar el pulso láser era necesario aplicar solo una señal a este módulo. El láser funcionó: sus flashes se podían ver usando la cámara de un teléfono móvil. Además, usando un osciloscopio, verifiqué que el módulo normalmente forma pulsos de inicio (referencia).Luego vino la verificación del módulo del fotodetector. Aquí tuve que verificar el funcionamiento del DAC, la unidad de generación de voltaje de fotodiodo de avalancha y la unidad de control de potencia del amplificador del fotodetector. Todos ganaron, lo que permitió comprobar el funcionamiento del buscador de rango en sí. Para hacer esto, ensamblé sus módulos en la forma en que los desarrolladores lo pretendieron:
En la fotografía, los cinco módulos principales se ensamblan alrededor del sistema óptico. Aquí, en lugar de mi propio espejo giratorio, instalé un espejo ordinario.Después de eso, presenté un programa de control láser para UART y configuré el fotodiodo. Como resultado, cuando comencé el láser en la entrada del comparador, ¡pude realmente detectar pulsos con un osciloscopio cuya amplitud dependía claramente del tipo de obstáculo frente al espejo! El comparador también funcionó bien. La última parte importante de la prueba permaneció: la verificación del rendimiento de TDC.El chip TDC-GPX instalado en el escáner tiene un diseño bastante complicado y puede funcionar en una gran cantidad de modos.La siguiente figura muestra su diagrama estructural:
Como puede ver, el chip contiene 8 canales separados, es decir, puede recibir hasta 8 señales de parada. Si los canales son diferenciales, solo se pueden analizar dos señales de parada más una señal de inicio. En este caso, el chip le permite combinar los canales de medición, lo que aumenta la precisión de los intervalos de tiempo de medición:
Honestamente, no me gustó la documentación de este chip. Muchas cosas en él se describen de manera bastante superficial, los ejemplos de código son incomprensibles. La parte de la hoja de datos dedicada a ajustar la resolución de tiempo está llena de algún tipo de "números migratorios". Tampoco hay una "Nota de aplicación" normal en el chip. Además, en el escáner mismo, no pude detectar la conexión de las líneas EF1 / EF1 al controlador. Es a partir de estas líneas que se puede determinar que el microcircuito ha terminado de medir el tiempo. Debido a todo esto, iniciar el TDC me llevó bastante tiempo, pero como resultado todo funcionó como debería: cuando se inició el láser, el TDC funcionó, y los resultados del TDC dependieron claramente de la distancia al obstáculo. Por lo tanto, el buscador de rango láser pulsado comenzó a funcionar. Queda por convertir toda la estructura en un escáner láser viable.El primer paso que necesitaba para llevar a cabo el ajuste: el telémetro ensamblado dejó de "ver" obstáculos después de unos pocos metros. El sistema óptico parecía intacto, pero tuve que quitar las placas del sistema óptico, de modo que la luz reflejada no fuera enfocada con precisión por la lente del fotodetector.Antes de la alineación, escribí un programa para el controlador, que no solo determinaba las distancias, sino que también medía la amplitud de la señal generada por el detector de picos usando el ADC.Todo el proceso de ajuste se redujo a movimientos suaves del fotodetector y las placas láser, y a la búsqueda de su posición en la que la amplitud de la señal es máxima. Como resultado del ajuste, la amplitud de la señal recibida se mejoró significativamente.A continuación, debe prestar atención a alguna característica del procesamiento de datos inherente a los telémetros de pulso.La señal generada por el fotodetector tiene una forma analógica. Para convertirlo a formato digital, que el TDC procesa aún más, se utiliza un comparador que está configurado para cambiar si la señal de entrada supera un cierto umbral. Como resultado, debido a la forma compleja de la señal de entrada, al cambiar la amplitud de la señal, se produce un error al determinar los intervalos de tiempo:
Como se puede ver en el gráfico, una señal con una amplitud más baja se detectará con retraso. Para resolver este problema, existen varios métodos, tanto de hardware como de software. Decidí usar la opción más simple: la corrección de los resultados de la medición dependiendo de la amplitud de la señal. Al mismo tiempo, tuve que recopilar estadísticas sobre los cambios en los resultados de la medición del tiempo de los cambios en la amplitud de la señal. Para cambiar la amplitud de la señal sin cambiar sus otros parámetros, utilicé almohadillas de papel en la lente, lo que redujo el flujo de luz incidente en el fotodiodo.El resultado fue esta dependencia: en
base a esta dependencia, formé una tabla de corrección, cuyos datos son utilizados por el programa controlador para determinar la distancia al objeto.El siguiente paso es iniciar el motor espejo y el codificador.Anteriormente, ya cité una foto de un espejo:
el motor del espejo es sin escobillas, muy similar a los utilizados en los ventiladores más fríos. De él salen tres cables: dos de ellos son de alimentación, otro es una señal de velocidad de pulso. Todos estos cables están conectados al módulo de interfaz, mientras que la señal de velocidad generada por el motor no se utiliza: el control se basa en los datos del codificador.Como puede ver en la foto, un disco transparente con etiquetas para el codificador se fija en el eje del motor. Puede notar que hay una marca cero en el disco.El codificador se montó en una placa pequeña y se cubrió por completo con una pantalla de metal, por lo que no se pudo determinar su marca. Sin embargo, en función de su tamaño y pines, decidí que era un codificador de cuadratura HEDS-9040:
cuatro cables pasaron de la placa del codificador al módulo de interfaz, pero resultó que solo se utilizaron tres: dos fuentes de alimentación y una señal.Según tengo entendido, se instalaron activadores de Schmitt y se instaló algo de lógica en el tablero, combinando datos de los canales A, B e índice (señal de marca cero).Así es como se ve la señal producida por la placa del codificador y la señal de índice tomada directamente del codificador.
Como se puede ver, durante la señal de índice, se suprimen los pulsos del codificador. Al final resultó que, la placa del codificador generó 500 pulsos por revolución, pero el temporizador del controlador T2, al que está conectada la línea del codificador, puede funcionar simultáneamente en ambos bordes de los pulsos, lo que da 1000 interrupciones por revolución del espejo. Este valor corresponde a la resolución angular declarada del escáner a 0,36 grados.Configuré el temporizador T2 en "Modo de captura", lo que me permite medir el tiempo entre interrupciones desde el codificador. El tiempo obtenido se utiliza para detectar la posición "cero" del espejo y para estabilizar la velocidad de rotación del motor. Al mismo tiempo, se cuenta el número de interrupciones, lo que le permite determinar la posición del espejo.Después de que el codificador funcionó, y logré iniciar el control de velocidad del motor, fue posible ensamblar completamente el escáner. Debido a la forma compleja de las placas y la óptica, el diseño resultó ser bastante elaborado: no fue fácil ensamblar dicho diseño; la precisión de la disposición de las piezas individuales es muy importante para el escáner. Si el eje del espejo no coincidiera con el eje óptico de la parte del telémetro, esto podría llevar al hecho de que el plano de exploración estaría fuertemente curvado o inclinado.
Al medir la distancia exacta a los objetos, es importante tener algún tipo de objeto de "referencia", cuya distancia se conoce con precisión. Conociendo el "tiempo de vuelo", puede determinar con precisión el tiempo correspondiente a la distancia cero. Debido a los cambios en la temperatura de los componentes del escáner, este tiempo puede cambiar, por lo que este tiempo debe ser monitoreado constantemente. Para resolver este problema, instalé una placa especial ennegrecida en el escáner:
la placa está ennegrecida para que la luz reflejada no "ciegue" el fotodetector. A juzgar por las instrucciones, también se instalaron elementos reflectores oscuros y claros en el diseño original del escáner. Se utilizaron para controlar el funcionamiento de la parte del telémetro del escáner y, muy probablemente, también se utilizaron para la calibración.En la foto de arriba, el codificador montado en la placa también es claramente visible. Al final resultó que, el codificador debe estar colocado con mucha precisión en relación con el disco, y hubo muchos problemas con esto, incluso un pequeño cambio en el codificador provocó la pérdida de pulsos, especialmente los índices. Es posible que el escáner deje de funcionar después de golpear el cuerpo precisamente debido a problemas con el codificador.Como resultado, logramos obtener una velocidad de escaneo de hasta 20 revoluciones por segundo. Con un voltaje APD de 135 V, normalmente se detectan distancias de hasta 10-15 m. A un voltaje de 145 V y con filtrado de señal adicional, es posible medir distancias de hasta 30 m (aunque no estoy seguro de si esto es seguro para un fotodetector).Vale la pena señalar que la velocidad máxima de transmisión en el escáner original es de 115200 bit / s, lo que le permite transferir todos los datos solo a una velocidad de aproximadamente 11 revoluciones por segundo.Como mencioné, en mi firmware transfiero datos a una velocidad de 500 kbit / s, lo que puede aumentar significativamente la cantidad de escaneos transmitidos por segundo. Fue debido al límite de velocidad UART que no aumenté la velocidad de escaneo a las 25 revoluciones originales por segundo. Observo que en el diseño original del escáner, los datos se procesan en el mismo escáner, por lo que la baja velocidad de transferencia de datos no afecta particularmente nada.Dado que el escáner ahora funciona sin carcasa, fue posible aumentar el área de escaneo a 208 grados contra 190 en el diseño original.Visualización de datos recibidos del escáner:
Obviamente, el escáner debe realizar alguna función útil, así que decidí verificar su funcionamiento en ROS en SLAM, y comparar los resultados con los resultados de un escáner láser casero . Para hacer esto, lo instalé en Roomba, en el que previamente se instaló un escáner casero.Vista del escáner Leuze instalado en Roomba (el espejo gira para que parezca borroso): como resultado de la operación hector_slam, logramos obtener un mapa de apartamentos de este tipo (las paredes se muestran en amarillo): dado que la aspiradora viaja al nivel del piso, principalmente "ve" los muebles. Pero dicha tarjeta se obtiene si simplemente lleva la aspiradora en las manos al nivel del cinturón: en este caso, las paredes del apartamento son "visibles" con mayor frecuencia.

Si comparamos la calidad de las tarjetas, está claro que las líneas del escáner casero son más "ruidosas". Esto se debe al hecho de que con un escáner casero que utiliza el principio de triangulación de operación, la precisión aumenta significativamente con el aumento de la distancia.Desafortunadamente, a pesar de la muy buena calidad de escaneo, este escáner no es adecuado para un robot autónomo: tiene dimensiones y consumo de energía demasiado grandes (aproximadamente 7,2 W).¿Dónde más puedo usar un escáner? Anteriormente, cuando hablaba de un escáner casero, a menudo me preguntaban sobre la posibilidad de hacer un escáner 3D, ¡y es hora de hacerlo! Una velocidad de escaneo bastante alta es útil aquí. Por supuesto, por resolución, dicho escáner no se puede comparar con escáneres que utilizan el principio de triangulación de medición de distancia (con una línea o proyector láser (SLS)), pero pueden escanear grandes espacios: locales, secciones de calles.Para rehacer un escáner 2D en 3D, debe proporcionarle la capacidad de girar a lo largo de otro eje. Decidí hacer mi escáner utilizando el mismo principio de escaneo de haz que en el escáner de esteartículos Para hacer esto, coloqué el escáner Leuze "acostado" para que su plano de escaneo sea perpendicular al piso. Luego, fue necesario realizar una rotación lenta y suave de todo el escáner alrededor del eje. La principal dificultad: el escáner debe girar sin latidos ni distorsiones, lo que provocará la distorsión de los escaneos. Al final resultó que, en casa, es difícil hacer un conjunto de rodamiento que pueda proporcionar una rotación tan precisa. Por lo tanto, decidí usar el cabezal VHS de la grabadora como unidad de rodamientos: contiene dos rodamientos, está hecho con una precisión muy alta y es capaz de soportar el peso del escáner. El diseño resultante es impulsado por un motor paso a paso.El escáner 3D ensamblado se ve así: Vista del escáner montado en un trípode:
A la izquierda hay una batería de 12 V, que también es un contrapeso. Dado que el escáner Leuze requiere 24 V para funcionar, tuve que instalar un convertidor CC / CC escalonado montado sobre la base del chip XL6009 en el escáner. El motor paso a paso del escáner está controlado por un módulo en el A4988 y Arduino, que proporciona rotación a una velocidad determinada. Tanto el escáner Leuze (a través del adaptador USB-UART) como el Arduino están conectados a través de un concentrador USB con un cable a una computadora que captura datos. En la forma actual, la rotación del espejo del escáner y la rotación de todo el escáner no están sincronizadas: la velocidad de rotación del escáner se elige de modo que cuando se gira 0,36 grados, el espejo puede hacer al menos tres revoluciones. Como no hay sincronización de velocidad, tuve que transmitir información de posición de sincronización del Arduino al escáner Leuze.Esto se implementa de manera bastante simple: cuando Arduino gira el escáner por cada 0.36 grados, cambia el nivel de señal en uno de los terminales. Esta señal se transmite al módulo procesador del escáner (al conector no utilizado del sensor de estado de vidrio protector). La información sobre el estado de esta señal se transmite al comienzo de cada envío del escáner; por lo tanto, el programa autoescrito para la PC que controla el escáner recibe información sobre el movimiento del escáner y determina el ángulo de rotación.recibe información sobre el movimiento del escáner y determina el ángulo en el que gira.recibe información sobre el movimiento del escáner y determina el ángulo en el que gira.Un solo escaneo 3D generado por el escáner contiene aproximadamente 350,000 puntos. Por supuesto, esto es significativamente menor que el de los escáneres profesionales, pero sigue siendo bastante bueno, especialmente si une varios escaneos.Un ejemplo es un escaneo único de una habitación: Un ejemplo es un escaneo de una habitación pegada de varias: La parte escaneada de la entrada: Un video que muestra los resultados del escáner resultante:

→ El código fuente del programa controlador en GithubSource: https://habr.com/ru/post/es396357/
All Articles