Scanner a laser de engenharia reversa Leuze RS4
Anteriormente, eu falei sobre engenharia reversa de um sensor de distância a laser . Desta vez, falaremos sobre um dispositivo mais complexo - um scanner a laser Leuze RS4. Como o sensor, esse scanner chegou a mim em um estado quebrado, então tive que começar a restaurar o trabalho e, nesse processo, melhorar algumas de suas características e, de fato, refazê-lo em outro dispositivo.O que é esse scanner a laser?
O Leuze RS4 é um scanner de segurança a laser, ou seja, foi projetado para impedir que pessoas entrem em áreas perigosas no local de trabalho, para evitar colisões de veículos de produção, etc. Possui características bastante decentes - alcance máximo: 15 / 50m (dependendo do modo de operação) ), a precisão de medir a distância em toda a faixa de medição é de 5 mm, a resolução angular é de 0,36 graus, a velocidade de digitalização é de 25 rpm (25000 medições / s).Vale ressaltar que este scanner está posicionado precisamente como um dispositivo de segurança - ou seja, armazena a localização das zonas de alarme e aviso na memória e, quando um objeto entra nessas zonas, uma das teclas é aberta no scanner. Para configurar a localização das zonas, o scanner pode ser conectado a um computador e observar a localização de obstáculos na tela. Existe até um pacote ROS que permite receber dados deste scanner.Peguei um scanner sem estojo, desmontado em seus componentes. O scanner travou devido a um forte golpe no corpo; no que exatamente ele parou de funcionar, eu ainda não entendi - talvez a óptica estivesse desalinhada, o contato em um dos conectores se apagou ou o sensor do codificador se movesse, ou algo mais. Tentei montar todas as peças, o scanner foi visto no software nativo, mas a digitalização não foi iniciada. Portanto, só tenho uma maneira de iniciá-lo - restaurar o circuito do scanner o máximo possível e escrever meu próprio firmware do microcontrolador do scanner.Aqui está a aparência das peças: Aqui elas devem estar localizadas no estojo (foto da documentação, pode-se ver que o design e a eletrônica são um pouco diferentes):
Também uma parte importante do scanner é o espelho de digitalização (destacado em azul na foto acima) instalado em seu centro:
Diagrama esquemático do scanner:
Como pode ser visto no diagrama, toda a eletrônica do scanner consiste em módulos (placas) separados, conectados por conectores e loops.Existem muitos módulos - módulo de fonte de alimentação (DC-DC), módulo de interface, módulo processador, módulo fotodetector (APD), módulo laser. Além disso, há também um módulo codificador e duas placas em forma de ferradura, que a princípio pareciam estranhas.Antes de tudo, vale a pena prestar atenção neles:
Obviamente, uma das placas contém LEDs e a segunda contém fotodiodos. Inicialmente, pensei que fosse algum tipo de codificador ou algum tipo de mecanismo para verificar a radiação laser. No entanto, depois de ler a documentação do scanner e examinar as fotografias em detalhes, percebi que este é um sistema para monitorar o estado da superfície do vidro protetor do scanner.Os furos para LEDs são visíveis na foto:
Ao medir o nível do sinal dos fotodiodos, é possível estimar o nível de transmissão do vidro de proteção. Obviamente, esse sistema não é crítico para o scanner, então não usei essas placas no futuro.O módulo do processador é a parte mais difícil do scanner. É assim que os componentes eletrônicos do módulo se parecem de dois lados:
Pela primeira vez em que olhei para o quadro, percebi imediatamente que o scanner usa o método de medição da distância no tempo de voo (TOF) - o chip com a maior marcação que se tornou " ACAM TDC-GPX ", sobre o qual eu já tinha ouvido falar. TDC - "Time-to-Digital Converter", ou seja, um chip especializado projetado para medir intervalos de tempo com uma precisão muito alta, é o que é usado para medir o tempo de "vôo" de um pulso de laser.Também estava a bordo um microcontrolador Infineon C167 com um chip de memória FLASH externo (o que agradou) e o ASIC (o que incomodou muito). Em mais detalhes sobre este módulo, vou contar abaixo.Módulo de potênciacontém um conversor DC-DC isolado galvanicamente personalizado com várias tensões de saída e vários capacitores:
A tensão de alimentação do conversor é de 24V. Sua principal característica é que ele fornece uma alta tensão (~ 230V), necessária para a operação do laser e do fotodetector, em um pequeno conector separado.Ele também gera as seguintes tensões no conector principal: + 5V, -5V, ~ 15V, galvanicamente isolado do resto + 5V para a interface RS232.Parte óptica do scanner
À primeira vista, não está muito claro onde estão as ópticas do scanner. Nesse caso, uma pequena janela com um espelho no centro da foto serve para emitir o feixe de laser e uma grande superfície brilhante ao redor é a superfície do filtro de luz de interferência instalado na frente da lente do fotodetector. Este filtro transmite apenas a radiação cujo comprimento de onda está próximo ao comprimento de onda do laser.É assim que é mostrado na documentação do scanner:
a lente é montada dentro de uma caixa de plástico preto, por isso é problemático vê-la. No final desta caixa, oposto ao que é visto na foto acima, o módulo laser e o fotodetector são fixos : Módulo laser
Visão do módulo a laser (alguns dos detalhes são marcados por mim durante o desenho do circuito): Como você pode ver, o circuito deste módulo é bastante simples, para que eu possa restaurar completamente o circuito: Uma grande parte redonda da placa é um emissor especializado a laser. Infelizmente, não havia marcas nele; portanto, não foi possível encontrar documentação. Na descrição do scanner, você pode descobrir - “Comprimento de onda da luz do laser - 905 nm”, “Classe do laser - 1”, “Duração do pulso - 0,003 µs”, “Frequência de repetição - 25 kHz”. O que foi possível entender restaurando o circuito do módulo e analisando sua operação:

- O emissor a laser é constantemente fornecido com uma tensão de alimentação de 143 V, limitada por diodos zener.
- , «3» . , , .
- , , . ( ) «» .
Todo o controle a laser é realizado em uma linha - "LASER_PULSE". Na maioria das vezes na linha deve ser de nível "alto". Quando um pulso negativo é aplicado, o gatilho DD1 é redefinido para 0 em sua borda anterior e, na borda posterior, o gatilho começa a "esperar" pelo sinal do fotodiodo e o laser é iniciado. Quando um sinal do fotodiodo aparece, o gatilho muda para 1.Você pode observar dois fios coaxiais usando os conectores conectados ao módulo. Eles são usados para transmitir o sinal diferencial do gatilho para o chip TDC.Também neste módulo estão cinco LEDs. O módulo do processador os controla. MódulofotodetectorO módulo em si tem a seguinte aparência: Fotografia do fotodetector próximo a:
O sinal de alta tensão no canto da placa mostra claramente que um fotodiodo de avalanche (APD) é usado aqui - eles exigem uma tensão bastante alta para operar.Infelizmente, não havia marcas visíveis no corpo do fotodetector. Pelo emblema no próprio fotodiodo (no centro), só foi possível determinar que ele foi fabricado pela Pacific Silicon Sensor (First Sensor)No entanto, não havia mais informações sobre ele, talvez ele seja feito sob medida. Pode ser visto na foto que esse fotodetector é um híbrido, ou seja, contém um amplificador embutido - é claramente visível acima do fotodiodo. Obviamente, o amplificador e o fotodiodo precisam de energia - ele é alimentado pelos terminais inferiores (os capacitores são soldados a eles). Um grande mistério foi o pequeno detalhe à esquerda do fotodiodo, para o qual existem três condutores. Pesquisas posteriores mostraram que este é um sensor térmico analógico.Este módulo é muito mais complicado que o anterior, usa uma placa de circuito impresso de multicamadas - pelo menos 4 camadas, com a maioria das linhas de sinal localizadas na camada externa da placa, o que facilita muito sua análise. Neste módulo, restaurei cerca de 80% do circuito, o restante não foi realmente necessário para mim.O circuito resultante do módulo fotodetector: Na parte superior do circuito, há uma fonte linear de alta tensão ajustável para um fotodiodo de avalanche. Pode gerar uma tensão estável de pelo menos 150 V. Essa fonte é controlada pelo DA1 DAC (LTC1451).
Como o scanner é baseado em um telêmetro por pulsos, a principal tarefa do módulo fotodetector é detectar rapidamente um sinal de laser suficientemente fraco, refletido em um obstáculo. Como o nível do sinal de luz é muito pequeno, ele só pode ser detectado usando um fototodiodo de avalanche, que tem seu próprio ganho. Neste caso, o sinal do fotodiodo é adicionalmente amplificado por um amplificador integrado no fotodetector. Devido ao fato de o amplificador estar embutido no corpo do fotodetector, a influência da interferência no sinal útil é reduzida. O sinal gerado pelo fotodetector (OUT_B) é transmitido para um determinado chip DA4, que, aparentemente, é outro amplificador de alta frequência. Depois disso, o sinal é transmitido para a entrada direta do comparador de alta velocidade D1 (MAX9601).O sinal de referência do divisor do resistor (cerca de 50 mV) é alimentado na entrada inversa deste comparador.O sinal na saída do comparador é diferencial, é transmitido através de um fio coaxial diretamente para a placa do módulo do processador.Além disso, o sinal da saída do amplificador DA4 é transmitido para algum tipo de detector de pico, que "lembra" o nível máximo do pulso recebido. Não comecei a restaurar o circuito desse nó e desenhei no circuito apenas seu estágio de saída (chip U1), cujo sinal também é transmitido para o módulo do processador.Uma das partes do scanner menos claras para mim é o transistor Q3 instalado na saída do amplificador de RF. A julgar pelos circuitos, é necessário ativar a atenuação do sinal na saída do amplificador. Este transistor pode ser controlado usando um sinal da placa processadora (linha 10 - “digi”).Você pode perceber que a placa possui um chip EEPROM. Todas as saídas de sinal deste chip estão conectadas à placa processadora. Aparentemente, neste microcircuito, alguns parâmetros foram armazenados, únicos para cada placa fotodetector, e gravados nela ao testar a placa. Em particular, isso pode ser uma curva da dependência do ganho APD na tensão de alimentação, da dependência da tensão na saída do sensor de temperatura em sua temperatura e de outras características semelhantes.Você pode ver que a potência do fotodetector pode ser controlada definindo certos níveis nas linhas CLK, CS, CS2 conectadas ao DAC e EEPROM.A placa contém vários circuitos projetados para monitorar sua condição. Você pode controlar o nível de tensão do APD, sua temperatura (linha7) e o limite do comparador. Essas tensões são convertidas pelos amplificadores operacionais DA3-DA5 e transmitidas à placa do módulo do processador.Retornando ao
módulo do processador Este módulo é o mais complexo de todos, contém um grande número de microcircuitos com várias saídas, a placa de circuito é novamente de quatro camadas e a maioria das linhas de sinal são separadas nas camadas internas, o que complica significativamente a restauração do circuito. Muitas vezes, as faixas mudavam para outro lado do tabuleiro. Para pesquisar rapidamente onde uma determinada faixa está conectada, tive que usar apenas uma escova desse tipo, conectada a um multímetro (no modo de discagem):
Eu restaurei cerca de 70% do esquema - o resto não era realmente necessário. Diagrama de blocos do módulo do processador:
O diagrama resultante do módulo do processador: Apesar de eu chamar esse módulo de “módulo do processador” em todos os lugares, na realidade, ele é baseado no microcontrolador Infineon SAK-C167CR-L33M . Possui 144 pinos e é construído sobre a arquitetura C166 bastante antiga. Este microcontrolador não possui sua própria memória não volátil - é necessário conectar a memória externa a ele através de um barramento paralelo. Para esses fins, o scanner possui um chip de memória Flash M29F400B (512K x 8 / 256K x 16). Além disso, dois chips de RAM estão conectados ao microcontrolador - IS61C6416AL-12 (64K x 16) e K6R4016C1D (256K x 16).
Você pode ver que o barramento de endereço está conectado a todos os microcircuitos de memória com um turno de um bit - as linhas de memória A0 estão conectadas à linha A1 do microcontrolador. Isso se deve ao fato de os endereços serem definidos no barramento de endereços em bytes, mas o controlador e a memória são de 16 bits. Para que o controlador grave bytes únicos na RAM sem afetar os bytes vizinhos em uma palavra de 16 bits, os chips de memória possuem linhas especiais UBn, LBn. Essa solução é muito comum em dispositivos com barramentos paralelos e é descrita em detalhes na documentação do controlador.Mas outra solução no módulo do processador não ficou totalmente clara para mim. Se você observar o chip de memória Flash U1, notará que a linha A14 do chip está conectada ao terra. A linha de barramento de endereço do controlador A15 correspondente não está conectada ao chip. O resultado é que o controlador tem acesso a apenas metade da memória Flash. Uma situação completamente semelhante com o chip RAM2 (DD3).Com o chip RAM1 (DD2), a situação é um pouco diferente - a linha do controlador A15 também não está conectada a ele, mas ao mesmo tempo todas as entradas de endereço desse chip são conectadas ao barramento de endereços, para que o controlador tenha acesso a toda a memória do chip.E agora você deve prestar atenção ao nó nos elementos lógicos DX1, DX2, DD4. São esses microcircuitos que determinam qual dos microcircuitos de memória é selecionado pelo microcontrolador. Pode-se ver que eles são controlados pelos seguintes sinais:- WRn - sinal de gravação, nível ativo - baixo. Nesta linha, o microcontrolador define um nível baixo quando você precisa gravar alguns dados na memória RAM externa
- A15 é a mesma linha de barramento de dados que não está conectada diretamente a nenhum chip de memória.
- CSn0 é um sinal de seleção de chip especializado, o nível ativo é baixo. Esta linha está conectada ao decodificador de endereço integrado no controlador. Após uma redefinição, o controlador está baixo.
- RAM2_CE - conectado ao GPIO do controlador com um elevador no chão.
A lógica da operação desse nó está bem descrita na tabela:
Como você pode ver, dependendo do status da linha RAM2_CE, o microcontrolador funcionará com memória Flash ou com o microcircuito RAM2 (DD3) e seus espaços de endereço coincidem. Vale ressaltar que a capacidade de memória desses microcircuitos é a mesma. Talvez isso seja feito para simplificar a atualização do firmware do dispositivo. Há outra opção - a RAM instalada é 3 vezes mais rápida que a memória Flash, portanto, após a inicialização, o controlador pode copiar o conteúdo do FLASH para a RAM2, após o qual o programa é executado a partir dele.Mas o alto nível na linha A15 determina claramente que o controlador funcionará com o chip RAM (DD2).Como resultado, verifica-se que as memórias FLASH e RAM1 se alternam no espaço de endereço do controlador:
A área da RAM que já foi encontrada é destacada em vermelho - ao acessá-lo, o controlador terá acesso aos dados localizados nos endereços (0x8000-0xFFFF).A configuração do compilador não é trivial e, como mencionei acima, metade do Flash / RAM2 é perdida. Por que os desenvolvedores do scanner não alternaram entre os chips FLASH e RAM usando a linha CSnX especializada do controlador não está claro.Como já mencionei, o controlador usado não possui memória Flash e, portanto, bits de fusível. Para configurar alguns parâmetros do controlador: largura e endereço do barramento de dados, os parâmetros PLL são resistores pull-down conectados ao barramento de dados. O próprio controlador possui resistores pull-up de alta resistência (> 100 KOhm) integrados a todo o barramento. Assim, devido a resistores externos, uma certa combinação de sinais é estabelecida no barramento, que o controlador lê quando é ligado. Determina as configurações necessárias do controlador.Nesse caso, estamos falando dos resistores R3-R6. A configuração selecionada dos resistores é consistente com as conexões de sinal de barramento resultantes e fornece uma velocidade de clock do controlador de 33 MHz.O sinal de pulso do codificador de espelho é alimentado na entrada do timer "T2IN" do microcontrolador através do elemento lógico OR D6. A segunda entrada desse chip é conectada ao GPIO do controlador, o que permite desativar o fornecimento de pulsos na entrada do timer. Por que essa solução é necessária e por que é impossível desligar o cronômetro programaticamente, eu ainda não entendo.Agora você deve prestar atenção ao chip TDC (DD1).O scanner possui um chip TDC-GPX - o mais "avançado" de todos os que estão na faixa do ACAM. A precisão alegada de medir intervalos de tempo de até 10 ps RMS. O microcircuito possui 8 canais de entrada de linhas LVTTL e 2 canais de LVECL (diferencial).Neste scanner, para obter a precisão máxima da medição do tempo, são as entradas LVECL usadas para receber sinais do módulo laser e do módulo fotodetector usando quatro cabos coaxiais. Os sinais do módulo laser são alimentados nas entradas do DStart / DStartN e iniciam a contagem do tempo. Os sinais do módulo fotodetector são alimentados nas entradas DStop1 / DStop1N, DStop2 / DStop2N e interrompem a contagem de tempo. Como pode ser visto no diagrama, os sinais de parada são aplicados imediatamente a dois canais TDC, com polaridade inversa. Devido a isso, é possível medir não apenas a duração do "vôo" do pulso da luz, mas também a largura do pulso recebido.O TDC-GPX possui um barramento de dados de 28 bits, mas pode ser alternado para o modo de 16 bits, que é usado no scanner. O barramento de endereço é de 4 bits, também é alterado em 1 bit, como nos chips de memória. Os chips DD8, DD9, U2 são usados para gerar sinais de controle do chip e corresponder aos níveis - o microcontrolador trabalha a partir de 5V e o TDC - a partir de 3,3V. Em geral, o sistema de energia TDC é bastante complexo, existe até um ajuste automático da tensão de alimentação. Devido à sua complexidade, não comecei a desenhar seu diagrama - suspeito que não seja muito diferente de uma folha de dados.A programação do microcontrolador e do TDC será discutida mais adiante.Como mencionei anteriormente, um chip ASIC personalizado com as inscrições "LEUZE98" e "WATCHDOG" está instalado na placa. O que é é desconhecido. Pode-se ver que um oscilador de cristal de 20 MHz está conectado a este microcircuito. Depois que pude programar o microcontrolador, verifiquei se o ASIC não interferia em sua operação e não restaurei o diagrama de conexão do ASIC. Tanto quanto eu entendo, este chip se comunica com o controlador através de um barramento paralelo. É possível que seja o ASIC que gera o sinal de redefinição RESETn, que redefine o controlador e o TDC.No entanto, foi necessário lidar com algumas cadeias com mais detalhes.Como se viu, o sinal de controle do laser "LASER_PULSE" pode ser gerado pelo microcontrolador e pelo ASIC usando um nó nos transistores T1, T2. Nesse caso, quando ligado, o ASIC abre o transistor T1, para que o controlador não consiga controlar o laser. Por causa disso, tive que remover o resistor R24 - e o laser começou a ser normalmente controlado pelo controlador.O sinal de controle do motor espelho line_motor1 também veio do ASIC (via diodo D2). Por causa disso, tive que cortar a pista na placa e conectar esse sinal diretamente à saída livre do controlador GPIO - P3.15.O mais estranho é que a linha CS2 conectada ao DAC instalado na placa de circuito do módulo fotodetector também se mostrou conectada ao ASIC. Por esse motivo, o controlador não pôde definir de forma independente a tensão de alimentação do APD e ligar o amplificador do APD. Talvez isso tenha sido feito para aumentar a confiabilidade do scanner - uma configuração incorreta do DAC pode levar à falha do APD. Eu também tive que conectar esta linha ao pino GPIO livre do controlador P3.4.É sabido que é o ASIC que controla os três LEDs montados no módulo a laser. Dois outros LEDs exibindo o status do scanner (a presença de um obstáculo na área de trabalho) são controlados a partir do controlador - linhas LN1, LN2. Essas linhas também vão para a placa do módulo de interface.Como o scanner pode funcionar em sistemas de segurança, a placa processadora possui um grande número de nós para diagnosticar sua condição. O processador (e possivelmente o ASIC) pode detectar a inclusão de um laser (usando o chip U3), controlar o nível de várias tensões de alimentação, tensão de alimentação do APD, temperatura do APD e o limite do comparador na placa do fotodetector.Devido ao fato de a tensão de referência do ADC do controlador ser de 4.1V, uma parte das tensões medidas é reduzida com a ajuda dos divisores de resistores - eles podem ser vistos no diagrama à direita.E agora vale a pena examinar mais de perto o método de geração do sinal incomum "digi", que mencionei anteriormente na descrição do módulo fotodetector.O diagrama abaixo mostra os nós do módulo processador (parte inferior) e do módulo fotodetector (parte superior):
As setas mostram a conexão dos módulos usando fios. Abaixo, descreverei a operação desses nós, como eu o entendo. No módulo fotodetector, o sinal da saída APD é amplificado pelo chip DA4, após o qual é transferido para o comparador D1. Se o nível do sinal na entrada do comparador for superior a 50 mV, um nível alto será definido na saída do comparador. O sinal da saída do comparador é transmitido para o módulo do processador. Primeiro, ele entra na entrada TDC, que conta o tempo desde o início do pulso do laser. Mas, além disso, esse sinal é alimentado na entrada do relógio do D-trigger DD1. Uma unidade lógica é sempre fornecida à entrada do sinal de disparo, e o próprio disparo pode ser redefinido para zero usando a linha GPIO do controlador BASE5. Assim, a operação do comparador leva a um gatilho instantâneo "1". Este gatilho tem uma saída diferencial,o sinal a partir do qual é alimentado a entrada do chip D3, que o converte no formato LVTTL. Este sinal é alimentado na entrada “digi” do módulo fotodetector. Como mencionei anteriormente, na minha opinião, a aparência desse sinal leva a um enfraquecimento do nível do sinal na entrada do comparador.A principal questão é por que isso é necessário e por que é tão difícil de implementar? Por que era impossível criar os dois nós na placa do módulo fotodetector?Só posso expressar minhas suposições. Talvez o sinal precise ser atenuado para evitar a transição do comparador ou detector de amplitude para a saturação. Talvez - para reduzir o comprimento do pulso recebido. Para ambos os nós, simplesmente não poderia haver um lugar na placa do detector fotográfico. Outra opção também é possível - o sinal precisa ser enfraquecido somente após ter tempo de chegar ao TDC por meio de fios coaxiais, o que justifica um projeto tão complexo.O estudo mostrou que, antes de iniciar um novo pulso a laser, é necessário reiniciar o gatilho, caso contrário, os pulsos não serão aceitos.Módulo de interfaceInfelizmente, não encontrei uma boa foto deste módulo. Existe apenas este:
é neste módulo que os dois únicos conectores estão instalados, aos quais você pode se conectar fora do scanner. Um deles é o RS-232 / RS-422, de acordo com o segundo, a energia é fornecida ao scanner, os sinais de controle são fornecidos e um circuito de segurança é conectado aqui.Este módulo contém conversores e optoacopladores UART-RS232 / RS485 de isolamento galvânico (eles são instalados em uma pequena placa separada mostrada à direita), chaves de alimentação do circuito de segurança, circuitos de entrada das linhas de controle do telêmetro, um circuito de controle do motor, um conversor de sinal do encoder.O módulo de energia e o módulo do processador, bem como o módulo do codificador e o motor espelho estão conectados a este módulo (usando os conectores na parte inferior do módulo, eles não são visíveis na foto).Diagrama parcial do módulo de interface: restaurei apenas parte do diagrama de circuito deste módulo (cerca de 20%), porque não estava interessado nas chaves e linhas de entrada necessárias para garantir a segurança. E há muitos deles por aí, a documentação menciona o limite de corrente no circuito de segurança, monitoramento de curto-circuito e outras funcionalidades.
Um pouco estranhamente controlava a velocidade de rotação do motor do espelho. O controle de velocidade é implementado alterando a tensão do motor - com isso, tudo fica claro. Mas o ajuste dessa tensão em si é realizado com a ajuda de uma certa cadeia de integração em um amplificador operacional. Para aumentar a tensão, o controlador define 0 na linha line_mot1 para abaixá-la - 1. Obviamente, sem feedback constante do codificador, o motor para ou acelera à velocidade máxima através do controlador.Como se viu, o chip conversor UART-RS232 LTC1387 é bastante lento - a uma velocidade de 500 kbit / s, os dados foram distorcidos. Por causa disso, tive que remover uma pequena placa com esse chip e conectar o conversor USB-UART diretamente à placa do módulo de interface.Agora que falei sobre o design de todos os módulos, vale a pena elaborar o próprio processo de engenharia reversa.Quando comecei a lidar com a eletrônica dos scanners, fiquei com mais medo de que um laser ou um fotodetector fosse danificado como resultado de um impacto. Ao mesmo tempo, eu não tinha certeza de que seria capaz de iniciar o módulo do processador - o microcontrolador desconhecido e o ASIC estavam envergonhados. Portanto, antes de tudo, restaurei o circuito do módulo a laser e depois o módulo fotodetector. Depois que eu pude entender o circuito desses módulos e determinar a finalidade de todos os contatos em seus conectores, foi possível prosseguir para o módulo do processador. Como último recurso, se eu não pudesse iniciá-lo, tive uma ideia de fazer um análogo deste módulo nos microcircuitos STM32 + TDC-GP2.Obviamente, para verificar o módulo, você precisa executar seu próprio programa no microcontrolador Infineon SAK-C167CR instalado nele. Novamente, vale lembrar que este controlador não possui memória Flash incorporada. Além disso, como se viu, o controlador não possui nenhuma interface de depuração especializada (incluindo JTAG). Com um alto grau de probabilidade, o firmware é gravado em um Flash externo no programador de fábrica. No entanto, como se viu, tudo não é tão ruim - o controlador possui um gerenciador de inicialização (“Bootstrap Loader”), trabalhando no UART. Esse carregador de inicialização é armazenado na ROM de inicialização incorporada ao controlador, portanto deve estar no meu controlador. E funciona de maneira bastante peculiar - para ativá-lo na inicialização, é necessário definir a linha de barramento de dados P0L.4 para baixa,após o qual o controlador começa a aguardar o byte 0x00 do host aparecer. Depois de aceitar esse byte, o carregador de inicialização determina automaticamente a taxa de transferência e começa a aguardar 32 bytes de dados que copia na RAM interna do controlador. Depois que os dados são recebidos, o controlador inicia a execução do programa recebido (16 palavras do controlador).De fato, nesses 32 bytes, você precisa enviar outro carregador ("preloader"), que receberá o carregador principal "External loader" do host e iniciará sua execução.Aqui tive sorte - para este processador já existe um programa FLASHit pronto para executar todas as operações mencionadas automaticamente. O carregador incorporado possui bastante funcionalidade - com ele, você pode determinar automaticamente o modelo de memória Flash instalada, editar e visualizar o conteúdo dos registros do controlador, ver o status dos canais ADC.Não encontrei nenhum bloco de teste na placa conectada à linha P0L.4 do controlador; portanto, para iniciar o gerenciador de inicialização, tive que soldar um pino especial nessa linha. Prendi o pino no gabinete de um dos chips de RAM. Para iniciar o carregador de inicialização, você precisa conectar esse pino através de um resistor de 8 kΩ ao terra.Depois de conectar a placa ao computador e aplicar energia ao módulo do processador, o microcontrolador realmente apareceu no FLASHit. Depois disso, escrevi um pequeno programa no Keil que trocava um dos pinos do controlador e o escrevia no Flash. O programa funcionou bem, o ASIC não interferiu (eu tinha medo de algum tipo de mecanismo de vigilância incorporado ou conflitos nos ônibus), para que eu pudesse seguir em frente.Depois disso, restaurei o circuito do módulo do processador, o que me permitiu verificar a operação de todos os módulos na montagem.No primeiro, verifiquei a operação do módulo a laser - como escrevi anteriormente, para iniciar o pulso do laser, era necessário aplicar apenas um sinal a este módulo. O laser funcionou - seus flashes podiam ser vistos usando a câmera de um telefone celular. Além disso, usando um osciloscópio, verifiquei se o módulo normalmente forma pulsos de início (referência).Em seguida, veio a verificação do módulo fotodetector. Aqui eu tive que verificar a operação do DAC, a unidade de geração de tensão do fotodiodo de avalanche e a unidade de controle de potência do amplificador do fotodetector. Todos eles ganharam, o que permitiu verificar o funcionamento do próprio telêmetro. Para fazer isso, montei seus módulos da forma que os desenvolvedores pretendiam:
Na fotografia, todos os cinco módulos principais são montados em torno do sistema óptico. Aqui, em vez do meu próprio espelho rotativo, instalei um espelho comum.Depois disso, enviei um programa de controle a laser para o UART, configurei o fotodiodo. Como resultado, quando iniciei o laser na entrada do comparador, pude realmente detectar pulsos com um osciloscópio cuja amplitude dependia claramente do tipo de obstáculo na frente do espelho! O comparador também funcionou bem. A última parte importante do teste permaneceu - a verificação de desempenho do TDC.O chip TDC-GPX instalado no scanner possui um design bastante complicado e pode funcionar em um grande número de modos.A figura abaixo mostra seu diagrama estrutural:
Como você pode ver, o chip contém 8 canais separados, ou seja, pode receber até 8 sinais de parada. Se os canais forem diferenciais, apenas dois sinais de parada mais um sinal de partida podem ser analisados. Nesse caso, o chip permite combinar os canais de medição, aumentando assim a precisão dos intervalos de tempo de medição:
Honestamente, eu não gostei da documentação deste chip. Muitas coisas nele são descritas superficialmente; exemplos de código são incompreensíveis. A parte da folha de dados dedicada ao ajuste da resolução de tempo está cheia de algum tipo de "número migratório". Também não há uma "Nota de Aplicação" normal no chip. Além disso, no próprio scanner, não consegui detectar a conexão das linhas EF1 / EF1 ao controlador. É a partir dessas linhas que pode ser determinado que o microcircuito terminou de medir o tempo. Por tudo isso, iniciar o TDC levou muito tempo, mas, como resultado, tudo funcionou como deveria - quando o laser começou, o TDC funcionou, e os resultados do TDC dependiam claramente da distância do obstáculo. Assim, o telêmetro a laser pulsado começou a funcionar. Resta transformar toda a estrutura em um scanner a laser viável.O primeiro passo necessário para realizar o ajuste - o telêmetro montado parou de "ver" obstáculos depois de alguns metros. O sistema óptico parecia intacto, mas tive que remover as placas do sistema óptico, para que a luz refletida não fosse focada com precisão pelas lentes do fotodetector.Antes do alinhamento, escrevi um programa para o controlador, que não apenas determinou as distâncias, mas também mediu a amplitude do sinal gerado pelo detector de pico usando o ADC.Todo o processo de ajuste foi reduzido a movimentos suaves do fotodetector e das placas de laser e à busca de sua posição na qual a amplitude do sinal é máxima. Como resultado do ajuste, a amplitude do sinal recebido foi significativamente melhorada.Em seguida, você deve prestar atenção a algum recurso do processamento de dados inerente aos rangefinders de pulso.O sinal gerado pelo fotodetector tem uma forma analógica. Para convertê-lo em formato digital, que é processado posteriormente pelo TDC, é utilizado um comparador configurado para alternar se o sinal de entrada exceder um determinado limite. Como resultado, devido à forma complexa do sinal de entrada, ao alterar a amplitude do sinal, ocorre um erro ao determinar os intervalos de tempo:
Como pode ser visto no gráfico, um sinal com amplitude menor será detectado com atraso. Para resolver esse problema, existem vários métodos, tanto de hardware quanto de software. Decidi usar a opção mais simples - a correção dos resultados da medição, dependendo da amplitude do sinal. Ao mesmo tempo, eu tive que coletar estatísticas sobre mudanças nos resultados da medição do tempo a partir de mudanças na amplitude do sinal. Para alterar a amplitude do sinal sem alterar seus outros parâmetros, usei blocos de papel na lente, o que reduziu o fluxo de luz incidente no fotodiodo.O resultado foi essa dependência: com
base nessa dependência, formei uma tabela de correção, cujos dados são usados pelo programa controlador para determinar a distância do objeto.O próximo passo é iniciar o mecanismo de espelho e o codificador.Anteriormente, eu já citei uma foto de um espelho:
O motor do espelho é sem escova, muito semelhante ao usado em ventiladores mais frios. Três fios saem dela - dois deles são de potência, outro é um sinal de velocidade de pulso. Todos esses fios são conectados ao módulo de interface, enquanto o sinal de velocidade gerado pelo motor não é utilizado - o controle é baseado nos dados do codificador.Como você pode ver na foto, um disco transparente com etiquetas para o codificador é fixado no eixo do mecanismo. Você pode perceber que há uma marca zero no disco.O codificador foi montado em uma pequena placa e completamente coberto com uma tela de metal, de modo que sua marcação não pôde ser determinada. No entanto, com base em seu tamanho e pinagem, decidi que era um codificador de quadratura HEDS-9040:
quatro fios passaram da placa do codificador para o módulo de interface, mas, como se viu, apenas três deles foram usados - duas fontes de alimentação e um sinal.Pelo que entendi, os gatilhos Schmitt e alguma lógica foram instalados na placa, combinando dados dos canais A, B e índice (sinal de marca zero).É assim que o sinal produzido pela placa do codificador e o sinal de índice obtido diretamente do codificador se parecem.
Como pode ser visto, durante o sinal de índice, os pulsos do codificador são suprimidos. Como se viu, a placa do codificador gerou 500 pulsos por rotação, mas o temporizador do controlador T2, ao qual a linha do codificador está conectada, pode operar simultaneamente em ambas as extremidades dos pulsos, o que fornece 1000 interrupções por rotação do espelho. Este valor corresponde à resolução angular declarada do scanner em 0,36 graus.Defino o temporizador T2 para "Modo de captura", o que me permite medir o tempo entre interrupções do codificador. O tempo obtido é usado para detectar a posição "zero" do espelho e para estabilizar a velocidade de rotação do motor. Ao mesmo tempo, o número de interrupções é contado, o que permite determinar a posição do espelho.Depois que o codificador funcionou, e eu consegui iniciar o controle de velocidade do motor, foi possível montar completamente o scanner. Devido à forma complexa das placas e da óptica, o design acabou sendo bastante elaborado: não foi fácil montar esse design - a precisão da disposição das peças individuais é muito importante para o scanner. Se o eixo do espelho não coincidir com o eixo óptico da parte do telêmetro, isso pode levar ao fato de que o plano de varredura seria fortemente curvado ou inclinado.
Ao medir a distância exata aos objetos, é importante ter algum tipo de objeto de "referência", cuja distância é precisamente conhecida. Conhecendo o "tempo de vôo", é possível determinar com precisão o tempo correspondente à distância zero. Devido a mudanças na temperatura dos componentes do scanner, esse tempo pode mudar, portanto esse tempo deve ser monitorado constantemente. Para solucionar esse problema, instalei uma placa escurecida especial no scanner:
A placa é escurecida para que a luz refletida não "cegue" o fotodetector. A julgar pelas instruções, os elementos refletores da escuridão e da luz também foram instalados no design original do scanner. Eles foram usados para monitorar a operação da parte do telêmetro do scanner e, muito provavelmente, também foram usados para calibração.Na foto acima, o codificador montado na placa também é claramente visível. Como se viu, o codificador deve ser posicionado com muita precisão em relação ao disco, e houve muitos problemas com isso - mesmo uma pequena mudança no codificador levou à perda de pulsos, especialmente os índices. É possível que o scanner tenha parado de funcionar depois de atingir o corpo precisamente devido a problemas com o codificador.Como resultado, foi possível obter uma velocidade de varredura de até 20 rotações por segundo. Com uma voltagem APD de 135 V, normalmente são detectadas distâncias de até 10 a 15 m. A uma voltagem de 145 V e com filtragem de sinal adicional, é possível medir distâncias de até 30 m (embora eu não tenha certeza se isso é seguro para um fotodetector).Vale ressaltar que a velocidade máxima de transmissão no scanner original é de 115200 bits / s, o que permite transferir todos os dados apenas a uma velocidade de cerca de 11 rotações por segundo.Como mencionei, no meu firmware transfiro dados a uma velocidade de 500 kbit / s, o que pode aumentar significativamente o número de varreduras transmitidas por segundo. Foi por causa do limite de velocidade do UART que eu não aumentei a velocidade de digitalização para as 25 rotações originais por segundo. Observo que, no design original do scanner, os dados são processados no próprio scanner, portanto, a baixa velocidade de transferência de dados não afeta nada em particular.Como o scanner agora funciona sem caixa, foi possível aumentar a área de digitalização para 208 graus contra 190 no design original.Visualização dos dados recebidos do scanner:
Obviamente, o scanner deve executar algumas funções úteis, então decidi verificar sua operação no ROS no SLAM e comparar os resultados com os resultados de um scanner a laser caseiro . Para fazer isso, instalei-o no Roomba, no qual um scanner caseiro foi instalado anteriormente.Visão do scanner Leuze instalado no Roomba (o espelho gira para que fique embaçado): Como resultado da operação hector_slam, conseguimos obter um mapa de apartamento (as paredes são mostradas em amarelo): Como o aspirador de pó viaja no nível do chão, ele “vê” principalmente os móveis. Mas esse cartão é obtido se você simplesmente levar o aspirador de pó nas mãos ao nível do cinto: nesse caso, as paredes do apartamento ficam "visíveis" com mais frequência.

Se compararmos a qualidade dos cartões, fica claro que as linhas do scanner caseiro são mais "barulhentas". Isso se deve ao fato de que, com um scanner caseiro que utiliza o princípio de operação da triangulação, a precisão aumenta significativamente com o aumento da distância.Infelizmente, apesar da muito boa qualidade de digitalização, este scanner não é adequado para um robô autônomo - possui dimensões e consumo de energia muito grandes (cerca de 7,2 W).Onde mais posso usar esse scanner? Antes, ao discutir um scanner caseiro, muitas vezes me perguntavam sobre a possibilidade de fazer um scanner 3D, e é hora de fazê-lo! Uma velocidade de digitalização bastante alta é útil aqui. Obviamente, por resolução, esse scanner não pode ser comparado a scanners que usam o princípio de triangulação da medição de distância (com uma linha a laser ou projetor (SLS)), mas podem digitalizar grandes espaços - instalações, seções de ruas.Para refazer um scanner 2D em 3D, você precisa fornecer a capacidade de girar ao longo de outro eixo. Decidi fazer meu scanner usando o mesmo princípio de digitalização por feixe que o scanner desteartigos. Para fazer isso, coloquei o scanner Leuze “deitado” para que seu plano de digitalização fique perpendicular ao chão. Em seguida, foi necessário realizar uma rotação lenta e suave de todo o scanner em torno do eixo. A principal dificuldade - o scanner deve girar sem batidas e distorções, o que levará à distorção das digitalizações. Como se viu, em casa é difícil fazer um conjunto de rolamentos que possa fornecer uma rotação tão precisa. Portanto, decidi usar a cabeça VHS do gravador como uma unidade de rolamento - ele contém dois rolamentos, é fabricado com uma precisão muito alta e é capaz de suportar o peso do scanner. O design resultante é acionado por um motor de passo.O scanner 3D montado é assim: Visão do scanner montado em um tripé:
À esquerda, há uma bateria de 12 V, que também é um contrapeso. Como o scanner Leuze requer 24 V para operação, eu tive que instalar um conversor DC / DC intensivo montado com base no chip XL6009 no scanner. O motor de passo do scanner é controlado por um módulo no A4988 e no Arduino, que fornece rotação a uma determinada velocidade. Tanto o scanner Leuze (via adaptador USB-UART) quanto o Arduino são conectados através de um hub USB com um fio a um computador que captura dados. Na forma atual, a rotação do espelho do scanner e a rotação de todo o scanner não são sincronizadas - a velocidade de rotação do scanner é escolhida para que, quando girado 0,36 graus, o espelho tenha tempo para fazer pelo menos três rotações. Como não há sincronização de velocidade, tive que transmitir informações de posição de sincronização do Arduino para o scanner Leuze.Isso é implementado de maneira simples - quando o Arduino gira o scanner a cada 0,36 graus, ele altera o nível do sinal em um dos terminais. Esse sinal é transmitido ao módulo do processador do scanner (ao conector não utilizado do sensor de status do vidro de proteção). As informações sobre o status desse sinal são transmitidas no início de cada envio do scanner - portanto, o programa auto-escrito para o PC que controla o scanner recebe informações sobre o movimento do scanner e determina o ângulo pelo qual ele é girado.recebe informações sobre o movimento do scanner e determina o ângulo em que é girado.recebe informações sobre o movimento do scanner e determina o ângulo em que é girado.Uma única digitalização 3D gerada pelo scanner contém cerca de 350.000 pontos. Obviamente, isso é significativamente menor que o dos scanners profissionais, mas ainda é muito bom, especialmente se você colar várias digitalizações.Um exemplo é uma varredura única de uma sala: Um exemplo é uma varredura de uma sala colada de várias: A parte digitalizada da entrada: Um vídeo mostrando os resultados do scanner resultante:

→ O código fonte do programa controlador no GithubSource: https://habr.com/ru/post/pt396357/
All Articles