Mitsubishi VisiTel: comunicação de zoom dos anos 80

Fora da janela é 2020. O trabalho remoto já é completamente normal. Décadas de publicidade para as principais empresas de telecomunicações finalmente fizeram seu trabalho - ensinaram minha mãe a fazer chamadas de vídeo. É verdade que os acontecimentos dos últimos meses, que causaram um inesperado interesse público na comunicação por vídeo, levaram a uma escassez sem precedentes de webcams . Mas não podemos permitir que isso nos impeça de levar uma vida normal. Afinal, cada um de nós precisa de muitas pessoas para ligar. Tenho uma solução para o problema de falta de webcams. Este é o Mitsubishi VisiTel!





Mitsubishi VisiTel



Quando este dispositivo apareceu em 1988, ele definitivamente representava o futuro. E com seu preço baixo - apenas $ 399 - como poderia não se tornar popular imediatamente? Na revista Popular Mechanics, publicada em fevereiro de 1988, uma página inteira foi dedicada ao Mitsubishi VisiTel. O dispositivo foi descrito lá, mencionando um volume inesperadamente grande de detalhes técnicos. E os apresentadores do Gadget Guru no canal de TV WSMV, imediatamente depois de começarem a falar sobre o VisiTel, fizeram uma pergunta extremamente importante: "Posso continuar usando um telefone normal enquanto isso está conectado à linha?"



Demorou 30 anos e uma pandemia global para finalmente aceitarmos o fato inevitável de que antes de ligar para os colegas precisamos tomar um banho e nos colocar em ordem. Agora, diga-se de passagem, não há como escapar da videotelefonia.



Não sou o primeiro a pensar que há algo particularmente kitsch no VisiTel. As pessoas vêm mexendo neste dispositivo muito tempo. Apesar de não transmitir um sinal de vídeo, mas apenas permitir a partilha de fotos, é um daqueles produtos considerados grandes feitos da engenharia. Este é um desenvolvimento bem à frente de seu tempo. Meu interesse no VisiTel apareceu depois disso



vídeo. Seu autor mostrou como, ao desacelerar ou acelerar a captura de uma imagem enviada pelo VisiTel, é possível distorcer a imagem na tela. Ao saber disso, imediatamente percebi que o dispositivo usa um esquema de modulação de amplitude simples. Sabendo disso, fui ao eBay e encontrei uma cópia adequada do VisiTel lá. Meu objetivo era fazer com que essa incrível "cápsula do tempo" com os avanços técnicos do final dos anos 1980 funcionasse em conjunto com as tecnologias modernas que escolhi. Em particular, eu queria organizar a comunicação com colegas da Zoom. Além disso, eu queria conseguir isso sem precisar modificar o hardware VisiTel. Há algo de especial neste dispositivo, de forma que você deseja deixá-lo em sua forma original.



Etapa 1. Conexão





Comece a experimentar o VisiTel



O VisiTel é ridiculamente fácil de colocar em funcionamento. Da parte de trás do dispositivo vem um longo cabo com um divisor em forma de Y no final (mais sobre isso abaixo) e um par de conectores. Um deles é um conector de alimentação de 2,1 mm. O dispositivo precisa de 15 volts. É um tanto estranho que os desenvolvedores do dispositivo decidiram escrever o número 15 em uma fonte que a inscrição lê como "IS Volts". O segundo conector é um RJ-11 normal, que usa dois pinos. Este é um conector de telefone padrão. Se você se lembra de telefones com fio comuns, também deve se lembrar de que o fone é conectado ao dispositivo por meio do conector RJ-9 e o telefone é conectado à linha por meio do conector RJ-11. O significado disso é que seria possível conectar não apenas um aparelho ao telefone, mas também outra coisa, além do fato de quepara que você possa substituir o cabo ou tubo caso algo aconteça com eles. É verdade que não se pode dizer que algo tenha acontecido com freqüência com os cabos que vão dos telefones aos aparelhos, já que na sua fabricação foram utilizados fios especiais e muito flexíveis.





VisiTel





, VisiTel



Voltando para a parte de trás do VisiTel, existe, além do cabo, um conector RJ-11. Depois de pensar por algum tempo sobre por que ele era necessário ali, percebi. O dispositivo atua como intermediário entre um telefone comum e uma linha telefônica. Isso permite que o VisiTel monitore a linha ou transmita imagens durante chamadas telefônicas regulares. Isso leva a um problema óbvio. A saber, estamos a falar do facto de o VisiTel utilizar a linha telefónica em simultâneo com o telefone, o assinante ouvirá os sons que acompanham a recepção e o envio das imagens. Mas os engenheiros da Mitsubishi cuidaram disso. Antes de enviar ou receber uma imagem, você pode ouvir um clique alto, indicando que algum tipo de retransmissão desliga o telefone por um tempo. Vamos usar o VisiTel para que o sinal de áudio recebido do dispositivo não seja interessante para nós,portanto, não conectaremos nada ao conector RJ-11 na parte traseira do dispositivo. Isso torna desnecessário o relé correspondente, o que significa que pode ser removido para se livrar dos cliques associados ao envio da imagem.



Como organizar a troca de dados com este dispositivo? Por exemplo, meu computador não possui um conector RJ-11. É verdade que isso não é assustador, já que existem adaptadores à venda para conectar aparelhos com conectores RJ-9 a smartphones. Uma das opções de conexão é que você pode cortar o conector RJ-11 e soldar um plugue de 3,5 mm ao fio, organizando a transmissão de áudio mono. Observe que eu originalmente assumi que o VisiTel tinha um conector RJ-9, não um conector RJ-11.



Usando o plugue de 3,5 mm, conectar o VisiTel ao computador é extremamente fácil. Ou seja, você precisa obter um adaptador USB com saídas separadas para conectar um microfone e um fone de ouvido (não TRSS) e conectar o VisiTel a um conector adequado.



Acima, eu disse que voltaria ao divisor em forma de Y. Meu VisiTel teve algum tipo de problema com os fios ao redor deste divisor. Além disso, o fio não se partiu quando tudo simplesmente se recusa a funcionar e quando o problema é completamente óbvio. Era uma daquelas avarias desagradáveis ​​quando tudo funciona à noite e na manhã seguinte não funciona. Seria bom se os criadores do VisiTel usassem fios flexíveis especiais em seus produtos. Este problema, que apareceu e desapareceu, custou-me muitos dias numa busca sem sentido pela sua solução. Procurei por problemas de superaquecimento sem muito sucessodispositivos, verificou as configurações da placa de áudio três vezes. Acabei encontrando o problema quando levantei o dispositivo durante o teste. Depois disso, encontrei sinais característicos de uma conexão quebrada na gravação. Aprendi uma lição com essa história sobre como trabalhar com hardware antigo. Consiste no fato de que, durante o funcionamento do aparelho, é preciso movê-lo um pouco e ver se tudo neste momento funciona como antes.





O local do dano no fio é marcado com um círculo



Etapa 2. Investigação do mecanismo de transmissão de imagem



Depois de resolver o problema com os fios complicados e conectar o dispositivo ao computador, é hora de descobrir qual protocolo é usado para codificar as imagens transmitidas. Vídeos e artigos sobre o VisiTel nos permitem concluir que as imagens são codificadas usando a modulação de amplitude do sinal de áudio. A modulação de amplitude é a codificação de dados realizada pela alteração da amplitude de um sinal portador. A modulação de amplitude é comumente usada para codificar o som transmitido por ondas de rádio, mas a mesma abordagem pode ser usada para transmitir imagens usando ondas de rádio ou mesmo ondas sonoras. Aquivocê pode encontrar uma excelente descrição detalhada desse processo com exemplos de código Python, direcionado para aqueles que estão acostumados a aprender coisas novas por meio da prática.



Sabendo que os dados são codificados usando o mecanismo de modulação AM do sinal de áudio, podemos dar o primeiro passo para decodificar esses dados. Esta etapa consiste em registrar um sinal modulado que transmite uma imagem de amostra com propriedades previamente conhecidas. Para capturar o sinal de áudio, usei o Audacity , meu software de áudio usual.





Representação gráfica do sinal de áudio O



texto acima mostra como eu, em um esforço para entender melhor como os dados são codificados, enviei uma imagem muito simples e especialmente preparada do VisiTel. Essa imagem, mostrada abaixo, era de um par de cartas, preto e branco, que segurei na frente da câmera do aparelho. O sinal correspondente a ele é marcado no programa comoblackWhiteV.





Imagem usada no experimento



Vamos examinar mais de perto o sinal de áudio recebido.





Olhando mais de perto o sinal de áudio



Você pode ouvir este sinal aqui .



Como você pode ver, no início de cada bloco há um cabeçalho, ou sequência, indicando a inicialização (de 17,55 a 17,80 neste exemplo). Isso permite que o dispositivo receptor saiba que outro dispositivo está prestes a transmitir uma imagem e determinar a amplitude máxima do sinal. Este indicador é então usado como um fator de escala ao decodificar a imagem. Como resultado, as imperfeições da linha telefônica não resultarão em perda de contraste ou brilho da imagem. O sinal transmitido em algumas linhas pode ser ruidoso ou enfraquecido. Observe que o sinal até 17,55 é apenas ruído, não importante para o protocolo de dados usado pelo VisiTel.



Para ter certeza de que a sequência de cabeçalho que encontrei realmente indicava ao VisiTel que outro dispositivo estava prestes a enviar uma imagem, deixei o dispositivo ouvir apenas este pequeno trecho da gravação e fui recompensado com um clique de retransmissão. Era óbvio que essa sequência aciona alguns mecanismos. Mas depois de enviar ao dispositivo apenas 30 milissegundos do cabeçalho, percebi que o dispositivo detecta que a imagem após o cabeçalho não é transmitida. O relé desliga alguns milissegundos após o final da transmissão do cabeçalho. Se você reproduzir o título e os primeiros milissegundos do som após ele, o VisiTel começará a exibir a imagem na tela. Se você desligar o som enquanto o dispositivo estiver exibindo uma imagem na tela, o trabalho continuará,O VisiTel continua a receber alguns dados até que o buffer usado para armazenar a imagem esteja cheio. Isso prova mais uma vez que depois que o VisiTel começa a processar os dados gráficos, o dispositivo não depende de um oscilador externo para descobrir exatamente onde os dados de que precisa estão codificados no sinal. Ele tem seu próprio gerador de relógio que diz exatamente onde ele precisa.onde exatamente está o que ele precisa.onde exatamente está o que ele precisa.



Como a parte do cabeçalho do sinal é apenas responsável por estabelecer a conexão, e como não depende da imagem transmitida, não tive a intenção de me aprofundar no estudo de suas características. Para nós, para atingirmos nossos objetivos, basta saber que o cabeçalho é responsável por estabelecer uma conexão, e também basta ter uma ideia aproximada de como ele se parece.



E agora é hora de passar para a coisa mais difícil - descobrir como exatamente as informações gráficas são codificadas, como os pixels "soam". Primeiro, eu precisava entender como os dados de pixel são representados em um sinal de áudio. Meu primeiro palpite foi que cada onda completa representa um pixel. Testei essa ideia contando o número de ondas entre as repetições do padrão de teste. O que consegui estava de acordo com as especificações do VisiTel do anúncio antigo. Ou seja, tem 96x96 pixels, com várias linhas sendo geradas antes do início da própria imagem.



Tudo isso significa que o aparelho analisa a amplitude de cada onda e grava os dados na forma de um pixel buffer, que representa uma imagem digital no VisiTel. Sabemos pelos materiais de marketing do VisiTel que cada pixel da imagem exibida tem 16 tons de cinza. Mas eu, analisando os pixels do sinal "analógico", não senti necessidade de aplicar o efeito de posterizá-los na decodificação ou codificação.



Curiosamente, o brilho dos pixels é invertido antes da modulação. Como resultado, as ondas maiores correspondem aos pixels mais escuros. Além disso, a imagem é refletida da esquerda para a direita, ou seja, uma imagem espelhada é formada. Gostaria de saber o que pensam os leitores deste material sobre o motivo de inverter o brilho dos pixels antes de transmitir o sinal. Suspeito que seja porque a visão humana se sente mais confortável com pixels pretos espalhados aleatoriamente do que com pixels igualmente brancos. Afinal, o ruído nas linhas telefônicas é um problema que a VisiTel definitivamente teve que enfrentar em 1988.





Investigação de sinal



É verdade que houve uma exceção ao esquema de codificação de imagem acima que me iludiu por várias semanas. Ao usar este esquema de codificação invertido, pixels perfeitamente brancos devem ser representados por silêncio. Não deve haver nenhum sinal representando esses pixels. Mas tive a sensação de que os criadores do VisiTel não gostaram da ideia. Em vez disso, para codificar pixels totalmente brancos, o sinal da portadora foi deslocado em 1/4 do comprimento de onda, resultando em tais ondas fora de fase com as normais. Nesse caso, o sinal, como antes, poderia ser enviado para outro dispositivo. O dispositivo receptor, ao receber tal sinal, manteve a sincronização com o sinal "normal" e tomou informações sobre a amplitude do sinal no mesmo lugar de costume, mas agora nesses momentos a onda passou por 0,o que deu aos pixels brancos. Como eu já disse, se você desligar o som durante a transferência da imagem, o VisiTel continuará exibindo a imagem até que o buffer esteja cheio. Estes são pixels brancos. Como resultado, verifica-se que o silêncio, mesmo sem a presença de um sinal útil na linha, é percebido pelo dispositivo como branco. Não sei por que os criadores do dispositivo decidiram complicar o esquema de modulação, introduzindo esse modo de deslocamento de fase nele. Quanto a mim, muito esforço foi despendido nisso, mas ou não há benefício com tal passo, ou é muito insignificante.para o qual os criadores do dispositivo decidiram complicar o esquema de modulação, introduzindo um modo de deslocamento de fase nele. Quanto a mim, muito esforço foi despendido nisso, mas ou não há benefício com tal passo, ou é muito insignificante.para o qual os criadores do dispositivo decidiram complicar o esquema de modulação, introduzindo tal modo de deslocamento de fase nele. Quanto a mim, muito esforço foi despendido nisso, mas ou não há benefício com tal passo, ou é muito insignificante.



Eu, sem saber sobre modulação de deslocamento de fase, inicialmente tentei encontrar o máximo de cada uma das ondas e representar o valor resultante como um pixel. As quebras de linha foram realizadas com uma etapa calculada pela fórmula 96*( ). Isso levou ao fato de que em algumas linhas havia um pouco mais ou um pouco menos pixels. Além disso, essa abordagem rudimentar de análise de sinal era muito sensível ao ruído, uma vez que mesmo pequenos picos nas ondas podiam levar ao aparecimento de pixels extras. É verdade que esse mecanismo de decodificação de imagem era muito simples de implementar. Implementar essa ideia simples poderia decodificar imagens sem a necessidade de sincronizar o receptor e a fonte. Mas depois de aplicar esse sistema de decodificação de sinal, nada decente aconteceu comigo.



Para decodificar as imagens com mais precisão, precisamos fazer o mesmo que o VisiTel faz. Ou seja, você precisa sincronizar com o sinal no momento do processamento do cabeçalho e, em seguida, amostrar o sinal em intervalos regulares. Não é de surpreender que esse processamento de sinal exija um tempo muito preciso. No meu caso, ao gravar som com uma frequência de 44100 Hz, existem 25,23158 amostras por onda (isso significa que a frequência da onda portadora é 1747,80968929 Hz). Como resultado, toda vez que lermos informações sobre um pixel, procuraremos no buffer de áudio os dados do próximo pixel a uma distância de 25,23158 amostras do anterior. Como as posições das amostras são descritas por valores inteiros, simplesmente arredondamos o número correspondente para o inteiro mais próximo e o usamos. O mais importante aqui é evitar o acúmulo de erros de arredondamento,pois isso fará com que a posição de amostragem saia rapidamente da fase em relação à onda sonora. E se um deslocamento semelhante ocorrer durante a decodificação da imagem, embora pequeno, a imagem finalizada será preenchida com artefatos.





Imagem cheia de artefatos



Felizmente para mim, o número de amostras por onda é bastante estável. Não mudou depois que o dispositivo aqueceu, embora eu estivesse preocupada que isso pudesse ser um problema. Essa estabilidade me permitiu simplesmente codificar o valor apropriado no código de decodificação da imagem. Idealmente, o número de amostras por onda deve ser aprendido com o título, mas descobri que não havia amostras suficientes para atingir uma precisão de 5 casas decimais. E o valor, embutido no código, tornou possível alcançar resultados estáveis. Graças a esta implementação mais precisa do sistema de decodificação de sinal, as quebras de linha foram simplesmente executadas após a função que gera 1 pixel ser chamada 96 vezes.



Até agora, trabalhei com trechos pré-gravados de áudio decodificados de arquivos WAV. Para funcionar de forma interativa e decodificar as imagens que entram na interface de áudio de um computador, o decodificador deve ser equipado com a capacidade de detectar o cabeçalho e localizar o início dos dados da imagem. Se você olhar o título, verá que há três fragmentos claramente distinguíveis nele.





Análise do cabeçalho: Portadora - Silêncio - Portadora



Para detectar isso, implementei um detector simples baseado em FFT e uma máquina de estado. O material de origem é processado primeiro e, em seguida, o detector examina cada bloco do sinal de áudio até encontrar um sinal forte de 1747 Hz. Os blocos são então examinados até encontrarem o local onde o sinal desaparece e reaparece. Isso significa encontrar o momento para iniciar a transmissão. Depois disso, um deslocamento estático simples é usado para encontrar a hora de início da transmissão de dados da imagem e os mecanismos acima são usados ​​para decodificar a imagem. Após a decodificação ser concluída, a imagem é exibida e a máquina de estado é redefinida para seu estado original e aguarda o início da próxima transmissão.



Etapa 3. Apresentando VisiTel como uma webcam



Agora que conseguimos decodificar a imagem recebida do VisiTel, resta colocar a última peça do quebra-cabeça no lugar. Precisamos apresentar as imagens decodificadas na forma de quadros de vídeo e transmitir o fluxo de vídeo para o programa de videoconferência. Isso é surpreendentemente fácil no Linux. A entrada de vídeo é abstraída usando a interface V4L2, mas isso infelizmente acontece no espaço do kernel. Para não se envolver com as complexidades associadas à criação de um módulo do kernel, você pode usar uma solução pronta - v4l2loopback... Este módulo é um dispositivo de entrada e um dispositivo de saída. A entrada de gráficos que é passada para ele se torna uma saída que outros programas como o Zoom podem aceitar. Existem até pacotes Python que abstraem tudo ainda mais, permitindo que você trabalhe com esse tipo de dados usando OpenCV e NumPy. Eu usei um desses pacotes - pyfakewebcam. Possui uma interface extremamente simples. Para criar uma webcam virtual, basta fazer o seguinte:



import
      pyfakewebcam
self.camera
    =
    pyfakewebcam.FakeWebcam(self.v4l2_device, 640, 480)


E quando você receber um novo quadro, você precisa fazer isso:



self.camera.schedule_frame(output)


Agora, depois dessa pequena adição ao decodificador, tudo funcionou como deveria. O Zoom pode receber imagens do VisiTel, e podemos organizar vídeo-chat no estilo dos anos 1980.





Vídeo chat no espírito dos anos 1980



Eu também gostaria de instalar o driver Direct Rendering Manager Linux, que permitirá não só receber imagens do VisiTel, mas também enviá-las para ele. Mas, por agora, para reconhecer este projeto como um sucesso, basta-me comunicar em Zoom com um aparelho de 1988. Aqui , se você estiver interessado, está o código do projeto no GitHub.



Você já tentou dar uma segunda vida a alguns dispositivos de um passado distante?










All Articles