Desenvolvimento de firmware para uma câmera de vídeo analógica EVR-Y2022F

Em um artigo anterior, o dispositivo de uma câmera de vídeo analógica foi examinado detalhadamente para criar seu próprio firmware. Como já mencionado, a câmera possui um microcontrolador de origem desconhecida. É muito mais rico que os AVRs usuais: possui duas tensões de alimentação de 3,3V e 1,8V e também possui uma função DSP. Cheguei a essa conclusão quando pensei na implementação do algoritmo de foco automático. No entanto, eu não preferia MKs complexos como o STM32 e outros, apenas porque nunca trabalhei com eles. Definitivamente, decidi usar um dos AVR MKs para implementar meu firmware. Portanto, já nesse estágio, comecei a perceber que a implementação da função de foco automático não seria muito fácil de manusear, ou melhor, impossível.

Minha escolha caiu no ATmega128 MK, já que foi ele quem caiu no meu braço. Obviamente, o ATmega8 MK não será suficiente em termos de número de conclusões, especialmente porque, apenas no caso, decidi reservar uma porta MK inteira para o fluxo de vídeo digital do processador de vídeo. Primeiro de tudo, eu descobri quais funções estarão no meu próprio firmware, em particular as que não estavam no firmware original e quais terão que ser negligenciadas.

Vamos considerar uma variante do algoritmo de foco automático para analisar um fluxo de vídeo digital. Consegui descobrir que os dados do fluxo de vídeo são uma alternância de bytes sincronizados com os pulsos “CK”. Os bytes do fluxo de vídeo codificam os níveis dos componentes Y, Cr, Cb do sinal de vídeo com gradação de 8 bits (256 níveis). Ou seja, a saída de vídeo digital do processador de vídeo desta câmera é multiplexada por componente. Informações sobre brilho (Y) estão contidas em cada segundo byte do fluxo de vídeo, e informações sobre cores são duas vezes menos frequentes. Ou seja, informações sobre o sinal de diferença de cor do Cr vermelho estão contidas em cada quarto byte, bem como informações sobre o sinal de diferença de cor do azul. Assim, o fluxo representa a seguinte sequência: Cb0, Y0, Cr0, Y1, Cb2, Y2, Cr2, Y3, Cb4, Y4, Cr4, Y5, .... Ou seja,enquanto as informações sobre o brilho de cada pixel são fornecidas sem lacunas, as informações sobre a cor dos pixels são exibidas em componentes em sequência. Esse afinamento é devido às propriedades de insensibilidade à cor de pequenos detalhes e uma redução na faixa de cores no sinal de vídeo. Essas propriedades são usadas na digitalização analógica de televisão e vídeo. A "compressão" acima (subamostragem de cores) possui uma proporção de componente de 4: 2: 2.

Para que o algoritmo de foco automático funcione, basta analisar apenas o componente de brilho, o que também é fácil de obter interceptando o fluxo de vídeo “byte a byte”. Se a frequência CK for de cerca de 18 MHz, CK / 2 é de 9 MHz, o que parece ser bastante viável para o ATmega128 MK. Os pulsos de sincronização horizontal e vertical permitem ao controlador “contar” e analisar qualquer área da imagem. Talvez, para o algoritmo de foco automático, seja suficiente analisar apenas o centro da varredura. Obviamente, quanto melhor o foco, mais nítida a imagem e, portanto, maior a faixa de frequência do sinal de vídeo (mais componentes de RF). Ou seja, é possível (até necessário) aplicar o algoritmo Fast Fourier Transform (FFT) a fragmentos de um fluxo de vídeo digital e analisar os componentes de RF. Nesse caso, você precisa torcer o foco do foco toda vez,usando o método de “meia divisão” como um método de otimização matemática. Assim, você pode alcançar o melhor resultado.

Eu não me incomodei com a função de foco automático, considerando que era impossível no MK com uma arquitetura simples, embora, em qualquer caso, reservei uma porta para vídeo digital. Em vez de focar automaticamente, decidi implementar várias outras funções que não estavam disponíveis no firmware original. Mas, para isso, a câmera de vídeo precisará se limitar a condições estacionárias, o que é típico para a vigilância por vídeo. Supõe-se que a câmera possa girar posteriormente no plano horizontal e vertical usando mecanismos especiais, automática e manualmente. Quando a câmera é direcionada automaticamente para um objeto específico, cujas coordenadas esféricas serão pré-armazenadas na memória do dispositivo de controle, as “coordenadas” do zoom e foco também serão alteradas, que também serão pré-selecionadas e armazenadas na memória.Além disso, o gerenciamento pode ser organizado de acordo com o protocolo PELCO-D. Na especificação deste protocolo, há uma equipe especial para esse negócio. As coordenadas do zoom e foco, é claro, serão "emparelhadas" para uma distância específica. Ou seja, um objeto que estará localizado a uma determinada distância estará em foco.

Antes de começar a escrever um programa de firmware, você precisa pensar sobre quais periféricos do MK e quais conclusões estarão envolvidas. Então você precisa pensar em como colocar e consertar a placa com seu próprio MK dentro da câmera. E para que fosse o mais conveniente e sustentável possível. Decidi usar uma placa com o MK, cujas conclusões serão completamente encaminhadas para o lado esquerdo e direito. A placa estará localizada na parte inferior da câmera, onde há pouco espaço, e será mantida em uma conexão destacável. Ao mesmo tempo, haverá "pinos" do conector na própria placa e haverá soquetes correspondentes nas laterais da câmera. Para os soquetes de resposta, decidi fazer mais duas placas adaptadoras, do tamanho da lateral da câmera. As lamelas desses cartões vão para o lado superior da câmera, diretamente para a placa principal. Supõe-se que cada lamela seja conectada ao ponto desejado na placa principal da câmera.

Durante o desenvolvimento da placa com a MK, tive a ideia de suplementar a câmera de vídeo com um relógio (RTC), e destaquei a linha I2C, colocada na placa RTC DS1307 (eu já sei o que diabos) com quartzo e uma bateria e, no caso, EEPROM 24AA512, que eram à mão. Também na placa na borda superior estão os conectores para conectar os programadores SPI e JTAG. Na placa-mãe original, o MK tem clock de quartzo de 12 MHz. É o mesmo para mim. Em geral, é melhor colocar quartzo em 11.0592 MHz para uma operação UART clara. As distâncias entre os "pentes" das juntas destacáveis ​​foram cuidadosamente calculadas com antecedência. Decidi alimentar o MK do “Krenka” de cinco volts, que será parafusado no quadro sob a placa principal (também servirá como dissipador de calor). A energia será retirada da tensão de entrada 12V imediatamente após o fusível FB801, conforme mostrado na figura.


FIG. 1. Gerenciamento de energia do microcontrolador.

Enquanto desenhava pranchetas no "SprintLayout", me perguntava o objetivo de cada pino do MK, que é enviado "para fora" do conector. O resultado é essa imagem.


FIG. 2. Esboços de placas de circuito impresso adicionais.

Para dizer a verdade, desenhei as placas laterais (ao longo das bordas) na fase de redação deste artigo. Mas, na verdade, eu os fiz com um cortador. Acabou não sendo a opção mais bem-sucedida. E o próprio quadro com MK foi feito de maneira torta. De alguma forma, aparafusei as placas auxiliares laterais nas laterais do quadro da câmera, soldando porcas de fluxo na superfície de cobre da PCB. O fato é que há muito pouco espaço nas laterais e a tampa da câmera está praticamente "apertada" de costas.

As figuras abaixo mostram a distribuição das conclusões do MK, bem como sua finalidade.


FIG. 3. O objetivo das conclusões do microcontrolador.

Há muitos pontos para comentar.

Para o programador SPI (STK200 +), a saída "PEN" era desnecessária. A ativação ocorre por "RESET", como de costume. Mas, em vez de “MISO” e “MOSI”, o MK possui uma interface separada (PDI / PDO), e a linha “CLK” é combinada.

Como tensão de referência para o ADC, escolhi os mesmos 5V, dos quais o próprio MK é alimentado. Tentei obter separadamente 3,3V (como no circuito original), mas ao mesmo tempo havia armadilhas. E, para mudar para a tensão de referência de 5V, é necessário mudar um pouco o circuito, conforme mostrado na figura.


FIG. 4. Tradução dos botões na tensão de referência de 5V.

Ou seja, é necessário dessoldar um lado do resistor R505 do lado da fonte de 3,3V e aplicar 5V a partir da linha de energia MK.

Das conclusões do MK, que são usadas apenas dentro da placa projetada, apenas três estão envolvidas. Um sinal de pulso de 1 Hz com RTC chega ao PB7 para atualizar a hora. Os pinos PD0 e PD1 são alocados ao barramento I2C. Ele será implementado programaticamente usando a biblioteca CVAVR “i2c.h”, apesar de uma interface de hardware i2c (TWI) estar conectada a essas saídas.

O pino MC “RESET” é emitido, mas a redefinição do MK ocorrerá por conta própria sem uma cadeia de redefinição externa.

Entendeu-se que os pulsos de clock HD e VD chegariam ao MK através de portas de interrupção externas para a precisão da leitura do campo de vídeo. No entanto, excluindo a função de foco automático, eles não são mais necessários. Os sinais dos interruptores de limite de zoom e foco chegam às portas vizinhas de interrupções externas.

A porta "A" MK é reservada para o fluxo de vídeo digital. A porta "C" é totalmente reservada para SD.

O pino PD4 é usado para alternar TX / RX RS-485. Não houve comutação no circuito original: a 2ª e a 3ª pernas do chip MAX485 estavam no chão. O MK original só conseguiu receber dados para controlar a câmera via PELCO-D. Eu decidi fazer uma pequena atualização. A ideia era essa. Se a câmera de vídeo ficar alta e em uma caixa fechada, será simplesmente impossível atualizar rapidamente o firmware. E essa necessidade certamente surgirá: eliminar vários erros e melhorar a funcionalidade se tornará uma prática regular pela primeira vez. Portanto, tive a ideia de implementar um gerenciador de inicialização para o MK e já usá-lo atualizar remotamente o firmware via RS-485. E, neste caso, uma troca de mão dupla é muito desejável. Sobre o carregador de inicialização será uma parte separada deste artigo. E para conectar o MAX485 (2 e 3 pernas) a este pino MK,você precisa fazer uma pequena alteração no primeiro e no segundo quadro. Essas placas são conectadas por um cabo de loop, nos conectores dos quais existe um contato “IRL” não utilizado para controle da luz de fundo. Na segunda placa (principal), você precisa dessoldar o resistor e a solda R520, em vez disso, um fio que passa pela placa adaptadora ao ATmega128 MK na saída correspondente. E, na primeira placa, é necessário dessoldar e dobrar 2 e 3 pernas do U202, soldá-las e puxá-las da fiação para a saída livre de 1 conector J302. Essas operações para alterar o circuito são mostradas na figura.que passará pela placa adaptadora para o ATmega128 MK na saída correspondente. E, na primeira placa, é necessário dessoldar e dobrar 2 e 3 pernas do U202, soldá-las e puxá-las da fiação para a saída livre de 1 conector J302. Essas operações para alterar o circuito são mostradas na figura.que passará pela placa adaptadora para o ATmega128 MK na saída correspondente. E, na primeira placa, é necessário dessoldar e dobrar 2 e 3 pernas do U202, soldá-las e puxá-las da fiação para a saída livre de 1 conector J302. Essas operações para alterar o circuito são mostradas na figura.


FIG. 5. Organização da linha TRX para controle do TX / RX MAX485.

Existem duas interfaces UART a bordo do ATmega128. Nesse caso, você deve usar a segunda interface (pinos 27, 28), já que a primeira interface nos pinos (pinos 2, 3) é combinada com a interface do programador SPI.

No quadro, quase todas as conclusões do MK estão envolvidas. As conclusões do porto "G" não foram utilizadas. A propósito, foi possível implementar o relógio programaticamente com base no MK. Ele fornece um modo de suspensão com o uso de uma bateria para contar o tempo em que a energia principal está desligada. Existem até conclusões para conectar um quartzo de baixa frequência separado. No entanto, eu não me incomodei com isso, batendo no DS1307.

A figura abaixo mostra o objetivo de cada saída da placa com o MK. Além disso, está marcado condicionalmente o que e de que lado da placa principal os fios de cada pino serão soldados. Também é necessário fazer alguns comentários.


FIG. 6. Atribuição de conclusões de um pagamento adicional com a MK.

Os sinais dos interruptores de limite de zoom e foco chegam não apenas às portas de interrupção, mas também às entradas ADC. O fato é que, mesmo na fase do estudo da SD, eu notei esse recurso. Se o mecanismo de zoom ou foco estiver em "zero", o sinal de saída do trailer poderá assumir um estado "intermediário". Para capturar melhor esses casos raros, decidi usar o ADC. Obviamente, essa não é uma abordagem muito competente, mas, ao fazer isso, rapidamente saí do problema que às vezes surgia no estágio de inicialização do firmware de teste. Assim, aumentei a estabilidade do algoritmo.

Os sinais SDA / SCL do I2C são apenas conectados ao conector, apenas por precaução, e eles não são usados ​​fora desta placa.

Os nomes de cada pino para o controle do ID são assinados de acordo com a conexão real. A conexão de dados, olhando para o futuro, foi finalmente corrigida no estágio de depuração. Havia muita confusão, mas os erros eram apenas na alternância de fases precisas ao contrário, e não na ordenação. As alternativas “4-1-2-3” (para zoom) e “2-3-4-1” (para foco) são a mesma coisa, assim como “1-2-3-4”, que e foi tomada como base.

No final do artigo (para não desonrar), duas fotos são apresentadas. O primeiro é a vista inferior da câmera de vídeo com a placa de circuito adicional. O segundo é uma vista de cima da placa principal da câmera de vídeo com um MK padrão isolado (microprocessador, para ser mais preciso), um monte de jumpers de fios e outras ranhuras.

Eu escrevi o programa (firmware) junto com seus testes preliminares no programa ISIS 7 Professional (Proteus).


FIG. 7. Visão do projeto em Proteus.

Em vez dos chips exclusivos do gerador de caracteres e do processador de vídeo (que obviamente não estão no Proteus), instalei depuradores SPI. Com a ajuda deles, é conveniente controlar os bytes que o MK envia pelo SPI. Mas a reação real a esses bytes é controlada diretamente no hardware. Com o Proteus, você pode monitorar e depurar comandos PELCO-D provenientes de um DVR real. Para fazer isso, como opção, você precisa conectar o DVR à porta COM do computador através do adaptador unidirecional mais simples RS485-> RS232.

Então eu comecei a desenvolver e modelar. O Excel ajudou muito com isso.

Primeiro, você precisa decidir sobre os temporizadores e sua configuração. Um temporizador - para realizar a rotação do motor de passo e a implementação de operações repetidas dos botões enquanto os segura. Ao pressionar este botão ou aquele durante as configurações no menu, a operação do SD será excluída. E quando você mantém um dos botões de controle de zoom ou foco fora do menu, o SD gira com o parâmetro de tempo correspondente. Assim, não há conflitos. Planejei usar o segundo temporizador para implementar o PWM para o SD, mas com o tempo decidi abandoná-lo. De fato, no meu caso, quando não há foco automático, não há necessidade de PWM. Além disso, o mecanismo de transmissão possui uma estrutura helicoidal, portanto, em repouso, você não pode "segurar" o SD por corrente contínua, o mecanismo não se arrasta em lugar algum.

É necessário revisar o alfabeto de caracteres do gerador de caracteres, de acordo com a folha de dados, e compará-lo com o alfabeto padrão ASCII. O alfabeto do gerador de caracteres consiste em 128 caracteres, metade do tamanho do último. Por exemplo, os caracteres cirílicos no gerador de caracteres estão completamente ausentes, mas há caracteres especiais que são característicos de sua aplicação (sol, ampulheta, homenzinho, anotação, telefone etc.). Eu fiz uma matriz de "smb [256]" de 256 elementos, colocando-a no EEPROM MK. A notação smb [i] = adr significa que no endereço adr no gerador de caracteres existe um caractere com o código ASCII i. E se o símbolo i não estiver no alfabeto do gerador de caracteres, o valor do elemento da matriz se refere ao "espaço" com o endereço 0x7E. Ou seja, quase metade dos elementos da matriz tem o valor "0x7E". Essa matriz é apresentada em forma de tabela na figura abaixo.


. 8. ASCII PD6464A.

Em seguida, você precisa considerar como processar botões através do ADC. De acordo com a lei de Ohm, é fácil calcular os valores de tensão na entrada do ADC quando você clica em um botão. Depois disso, é fácil calcular os limites dos intervalos, cujo meio será o mesmo valor de tensão. No total, são obtidos seis intervalos: cinco deles correspondem a cada botão e um à ausência de pressionamento (nenhum botão é pressionado). No nível do hardware, o ADC MK analisa periodicamente o valor da tensão dos botões. O cronômetro para anti-rejeição pode ser implementado com base no cálculo dos ciclos de relógio ADC, o que eu fiz. No estágio de depuração, essa parte do programa teve suas armadilhas. Eu acho que não vale a pena escrever detalhes. Para conseguir o trabalho claro dessa funcionalidade, tive que mexer muito tempo. A função de reconhecimento de botão é colocada na seção de interrupção do ADC e, em sua saída, está o número do botão,bandeira de depressão e bandeira de lançamento. O processamento adicional dos botões ocorre no ciclo principal do programa. A frequência de polling do botão (frequência ADC) foi 12000/128 = 93,75 (kHz), onde 128 é o divisor máximo possível.

Em seguida, compilei uma matriz de valores de registro UART UBRR1 da configuração UART, dependendo de uma ou outra taxa de transmissão PELCO-D, que pode ser selecionada na lista nas configurações através do menu. Esses valores podem ser calculados usando a fórmula da folha de dados no MK e também podem ser obtidos usando o configurador automático do AVR Wizard.

Então eu comecei a modelar o menu. Este é o estágio principal e demorado de escrever um programa. Em princípio, eu não iria repetir o menu do firmware padrão, exceto por isso, decidi complicá-lo para uma estrutura hierárquica (seção na seção). Abaixo está uma descrição do modelo e as definições do menu que fiz para mim.

Não posso ler
.
.
.
.
«MENU».

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

:
— ;
— ;
— ;
— .

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

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

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

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

.
.

Assim, a navegação no menu é um pouco semelhante à navegação nos arquivos e pastas através do “Total Commander”. O código de implementação para este modelo de menu não é muito complicado, mas muito complicado. Existem duas variáveis ​​principais: o número da página ativa e o número da posição ativa na página. Para ambas as variáveis, duas funções de “caixa de mudança” funcionam uma na outra. Este par de funções está envolvido no processo de pressionar os botões "Esquerda", "Direita" e "Menu". Em cada local (para cada botão, página e item atual), certas ações são registradas. Cada página do menu possui uma função que implementa a exibição da página na tela com todas as inscrições e parâmetros. Antes de implementar as funções de saída da página, eu as modelei anteriormente no Excel, como se costuma dizer, "por células".Portanto, as coordenadas das células de cada símbolo no campo da tela são apresentadas com mais clareza e essas informações são necessárias na fase de programação. Na figura abaixo, como exemplo, dei a visualização da página 9, na qual o baudrate PELCO-D é selecionado na lista. O elemento da interface na página é um botão de opção. Além disso, o primeiro parágrafo <..> é sair desta seção.


FIG. 9. Modelando o OSD no Excel.

Também fiz uma matriz que reflete o número de pontos em cada página. É usado no processamento de pressionar os botões Para cima e Para baixo. Isso é feito para reduzir o código e evitar o uso da função de caixa de mudança.

Prensas virtuais repetidas enquanto mantém pressionados os botões são implementadas no corpo da interrupção do timer pela função "case-switch", que funciona em uma variável inteira, que é um sinalizador. O valor do sinalizador é exclusivo para cada ação de um botão em uma página específica e em um item de menu específico. Ele é atribuído ao sinalizador como um número de série apenas nos locais em que são necessários cliques virtuais. Ao mesmo tempo, dentro da função “caixa de mudança” (no corpo da interrupção do temporizador) são colocadas cópias de funções que implementam as ações dos botões. Para economizar memória, foi possível colocar "atalhos" (links) em chamadas regulares para a função de processamento de botões. É ainda mais razoável, mas naquela época eu não tinha paciência para pensar em como fazê-lo melhor, porque queria terminar o projeto o mais rápido possível. E a memória no ATmega128 acabou sendo bastante.

Por fim, implementei “bibliotecas” para trabalhar com um processador de vídeo, gerador de caracteres e o RTC DS1307 com as funções necessárias. Depois disso, determinei os endereços do EEPROM MK para armazenar essas ou aquelas informações. Os primeiros 32 bytes são reservados para armazenar informações de configurações de menu. Os próximos 32 bytes são reservados para armazenar texto que pode ser exibido na tela ou alterado usando o comando padrão “Pelco-D Write Char. Para tela ". Os próximos 256 bytes da área EEPROM são reservados para o alfabeto (conversão de um caractere de ASCII em um endereço para um gerador de caracteres, conforme mencionado acima). Por fim, os próximos 128 bytes são reservados para armazenar "predefinições" (modelos) de zoom / foco. Eu introduzi esse recurso devido à falta de foco automático. Eu escrevi sobre isso no começo do artigo. Um total de 32 modelos. As coordenadas do zoom ou foco são codificadas em dois bytes.

Separadamente, vale a pena escrever sobre a implementação do gerenciamento de SD. A rotação do SD é obtida chamando as funções StepF () e StepZ () no bloco de interrupção do temporizador. A velocidade de rotação é determinada pela configuração deste temporizador. E a implementação das funções acima implementa a promoção de foco ou zoom (respectivamente) em uma etapa mínima. Durante a rotação da lente zoom e do foco, suas posições finais são controladas. A posição do foco máximo e a posição do zoom mínimo são representadas no programa por constantes (280 e -600, respectivamente). Mas a posição do foco mínimo e a posição do zoom máximo - na forma das variáveis ​​F_min e Z_max (mais precisamente, funções). Essa abordagem foi facilitada por uma área de trabalho não retangular com um canto inferior direito cortado. Para calcular os valores de F_min e Z_max, são usadas as funções definidas por partes F_min (Z) e Z_max (F). Além disso,quando o zoom SD gira na direção positiva em Z (coordenada de zoom)> 500, o foco SD gira simultaneamente na mesma direção se o último tiver coordenadas <(- 180). Ou seja, a posição máxima de zoom, em princípio, não é limitada pela posição atual de foco, mas é limitada a 600. Simplesmente acontece que dois SDs rodam simultaneamente quando a borda angular correspondente da região pentagonal é atingida e o movimento nesse estágio ocorre ao longo do “lado cortado” (se interpretado graficamente) ) Do ponto de vista da mecânica, isso é equivalente ao processo descrito no artigo anterior, quando, na ausência de SD e ao mover manualmente os nós de zoom e foco, o nó de zoom no final do caminho "puxa" o nó de foco. Devido ao fato de que a coordenada de zoom domina a coordenada de foco (é por isso que considero a dependência de F (Z),mas não vice-versa), não comecei a implementar um procedimento semelhante de rolagem de zoom na função Step_F ().

No firmware original, a velocidade de alterar o zoom e o foco tinha valores fixos. Isso nem sempre é conveniente. No meu firmware, forneci quatro valores das velocidades de zoom e foco (independentemente), que podem ser selecionados através do menu e usando o comando PELCO-D atribuído a esta função. Esses quatro valores são pré-selecionados no estágio de depuração com base na conveniência e, em seguida, são inseridos no firmware.

A função de inicialização do BD init_MR () é necessária para vincular a mecânica do zoom e focar no sistema de coordenadas. É realizada uma vez toda vez que você liga a câmera de vídeo. O algoritmo de seu trabalho é aproximadamente o seguinte. Antes de tudo, supõe-se que o zoom ou o foco esteja no ponto zero, e é feita uma tentativa de capturar o retorno do sinal dos interruptores de limite pelas funções externas de interrupção. Observarei imediatamente que, se o zoom ou o foco estiver "em zero" (nos limites da partição do trailer óptico), o sinal na saída do trailer terá um estado "intermediário" entre o lógico "0" e "1". Tais casos são muito improváveis, mas não podem ser descartados. No entanto, a função de interrupção não interpreta um sinal como ressalto. Foi por isso que eu vim para usar o ADC MK, acionando sinais dos interruptores de limite e zoom nos dois canais livres. Assim,o primeiro passo é a "digitalização" dos sinais dos interruptores de limite com precisão de 8 bits. Isso é feito usando uma única conversão de analógico para digital. Vale lembrar que a tensão de referência no nosso caso é de 5V, e o nível lógico “1” do interruptor de limite é de 3,3V. Para um "0" lógico, o valor ADC será zero e para um "1" - 3,3 / 5 * 255 = 168. Se o valor do sinal de um ou outro trailer cair na faixa, por exemplo, de 2 a 165 (um intervalo nebuloso é obtido), isso significa que o nó correspondente já está "em zero" e o procedimento de inicialização para esse nó pode ser interrompido. Caso contrário, pelo valor lógico do sinal do trailer ("0" ou "1"), você precisará determinar em qual parte (metade) o nó está localizado. A direção de rotação do SD dependerá disso. De uma forma ou de outra, o SD deve ser girado nessa direção,para que o nó correspondente se mova em direção ao "zero" (chave limitadora). Assim, a rotação do acionamento do motor é iniciada com o cálculo simultâneo do número de etapas até que a chave limite seja atingida. Assim que o interruptor de limite correspondente for alcançado, o que determina a função da interrupção externa de acordo com a diferença no nível lógico, haverá uma rotação reversa do acionamento do motor. Ele irá girar na direção oposta pelo mesmo número de etapas, retornando assim à sua posição original. O valor do número de etapas para cada BD com o sinal correspondente será copiado para as variáveis ​​correspondentes antes de sair da função de inicialização. O procedimento descrito acima ocorre independentemente para foco e zoom na mesma função (não por sua vez).A velocidade de rotação do acionamento do motor no estágio de inicialização é determinada por uma constante separada e corresponde à velocidade máxima para uma rotação correta e confiável do SM.

Considere o exemplo em que, antes de ligar a câmera, o zoom estava na região negativa e o foco estava na região positiva. A figura mostra esquematicamente a trajetória do ponto (Z; F) durante o procedimento de inicialização do motor de passo.


FIG. 10. O processo de inicialização do zoom e foco.

O ponto A é a posição inicial do zoom e do foco. O movimento dos dois nós ocorre na direção de "zero" com a mesma velocidade (velocidade de inicialização). No ponto B, o foco chega a zero, pois estava mais perto de zero que o zoom. Então o foco é invertido. No ponto C, o foco conclui o processo de inicialização, retornando à sua posição original. Ao mesmo tempo, o zoom ainda está se movendo em direção ao seu "zero". No ponto D, atinge seu "zero" e retorna à sua posição original (ponto A).

Além da função de inicialização init_MR (), há uma função goto_zf (z, f). Com base no nome, pretende-se alternar de uma predefinição para outra, sobre a qual escrevi no início do artigo. A velocidade de rotação do motor de passo durante a transição é a mesma que durante a inicialização. O processo de transição em zoom e foco é realizado simultaneamente. Ou seja, se for necessário ir do ponto (z1; f1) para o ponto (z2; f2), a rotação simultânea de dois SDs será iniciada. Se, por exemplo, | f2-f1 | <| z2-z1 |, o foco SD será interrompido mais cedo. Isso é demonstrado na figura abaixo.


FIG. 11. O processo de alterar o zoom e o foco ao escolher uma predefinição.

Durante todo o tempo de operação do motor de passo durante a passagem do limitador de marca zero, a coordenada correspondente é zerada. E isso apesar do fato de que teoricamente isso não pode ser feito. No entanto, na prática, ainda existe um erro de 1-2 etapas do SD.

Vale acrescentar que, ao contrário do firmware original, no meu caso, ao controlar o zoom e o foco (tanto pelos botões quanto pelo PELCO-D), ofereci a possibilidade de movimento passo a passo. Isso funciona da seguinte maneira. Quando você clica em qualquer um dos 4 botões para controlar o zoom ou o foco, o SD correspondente é girado uma etapa, minimizando o movimento do nó de zoom ou foco. Se você não soltar o botão, a rotação normal do motor de passo começará após um curto período de tempo. Esse atraso é selecionado empiricamente com antecedência. Esse recurso é semelhante ao pressionamentos virtuais repetidos enquanto mantém pressionado o botão. Graças a esse recurso, o problema de "colar" o botão ao controlar o zoom ou o foco no dispositivo remoto PELCO-D por uma conexão ruim à Internet é eliminado. Mais precisamente, a oportunidade surge como rude,e ajustar o zoom ou o foco.

O intérprete dos comandos PELCO-D é feito pela mesma analogia do dispositivo para alternar cargas via PTZ. Dediquei anteriormente um pequeno artigo separado sobre Habré a esse dispositivo simples. Diferente do firmware original, os comandos de controle de zoom e foco se referem totalmente ao pressionar os botões correspondentes. Ou seja, é possível “subir” no menu usando os botões de zoom e foco PELCO-D. E para acessar remotamente o menu pelo PELCO-D, ou melhor, pressionar o botão “MENU”, comparei o botão de abertura com ele, porque essa função não é usada neste modelo de câmera. Portanto, existem cinco comandos PELCO-D básicos para pressionar, bem como cinco comandos básicos para liberar botões. Além disso, como já escrevi casualmente ao longo do artigo, comandos adicionais são processados: "Definir predefinição", "Limpar predefinição","Ir para predefinição", "Escrever caracteres. To Screen ”,“ Clear Screen ”,“ Set Speed ​​Speed ​​”,“ Set Speed ​​Speed ​​”.

A data e a hora com o RTC são exibidas no canto inferior esquerdo da imagem por analogia com as câmeras VHS antigas, se esta opção estiver ativada no menu. Além disso, no menu você pode selecionar o formato de saída, que também forneci com antecedência. Também na tela ao lado da data e hora é possível exibir o dia da semana. Além do relógio, as coordenadas atuais de zoom e foco são exibidas na tela como informações adicionais. Esta opção é necessária principalmente no estágio de depuração.

Vou falar sobre as funções do menu que eu implementei. Com o tempo, se necessário, o menu será revisado: algumas funções podem ser removidas e outras adicionadas. A estrutura do menu que desenhei no SPlan, com visualizações de página, é mostrada na figura abaixo. Setas vermelhas - entre na seção. Setas azuis - saia da seção. Não desenhei setas azuis em cada página do menu, desenhei apenas duas por exemplo.


FIG. 12. A estrutura do menu na tela.

Algumas seções do meu menu são um pouco como as seções do original. Primeiro de tudo, estas são as duas primeiras seções: balanço de branco e exposição. Na terceira seção, você pode especificar o endereço da câmera PELCO-D e selecionar a taxa de dados (taxa de transmissão) na lista. A quarta seção é dedicada à data e hora. Você pode definir a data, hora, dia da semana, escolher um dos quatro formatos de exibição e escolher um método de exibição. A quinta seção - trabalhando com predefinições (modelos) de zoom e foco, onde você pode chamá-lo por número, além de apagar ou substituir. Também nesta seção do menu, você pode escolher uma das quatro velocidades para alterar o foco ou o zoom. A quinta seção permite editar os parâmetros do processador de vídeo localizado no byte 9 da categoria 3. Esse é o nível e a inversão do componente burst do sinal de vídeo e o espelhamento de vídeo. A última seção do menu é para depuração.Com ele, você pode gravar no processador de vídeo qualquer valor de qualquer byte em qualquer categoria. O valor pode ser definido na forma decimal e binária.

Agora vou dizer algumas palavras sobre o gerenciador de inicialização. Como já escrevi, o gerenciador de inicialização é necessário para fazer o flash remoto da câmera de vídeo via RS-485. Inicialmente, pensei em implementar totalmente o gerenciador de inicialização. No entanto, para economizar tempo, decidi fazer um dos downloaders já implementados que podem ser encontrados na Internet. Além disso, nunca os usei, tendo uma idéia deles apenas no nível teórico. Um dos critérios importantes para escolher um gerenciador de inicialização é o suporte ao RS-485. Normalmente, os downloaders AVR operam no UART RS-232. E o carregador de inicialização com suporte ao RS-485 difere apenas no fato de uma saída adicional ser alocada no lado do MK para alternar o transceptor RS-485 (por exemplo, MAX485) durante a transferência de dados do MK para o PC. Ao piscar o MK, o carregador de inicialização transmite informações sobre a gravação com ou sem êxito para o computador. Primeiro carregador de inicializaçãoque eu achei que permite gravar não apenas a memória FLASH do MK com firmware, mas também EEPROM. Além de escrever, você também pode ler dados. Mas esse projeto com código fonte do assembler foi bastante confuso e eu não o entendi. Além disso, a ênfase principal deste gerenciador de inicialização visava a capacidade de piscar vários dispositivos individualmente, sem desconectá-los da rede RS-485, acessando cada dispositivo em um endereço previamente costurado nele. Não preciso desses recursos funcionais, pois uso uma topologia diferente da rede RS-485 e é possível alternar rapidamente a câmera de vídeo do DVR para o PC. O segundo gerenciador de inicialização é o Chip45 alemão. O código fonte não é de domínio público, pode ser comprado do autor. Em vez disso, existem centenas de arquivos HEX para diferentes AVR MKs, diferentes interfaces UART (se houver vários, como no meu caso),RS-485 ou RS-232 para escolher. Em suma, para todas as ocasiões. Ao mesmo tempo, o autor observa que, no caso do RS-485, a saída de comutação TX / RX é fixa e corresponde ao pino XCK UART da interface do controlador, que praticamente não é usado no UART. No meu caso, o trigésimo pino do XCK da segunda interface UART do Atmega128 MK é PORTD.5 ​​e é usado para ativar os interruptores de limite de zoom e foco. Em princípio, essa função não é necessária, porque, como os estudos mostraram, as chaves de limite estão sempre ativas, como já escrevi. E, se necessário, você pode transferir esta função para qualquer outro MK de saída livre. Mas, de qualquer forma, esse carregador de inicialização também não me impressionou, principalmente porque me deparei com um carregador de inicialização mais interessante chamado “AVR Universal Bootloader” de design chinês. Como o Chip45, ele só pode escrever e apenas na memória FLASH do MK.Mas ele tem um grande número de possibilidades e, portanto, decidi firmemente continuar nela. Ele vem como um projeto do AVR Studio com código-fonte C. Devido ao fato de trabalhar no CodeVisionAVR, tive que instalar o AVR Studio junto com o WinAVR. Para obter o arquivo HEX do firmware do gerenciador de inicialização, você precisa compilar o projeto fazendo alterações preliminares no código-fonte na configuração do seu próprio dispositivo e precisa do seu. A compilação do projeto consiste no lançamento de um arquivo bat (arquivo em lote), no qual os comandos de compilação são gravados. Portanto, não é necessário que um projeto no AVR Studio seja aberto. Alterações no código fonte podem ser feitas manualmente (no nível do programador) ou usando o configurador. A função deste último é uma janela adicional do utilitário que funciona com o carregador de inicialização, que também está anexado.No configurador, você pode especificar o pino MK para a comutação TX / RX RS-485, o pino MK para o LED de controle piscando, o pino MK para entrar no gerenciador de inicialização, a maneira como o gerenciador de inicialização é inserido, o nome e a frequência do MK, etc., não podem ser listados. Além disso, o conhecido programa padrão "HyperTerminal" pode funcionar como um utilitário para carregar um programa de usuário no MK, ou seja, trabalhar com o gerenciador de inicialização, e usa o protocolo "Xmodem" para baixar o firmware. E, para trabalhar de forma conveniente e visual com o gerenciador de inicialização através do terminal de texto, a função especial "Modo verboso" é fornecida no configurador. Mas, apesar da atratividade do hiperterminal, decidi usar o utilitário que acompanha o carregador de inicialização. O fato é que, com a conveniente função Verbose ativada no configurador, trabalhando através do terminal, me deparei com a seguinte situação.Às vezes, acontecia quando o tráfego de dados na linha "colidia" (ambos os dispositivos no modo TX), como resultado do MAX485 na câmera de vídeo ficar muito quente e falhar, ou melhor, não completamente, mas apenas a seção RX (transmissão de dados via RS-485 para a câmera) . Por causa disso, abandonei o HyperTerminal. E há mais um inconveniente. O HyperTerminal não funciona com arquivos de texto HEX e aceita apenas um arquivo binário. Portanto, eu teria que aplicar uma conversão adicional de hex para bin. Depois que o arquivo HEX do gerenciador de inicialização foi gerado por mim, eu o costurei no MK usando o programa PonyProg e o programador SPI usual. Como resultado, o carregador de inicialização funciona da seguinte maneira. Quando você liga a câmera de vídeo, o carregador de inicialização é imediatamente ativado. Ele espera por uma conexão do utilitário por um segundo e o firmware principal começa a funcionar. Se a conexão for estabelecida com sucesso,então o processo de piscar começa. Ao mesmo tempo, a outra extremidade da linha RS-485 deve ser desconectada do DVR com antecedência e conectada ao PC através do adaptador USB RS485 <-> RS232 ou RS485 <-> USB. A propósito, sobre os adaptadores. Surgiu a questão de como fazer esse adaptador você mesmo, porque os adaptadores comprados são caros. Procurando na Internet, encontrei um circuito adaptador RS485 <-> RS232 simples. É mostrado na figura abaixo. Consiste principalmente nos microcircuitos MAX232 e MAX485 conhecidos, e o TX / RX é comutado pelo sinal da 3ª saída da porta COM do computador através de uma cadeia com um diodo zener. Ou seja, o MAX485 é alternado pelo tráfego de dados que o PC transmite. Tudo é simples e engenhoso.RS232 ou RS485 <-> USB. A propósito, sobre os adaptadores. Surgiu a questão de como fazer esse adaptador você mesmo, porque os adaptadores comprados são caros. Procurando na Internet, encontrei um circuito adaptador RS485 <-> RS232 simples. É mostrado na figura abaixo. Consiste principalmente nos microcircuitos MAX232 e MAX485 conhecidos, e o TX / RX é comutado pelo sinal da 3ª saída da porta COM do computador através de uma cadeia com um diodo zener. Ou seja, o MAX485 é alternado pelo tráfego de dados que o PC transmite. Tudo é simples e engenhoso.RS232 ou RS485 <-> USB. A propósito, sobre os adaptadores. Surgiu a questão de como fazer esse adaptador você mesmo, porque os adaptadores comprados são caros. Procurando na Internet, encontrei um circuito adaptador RS485 <-> RS232 simples. É mostrado na figura abaixo. Consiste principalmente nos microcircuitos MAX232 e MAX485 conhecidos, e o TX / RX é comutado pelo sinal da 3ª saída da porta COM do computador através de uma cadeia com um diodo zener. Ou seja, o MAX485 é alternado pelo tráfego de dados que o PC transmite. Tudo é simples e engenhoso.Consiste principalmente nos microcircuitos MAX232 e MAX485 conhecidos, e o TX / RX é comutado pelo sinal da 3ª saída da porta COM do computador através de uma cadeia com um diodo zener. Ou seja, o MAX485 é alternado pelo tráfego de dados que o PC transmite. Tudo é simples e engenhoso.Consiste principalmente nos microcircuitos MAX232 e MAX485 conhecidos, e o TX / RX é comutado pelo sinal da 3ª saída da porta COM do computador através de uma cadeia com um diodo zener. Ou seja, o MAX485 é alternado pelo tráfego de dados que o PC transmite. Tudo é simples e engenhoso.


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

Depois de dominar o gerenciador de inicialização, no meu tempo livre, decidi pesquisar a ótica da câmera de vídeo. Mais precisamente, tornou-se interessante para mim quais combinações de valores de zoom e foco produzirão imagens focadas a diferentes distâncias da lente ao objeto. Deixe-me lembrá-lo de que a região de vários valores mútuos de zoom e foco é descrita por uma região pentagonal (quase retangular). Por exemplo, calcule a distância da lente ao objeto em 10 cm. O argumento (ao longo do eixo da abcissa) do zoom tem uma faixa de valores de -600 a 600. É necessário selecionar o valor do foco em cada valor de zoom no qual o assunto na frente da lente na imagem de vídeo estará em foco. Então você precisa fazer uma mesa. Obviamente, não faz sentido classificar todos os 1200 valores de zoom; basta levar algumas dezenas de valores com um certo passo igual. Como tal, escolhi o valor 50.Em cada valor de zoom com esta etapa (-600, -550, -500, ...) selecionei o valor do foco e registrei os resultados da medição. Eu fiz um procedimento semelhante com outras distâncias da lente ao objeto: 50 cm, 1 m, 10 m, 100 M. O resultado foi uma família de curvas que eu exibi no Excel.


. 14. Z-F .

Olhando para os gráficos, quero fazer muitos comentários. No zoom mínimo, os valores de foco são ligeiramente menores que o "meio" (zero) para quase qualquer distância. A curva rosa por uma distância de 10 cm termina com um valor de zoom de cerca de 250, o que corresponde ao valor mínimo de foco. Essa curva tem um caráter decrescente e é convexa para cima. A curva vermelha por uma distância de 1 m tem uma forma completamente diferente. Em primeiro lugar, não é monótono e, em segundo lugar, no que diz respeito à propriedade de convexidade, existe um ponto de inflexão. As curvas para distâncias de 10 me 100 m são de natureza semelhante, as quais, aliás, praticamente coincidem, que eu já conhecia antecipadamente. Portanto, as distâncias medidas de 10 e 100 metros, é claro, tomei aproximadamente. O que oscila a curva azul por meio metro de distância - inicialmente eu não faria medições nela.Selecionei essa distância aproximadamente com base no princípio de que o mais próximo possível com um fragmento da curva correspondente se aproxima do limite do canto da região (corte). E assim aconteceu: essa borda praticamente toca um fragmento da curva. Em geral, vale ressaltar que a metade superior da região (valores de foco positivo) praticamente não é utilizada. A exceção está a uma grande distância do objeto até a lente e com o maior zoom. E, no entanto, para quase todas as distâncias (exceto a mais próxima, a menos de meio metro), com zoom baixo (150 ou menos), os valores de foco são quase os mesmos. De um modo geral, todos os fatos de medição declarados devem ter uma interpretação teórica, com base nas leis da óptica. Mas, atualmente, não tenho idéia dos dispositivos de lentes desse tipo. Máximo,o que encontrei no campo da óptica é a construção de um simples telescópio refrator de duas lentes. E no caso desta câmera de vídeo - eu não entendi a mecânica da óptica. Na saída, apenas dois nós móveis não estão disponíveis: o nó de foco (responsável pelo foco) e o nó de zoom. E não sei quantas lentes totais existem. Suponho que dois que estão conectados com esses nós em movimento. Também é importante notar que, ao ajustar o foco, o zoom também muda visualmente levemente, mesmo se o nó correspondente estiver fixo.conectado a esses nós em movimento. Também é importante notar que, ao ajustar o foco, o zoom também muda visualmente levemente, mesmo se o nó correspondente estiver fixo.conectado a esses nós em movimento. Também é importante notar que, ao ajustar o foco, o zoom também muda visualmente levemente, mesmo se o nó correspondente estiver fixo.

No final do artigo, passamos aos testes práticos da câmera de vídeo. Decidi não tirar muitas fotos, mas imediatamente enviei o vídeo inteiro. Gravei a captura de vídeo através do dispositivo, o som foi gravado separadamente no gravador de áudio. A resolução original é 720 por 576. Após o upload do vídeo para o YouTube, sua qualidade mudou visivelmente.


Quando você liga a câmera, a primeira coisa que acontece é a inicialização dos motores de passo de zoom e o foco no fundo da imagem de vídeo. Essa imagem é em preto e branco e sem AGC, pois o procedimento de inicialização do processador de vídeo ainda não passou. No canto inferior esquerdo, a data e a hora atuais exibirão a data e a hora da compilação do firmware atual da câmera. No código-fonte do firmware, criei as variáveis ​​correspondentes que estão localizadas em endereços fixos no código HEX. Supõe-se que no estágio de compilação, mais precisamente após, um programa seja executado automaticamente, que pegue os valores das variáveis ​​desde o horário do sistema e os insira no arquivo HEX nos endereços desejados. Além disso, ainda é necessário recontar as somas de verificação. Talvez exista uma maneira mais simples. No exemplo do vídeo, essas variáveis ​​são iguais a zero, pois ainda não implementei essa função.

Após a inicialização do SD, o processador de vídeo é inicializado e uma saudação é exibida imediatamente no fundo da imagem de vídeo. Ao ajustar o zoom e o foco, suas coordenadas são exibidas no canto inferior direito. No vídeo, demonstro o uso da função de salvar e recuperar modelos (predefinições) de zoom e foco em várias partes da imagem. Ao limpar uma predefinição, as variáveis ​​correspondentes adquirem o valor 0xFFFF, que corresponde a um valor de -1. Esta função, em princípio, é supérflua, pode ser excluída.

Na última seção do menu, usada para depuração, mostro o registro da categoria 9 byte 3. As funções correspondentes a esse byte estão na seção anterior do menu, escrevi sobre elas várias vezes. Devido ao fato de o estado atual do byte não ser lido no processador de vídeo, eu o defino manualmente como "48" como um dos aceitáveis. Depois disso, altero os bits individuais desse byte, mostrando assim as funções "Mirror" e "Inverse Burst".

Ao ajustar o nível “Burst” na penúltima seção do menu, você notará um pequeno bug de firmware que é fácil de corrigir. Das outras deficiências - às vezes, ao atualizar a hora, ocorrem lacunas nos caracteres. Eu acho que isso se deve à instalação “distorcida” de eletrônicos dentro da câmera de vídeo.

Em geral, ao operar a câmera, foram encontrados pequenos inconvenientes associados à navegação no menu. Portanto, é bem possível que a revisão necessária seja feita ao longo do tempo.

Sim, quase esqueci. Como prometido, trago duas fotografias do que o preenchimento da câmera de vídeo transformou após o desenvolvimento.


FIG. 15. Uma visão atualizada da câmera de vídeo na parte inferior.


FIG. 16. Uma visão atualizada da câmera de vídeo dentro da parte superior.


All Articles