Desarrollo de firmware para una videocámara analógica EVR-Y2022F

En un artículo anterior, se examinó el dispositivo de una cámara de video analógica con gran detalle para crear su propio firmware. Como ya se mencionó, la cámara tiene un microcontrolador de origen desconocido. Es mucho más rico que los AVR habituales: tiene dos voltajes de suministro de 3.3V y 1.8V, y además, tiene una función DSP. Llegué a esta conclusión cuando pensé en la implementación del algoritmo de enfoque automático. Sin embargo, no preferí MK complejos como STM32 y otros, solo porque nunca trabajé con ellos. Definitivamente tomé la decisión de usar uno de los AVR MK para implementar mi firmware. Por lo tanto, ya en esta etapa comencé a darme cuenta de que la implementación de la función de enfoque automático no será muy fácil de manejar, o más bien, imposible.

Mi elección recayó en el ATmega128 MK, ya que fue él quien cayó en mi brazo. El ATmega8 MK obviamente no será suficiente en términos de la cantidad de conclusiones, especialmente porque, por si acaso, decidí reservar un puerto MK completo para la entrada del flujo de video digital desde el procesador de video. En primer lugar, descubrí qué funciones estarán en mi propio firmware, en particular, las funciones que no estaban en el firmware original, y qué funciones tendrán que ser descuidadas.

Consideremos una variante del algoritmo de enfoque automático para analizar una transmisión de video digital. Me las arreglé para descubrir que los datos del flujo de video son una alternancia de bytes sincronizados con los pulsos "CK". Los bytes del flujo de video codifican los niveles de los componentes Y, Cr, Cb de la señal de video con gradación de 8 bits (256 niveles). Es decir, la salida de video digital del procesador de video de esta cámara está multiplexada por componentes. La información sobre el brillo (Y) está contenida en cada segundo byte de la transmisión de video, y la información sobre el color es dos veces menos frecuente. Es decir, la información sobre la señal de diferencia de color del Cr rojo está contenida en cada cuarto byte, así como la información sobre la señal de diferencia de color del azul. Por lo tanto, el flujo representa la siguiente secuencia: Cb0, Y0, Cr0, Y1, Cb2, Y2, Cr2, Y3, Cb4, Y4, Cr4, Y5, ... Es decir,Mientras que la información sobre el brillo de cada píxel viene sin espacios, la información sobre el color de los píxeles viene en secuencia en componentes. Este adelgazamiento se debe a las propiedades de insensibilidad al color de los pequeños detalles y a una reducción en la banda de color en la señal de video. Estas propiedades se utilizan en televisión analógica y digitalización de video. La "compresión" anterior (submuestreo de color) tiene una relación de componentes de 4: 2: 2.

Para que funcione el algoritmo de enfoque automático, es suficiente analizar solo el componente de brillo, que también es fácil de lograr interceptando el flujo de video "byte por byte". Si la frecuencia CK es de aproximadamente 18 MHz, entonces CK / 2 es de 9 MHz, lo que parece ser bastante alcanzable para el ATmega128 MK. Los pulsos de sincronización horizontal y vertical permiten al controlador "contar" y analizar cualquier área de la imagen. Quizás, para el algoritmo de enfoque automático, es suficiente analizar solo el centro del ráster. Obviamente, cuanto mejor sea el enfoque, más nítida será la imagen y, por lo tanto, más amplia será la banda de frecuencia de la señal de video (más componentes de RF). Es decir, es posible (incluso necesario) aplicar el algoritmo de Transformación rápida de Fourier (FFT) a fragmentos de un flujo de video digital y analizar los componentes de RF. En este caso, debe girar el foco de enfoque cada vez,utilizando el método de "media división" como método de optimización matemática. Por lo tanto, puede lograr el mejor resultado.

No me molesté con la función de enfoque automático, considerando que era imposible en MK con una arquitectura simple, aunque, en cualquier caso, reservé un puerto para video digital. En lugar de enfoque automático, decidí implementar una serie de otras funciones que no estaban disponibles en el firmware original. Pero para esto, la cámara de video tendrá que limitarse a condiciones estacionarias, lo cual es típico para la video vigilancia. Se supone que la cámara podrá girar posteriormente en el plano horizontal y vertical utilizando mecanismos especiales, tanto automática como manualmente. Cuando la cámara apunta automáticamente a un objeto específico, cuyas coordenadas esféricas se almacenarán previamente en la memoria del dispositivo de control, las "coordenadas" del zoom y el enfoque también cambiarán, que también se preseleccionarán y almacenarán en la memoria.La gestión se puede organizar de acuerdo con el protocolo PELCO-D, además, en la especificación de este protocolo hay un equipo especial para este negocio. Las coordenadas del zoom y el enfoque, por supuesto, se "emparejarán" para una distancia específica. Es decir, un objeto que se ubicará a una distancia dada estará enfocado.

Antes de comenzar a escribir un programa de firmware, debe pensar qué periféricos de MK y qué conclusiones estarán involucradas. Luego, debe pensar en cómo colocar y arreglar la placa con su propio MK dentro de la cámara. Y para que fuera lo más conveniente y fácil de mantener posible. Decidí usar una placa con MK, cuyas conclusiones se enrutarán completamente hacia el lado izquierdo y derecho. La placa se ubicará en la parte inferior de la cámara, donde hay poco espacio, y se mantendrá en una conexión desmontable. Al mismo tiempo, habrá "pines" del conector en la placa, y habrá enchufes de acoplamiento en los lados de la cámara. Para las tomas de respuesta, decidí hacer dos placas adaptadoras más, del tamaño del lado de la cámara. Las láminas de estas tarjetas van al lado superior de la cámara, directamente a la placa principal. Se supone que cada lámina se conectará al punto deseado en el tablero principal de la cámara.

Durante el desarrollo de la placa con MK, tuve la idea de complementar la videocámara con un reloj (RTC), y destaqué la línea I2C, colocada en la placa RTC DS1307 (ya sé qué demonios) con cuarzo y una batería y, por si acaso, EEPROM 24AA512, que eran manualmente. También en la placa en el borde superior hay conectores para conectar programadores SPI y JTAG. En la placa base original, MK tiene una frecuencia de cuarzo de 12 MHz. Es lo mismo para mi. En general, es mejor poner cuarzo a 11.0592 MHz para una operación clara de UART. Las distancias entre los "peines" de las articulaciones desmontables las calculé cuidadosamente de antemano. Decidí alimentar a MK con el "Krenka" de cinco voltios, que se atornillará al marco debajo de la placa principal (también servirá como disipador de calor). La energía se tomará del voltaje de entrada de 12V inmediatamente después del fusible FB801, como se muestra en la figura.


Higo. 1. Gestión de energía del microcontrolador.

Mientras dibujaba tableros en "SprintLayout", me preguntaba el propósito de cada pin del MK, que sale "al conector". El resultado es una imagen así.


Higo. 2. Bocetos de placas de circuito impreso adicionales.

Para decirte la verdad, dibujé las tablas laterales (a lo largo de los bordes) en la etapa de escribir este artículo. Pero, de hecho, los hice con un cortador. Resultó no ser la opción más exitosa. Y el tablero en sí con MK se hizo torcidamente. De alguna manera atornillé las placas auxiliares laterales a los lados del marco de la cámara, soldando tuercas fundentes a la superficie de cobre de la PCB. El hecho es que hay muy poco espacio en los costados, y la tapa de la cámara está prácticamente "apretada" de forma consecutiva.

Las siguientes figuras muestran la distribución de las conclusiones de la MK, así como su propósito.


Higo. 3. El propósito de las conclusiones del microcontrolador.

Hay muchos puntos para comentar.

Para el programador SPI (STK200 +), la salida "PEN" era innecesaria. La activación se realiza mediante "RESET", como de costumbre. Pero en lugar de "MISO" y "MOSI", el MK tiene una interfaz separada (PDI / PDO), y la línea "CLK" se combina.

Como voltaje de referencia para el ADC, elegí los mismos 5V, desde los cuales se alimenta el MK. Intenté obtener 3.3V por separado (como en el circuito original), pero al mismo tiempo hubo dificultades. Y para cambiar al voltaje de referencia de 5V, debe cambiar ligeramente el circuito, como se muestra en la figura.


Higo. 4. Traducción de los botones en el voltaje de referencia de 5V.

Es decir, debe soldar un lado de la resistencia R505 desde el lado de suministro de 3.3V y, en su lugar, aplicarle 5V desde la línea de alimentación MK.

De las conclusiones de MK, que se usan solo dentro del tablero diseñado, solo tres están involucradas. Una señal de pulso de 1 Hz con RTC llega a PB7 para actualizar la hora. Los pines PD0 y PD1 se asignan al bus I2C. Se implementará mediante programación utilizando la biblioteca CVAVR "i2c.h", a pesar de que una interfaz de hardware i2c (TWI) está conectada a estas salidas.

El pin MC "RESET" se emite, pero el restablecimiento MK se producirá por sí solo sin una cadena de restablecimiento externo.

Se entendió que los pulsos de reloj HD y VD llegarían al MK a través de puertos de interrupción externos para la precisión de la lectura del campo de video. Sin embargo, excluyendo la función de enfoque automático, ya no son necesarios. Las señales de los interruptores de límite de zoom y enfoque llegan a puertos vecinos de interrupciones externas.

El puerto "A" MK está reservado para la transmisión de video digital. El puerto "C" está totalmente reservado para SD.

El pin PD4 se utiliza para cambiar TX / RX RS-485. No hubo conmutación en el circuito original: la segunda y tercera patas del chip MAX485 estaban en el suelo. El MK original solo podía recibir datos para controlar la cámara a través de PELCO-D. Decidí hacer una pequeña actualización. La idea era esta. Si la videocámara cuelga alto y en una carcasa cerrada, simplemente será imposible actualizar rápidamente el firmware. Y seguramente surgirá tal necesidad: eliminar varios errores y mejorar la funcionalidad se convertirá en una práctica habitual por primera vez. Por lo tanto, se me ocurrió la idea de implementar un gestor de arranque para MK, y ya lo utilizo para actualizar el firmware de forma remota a través de RS-485. Y en este caso, un intercambio bidireccional es muy deseable. Sobre el gestor de arranque será una parte separada de este artículo. Y para conectar el MAX485 (2 y 3 patas) a este pin MK,necesitas hacer un pequeño cambio en el primer y segundo tablero. Estas placas están conectadas por un cable de bucle, en cuyos conectores hay un contacto "IRL" no utilizado para el control de la luz de fondo. En la segunda placa (principal), debe soldar la resistencia R520 y soldar en lugar de un cable que atraviese la placa adaptadora al ATmega128 MK a la salida correspondiente. Y en la primera placa, debe soldar y doblar 2 y 3 patas de U202, soldarlas y sacarlas del cableado a la salida libre de 1 conector J302. Estas operaciones para cambiar el circuito se muestran en la figura.que pasará por la placa adaptadora al ATmega128 MK a la salida correspondiente. Y en la primera placa, debe soldar y doblar 2 y 3 patas de U202, soldarlas y sacarlas del cableado a la salida libre de 1 conector J302. Estas operaciones para cambiar el circuito se muestran en la figura.que pasará por la placa adaptadora al ATmega128 MK a la salida correspondiente. Y en la primera placa, debe soldar y doblar 2 y 3 patas de U202, soldarlas y sacarlas del cableado a la salida libre de 1 conector J302. Estas operaciones para cambiar el circuito se muestran en la figura.


Higo. 5. Organización de la línea TRX para controlar el TX / RX MAX485.

Hay dos interfaces UART a bordo del ATmega128. En este caso, debe usar la segunda interfaz (pines 27, 28), ya que la primera interfaz en los pines (pines 2, 3) se combina con la interfaz para el programador SPI.

En el tablero, están involucradas casi todas las conclusiones del MK. Las conclusiones del puerto "G" resultaron no ser utilizadas. Por cierto, fue posible implementar el reloj mediante programación sobre la base de MK. Proporciona un modo de suspensión con el uso de una batería para contar el tiempo cuando la alimentación principal está apagada. Incluso hay conclusiones para conectar un cuarzo separado de baja frecuencia. Sin embargo, no me molesté con esto, abofeteando el DS1307.

La figura siguiente muestra el propósito de cada salida de la placa con MK. Además, se marca condicionalmente qué y en qué lado de la placa principal se soldarán los cables de cada pin. También es necesario hacer algunos comentarios.


Higo. 6. Asignación de conclusiones de un pago adicional con MK.

Las señales de los interruptores de límite de zoom y enfoque llegan no solo a los puertos de interrupción, sino también a las entradas ADC. El hecho es que incluso en la etapa del estudio de SD, noté tal característica. Si el mecanismo de zoom o enfoque está en "cero", la señal de salida del remolque puede tomar un estado "intermedio". Para capturar mejor estos casos raros, decidí usar el ADC. Por supuesto, este no es un enfoque muy competente, pero al hacerlo rápidamente salí del problema que a veces surgía en la etapa de inicialización de mi firmware de prueba. Por lo tanto, aumenté la estabilidad del algoritmo.

Las señales SDA / SCL del I2C se conectan al conector, por si acaso, y no se usan fuera de esta placa.

Los nombres de cada pin para el control de la ID se firman de acuerdo con la conexión real. La conexión de datos, mirando hacia el futuro, finalmente se corrigió en la etapa de depuración. Hubo mucha confusión, pero los errores fueron solo en la alternancia de fases precisas para revertir, y no en su orden. Las alternancias "4-1-2-3" (para el zoom) y "2-3-4-1" (para el enfoque) son lo mismo, así como "1-2-3-4", que y fue tomado como base.

Al final del artículo (para no deshonrar) se presentan dos fotos. La primera es la vista inferior de la videocámara con una vista de la placa de circuito adicional. La segunda es una vista desde arriba desde arriba en la placa principal de una cámara de video con un MK estándar sellado (microprocesador, para ser más precisos), un montón de puentes de alambre y otros mocos.

Escribí el programa (firmware) junto con sus pruebas preliminares en el programa ISIS 7 Professional (Proteus).


Higo. 7. Vista del proyecto en Proteus.

En lugar de los chips únicos del generador de caracteres y el procesador de video (que, por supuesto, no están en Proteus), instalé depuradores SPI. Con la ayuda de ellos, es conveniente controlar los bytes que MK envía por SPI. Pero la reacción real a estos bytes se controla directamente en el hardware. Con Proteus, puede monitorear y depurar comandos PELCO-D provenientes de un DVR real. Para hacer esto, como opción, debe conectar el DVR al puerto COM de la computadora a través del adaptador unidireccional más simple RS485-> RS232.

Luego comencé a desarrollar y modelar. Excel ayudó mucho con esto.

Primero debe decidir sobre los temporizadores y su configuración. Un temporizador: para realizar la rotación del motor paso a paso y la implementación de operaciones repetidas de los botones mientras los mantiene presionados. Al mantener presionado este o aquel botón durante la configuración a través del menú, se excluirá el funcionamiento de la SD. Y cuando mantiene presionado uno de los botones de control de zoom o enfoque fuera del menú, la SD gira con el parámetro de tiempo correspondiente. Por lo tanto, no hay conflictos. Planeaba usar el segundo temporizador para implementar PWM para la SD, pero con el tiempo decidí abandonarlo. De hecho, en mi caso, cuando no hay enfoque automático, no hay necesidad de PWM. Además, el mecanismo de transmisión tiene una estructura helicoidal, por lo tanto, en reposo, no puede "retener" la SD por corriente continua, el mecanismo no se arrastrará a ninguna parte.

Luego, debe revisar el alfabeto de los caracteres del generador de caracteres, de acuerdo con la hoja de datos, y compararlo con el alfabeto ASCII estándar. El alfabeto del generador de caracteres consta de 128 caracteres, que es la mitad del tamaño del último. Por ejemplo, los caracteres cirílicos en el generador de caracteres están completamente ausentes, pero hay caracteres especiales que son característicos de su aplicación (sol, reloj de arena, hombrecito, nota, teléfono, etc.). Hice una matriz de "smb [256]" de 256 elementos, colocándolo en la EEPROM MK. La notación smb [i] = adr significa que en la dirección adr en el generador de caracteres hay un carácter con el código ASCII i. Y si el símbolo i no está en el alfabeto del generador de caracteres, entonces el valor del elemento de matriz se refiere al "espacio" con la dirección 0x7E. Es decir, casi la mitad de los elementos en la matriz tienen un valor de "0x7E". Esta matriz se presenta en forma de tabla en la figura a continuación.


. 8. ASCII PD6464A.

A continuación, debe considerar cómo procesar los botones a través del ADC. De acuerdo con la ley de Ohm, es fácil calcular los valores de voltaje en la entrada del ADC cuando hace clic en un botón. Después de eso, es fácil calcular los límites de los intervalos, cuya mitad serán los mismos valores de tensión. En total, se obtienen seis intervalos: cinco de ellos corresponden a cada botón y uno a la ausencia de presión (no se presiona ningún botón). A nivel de hardware, el ADC MK analiza periódicamente el valor de voltaje de los botones. El temporizador para anti-rebote se puede implementar en función del cálculo de los ciclos de reloj ADC, lo cual hice. En la etapa de depuración, esta parte del programa tuvo sus dificultades. Creo que no vale la pena escribir detalles. Para lograr el trabajo claro de esta funcionalidad, tuve que jugar mucho tiempo. La función de reconocimiento de botones se coloca en la sección de interrupción de ADC, y en su salida está el número de botón,bandera de depresión y bandera de liberación. El procesamiento adicional de los botones ocurre en el ciclo del programa principal. La frecuencia de sondeo de los botones (frecuencia ADC) fue 12000/128 = 93,75 (kHz), donde 128 es el máximo divisor posible.

Luego compilé una matriz de valores de registro UART UBRR1 de la configuración UART, dependiendo de una u otra velocidad de transmisión PELCO-D, que se puede seleccionar de la lista en la configuración a través del menú. Estos valores pueden calcularse usando la fórmula de la hoja de datos en el MK, y también pueden obtenerse usando el autoconfigurador AVR Wizard.

Entonces comencé a modelar el menú. Esta es la etapa principal y larga de escribir un programa. En principio, no iba a repetir el menú del firmware estándar, excepto por esto, decidí complicarlo a una estructura jerárquica (sección en la sección). A continuación se muestra una descripción del modelo y las definiciones del menú que hice para mí.

No puedo leer
.
.
.
.
«MENU».

«» .
«» «» .
«» .
«» .
( ) , .
« », .

:
— ;
— ;
— ;
— .

, , .
<>.
.
"<..>".
«».
, .
( ) .
"<..>" .
, .
.

.
.
.
"<•>" ( ).
"< >" ().
«».

.
.
«l*l» (, «l»).
«l l» (, «l»).
«».

, .
.
.
.
: «000», «00», «0».
.
: ": ".
— ( ) .
, , «» «».
«» 1.
«» 1.

.
.

Por lo tanto, la navegación por el menú es algo similar a la navegación por archivos y carpetas a través de "Total Commander". El código de implementación para este modelo de menú no es muy complicado, pero es muy engorroso. Hay dos variables clave: el número de la página activa y el número de la posición activa en la página. Para ambas variables, dos funciones "switch-case" funcionan entre sí. Este par de funciones está involucrado en el proceso de presionar los botones "Izquierda", "Derecha" y "Menú". En cada lugar (para cada botón, página y elemento actual) se registran ciertas acciones. Cada página de menú tiene una función que implementa la visualización de la página en la pantalla con todas las inscripciones y parámetros. Antes de implementar las funciones de salida de la página, las modelé previamente en Excel, como dicen, "por celdas".Por lo tanto, las coordenadas de las celdas de cada símbolo en el campo de la pantalla se presentan con mayor claridad, y esta información es necesaria en la etapa de programación. En la siguiente figura, como ejemplo, ofrecí la vista de la página 9, en la que se selecciona la velocidad de transmisión PELCO-D de la lista. El elemento de interfaz en la página es un botón de radio. Además, el primer párrafo <..> es salir de esta sección.


Higo. 9. Modelado del OSD en Excel.

También hice una matriz que refleja el número de puntos en cada página. Se utiliza en el procesamiento de presionar los botones Arriba y Abajo. Esto se hace para reducir el código y evitar el uso de la función switch-case.

Las pulsaciones virtuales repetidas mientras se mantienen presionados los botones se implementan en el cuerpo de la interrupción del temporizador mediante la función de "cambio de caja", que funciona en una variable entera, que es una bandera. El valor del indicador es único para cada acción de un botón en una página específica y un elemento de menú específico. Se asigna a la bandera como un número de serie solo en aquellos lugares donde se necesitan clics virtuales. Al mismo tiempo, dentro de la función "interruptor de caja" (en el cuerpo de la interrupción del temporizador) se colocan copias de las funciones que implementan las acciones de los botones. Para ahorrar memoria, fue posible colocar "accesos directos" (enlaces) en llamadas regulares a la función de procesamiento de botones. Es aún más razonable, pero en ese momento no tenía la paciencia para pensar en cómo hacerlo mejor, porque quería terminar el proyecto lo antes posible. Y la memoria en ATmega128 resultó ser bastante.

Finalmente, implementé "bibliotecas" para trabajar con un procesador de video, generador de caracteres y RTC DS1307 con las funciones necesarias. Después de eso, determiné las direcciones de EEPROM MK para almacenar esta o aquella información. Los primeros 32 bytes están reservados para almacenar información de configuración del menú. Los siguientes 32 bytes están reservados para almacenar texto que se puede mostrar en la pantalla o cambiar usando el comando estándar “Pelco-D Write Char. A la pantalla. " Los siguientes 256 bytes del área EEPROM están reservados para el alfabeto (conversión de un carácter de ASCII a una dirección para un generador de caracteres, como se mencionó anteriormente). Finalmente, los siguientes 128 bytes están reservados para almacenar "presets" (plantillas) de zoom / enfoque. Introduje esta característica debido a la falta de enfoque automático. Escribí sobre esto al comienzo del artículo. Un total de 32 plantillas. Las coordenadas del zoom o foco están codificadas en dos bytes.

Por separado, vale la pena escribir sobre la implementación de la gestión de SD. La rotación de la SD se logra llamando a las funciones StepF () y StepZ () en el bloque de interrupción del temporizador. La velocidad de rotación está determinada por la configuración de este temporizador. Y la implementación de las funciones anteriores implementa la promoción de enfoque o zoom (respectivamente) en un paso mínimo. Durante la rotación del objetivo zoom y el enfoque, se controlan sus posiciones finales. La posición del enfoque máximo y la posición del zoom mínimo se representan en el programa mediante constantes (280 y -600, respectivamente). Pero la posición del foco mínimo y la posición del zoom máximo, en forma de variables F_min y Z_max (más precisamente, funciones). Este enfoque fue facilitado por un área de trabajo no rectangular con una esquina inferior derecha cortada. Para calcular los valores de F_min y Z_max, se utilizan las funciones definidas por partes F_min (Z) y Z_max (F). Además,cuando el zoom SD gira en la dirección positiva en Z (coordenada del zoom)> 500, el enfoque SD gira simultáneamente en la misma dirección si este último tiene coordenadas <(- 180). Es decir, la posición de zoom máxima, en principio, no está limitada por la posición de enfoque actual, sino que está limitada a 600. Simplemente sucede que dos SD giran simultáneamente cuando se alcanza el borde angular correspondiente de la región pentagonal, y el movimiento en esta etapa ocurre a lo largo del "lado cortado" (si se interpreta gráficamente) ) Desde el punto de vista de la mecánica, esto es equivalente al proceso descrito en el artículo anterior, cuando, en ausencia de SD y al mover manualmente los nodos de zoom y enfoque, el nodo de zoom al final de la ruta "tira" del nodo de enfoque. Debido al hecho de que la coordenada de zoom domina la coordenada de enfoque (por eso considero la dependencia de F (Z),pero no viceversa), no comencé a implementar un procedimiento similar de "desplazamiento" del zoom en la función Step_F ().

En el firmware original, la velocidad de cambiar el zoom y el enfoque tenía valores fijos. Esto no siempre es conveniente. En mi firmware, proporcioné cuatro valores de zoom y velocidades de enfoque (independientemente), que se pueden seleccionar tanto a través del menú como usando el comando PELCO-D asignado a esta función. Estos cuatro valores se preseleccionan en la etapa de depuración por conveniencia, luego se ingresan en el firmware.

La función de inicialización de BD init_MR () es necesaria para vincular la mecánica del zoom y enfocar el sistema de coordenadas. Se realiza una vez cada vez que enciende la videocámara. El algoritmo de su trabajo es aproximadamente el siguiente. En primer lugar, se supone que el zoom o el foco están en el punto cero, y se intenta atrapar el rebote de la señal de los interruptores de límite mediante funciones de interrupción externas. Notaré de inmediato que si el zoom o el foco están "en cero" (en el límite de la partición del avance óptico), la señal a la salida del avance tiene un estado "intermedio" entre el "0" lógico y el "1". Tales casos son muy poco probables, pero no se pueden descartar. Sin embargo, la función de interrupción no interpreta una señal como rebote. Es por eso que llegué a usar el ADC MK, activando señales desde los interruptores de límite y zoom en sus dos canales libres. Entonces,El primer paso es la "digitalización" de las señales de los interruptores de límite con una precisión de 8 bits. Esto se hace usando una sola conversión de analógico a digital. Vale la pena recordar que el voltaje de referencia en nuestro caso es 5V, y el nivel lógico "1" del interruptor de límite es 3.3V. Para un "0" lógico, el valor de ADC será cero, y para un "1" - 3.3 / 5 * 255 = 168. Si el valor de la señal de uno u otro trailer cae dentro del rango, digamos, de 2 a 165 (se toma un intervalo difuso), esto significa que el nodo correspondiente ya está "en cero", y el procedimiento de inicialización para este nodo se puede detener. De lo contrario, por el valor lógico de la señal del trailer ("0" o "1"), necesita determinar en qué parte (mitad) se encuentra el nodo. El sentido de rotación de la SD dependerá de esto. De una forma u otra, la SD debe girarse en esta dirección,para que el nodo correspondiente se mueva hacia el "cero" (interruptor de límite). Por lo tanto, la rotación del motor se inicia con el cálculo simultáneo del número de pasos hasta que se alcanza el interruptor de límite. Tan pronto como se alcanza el interruptor de límite correspondiente, que determina la función de interrupción externa de acuerdo con la diferencia en el nivel lógico, habrá una rotación inversa del motor. Girará en la dirección opuesta en el mismo número de pasos, volviendo así a su posición original. El valor del número de pasos para cada BD con el signo correspondiente se copiará a las variables correspondientes antes de salir de la función de inicialización. El procedimiento descrito anteriormente ocurre independientemente para enfocar y hacer zoom dentro de la misma función (no a su vez).La velocidad de rotación del accionamiento del motor en la etapa de inicialización está determinada por una constante separada y corresponde a la velocidad máxima para una rotación correcta y segura del SM.

Considere el ejemplo donde, antes de encender la cámara, el zoom estaba en la región negativa y el foco estaba en la región positiva. La figura muestra esquemáticamente la trayectoria del punto (Z; F) durante el procedimiento de inicialización del motor paso a paso.


Higo. 10. El proceso de inicialización del zoom y el enfoque.

El punto A es la posición inicial del zoom y el enfoque. El movimiento de ambos nodos ocurre en la dirección de "cero" con la misma velocidad (velocidad de inicialización). En el punto B, el foco llega a cero, ya que estaba más cerca de cero que el zoom. Entonces el enfoque se invierte. En el punto C, el foco completa el proceso de inicialización, volviendo a su posición original. Al mismo tiempo, el zoom todavía se mueve hacia su "cero". En el punto D, alcanza su "cero" y vuelve a su posición original (punto A).

Además de la función de inicialización init_MR (), hay una función goto_zf (z, f). Basado en el nombre, está destinado a cambiar de un preset a otro, sobre el que escribí al principio del artículo. La velocidad de rotación del motor paso a paso durante la transición es la misma que durante la inicialización. El proceso de transición en zoom y enfoque se lleva a cabo simultáneamente. Es decir, si se requiere ir desde el punto (z1; f1) al punto (z2; f2), se inicia la rotación simultánea de dos SD. Si, por ejemplo, | f2-f1 | <| z2-z1 |, el foco SD se detendrá antes. Esto se demuestra en la figura a continuación.


Higo. 11. El proceso de cambiar el zoom y el enfoque al elegir un preset.

Durante todo el tiempo de operación del motor paso a paso durante el paso del limitador de marca cero, la coordenada correspondiente se pone a cero. Y esto a pesar del hecho de que, en teoría, esto no se puede hacer. Sin embargo, en la práctica, todavía hay un error de 1-2 pasos de la SD.

Vale la pena agregar que, a diferencia del firmware original, en mi caso, al controlar el zoom y el enfoque (tanto desde los botones como a través de PELCO-D), proporcioné la posibilidad de un movimiento paso a paso. Esto funciona de la siguiente manera. Cuando hace clic en cualquiera de los 4 botones para controlar el zoom o el foco, la SD correspondiente se gira un paso, minimizando así el movimiento del nodo de zoom o foco. Si no suelta el botón, la rotación normal del motor paso a paso comenzará después de un corto período de tiempo. Este retraso se selecciona empíricamente de antemano. Esta característica es similar a las presiones virtuales repetidas mientras se mantiene presionado el botón. Gracias a esta función, se elimina el problema de "pegar" el botón al controlar el zoom o enfocar el dispositivo remoto PELCO-D a través de una mala conexión a Internet. Más precisamente, la oportunidad surge como grosera,y afinar el zoom o el enfoque.

El intérprete de los comandos PELCO-D se realiza con la misma analogía que en el dispositivo para conmutar cargas a través de PTZ. Anteriormente dediqué un pequeño artículo separado sobre Habré a este dispositivo simple. A diferencia del firmware original, los comandos de control de zoom y enfoque se refieren completamente a presionar los botones correspondientes. Es decir, es posible "subir" el menú utilizando los botones de zoom y enfoque PELCO-D. Y para acceder de forma remota al menú a través de PELCO-D, o más bien, presionar el botón "MENÚ", comparé el botón de apertura de apertura con él, porque esta función no se usa en este modelo de cámara. Por lo tanto, hay cinco comandos básicos de PELCO-D para presionar, así como cinco comandos básicos para soltar botones. Además, como ya escribí casualmente en todo el artículo, se procesan comandos adicionales: "Establecer preajuste", "Borrar preajuste","Ir a Preset", "Escribir Char. A la pantalla "," Borrar pantalla "," Establecer velocidad de zoom "," Establecer velocidad de enfoque ".

La fecha y la hora con RTC se muestran en la esquina inferior izquierda de la imagen por analogía con las cámaras VHS antiguas, si esta opción está activada en el menú. Además, en el menú puede seleccionar el formato de salida, que también proporcioné por adelantado. También en la pantalla junto a la fecha y la hora es posible mostrar el día de la semana. Además del reloj, las coordenadas actuales del zoom y el foco se muestran en la pantalla como información adicional. Esta opción es necesaria principalmente en la etapa de depuración.

Te contaré sobre las funciones del menú que implementé. Con el tiempo, si es necesario, se revisará el menú: algunas funciones pueden eliminarse y otras agregarse. La estructura del menú que dibujé en SPlan, con vistas de página, se muestra en la figura a continuación. Flechas rojas: ingrese a la sección. Flechas azules: salga de la sección. No dibujé flechas azules en cada página del menú, dibujé solo dos, por ejemplo.


Higo. 12. La estructura del menú en pantalla.

Algunas secciones de mi menú son un poco como las secciones del original. En primer lugar, estas son las dos primeras secciones: balance de blancos y exposición. En la tercera sección, puede especificar la dirección de la cámara PELCO-D y seleccionar la velocidad de datos (velocidad de transmisión) de la lista. La cuarta sección está dedicada a la fecha y la hora. Puede configurar la fecha, la hora, el día de la semana, elegir uno de los cuatro formatos de visualización y elegir un método de visualización. La quinta sección: trabajar con ajustes preestablecidos (plantillas) de zoom y enfoque, donde puede llamarlo por número, así como borrar o sobrescribir. También en esta sección del menú, puede elegir una de las cuatro velocidades para cambiar el enfoque o el zoom. La quinta sección le permite editar los parámetros del procesador de video, ubicado en el byte 9 de la categoría 3. Este es el nivel y la inversión del componente de ráfaga de la señal de video y la duplicación de video. La última sección del menú es para depurar.Al usarlo, puede escribir en el procesador de video cualquier valor de cualquier byte en cualquier categoría. El valor se puede establecer en forma decimal y binaria.

Ahora diré algunas palabras sobre el gestor de arranque. Como ya escribí, el cargador de arranque es necesario para flashear remotamente la videocámara a través de RS-485. Inicialmente, pensé en implementar completamente el gestor de arranque yo mismo. Sin embargo, para ahorrar tiempo, decidí hacerlo con uno de los descargadores ya implementados que se pueden encontrar en Internet. Además, nunca los he usado, teniendo una idea de ellos solo a nivel teórico. Uno de los criterios importantes para elegir un gestor de arranque es el soporte RS-485. Por lo general, los descargadores AVR funcionan en UART RS-232. Y el cargador de arranque con soporte RS-485 solo difiere en que se asigna una salida adicional en el lado MK para cambiar el transceptor RS-485 (por ejemplo, MAX485) durante la transferencia de datos desde el MK a la PC. Cuando parpadea MK, el gestor de arranque transmite información sobre la grabación exitosa o no exitosa a la computadora. Primer gestor de arranqueque encontré le permite grabar no solo la memoria FLASH de MK con firmware, sino también EEPROM. Además de escribir, también puede leer datos. Pero este proyecto con el código fuente del ensamblador fue bastante confuso y no lo entendí. Además, el énfasis principal de este gestor de arranque apuntaba a la capacidad de flashear múltiples dispositivos individualmente, sin desconectarlos de la red RS-485, accediendo a cada dispositivo en una dirección que estaba conectada previamente. No necesito tales funciones funcionales, ya que uso una topología diferente de la red RS-485, y es posible cambiar rápidamente la videocámara de DVR a PC. El segundo gestor de arranque es el alemán Chip45. El código fuente no está en el dominio público, se puede comprar al autor. En cambio, hay varios cientos de archivos HEX para diferentes AVR MK, diferentes interfaces UART (si hay varios, como en mi caso),RS-485 o RS-232 para elegir. En resumen, para todas las ocasiones. Al mismo tiempo, el autor señala que en el caso de RS-485, el pin de conmutación TX / RX es fijo y corresponde al pin XCK UART de la interfaz del controlador, que prácticamente no se usa en UART. En mi caso, el pin 30 del XCK de la segunda interfaz UART del Atmega128 MK es PORTD.5 ​​y se utiliza para activar los interruptores de límite de enfoque y zoom. En principio, esta función no es necesaria porque, como lo han demostrado los estudios, los interruptores de límite siempre están activos, como ya escribí. Y si es necesario, puede transferir esta función a cualquier otra salida libre MK. Pero, de todos modos, este gestor de arranque tampoco me impresionó, especialmente porque me encontré con un gestor de arranque más interesante llamado "AVR Universal Bootloader" de diseño chino. Al igual que Chip45, solo puede escribir y solo en la memoria FLASH de MK.Pero él tiene una gran cantidad de posibilidades y, por lo tanto, decidí permanecer en él. Viene como un proyecto AVR Studio con código fuente C. Debido al hecho de que trabajo en CodeVisionAVR, tuve que instalar AVR Studio junto con WinAVR. Para obtener el archivo HEX del firmware del cargador de arranque, debe compilar el proyecto haciendo cambios preliminares en el código fuente a la configuración de su propio dispositivo y necesita el suyo propio. La compilación del proyecto consiste en lanzar un archivo bat (archivo por lotes), en el que se escriben los comandos de compilación. Por lo tanto, no es necesario abrir un proyecto en AVR Studio. Los cambios en el código fuente pueden hacerse manualmente (a nivel del programador) o usando el configurador. El papel de este último es una ventana adicional de la utilidad que funciona con el gestor de arranque, que también está adjunto.En el configurador, puede especificar el pin MK para la conmutación TX / RX RS-485, el pin MK para el LED parpadeante de control, el pin MK para ingresar al cargador de arranque, la forma en que se ingresa el cargador de arranque, el nombre y la frecuencia MK, etc., no se pueden enumerar. Además, el programa HyperTerminal conocido estándar puede actuar como una utilidad para cargar un programa de usuario en MK, es decir, para trabajar con el gestor de arranque. Utiliza el protocolo Xmodem para descargar firmware. Y para trabajar de manera conveniente y visual con el gestor de arranque a través del terminal de texto, se proporciona la función especial "Modo detallado" en el configurador. Pero a pesar del atractivo del hiperterminal, decidí usar la utilidad que venía con el gestor de arranque. El hecho es que con la conveniente función Verbose activada en el configurador, trabajando a través del terminal, me encontré con la siguiente situación.A veces sucedió cuando el tráfico de datos en la línea "colisionó" (ambos dispositivos en modo TX), como resultado de lo cual el MAX485 en la videocámara se calentó mucho y falló, o mejor dicho, no completamente, sino solo la sección RX (transmitiendo datos a través de RS-485 a la cámara) . Debido a esto, abandoné HyperTerminal. Y hay un inconveniente más. HyperTerminal no funciona con archivos de texto HEX y solo acepta un archivo binario. Por lo tanto, tendría que aplicar una conversión adicional de hexadecimal a bin. Después de generar el archivo HEX del cargador de arranque, lo cosí en el MK usando el programa PonyProg y el programador SPI habitual. Como resultado, el gestor de arranque funciona de la siguiente manera. Cuando enciende la videocámara, el gestor de arranque se activa inmediatamente. Espera una conexión de la utilidad por un segundo, luego el firmware principal comienza a funcionar. Si la conexión se establece con éxito,entonces comienza el proceso de flasheo. Al mismo tiempo, el otro extremo de la línea RS-485 debe desconectarse del DVR de antemano y conectarse a la PC a través del adaptador USB RS485 <-> RS232 o RS485 <->. Por cierto, sobre los adaptadores. Surgió la pregunta de cómo hacer un adaptador de este tipo, ya que los adaptadores adquiridos son caros. Buscando en Internet, encontré un simple circuito adaptador RS485 <-> RS232. Se muestra en la figura a continuación. Consiste principalmente en los conocidos microcircuitos MAX232 y MAX485, y TX / RX se conmuta mediante la señal de la tercera salida del conector del puerto COM de la computadora a través de un circuito de diodo zener. Es decir, el MAX485 es conmutado por el tráfico de datos que transmite la PC. Todo es simple e ingenioso.RS232 o RS485 <-> USB. Por cierto, sobre los adaptadores. Surgió la pregunta de cómo hacer un adaptador de este tipo, ya que los adaptadores adquiridos son caros. Buscando en Internet, encontré un simple circuito adaptador RS485 <-> RS232. Se muestra en la figura a continuación. Consiste principalmente en los conocidos microcircuitos MAX232 y MAX485, y TX / RX se conmuta mediante la señal de la tercera salida del conector del puerto COM de la computadora a través de un circuito de diodo zener. Es decir, el MAX485 es conmutado por el tráfico de datos que transmite la PC. Todo es simple e ingenioso.RS232 o RS485 <-> USB. Por cierto, sobre los adaptadores. Surgió la pregunta de cómo hacer un adaptador de este tipo, ya que los adaptadores adquiridos son caros. Buscando en Internet, encontré un simple circuito adaptador RS485 <-> RS232. Se muestra en la figura a continuación. Consiste principalmente en los conocidos microcircuitos MAX232 y MAX485, y TX / RX se conmuta mediante la señal de la tercera salida del conector del puerto COM de la computadora a través de un circuito de diodo zener. Es decir, el MAX485 es conmutado por el tráfico de datos que transmite la PC. Todo es simple e ingenioso.Consiste principalmente en los conocidos microcircuitos MAX232 y MAX485, y TX / RX se conmuta mediante la señal de la tercera salida del conector del puerto COM de la computadora a través de un circuito de diodo zener. Es decir, el MAX485 es conmutado por el tráfico de datos que transmite la PC. Todo es simple e ingenioso.Consiste principalmente en los conocidos microcircuitos MAX232 y MAX485, y TX / RX se conmuta mediante la señal de la tercera salida del conector del puerto COM de la computadora a través de un circuito de diodo zener. Es decir, el MAX485 es conmutado por el tráfico de datos que transmite la PC. Todo es simple e ingenioso.


. 13. RS-232 <-> RS-485.

Después de dominar el gestor de arranque, en mi tiempo libre, decidí investigar la óptica de la videocámara. Más precisamente, me resultó interesante qué combinaciones de valores de zoom y enfoque producirán imágenes enfocadas a diferentes distancias de la lente al sujeto. Permítame recordarle que la región de varios valores mutuos de zoom y enfoque se describe mediante una región pentagonal (casi rectangular). Por ejemplo, tome la distancia de la lente al sujeto 10 cm. El argumento (a lo largo del eje de abscisas) del zoom tiene un rango de valores de -600 a 600. Es necesario seleccionar el valor de enfoque en cada valor de zoom en el que el sujeto frente a la lente en la imagen de video estará enfocado. Entonces necesitas hacer una mesa. Por supuesto, no tiene sentido ordenar los 1200 valores de zoom, es suficiente tomar unas pocas docenas de valores con un cierto paso igual. Como tal paso, elegí el valor 50.En cada valor de zoom con este paso (-600, -550, -500, ...) seleccioné el valor de enfoque y grabé los resultados de la medición. Hice un procedimiento similar con otras distancias desde la lente hasta el sujeto: 50 cm, 1 m, 10 m, 100 m. El resultado fue una familia de curvas que mostré en Excel.


. 14. Z-F .

Mirando los gráficos, quiero hacer muchos comentarios. Con el zoom mínimo, los valores de enfoque son ligeramente inferiores al "medio" (cero) para casi cualquier distancia. La curva rosa para una distancia de 10 cm termina con un valor de zoom de aproximadamente 250, que corresponde al valor de enfoque mínimo. Esta curva tiene un carácter decreciente y es convexa hacia arriba. La curva roja para una distancia de 1 m tiene una forma completamente diferente. En primer lugar, no es monótono, y en segundo lugar, en lo que respecta a la propiedad de convexidad, hay un punto de inflexión. Las curvas para distancias de 10 my 100 m son de naturaleza similar, las últimas, por cierto, prácticamente coinciden, lo que ya sabía de antemano. Por lo tanto, las distancias medidas de 10 y 100 metros, por supuesto, tomé aproximadamente. Lo que balancea la curva azul para una distancia de medio metro: inicialmente no iba a tomar medidas sobre ella.Seleccioné esta distancia aproximadamente en base al principio de que lo más cerca posible con un fragmento de la curva correspondiente se aproxima al límite de la esquina de la región (corte). Y así sucedió: este borde prácticamente toca un fragmento de la curva. En general, vale la pena señalar que la mitad superior de la región (valores de enfoque positivos) prácticamente no se usa. La excepción se encuentra a una gran distancia del sujeto a la lente y con el zoom más grande. Y, sin embargo, para casi todas las distancias (excepto la más cercana, menos de medio metro), con un zoom bajo (150 o menos), los valores de enfoque son casi los mismos. En términos generales, todos los hechos de medición establecidos deben tener una interpretación teórica, basada en las leyes de la óptica. Pero en este momento, no tengo idea de los dispositivos de lentes de este tipo. Máximo,Lo que encontré en el campo de la óptica es la construcción de un simple telescopio refractor de dos lentes. Y en el caso de esta videocámara, no entendí la mecánica de la óptica. En la salida, solo dos nodos móviles no están disponibles: el nodo de enfoque (responsable del enfoque) y el nodo de zoom. Y no sé cuántas lentes totales hay dentro. Supongo que dos están conectados con estos nodos móviles. También vale la pena señalar que al ajustar el enfoque, el zoom también cambia visualmente ligeramente, incluso si el nodo correspondiente está fijo.conectado a estos nodos móviles. También vale la pena señalar que al ajustar el enfoque, el zoom también cambia visualmente ligeramente, incluso si el nodo correspondiente está fijo.conectado a estos nodos móviles. También vale la pena señalar que al ajustar el enfoque, el zoom también cambia visualmente ligeramente, incluso si el nodo correspondiente está fijo.

Al final del artículo, pasamos a las pruebas prácticas de la videocámara. Decidí no tomar muchas fotos fijas, pero inmediatamente cargué todo el video. Grabé la captura de video a través del dispositivo, el sonido se escribió por separado en la grabadora de audio. La resolución original es 720 por 576. Después de subir el video a YouTube, su calidad ha cambiado notablemente.


Cuando enciende la cámara, lo primero que sucede es la inicialización de los motores paso a paso del zoom y el enfoque en el fondo de la imagen de video. Esta imagen es en blanco y negro y sin AGC, ya que el procedimiento de inicialización del procesador de video aún no ha pasado. En la parte inferior izquierda, la fecha y hora actuales mostrarán la fecha y hora de compilación del firmware actual de la cámara. En el código fuente del firmware, creé las variables correspondientes que se encuentran en direcciones fijas en el código HEX. Se supone que en la etapa de compilación, más precisamente después de eso, se ejecutará automáticamente un programa que toma los valores de las variables de la hora del sistema y las inserta en el archivo HEX en las direcciones deseadas. Además, todavía es necesario contar las sumas de verificación. Quizás haya una manera más simple. En el ejemplo en el video, estas variables son iguales a cero, ya que aún no he implementado esta función.

Después de la inicialización de la SD, el procesador de video se inicializa y se muestra inmediatamente un saludo en el fondo de la imagen de video. Al ajustar el zoom y el enfoque, sus coordenadas se muestran en la parte inferior derecha. En el video, demuestro el uso de la función de guardar y recuperar plantillas (preajustes) de zoom y enfoque en varias partes de la imagen. Al borrar un preset, las variables correspondientes adquieren el valor 0xFFFF, que corresponde a un valor de -1. Esta función, en principio, es superflua, se puede excluir.

En la última sección del menú, que se utiliza para la depuración, demuestro el registro del byte 3. de categoría 9. Las funciones correspondientes a este byte se encuentran en la sección anterior del menú, escribí sobre ellas muchas veces. Debido al hecho de que el estado actual del byte no se lee del procesador de video, lo configuré manualmente en "48" como uno de los aceptables. Después de eso, cambio los bits individuales de este byte, mostrando así las funciones "Mirror" y "Inverse Burst".

Al ajustar el nivel de "Ráfaga" en la penúltima sección del menú, notará un pequeño error de firmware que es fácil de solucionar. De las otras deficiencias, a veces, al actualizar el tiempo, se producen brechas en los caracteres. Creo que esto se debe a la instalación "torcida" de la electrónica dentro de la videocámara.

En general, al operar la cámara, se encontraron inconvenientes menores asociados con la navegación del menú. Por lo tanto, es muy posible que la revisión necesaria se realice con el tiempo.

Sí, casi lo olvido. Como prometí, traigo dos fotografías de en qué se convirtió el relleno de la videocámara después del desarrollo.


Higo. 15. Una vista actualizada de la videocámara en la parte inferior.


Higo. 16. Una vista actualizada de la videocámara dentro de la parte superior.


All Articles