Rádio de internet de tubo quente



Este é o ofício mais duradouro da minha vida. Demorou 12 anos desde a ideia até a implementação final, para que pudesse ser usado! Durante esse tempo, um número colossal de eventos aconteceu: deslocamentos, nascimentos, mortes, mas a ideia estava comigo e não importava o que acontecesse, eu a concluí. E quero falar sobre os caminhos, espinhos, aspirações que acompanharam esse ofício e o que resultou dele.



Idéia



Eu vi a própria ideia de um rádio Wi-Fi baseado em um roteador há muito tempo neste projeto . Na verdade, estamos em 2009. Era um rádio baseado em roteador, Linux e daemon mpd. Então, esses termos não eram totalmente claros para mim, mas eu realmente queria ter um rádio assim. E eu acionei essa ideia. Além disso, fiquei muito inspirado por qualquer tecnologia de lâmpada: lâmpadas amplificadoras, lâmpadas indicadoras (6E1P, que está na minha foto de perfil), telas CRT . E os visores de VFD (VFD - Vácuo Fluorescente Display ou em Vácuo-luminescente russo (VLI), ou catodoluminescente (CLI)) também são muito agradáveis.



Portanto, decidi usar um visor de dinheiro. Então eu nem sabia como era chamado exibição do comprador.



Então a ideia: um display do comprador, algum computador de placa única ou roteador, Linux + mpd, um indicador fluorescente a vácuo e algum tipo de controle para essas coisas. Semelhante ao projeto que me inspirou.



Eu entendo que cheguei muito atrasado com esta nave, já que há um monte de opções diferentes para rádio wi-fi. Mas ainda difere conceitualmente, ainda hoje, do resto, e acho que será interessante ler sobre a criação de tal dispositivo. Além do mais, fiz isso pela alma e não pela venda.



Conceito e design básicos



Essa rádio daqueles anos (cerca de 2010) tinha outro objetivo de projeto. Naqueles anos, eu estava estudando a língua sérvia e queria ter um dispositivo simples, onde receberia uma estação de rádio sérvia “ligando o botão”. Telefones, computadores não eram uma opção, pois eles próprios me distraíam muito: enquanto você abre, você vai esquecer o que estava fazendo. Em segundo lugar, eu realmente queria que o pedaço de ferro permanecesse o mais semelhante possível a um rádio familiar comum e até mesmo uma pessoa idosa poderia usá-lo. E, por último, eu queria que os controles fossem minimalistas: um botão.



Fiquei muito inspirado pelas soluções de design dos anos 30-40 do século 20 em arquitetura, interiores e, em particular, no design de receptores de rádio. Este estilo é denominado Art Deco. No nosso país, um representante brilhante deste estilo é o edifício da Biblioteca Lenin, a estação de metro Aeroport, Mayakovskaya, Krasnoselskaya (mais precisamente, tem a influência deste estilo). Se falamos dos receptores (cujo design eles já receberam da arquitetura), então as opções mais interessantes foram aquelas com a escala no topo.





Decisões de design que inspiraram fortemente



Claro, inicialmente o corpo deste rádio foi planejado para ser feito de madeira nobre, como um receptor em cima. E até uma vez aqui na Habré conheci um designer que estava fazendo um projeto parecido (não me lembro qual, desculpe); e até fizemos alguns esboços, pensamos no projeto, mas mesmo assim não me atrevi a seguir um caminho tão sério, mas em vão ... Em geral, foram muitos os sonhos e desejos estranhos. Mas tudo se resumiu a uma realidade cruel.



Primeiros passos de implementação



A base de todo rádio Wi-Fi é a tela do comprador. Selecionei o display por um longo tempo, estupidamente fui às compras e vi o que eu mais gosto. Eu gostei mais da tela Posiflex PD-2700 . Eu parei nisso.





Ligando pela primeira vez e exibindo uma imagem na tela.



Escrevi um artigo separado sobre como trabalhar com esses monitores. Você pode ler aqui . Portanto, não me deterei no princípio de seu trabalho em detalhes.



O roteador TP-Link 3020, Nokia N800 (sim, não se surpreenda, N800), vários laptops, computadores industriais de todos os tipos, caixas registradoras, Raspberry Pi de várias gerações, dispositivos de placa única e muito mais foram experimentados como os "cérebros" deste rádio. Tudo fala da universalidade das decisões tomadas. E olhando para o futuro, algumas decisões foram tomadas em prol da portabilidade, e não para reduzir o custo de construção.



Mas, em geral, não gostei de todas essas soluções, ou eram excessivas em termos de capacidade para tal tarefa, ou, pelo contrário, tinham desempenho muito baixo e problemas de reprodução de som (por exemplo, roteadores). A seguir, contarei os principais caminhos que segui na implantação do projeto. Sem ramos sem saída, como o Nokia N800 (por todo o romance dessa abordagem).



Protótipo de trabalho



O primeiro protótipo funcional, que era autônomo e até tocava rádio e ficava na cozinha, implementei na base de um roteador TP-Link 3020 e uma placa de som USB chinesa por 100 rublos. Este roteador é ótimo para esse tipo de artesanato, sua principal vantagem é que você pode comprar na loja de informática mais próxima, diferente de qualquer outra placa avulsa. O SO principal era o OpenWRT, o som era tocado através dos alto-falantes mais deshman, por 500 rublos, alimentados por USB. Em geral, tudo está embaixo. E até funcionou! Em suma, é melhor ver uma vez do que ler mil vezes.





Depois disso, ficou claro que controlar o vídeo a partir do tablet não é uma opção. O significado de rádio é perdido quando você pode usar o mesmo tablet. Portanto, decidi adicionar controle usando um codificador. Inicialmente, o codificador estava conectado ao GPIO desse roteador (sim, ele tem um GPIO a bordo), mas eu não gostei muito do seu trabalho e esta solução não era portátil, então no futuro fiz um controlador codificador separado baseado em arduino, que é conectado via UART.







O codificador é conectado ao GPIO TP-Link 3020.



Depois disso, foi necessário "configurar" a estação de rádio, e eu queria fazer com que parecesse em rádios antigos quando você gira o botão e o controle deslizante percorre a tela. Para isso, foi implementada uma fonte stick vertical, cinco peças. E eu sobrecarregava todas as vezes, leia sobre como baixar fontes em meu artigo . O resultado foi essa solução.





Bem, resta cruzar o próprio rádio com esses experimentos e, como resultado, temos um controle conveniente. Ele disse em poucas palavras, mas na verdade vários meses se passaram, mas o resultado é importante para mim.





Parece que tudo, mas como de costume com todos os meus amigos rádios amadores - o aparelho não tem case, e comecei a pensar no que fazer. Fiquei muito inspirado pelos receptores vintage abertos dos anos 30, onde havia apenas um canto com escudo e alças, e todas as tripas são soltas.





Uma variante do protótipo



decidi repeti-la. Para fazer isso, ele rasgou a coluna, removeu as dimensões dela e fez um protótipo de papelão.





Tiro os alto-falantes, tiro o amplificador e



faço as medições das dimensões. Depois de desmontar a coluna, retirei o amplificador de lá, tirei todas as dimensões da caixa, os botões do amplificador e do codificador e marquei tudo no papelão como ficaria.





Marcações de tamanho



pensei, que porra é brincadeira, deixa eu ver como vai ficar no papelão, uma espécie de protótipo de papelão.





Rádio em papelão



E até funciona!





Então ele copiou todas as dimensões, desenhou e as enviou para corte a laser.





Dimensões



Depois veio o acrílico cortado, e é assim que fica após a montagem.







No painel frontal há um botão liga / desliga, um codificador, um botão de volume. Por dentro, você pode ver que há uma fonte de alimentação independente, vários hubs, bem, vamos ser honestos, não parece muito bom.







Como muitos podem notar, o acrílico é transparente. Inicialmente, eu queria colocar a tela atrás dele para que brilhasse através dela (a tela já é branca, ela brilha através de um filtro verde). Mas não gostei da cor e do contraste.







Na foto, há luz através do acrílico laranja, uma cor honesta do display (na vida real é branco) e um filtro azul de um dos displays (agora tenho um verde no meu rádio).



O design resultante é legal, claro, mas não vou mentir para mim mesmo, não é prático. Claro, funcionou e eu até ouvi esse produto por algum tempo, mas uma série de problemas foram revelados. Em primeiro lugar, era completamente impossível utilizá-lo desta forma: acumula pó, não se pode pôr nada em cima, ocupa muito espaço. Em segundo lugar, o TP-Link 3020 revelou-se bastante fraco para rádio e muitos enfrentaram o problema de implementação nele. O OpenWRT não tem suporte de hardware para ponto flutuante e, portanto, o mpd carrega o processador em 100% e você pode ouvi-lo no som (há cliques digitais desagradáveis). Isso, em geral, põe fim a tal implementação. Além disso, várias circunstâncias da minha vida não me permitiram mais me envolver neste projeto, e este rádio foi desmontado e guardado literalmente em uma caixa.



Decisão final



Mas não pense que simplesmente desisti. Não, a ideia continuou viva. E agora, depois de um tempo, decidi terminar este rádio. E ficou tão bom que eu tinha uma caixa que comprei na China. Como cérebro, peguei o beaglebone black, com o qual trabalhei em um projeto e conheço seus lados bons e ruins. O lenço é velho, claro, mas cabe perfeitamente para essa tarefa. Inicialmente, eu queria colocar o OpenWRT como o sistema operacional principal, mas tive um monte de problemas com drivers de Wi-Fi lá. Peguei a placa de som no popular PCM2704 DAC. Ela é facilmente procurada neste pedido em um leilão popular, como um lenço branco. Estou muito satisfeito com a placa de som, mas no geral foi possível colocar qualquer, até a SoundBlaster.





Estágios de prototipagem, experimentando diferentes placas de som, dispositivos de placa única, imagens do Linux, adaptadores Wi-Fi e escolhendo a solução ideal



No meu último artigo, falei sobre como gastar tempo escolhendo componentes, caso contrário, haverá uma dor de cabeça. Aconteceu da mesma forma, eu queria um cartão USB Wi-Fi habilitado para Linux. E sem hesitação ele pegou o TP-Link N150 para si. Resumindo, não faça isso. Ela bebeu muito sangue de mim, passou uma semana com ela. Não consegui pegar no OpenWRT, no Ubuntu comecei com algumas danças violentas de pandeiro. Resumindo, instalei de acordo com este manual (há uma instrução em algum lugar no meio). O script de inicialização (/etc/rc.local) parece algo assim para mim (depois de um monte de experimentos).



#!/bin/sh
PATH="/sbin:/bin:/usr/bin"

ps -ef|grep wpa|awk '{print $2}' |xargs -i kill {}

#in case you want to test the script
ifdown wlan0
sleep 0.1
ifup wlan0
sleep 0.1
ifup wlan0
sleep 0.1
ifup wlan0
sleep 0.1
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
#END
sleep 30
#    


Em geral, depois de todas as provações, tudo começou e tudo isso foi montado e colocado no prédio. Não vou descrever todos os detalhes, porque cada um terá os seus. Mas fiz novas buchas para as pernas, o fundo era de compensado de baixo e prendi tudo nele. O display foi montado em molduras de madeira.





Painel frontal



Tudo é controlado por um codificador. Esquerda-direita - seleção de estação, pressionando o botão codificador - pausa; duplo toque curto no botão - exibição de hora e data (funciona como um relógio).





Painel traseiro



Apesar de se tratar exatamente de um rádio Wi-Fi, deixou a possibilidade de conexão via Ethernet para diagnóstico e depuração. Como você pode ver, não há amplificador no gabinete agora. Apenas um line-out, o que, na minha opinião, é ainda mais conveniente. Vamos dar uma olhada por dentro.







Dentro à esquerda vemos a fonte de alimentação, abaixo na face está um display em moldura de madeira, à direita na face há um codificador. Na parte superior do hub USB, ao qual a alimentação está conectada, o monitor também é alimentado por ele, uma caixa de som também é inserida no hub; a placa única fica em um canto de alumínio em prateleiras, aparafusada a madeira compensada. O controlador do codificador está escondido à direita, tem esta aparência.





Controlador de codificador



Este é um arduinka comum conectado via UART ao Beaglebone.



Algumas palavras sobre o código-fonte e as configurações



Percebi que, se uma descrição de código for adicionada a um artigo, sua legibilidade é imediatamente reduzida pela metade. Portanto, neste artigo haverá muito pouco código, embora dois artigos possam ser dedicados apenas à descrição do código. Não vou descrever a configuração do daemon mpd, há milhares de artigos, incluindo aqueles sobre o Habré, e o próprio manual geralmente é completo sobre ele. Vou omitir a configuração do Linux no Beaglebone. A menos que eu tenha que ligar o UART para conectar o Arduino. Mas isso também é facilmente pesquisado. O código-fonte de todo o projeto reside no github e está disponível para todos.



Não vou analisar todos os pontos do código. O trabalho com a tela foi abordado anteriormente no artigo. Vou revisar os arquivos.



A pasta arduino_encoder contém o projeto do codificador arduino. Tudo é intuitivamente claro lá e não vejo razão para resolver isso de alguma forma. Na pasta Linux, os códigos-fonte do próprio rádio, era esse código que vagava de projeto em projeto.



  • Makefile


Esta é uma montagem do próprio projeto, nada de novo aqui.



  • control.c


Este é o programa mestre onde toda a mágica acontece.



  • uart.c
  • uart.h


Aqui está o código de inicialização UART pronto. Para todos que trabalham em C com UART no Linux, recomendo olhar para esses dois arquivos. Bem, eu também recomendo que todos que assistiram aos meus webinars sobre como trabalhar com o UART no Linux uma ou duas vezes também olhem para eles.



  • display.c
  • display.h
  • output.h


Como você pode imaginar, este é o código para trabalhar com o monitor. Além disso, eu tive que parafusar o código de conversão de caracteres nele.



  • charset_coverter.c
  • charset_coverter.h


O display funciona na codificação CP866. E mesmo para exibir uma mensagem em russo a partir do console, você deve usar o seguinte truque:



echo -en " \n dlinyj" | iconv -f UTF-8 -t CP866 > /dev/ttyACM0


Mas, há uma nuance: não há letras "e", o sinal forte "" e o sinal suave "b" estão invertidos. Portanto, após a decodificação, você precisa decodificar.



  • mpc.c
  • mpc.h


Trabalhando com o daemon mpd. Em geral, existem bibliotecas para trabalhar com ele, mas como não preciso de um número muito grande de funções, decidi escrever tudo do zero nos soquetes. Talvez seja útil para alguém.



  • term.c
  • term.h


Oh, essa é a grande parte. Como às vezes eu tinha que depurar o código sem um display, fiz para mim mesmo um "simulador" do display, com controle de teclado em vez de um codificador. É assim: na primeira foto há data e relógio, na segunda uma melodia e estação.









Para obter mais detalhes sobre como escrever isso, consulte o artigo "Terminal Graphics" .



Adicionar estações de rádio para mim é o seguinte script.



#! /bin/sh -
# Some configuration settings
VOLUME=60
#mpc volume $VOLUME	# adjust this to suit your speakers/amplifier
mpc clear	# clear current playlist

mpc add http://relay3.slayradio.org:8000/						#*Slay Radio
mpc add http://fr1.streamhosting.ch:8080						#*lounge-radio.com
mpc add http://us-tx1.streams.bassdrive.com:9000/				#*DnBHeaven.com
mpc add http://uk2.internet-radio.com:31491						#*AmbientRadio.org
mpc add http://www.partyvibe.com:8010/							#*PARTY VIBE RADIO
mpc add http://streamer.psyradio.org:8120						#*psyradio chillout

mpc add http://live.coolradio.rs/cool128
mpc add http://big2.bigportal.ba:8100/big2


Se você tiver alguma estação de rádio streaming que possa recomendar, especialmente para música eletrônica, escreva nos comentários :)



Para facilitar o gerenciamento e a configuração, adicionei uma interface web do projeto ympd . Se parece com isso.





Como resultado, o arquivo /etc/rc.local no final se parece com isto:



sleep 30
/home/ubuntu/addradio.sh > /dev/null 2>&1 &
/home/ubuntu/wifi-radio/Linux/control > /dev/null 2>&1 &
/home/ubuntu/ympd --webport 80 > /dev/null 2>&1 &


Sim, sim, eu sei que no Ubuntu systemd e rc.local são ruins de usar e outros blá, blá, blá. Mas eu uso porque quero e posso.



Resultado



Claro, o rádio acabou por não ser tão bonito e pretensioso como originalmente planejado, mas decidi que um pássaro na minha mão é melhor do que uma torta no céu. É melhor fazer isso do que prolongar o prazer por mais alguns anos com um resultado pouco claro. Mesmo assim, embora seja feio, fico muito feliz. Então, para ler um monte de texto, é hora de assistir a um vídeo de como tudo se parece e funciona.







O vídeo está um pouco antigo, agora a antena e a Ethernet estão conectadas e até funcionam bastante bem.



Onde crescer?



E há espaço para crescer. Um dos desdobramentos desse projeto que venho explorando há muito tempo é o projeto Volumio . Este é um agregador de jogadores encantador que permite ouvir estações de rádio de todo o mundo, streaming e muito mais. Todos estão bem, perfeitamente encaixados no meu projeto e exibidos todas as estações na tela. A menos que os controles fossem completamente inúteis. Você também pode adicionar controle de voz, há um projeto Rhasspy maravilhoso , sobre o qual houve até um artigo sobre Habré. Ele permite que você faça controle de voz sem se conectar a um servidor externo!



A única coisa que vale a pena abandonar o mpd é o gargalo. Se não houver estação, ele desliga esperando por ela. Sem pré-buffer de outras estações, etc. Ou seja, há solo para crescimento. E o assunto é incrivelmente interessante, com um monte de ideias. Obrigado por ler!






All Articles