Fazendo um modem de sonar simples

Olá querida!


Neste artigo, pela demanda popular, mostraremos como fazer um modem hidroacústico simples: um pouco de processamento de sinal digital, um pouco de programação, um pouco de placas de circuito impresso caseiras e uma gota de hidrologia prática.

A todos aqueles que estão interessados ​​- pedimos que seja bem-vindo, ao mundo reverberante da comunicação subaquática!

E aqui está a imagem relevante, para atrair atenção:



"Em última análise, o significado da nossa existência é gastar energia ... E, se possível, você sabe, para que seja interessante para si e para os outros seja útil."
(C) ABS, meio-dia, século XXII

Economize seu tempo - Resumo


  • Modems acústicos ainda não são vendidos no Aliexpress
  • Existe um método simples e pouco exigente para a detecção de tons de recursos de computação, cuja frequência é 4 vezes menor que a frequência de amostragem; Arduino é suficiente para implementação
  • O exemplo de código para PC está no GitHub
  • Fabricamos antenas de recepção e transmissão de selecionadores de torta de 10 r cada
  • Compramos (ou fazemos sozinhos) uma placa amplificadora no TDA2030 em Ali por 50 rublos
  • Fabricamos um pré-amplificador LUT-ohm, com um custo total de ~ 100 rublos
  • Nós nos conectamos e vamos para a lagoa
  • Regozijar-se

Prelúdio Motivacional


Agora você pode comprar quase tudo no Aliexpress ou eBay. Especialmente muitas coisas diferentes para a fabricação independente de algo eletrônico baseado no Arduino. Você pode criar (se você simplesmente não comprar isso interessante) uma estação meteorológica de parada múltipla com conexão à Internet, um alimentador automático de gatos, um controlador de cervejaria em casa, mas ainda não pode comprar um modem de sonar, um projetista para sua fabricação ou pelo menos um módulo para adruino. Bem e bom! E não - agora vamos dizer como fazê-lo e também como funciona.

Durante muito tempo, todo o laboratório pensou no que pode ser oferecido aos amantes de fabricação independente. Algo muito simples, que pode ser coletado por um aluno e de um pedaço de pau e uma corda do que todos têm em mãos, mas ao mesmo tempo necessariamente representando pelo menos um valor prático ou educacional mínimo.

Algo que promete uma melhoria longa e emocionante, algo que pode ser transferido posteriormente para o arduino , se estiver errado .

Se abordarmos a questão materialmente, gostaríamos de oferecer um tutorial detalhado para a fabricação de um dispositivo simples que seria mais ou menos capaz de transmitir dados em um corpo de águas rasas (um canal de sonar raso é o mais complexo), o que significaria a produção máxima de uma placa de circuito impresso usando LUT, com um custo total não superior a trezentos rublos em pontos mínimos.

O que faremos hoje?


  • lembre-se de como fazer uma antena de sonar adequada e faça um par;
  • conecte uma das antenas a um PC através de um amplificador no TDA por ~ 50 rublos e obtenha um transmissor;
  • no segundo, faremos um pré-amplificador usando ~ LUT por ~ 100 rublos;
  • escreveremos (eu já escrevi tudo e coloco no Git) um modem simples em C # e tentaremos tudo no corpo d'água mais próximo;

Do que precisamos para isso?


  • dois elementos piezoelétricos. Por exemplo, de um relógio ou cartão postal ;
  • Cabo RG-174 / U (ou similar) ~ 5 metros;
  • selante acético;
  • verniz resistente à água;
  • textolite de folha, um total de aproximadamente 100x200 mm;
  • um amplificador para TDA2030 (por exemplo, um por 50 rublos);
  • componentes de pré-amplificador

Como isso funciona?


Toda a idéia do modem mais simples é construída, mais uma vez, no detector mais simples (coincidência?) De um certo tom, sobre o qual, para minha vergonha, eu não ouvi. Me contou sobre ele completamente por acaso andrey_9999a . A propósito, ele também fez uma placa de pré-amplificador.

A esse respeito, lembrei-me de uma citação do livro de Leonard Sasskind "A Batalha do Buraco Negro":
“Como conhecedor de vinhos, tenho mais ou menos certeza de que, mesmo com os olhos fechados, consigo distinguir vermelho de branco. Ainda mais confiável, eu distingo vinho de cerveja. Mas então o gosto vai me decepcionar.
Posso dizer a mim mesmo que, como engenheiro eletrônico de verdade, tenho mais ou menos certeza de que posso definitivamente soldar dois fios grossos. Ainda mais confiável, eu distingo um ferro de soldar quente de um frio, mesmo com os olhos fechados, mas a habilidade me decepciona. Portanto, tudo relacionado ao desenvolvimento e fabricação de placas é o trabalho dos meus camaradas e colegas andrey_9999a e StDmitriev .

Então, de volta ao detector. É um caso particular simplificado de computação da integral de Fourier:

 int0Tf(x)sen( omegat)dt


No caso de um sinal digital, para calcular a amplitude de uma harmônica arbitrária, será necessário executar uma transformada de Fourier discreta, para Arduina isso é difícil, mas o truque é que se você tomar Fc como frequência portadora, será exatamente 4 vezes menor que a frequência de amostragem Fs , então a amplitude desse harmônico pode ser calculada demonicamente mais fácil.

Nesse caso, dt = 2π * (Fs / 4) / Fs = π / 2 , e apenas 4 amostras caem no período da transportadora:



Se tudo for deslocado por π / 4, as amostras terão apenas dois valores: √2 / 2 e -√2 / 2; por simplicidade, deixaremos apenas os sinais - "+" e "-" .

A essência do método é que representamos a fase senoidal como uma sequência de sinais "+" "+" "-" "-" e a fase cosseno como "+" "-" "-" "+" .

Deixe o sinal de entrada estar no buffer sn , temos dois buffers de média de anel para as fases seno e cosseno - bs e bc do tamanho N. Ponteiros para a cabeça e cauda são comuns para eles - bH e bT . No momento inicial do tempo, bH = N-1, bT = 0 . Contador de ciclo médio C = 0 .

Tomamos 4 amostras do buffer de entrada e as adicionamos de acordo com as seqüências de caracteres.

Exemplo de código
a = sn(i)
bs(bH) = a
bc(bH) = a
s1 = s1 + a - bs(bT)
s2 = s2 + a - bc(bT)
bH = (bH + 1) % N
bT = (bT + 1) % N

a = sn(i+1)
bs(bH) = a
bc(bH) = -a
s1 = s1 + a - bs(bT)
s2 = s2 - a - bc(bT)
bH = (bH + 1) % N
bT = (bT + 1) % N

a = sn(i+2)
bs(bH) = -a
bc(bH) = -a
s1 = s1 - a - bs(bT)
s2 = s2 - a - bc(bT)
bH = (bH + 1) % N
bT = (bT + 1) % N

a = sn(i+3)
bs(bH) = -a
bc(bH) = a
s1 = s1 - a - bs(bT)
s2 = s2 + a - bc(bT)
bH = (bH + 1) % N
bT = (bT + 1) % N


Após cada quatro amostras processadas, verificamos o contador dos ciclos médios e, se excedeu N , calculamos a amplitude da portadora cA :

 if ++cycle >= N cA = sqrt(s1 * s1 + s2 * s2) cycle = 0 end 

É assim que fica em um sinal ideal:



O sinal em si é mostrado em azul e os valores de amplitude da portadora são mostrados em vermelho (tudo é reduzido para a faixa -1..1). Nesse caso, N = 2 desde não há barulho e tudo funciona bem de qualquer maneira.

Agora adicione um pouco de ruído branco e veja como nosso detector responderá a isso:



Adicionei ruído branco para que a relação sinal-ruído fosse de 0 dB. Na figura acima, o sinal de ruído é mostrado em azul, o sinal da fonte em verde e o valor da amplitude em vermelho. Nesse caso, o detector em N = 2 já não detectou nada, e o N mínimo no qual ele funciona corretamente é 32. Ou seja, o tamanho da janela de processamento nas amostras era 32 * 4 = 128 amostras.

Ou seja, agora podemos analisar o sinal de entrada e avaliar um parâmetro que quantifica a presença de uma frequência, quatro vezes menor que a frequência de amostragem. Se você definir um determinado valor limite para esse parâmetro, tudo poderá ser binarizado e, falando de uma maneira simples, podemos responder à pergunta: existe um tom específico no sinal de entrada ou não?

Isso é muito bom, mas precisamos transmitir bits, e os bits podem assumir dois valores.

Implementar um sistema com dois estados de sinalização com a ajuda de um é uma idéia mais ou menos, portanto, não codificaremos um dos estados com silêncio (pausa). Isso tornaria a detecção muito difícil: seria necessário destacar de alguma forma o início da premissa, descobrir como organizar seu fim etc.

Em vez disso, "1" e "0" codificaremos com pulsos de diferentes comprimentos, entre os bits existe o chamado intervalo de guarda - porque ainda precisamos lidar com a propagação de caminhos múltiplos e reverb. Em termos simples, o intervalo de guarda é o local (hora) em que todas as reflexões do bit anterior, todos os sons posteriores e ecos desaparecem.

Olhando para o futuro, levamos em conta que, com essa estrutura de sinal, o algoritmo de operação do receptor é bastante simplificado: esperamos o tom aparecer, notamos o início, esperamos que o tom desapareça e notamos novamente o tempo - se o tempo recebido for mais do que "1", provavelmente levamos um pouco com o valor "1", se parecer mais com "0" - então aparentemente levamos um pouco com o valor "0".

Em geral, podemos dizer que esse é algum tipo de código morse.

Parte do software do modem


Para os impacientes - um exemplo está no GitHub . Foi criado em C # (porque para o PC eu escrevo nele e é mais conveniente e rápido para mim).

A maravilhosa biblioteca do NAudio é usada para reproduzir e capturar som da entrada do microfone.

Toda a lógica do modem está na classe SUAModem (Modem acústico subaquático simples).

Os seguintes parâmetros são passados ​​para o construtor:

sRateHz duplo - taxa de amostragem em Hertz;
int wSize - o tamanho da janela de processamento nas amostras;
int oneMultiplier - quantas "janelas" duram um pouco com o valor "1"
int zeroMultiplier - quantas "janelas" duram um pouco com o valor "0"
eThreshold duplo - limiar, vamos falar sobre isso mais tarde

Para gerar um sinal a partir de uma matriz de bytes, existe um método ModulateData (byte [] data)), que retorna uma matriz de amostras assinadas de 16 bits.

public short [] ModulateData (byte [] data)
 public short[] ModulateData(byte[] data) { double alpha = 0; double phase = 0; List<short> samples = new List<short>(); BitArray bits = new BitArray(data); for (int i = 0; i < bits.Length; i++) { int sLim = (bits[i]) ? oneDurationSmp : zeroDurationSmp; alpha = 0; phase = 0; for (int sIdx = 0; sIdx <= sLim; sIdx++) { alpha = Math.Sin(phase); phase += delta; if (phase >= alimit) phase -= alimit; samples.Add(Convert.ToInt16(alpha * short.MaxValue)); } samples.AddRange(new short[defenseIntervalSmp]); } return samples.ToArray(); } 


No loop principal por bits transmitidos, a lista de amostras é preenchida. Dependendo do bit transmitido atual, o comprimento sLim do sinal gerado nas amostras é definido. Um intervalo de guarda é adicionado após cada bit.

Claro ...
Muitos podem perceber que, ao gerar um sinal, seria possível sem a função seno, mas este exemplo permite, alterando o valor delta de acordo, alterar a frequência do tom gerado.

Para gerar um tom com uma frequência Fna uma determinada taxa de amostragem Fsvalor correspondente  deltacalculado simplesmente:

 delta=2 piFn/Fs



Para gerar e emitir um sinal, existe o método TransmitData (byte [] data)), que internamente chama ModulateData:

público TransmitData duplo (dados de byte [])
 public double TransmitData(byte[] data) { var samples = ModulateData(data); double txTime = ((double)samples.Length) / SampleRateHz; var rawBytes = new byte[samples.Length * 2]; for (int i = 0; i < samples.Length; i++) { var bts = BitConverter.GetBytes(samples[i]); rawBytes[i * 2] = bts[0]; rawBytes[i * 2 + 1] = bts[1]; } using (var ms = new MemoryStream(rawBytes)) { using (var rs = new RawSourceWaveStream(ms, new WaveFormat(Convert.ToInt32(SampleRateHz), 16, 1))) { using (var wo = new WaveOutEvent()) { wo.Init(rs); wo.Play(); while (wo.PlaybackState == PlaybackState.Playing) { Thread.SpinWait(1); } } rs.Close(); } ms.Close(); } return txTime; } 


A classe SUAModem relata a aceitação do próximo byte usando o evento DataReceivedEventHandler.

As amostras de entrada são enviadas para a análise usando o método ProcessInputSignal (dados curtos []), onde são gravadas no buffer do anel. A análise ocorre em um thread separado, no método Receiver.

E o próprio receptor vive no método Receive:

void privado Receive ()
 private void Receive() int a; while (rCnt >= 4) { a = ring[rRPos]; rRPos = (rRPos + 1) % rSize; rCnt--; dRing1[rHead] = a; dRing2[rHead] = a; s1 += a - dRing1[rTail]; s2 += a - dRing2[rTail]; rHead = (rHead + 1) % windowSize; rTail = (rTail + 1) % windowSize; a = ring[rRPos]; rRPos = (rRPos + 1) % rSize; rCnt--; dRing1[rHead] = a; dRing2[rHead] = -a; s1 += a - dRing1[rTail]; s2 += -a - dRing2[rTail]; rHead = (rHead + 1) % windowSize; rTail = (rTail + 1) % windowSize; a = ring[rRPos]; rRPos = (rRPos + 1) % rSize; rCnt--; dRing1[rHead] = -a; dRing2[rHead] = -a; s1 += -a - dRing1[rTail]; s2 += -a - dRing2[rTail]; rHead = (rHead + 1) % windowSize; rTail = (rTail + 1) % windowSize; a = ring[rRPos]; rRPos = (rRPos + 1) % rSize; rCnt--; dRing1[rHead] = -a; dRing2[rHead] = a; s1 += -a - dRing1[rTail]; s2 += a - dRing2[rTail]; rHead = (rHead + 1) % windowSize; rTail = (rTail + 1) % windowSize; if (++cycle >= windowSize) { cycle = 0; currentEnergy = Math.Sqrt(s1 * s1 + s2 * s2) / windowSize; double de = currentEnergy - prevEnergy; #region analysis if (skip > 0) skip -= windowSize * 4; else { if (isRise) { if (de > -Threshold) { riseSmp += windowSize * 4; } else { // analyse symbol isRise = false; double oneDiff = Math.Abs(oneDurationSmp - riseSmp); double zeroDiff = Math.Abs(zeroDurationSmp - riseSmp); if (oneDiff > zeroDiff) { // Mostly likely "0" AddBit(false); } else { // Mostly likely "1" AddBit(true); } samplesSinceLastBit = 0; skip = defenseIntervalSmp / 2; } } else { if (de > Threshold) { isRise = true; riseSmp = windowSize * 4; } } } #endregion prevEnergy = currentEnergy; if (bPos > 0) { samplesSinceLastBit += 4 * windowSize; if (samplesSinceLastBit >= defenseIntervalSmp * 2 + zeroDurationSmp + oneDurationSmp) { DiscardBits(); } } } } } 


Pode ser visto no código que a análise é realizada em 4 amostras. Se desejar, você pode salvar o estado e processar uma amostra, o que será útil ao transferir para algum MK fraco.
À medida que os dados são recebidos, o valor da amplitude s é calculado na frequência sRateHz / 4. A diferença entre os valores anteriores e atuais da amplitude é calculada e depois comparada com um determinado limiar, selecionado experimentalmente. Um exemplo permite alterar esse limite em tempo real.

Um aumento acentuado da amplitude indica o início de um "bit", um declínio acentuado (um pouco menos acentuado devido à reverberação) indica o final de um "bit".

Após receber o próximo bit, calculamos o intervalo de proteção - pulamos o número especificado de amostras - há todos os tipos de ecos neles, eles apenas interferem conosco.

A parte de ferro do modem


Então, com a estrutura do sinal, tudo está claro, como recebê-lo com muita clareza. O pequeno é aprender a irradiar um sinal na água e recebê-lo da água.

Se você ainda não possui antenas de sonar, é hora de fazê-las em nosso tutorial anterior .

Eu fiquei com eles a partir desse momento, então pulo esta etapa.

Conectamos a antena destinada à transmissão na placa do amplificador com aliexpress . Por várias dezenas de metros (talvez até centenas), isso é suficiente para nós. Não há truques aqui - a saída da placa de som do laptop vai para a entrada do amplificador, que é alimentado por uma bateria de 12 volts e 4 Ah de ácido-chumbo. Nossa antena transmissora hidroacústica de um tweeter piezo está conectada à saída. No meu caso, fica assim:





Na foto acima, na tela há um pequeno spoiler para o próximo artigo. Da próxima vez nas mesmas glândulas, tentaremos novamente transmitir o som do "vídeo" através da água, mas de uma maneira completamente diferente da última vez .

Com uma antena receptora é um pouco mais complicado. Embora os tweeters piezo sejam muito sensíveis, isso ainda não é suficiente. Teremos que montar uma placa de pré-amplificador com um filtro na faixa de 5-35 kHz.
O ganho que obtemos é 1000.

O circuito, o design da placa de circuito e a lista de componentes do pré-amplificador estão no nosso GitHub: circuito , faixas - camada superior e inferior , BOM .

A tecnologia LUT foi discutida centenas de vezes, mas vamos também fazer a nossa parte.

Foto do processo
Então, pegamos uma revista adequada, só tínhamos esta em mãos:



Pegamos algumas páginas de lá e imprimimos as camadas usando uma impressora a laser.



Combine com agulhas e cola de um lado, como mostra a foto:



Antes de usar o ferro, umedecemos o toner com álcool isopropílico:



Passe a folha A4 dobrada quatro vezes:



Mergulhe em água morna sob a torneira:



E lavamos os restos de papel. Depois disso, preparamos uma peça para gravura:



Cortamos o excesso com a ajuda de uma tesoura para metal ou para quem é mais conveniente.

Envenenamos em cloreto férrico. Especialmente para o artigo, lançamos uma novidade que acabou sendo tão exigente que as bolhas vêm ativamente do futuro fórum:



Como resultado, após a gravação e lavagem do toner, obtemos um produto semi-acabado:





Depois de soldar os componentes e lavar, a placa fica assim.



E parece com a montagem da peça receptora. A energia é fornecida a partir da mesma bateria de 12 volts:



Isenção de responsabilidade de filtro pequeno
Se o leitor quiser mudar a banda, propomos recontar o filtro de 8ª ordem montado em um opamp barato de TL084C de 4 canais (DA2 no diagrama ), resistores R10-R13, R15-R23 e capacitores C5-C8, C11, C12, C14 e C15

Apenas no caso, aqui está a resposta de frequência da implementação atual do filtro:



E aqui está outro projeto para esse filtro criado no aplicativo Qucs

Experiências e testes


Para conectar a um laptop, usamos um conector comum de 3,5 mm, a ponta é um sinal, a do meio não está conectada, a terra - poeira em poeira no chão. Todas as amplificações e todos os efeitos do microfone devem ser desligados e o volume precisará ser reproduzido para atingir o nível ideal. A cadência deve ocorrer quando você toca na antena conectada ao pré-amplificador com o dedo e acaricia-o levemente.

Se você simplesmente colocar uma peça na outra sem um amplificador e pré-amplificador e conectá-las à entrada e saída de áudio, tudo funcionará perfeitamente. Abaixo está uma seção do sinal e você pode até determinar, a olho nu, onde estão os valores dos bits:



O sinal em si é mostrado em azul, a diferença entre os valores atuais e anteriores da amplitude (frente) em vermelho e a diferença entre os valores anteriores e atuais (declínio) em verde. Você pode facilmente "desmodular" esta parte da premissa: 1 0 0 0 1 1 0. Nosso zero é duas vezes maior que a unidade, e a duração do intervalo de guarda é igual à duração de zero.

Além disso, também sem um amplificador e pré-amplificador, abaixamos nossas antenas em um tanque de metal, com dimensões 3x1,5x1,5. Temos isso no laboratório e fizemos uma regra de que não fazemos comunicação se ela não puder trabalhar neste tanque. O fato é que, em um volume tão fechado de energia, não há para onde ir - o som é maravilhoso e repetidamente refletido das paredes de metal e no ponto de recepção do mingau é obtido. E, como geralmente verificamos dispositivos prontos com energia calculada para milhares de metros, você pode imaginar o que está acontecendo lá.

Por exemplo, dois de nossos modems RedLINE funcionam de forma estável neste tanque apenas a uma distância não superior a dois metros, e dois uWAVEs trabalham de forma estável a cerca de 1 metro. Enquanto o primeiro em águas abertas trabalha até 8000 metros, e o segundo - até um quilômetro .
Obviamente, todos os produtos comerciais não usam esses esquemas de modulação primitiva, que são discutidos no artigo e são muito mais complicados, mas agora é importante entendermos o básico e fazermos algo útil com nossas mãos.

Em geral, baixamos as antenas no tanque a uma distância de cerca de 50 centímetros e já conseguimos algo muito menos bonito do que com o contato direto das antenas:



Embora um intervalo de guarda muito mais longo seja usado aqui, ainda é visível que o eco caminha quase até o próximo bit, as frentes e, principalmente, os mergulhos estão muito embaçados. Mas você ainda pode determinar o conteúdo da mensagem: 1 0 0 0 1 1 0

Nos dois casos, enviei a mensagem "123" e esses sete bits pertencem ao símbolo da unidade.
Parecia algo assim, então a interface foi levemente refeita



Na tela acima, pode-se ver que, com essas configurações, a transmissão da mensagem “Olá, habr !!! :-) ", composto por 19 bytes, leva 9.132 segundos, ou seja, a velocidade de transmissão foi de 16,6 bits / s. A propósito, para que o modem funcionasse em nosso tanque, tivemos que aumentar o intervalo de guarda para que a velocidade de transmissão caísse para ~ 3 bits / s.

Verificamos o trabalho caseiro na piscina, onde ele ganhava 10 metros constantemente.



Também nos entregamos a trabalhos caseiros na lagoa. Usei um hidrofone ativo de design muito semelhante ao proposto no artigo, mas em vez de um tweeter piezo foi utilizado um sensor dos sensores de estacionamento, a bateria foi montada ali em uma bobina na qual o cabo foi enrolado:





A antena do receptor e do transmissor desceu diretamente da costa, a profundidade lá agudamente varia de 0,5 a 2 metros. Curiosamente, no experimento mostrado na foto acima, as piores condições foram, a distância era de apenas 5 metros - essa era geralmente a configuração inicial. Das 20 mensagens transmitidas, 3 bytes cada, em seis delas um byte foi atingido.

Então, quando conectamos o receptor a um segundo laptop e o movemos para o outro lado da lagoa (distância de cerca de 30 metros), a transmissão foi muito melhor - houve apenas alguns erros com 40 mensagens variando em tamanho de 3 a 13 bytes.



Na próxima foto no mapa, os locais onde as antenas foram localizadas são visíveis.



Conclusão e pesquisas adicionais


Como prometido, por alguns rublos montamos um dispositivo de trabalho. Embora seu valor prático seja duvidoso, o processo de fabricação e ajuste em uma lagoa será muito útil para iniciantes. Usando o método de detecção de portadora descrito, é bem possível criar vários sistemas de navegação simples para uso amador e, o que é especialmente interessante, a complexidade computacional permite implementar o método em um microcontrolador simples.

Para não ser infundado com relação à construção de sistemas de navegação em sinais simples, dê uma olhada no interessante trabalho em que eles construíram um sistema de navegação de longo alcance completo. Nesse sistema, é determinada a posição do ponteiro, que transmite periodicamente sua profundidade. O valor da profundidade é codificado pela distância entre dois pulsos simples em uma determinada frequência. Então sim, sim, os vasos não são queimados pelos deuses, a estrada será dominada pelo andador, paciência e trabalho, estudo, estudo, estudo - isso é tudo.

Talvez, se tivermos tempo, faremos um projeto DIY para posicionar um dispositivo autônomo emitindo sinais simples. Já fizemos algo semelhante, mas não DIY, com base nos modems uWAVE , sobre os quais tentamos gravar um vídeo . Será muito interessante ouvir suas opiniões sobre esse assunto - é muito importante ter a confirmação de que você está fazendo algo não em vão.

No entanto, voltando ao tópico principal, notamos o que poderia ser melhorado no esquema proposto:

  • tornar o cálculo de limiar adaptável
  • analisar larguras de sinal automaticamente
  • tente usar comprimentos diferentes para diferentes combinações de bits
  • aperte a codificação de correção de erros
  • transferir tudo para o arduino
  • o volume e o limiar precisam ser longos e tediosos para selecionar; portanto, seria bom adicionar AGC ao pré-amplificador

Nesta reunião, declararei encerrado e, se você estiver interessado no tópico, aqui está uma lista de nossos artigos anteriores:

GPS subaquático do zero por ano
GPS subaquático em um robô subaquático: experiência
Fabricamos o menor modem de sonar do mundo
Sobre o efeito das cianobactérias nas funções de fala do presidente
Fazendo uma simples antena de sonar com o lixo
Sessão de transmissão de vídeo de som através da água com exposição
GPS subaquático em dois transceptores
Navegação debaixo d'água: Rolamento não rolamento - você está fadado ao sucesso
GPS subaquático: continuação

PS


Como sempre, estamos felizes em ouvir comentários e sugestões, críticas e aplausos)

PPS


Não remova as glândulas longe - da próxima vez, usá-las novamente para transmitir o "vídeo" através da água.

Source: https://habr.com/ru/post/pt451800/


All Articles