Como fazer um videogame retrô com um Raspberry Pi e controles do Xbox 360

Com menos de 300 reais você constrói uma maquininha que é, ao mesmo tempo, um Nintendo, um Super Nintendo, um Mega Drive, um Master System, um Atari…


Siga o Medium Brasil ─ twitterfacebook

[ATENÇÃO: este texto é de 2014. De lá pra cá, o dólar explodiu (a meta de 300 reais tornou-se impossível), já foram lançadas duas novas versões do Raspberry Pi — a 2 e a 3 — , o RetroPie evoluiu bastante e até ganhou um spin-off de instalação descomplicada, o RecalBox. O texto abaixo está irremediavelmente desatualizado. Divirta-se e inspire-se com a leitura, mas não siga as instruções. Cheers!]

Nariz-de-cera. Pode pular esta parte

Eu sou de 1978. O Atari 2600 era novidade nos EUA. Eu faço parte da primeira geração de crianças que teve o videogame como principal brincadeira. Não, não me julgue — se você está lendo este texto, provavelmente teve infância igual ☺

Até hoje curto jogar, e nisso tenho a companhia de um monte de gente da minha idade. O problema é que o meu gosto não evoluiu muito com o tempo. Quer dizer, ainda prefiro o estilo oitentista de videogame. Tenho um Xbox 360, é verdade, e adoro títulos como GTA 5 e Arkham City. Mas, na minha cabeça, nada se compara a Battletoads.

O advento dos emuladores — softwares que conseguem rodar jogos de videogames antigos — possibilitou o retrogaming. Deu permanência para títulos criados há 30, 35 anos, que seguem jogáveis, mesmo sem o hardware original!

Mas emuladores são coisas de computador, e computadores não são a plataforma adequada para se jogar, digamos, Nintendo. Teclado? Monitor? Desde que os emuladores surgiram eu sonho com a possibilidade de encarar uma partidinha de F-Zero na frente da televisão, sentado no sofá com o joystick na mão. Computadores não são tão legais.

Gosta de jogos clássicos? Acesse o Pouco Pixel, a enciclopédia ilustrada do retrogaming! http://poucopixel.com
Surge o Raspberry Pi
A caixinha do Raspberry Pi, o próprio e a fauna que habita minha mesa.

Mas há uma solução, e ela se chama Raspberry Pi. O Raspberry Pi é um computadorzinho miniatura com processador ARM de 700MHz, 512 MB de memória RAM e saída de vídeo Full HD.

Custa menos de 200 reais.

O Raspberry Pi foi criado no Reino Unido como uma ferramenta educacional, mas virou rapidamente o xodó de entusiastas de automação e informática DIY. Já usaram o RPi como media center, como headless streamer, como sensor de presença em banheiros (sim!) e… para retrogaming! \o/

O RPi como videogame retrô (agora sim!)

Com tanta gente se debruçando sobre isso ao redor do mundo desde 2012, montar um retroconsole com o Raspberry Pi não é exatamente inventar a roda. Você não vai criar nada do zero. Tem um monte de sistemas inteiros pré-construídos que vão te entregar o trabalho quase pronto.

(Ênfase no quase. O RPi roda Linux — por definição, nada baseado em Linux vem pronto para usar.)

Depois de alguns dias lidando com isso, compartilho alguma das coisas que aprendi. Acho que posso contribuir.

Pega na minha mão ☺ Vamos criar juntos um retroconsole Raspberry Pi que usa o joystick wireless do Xbox 360.

Ingredientes
  • Um Raspberry Pi. Recomendo vivamente o modelo B+;
  • Um cartão de memória MicroSDHC, de 8GB, classe 10;
  • Um power outlet USB 5V de 2A. O carregador do seu celular não serve, por ser de 1A. O do iPad, por outro lado, é perfeito. Mesmo assim, é melhor comprar um específico só para o seu retroconsole. Vá ao xing-ling mais próximo de você e especifique que você quer um carregador de 2 amperes;
  • Um cabo Micro USB A-B (igual ao do seu Android!);
  • Um cabo HDMI (ou um cabo composto A/V 3.5mm, se sua TV não tiver entrada HDMI);
  • Um teclado USB qualquer. Será útil só na configuração inicial, então pode ser emprestado de outro computador, de um amigo etc;
  • Um ou mais controles sem fio do Xbox 360. Gosto de controles sem fio porque TVs devem ficar longe de sofás e cabos suficientemente compridos não são nada práticos;
  • Um receptor wireless para o controle do Xbox 360. A Microsoft vende esses adaptadores para PC, mas eles funcionam no RPi também. Você encontra o receptor oficial no xing-ling por 100 reais, mas há genéricos bem mais baratos.

[Você pode optar pelo controle do PlayStation 3. Neste caso, terá de substituir o adaptador do Xbox 360 por um dongle USB bluetooth. Mas confesso que não testei e não sei como funciona; as instruções abaixo são específicas para o controle do Xbox.]

Conectividade

O Rasberry Pi modelo B+ tem entrada ethernet mas muito provavelmente a sua TV está longe de um ponto de rede. Então sugiro a compra de um adaptador wi-fi USB.

Atenção aqui: como o Raspberry Pi não consegue enviar muita energia para as suas portas USB, o adaptador wi-fi não pode ser daqueles grandes, cheios de recursos, tipo aqueles TP-Link. Eu comprei no xing-ling o adaptador mais barato da loja, totalmente genérico. 30 reais e funciona perfeitamente, sem drenar toda a energia do meu RPi.

Modo de preparo

Montar o sistema operacional

Vamos começar o nosso trabalho a partir de um esforço genial chamado RetroPie. Trata-se de uma customização do Raspbian — o sistema operacional padrão do RPi — criada especialmente para retrogaming. Ele contém (quase) todos os emuladores, drivers e front-ends que vamos precisar.

Baixe este arquivo aqui (ele é grande, mais ou menos 1GB; mas o download via torrent é muito rápido). Esse arquivo contém o que se chama de “imagem” do RetroPie, o molde do cartão SD que colocaremos no RPi.

Para gravar essa imagem no SD você vai precisar de lidar com linha de comando (Linux, Mac) ou baixar um software específico (Windows). Siga as instruções nos links que coloquei no nome do seu sistema operacional, ou visite esta página do site oficial do Raspberry Pi.

O processo não deve ser demorado — cerca de 5 minutos. Prefira usar um computador com leitor de cartões embutido. Vários notebooks têm isso. Se o seu não tem, você pode usar um adaptador. Mas preste atenção. Adaptadores USB simplezinhos, como aqueles “pen drives” fáceis de encontrar por aí, são muito lentos e ineficientes. A gravação de uma imagem grande neles demora tipo 75 minutos e não raro sai corrompida. Procure um leitor de verdade.

Ligar o Raspberry Pi

Com o SD pronto, basta inseri-lo no Raspberry Pi. Em seguida, conecte o bichinho à TV (com o cabo HDMI ou composto) e plugue o teclado, o receptor do joystick e o dongle wi-fi (ou o cabo de rede, se for o caso). Coloque o RPi na tomada e — voilà!—, ele já está ligado, bootando. Sim, o RPi não tem botão “power”. Na tomada = funcionando. Ele foi projetado para ser always on. Não se preocupe que ele consome muito pouca energia.

Este é o Raspberry Pi com quase tudo plugado nele: HDMI, força e o receptor do Xbox. O microSD é encaixado na parte de baixo do RPi. Só faltou o wi-fi, que ocuparia uma das quatro portas USB disponíveis.

Enquanto o sistema carrega, aproveite para sincronizar o controle do Xbox com o receptor. Basta ligar o controle e apertar o botãozinho de sync que fica acima da pilha, ao mesmo tempo em que aperta o botão do receptor. Pronto!

Assim que o boot terminar, você estará na tela do Emulation Station, que é o front-end adotado pelo Retro Pie. Ele é todo controlado pelo joystick, então é muito prático para escolher jogos, por exemplo, sem precisar do teclado.

Deixe para brincar com o Emulation Station depois. No teclado, aperte F4 — você vai cair na tela preta do terminal. Não se assuste. Precisaremos do terminal algumas vezes ainda.

Precisamos ajustar o tamanho do SD, configurar o wi-fi e outras configurações importantes. Para isso, digite:

sudo raspi-config

Irá surgir uma tela azul, assim:

Primeiramente, vá em “Expand Filesystem” — isso vai fazer o seu microSD ter disponível toda sua capacidade (a imagem que gravamos tinha cerca de 1GB somente, lembra?). Em seguida, mude sua senha em “Change User Password”. Aproveite para mudar o layout do teclado em “Internationalisation Options”.

Agora vamos fazer o Raspberry Pi ser um pouco menos lento, graças a overclocking. Sim, o RPi suporta oficialmente o truque de mandar mais energia para o processador e assim aumentar sua velocidade. Vá em “Overclock” e, na tela que abre, opte pelo item “High”:

Volte ao terminal. Se você não está usando cabo de rede, hora de configurar o wi-fi: siga as instruções aqui.

Rede funcionando, hora de configurar o RetroPie em si. No terminal (lembre-se: para chegar a ele, basta apertar F4 no Emulation Station), digite:

sudo ./RetroPie-Setup/retropie_setup.sh

A tela azul acima irá aparecer. Selecione a opção 3, “setup”. Surgirá outro menu:

O suporte ao controle do Xbox já vem pré-instalado. Se você perceber que o joystick não está funcionando, selecione a opção 320, “Install Xbox contr. 360 driver” e siga as instruções.

Ao final de tudo, escolha a opção 7, “Perform Reboot” e aguarde o RPi reinicializar.

Configurar o joystick

Agora o Emulation Station deve pedir para você configurar seu joystick. A pegadinha: essa configuração serve somente para o Emulation Station em si, não para os jogos. Para os jogos vamos precisar voltar ao terminal. Aperte F4 e digite, numa linha só:

sudo /opt/retropie/emulators/RetroArch/installdir/bin/retroarch-joyconfig -p 1 -j 0 >> /opt/retropie/configs/all/retroarch.cfg

(Você precisa repetir esse passo para cada controle que quiser instalar, alterando sempre os parâmetros -p e-j incrementalmente: -p 2 -j 1, -p 3 -j 2 etc.)

Agora configure os botões usados para sair do jogo com o joystick. O padrão é usar o teclado, pressionando “esc”. Você não vai ter um teclado, então precisa fazer o emulador usar o joystick nesse caso. Digite:

sudo nano /opt/retropie/configs/all/retroarch.cfg

E acrescente, no final do arquivo, as linhas:

input_enable_hotkey_btn = “6"
input_exit_emulator_btn = “7"

São os botões “back” e “start” do Xbox 360. Eles devem ser pressionados simultaneamente para que você saia do jogo e retorne ao Emulation Station.

Enviar jogos via SFTP

Você deve fazer essa etapa no seu computador principal, não no Raspberry Pi. É bem simples: basta enviar os arquivos ROM dos jogos, que você já tem (certo? se não, use o Google), para o RPi via SFTP. Recomendo, para isso, o FileZilla, que está disponível em todas as plataformas. Configure o FileZilla para acessar o IP de seu Raspberry Pi (se você não souber qual é, digite ifconfig no terminal e anote), usando o usuário “pi” e a senha que você definiu. Conecte e encontre o diretório abaixo:

/home/pi/RetroPie/roms/

Lá você vai ver uma lista dos diversos videogames suportados. Envie os ROMs para as pastas apropriadas e prontinho.

Gosta de jogos clássicos? Acesse o Pouco Pixel, a enciclopédia ilustrada do retrogaming! http://poucopixel.com

Melhorar a performance

Saia do computador principal e vá ao Raspberry Pi. Nele, no terminal, digite:

emulationstation

Veja que mágico: os sistemas para os quais você enviou ROMs aparecem no menu!

No meu retroconsole só há jogos das plataformas que me importam: Atari 2600, Master System, Mega Drive (Genesis nos EUA) e, principalmente, NES e Super NES.

A essa altura você já pode brincar um pouquinho com os menus e inclusive jogar os ROMs instalados!

Mas você vai reparar que a performance nos jogos não é das melhores. Há engasgos aqui e ali e o som fica distorcido em muitas ocasiões. A triste verdade é que o Raspberry Pi não é um equipamento rápido, mesmo com overclock. Emular sistemas, mesmo os mais antigos, exige bastante do processador. O bom é que dá para melhorar bastante — o setup padrão do RetroPie é meio conservador e podemos ajustá-lo.

O emulador do RetroPie é o RetroArch, que na verdade é um front-end para diversas bibliotecas de emulação. Em geral, ele roda até bem no Raspberry Pi, com exceção do Super Nintendo. Então a nossa tarefa aqui é melhorar a performance do RetroArch e usar outro emulador para o SNES.

Você deve ter reparado que, ao começar o jogo, o Raspberry Pi muda de resolução: sai de 1920x1080 (Full HD) e vai para 1280x720 (HD). O RetroPie é configurado assim para economizar um pouco de processamento — fazer oversampling dos jogos come recursos do RPi. Vamos ser radicais. Jogos antigos não exigem tanta resolução. Para aliviar ainda mais o processador e fazer a emulação ser fluida, sugiro que rodemos os jogos em VGA (640x480).

Volte para o terminal (F4) e digite:

sudo nano /etc/emulationstation/es_systems.cfg

Procure os consoles que você pretende usar e altere suas linhas <command>, que deve ter essa cara aqui:

<command>/opt/retropie/supplementary/runcommand/runcommand.sh 4 “/opt/retropie/emulators/RetroArch/installdir/bin […] </command>

Altere o número que está logo após “runcommand.sh”. No exemplo acima, é 4 (resolução HD). Mude para 3 (VGA). Fica algo assim:

<command>/opt/retropie/supplementary/runcommand/runcommand.sh 3 “/opt/retropie/emulators/RetroArch/installdir/bin […] </command>

Salve o arquivo (control+X e responda “Y” à pergunta de confirmação) e execute novamente o Emulation Station (digitando emulationstation no terminal). Teste com algum jogo de Mega Drive ou NES, por exemplo. Muito melhor!

Se a imagem do jogo estiver muito pequenininha é porque o seu televisor está configurado para manter a imagem na resolução original (“unscaled”). Configure, no controle remoto da TV, para que ela preencha a tela mantendo as proporções (cada TV tem um nome para essa opção; geralmente é algo como “auto zoom”). Em outras palavras, quem deve fazer o trabalho de oversampling é a TV e não o Raspberry Pi — sacou a malandragem? ;-)

Mudando o emulador do Super Nintendo

Particularmente eu considero o RetroArch ruim para emular o Super Nintendo em um equipamento simples como o Raspberry Pi. (Veja nos comentários ao lado que ele tem seus defensores — vale experimentar e decidir você mesmo.) Por isso recomendo outro emulador. Sugiro que usemos o SNES9x-rpi, uma adaptação do consagrado SNES9x para o RPi e que performa muito melhor. O problema é que o SNES9x-rpi que vem pré-instalado no RetroPie só aceita o direcional analógico do joystick, algo muito ruim para jogos antigos. Sorte que algum ser iluminado das interwebs criou uma versão alternativa desse emulador com suporte ao d-pad. Azar que vamos ter que compilá-la nós mesmos.

No terminal, digite:

wget https://github.com/fradinni/snes9x-rpi/archive/master.zip; unzip master.zip

Arquivo baixado e descompactado, execute:

cd snes9x-rpi-master; ./build.sh

A compilação deve demorar alguns minutos. Depois de realizada, execute:

sudo cp /home/pi/snes9x-rpi-master/release/snes9x /opt/retropie/emulators/snes9x-rpi

Você estará substituindo a compilação padrão do SNES9x-rpi pela sua. Em seguida, precisamos criar um arquivo de configuração que habilite o controle do Xbox 360. Execute a seguinte linha:

sudo nano /opt/retropie/emulators/snes9x-rpi/snes9x.cfg

E faça esse arquivo ter o seguinte conteúdo:

[Graphics]
DisplaySmoothStretch=0
[Joystick]
A_1=0
B_1=1
X_1=2
Y_1=3
L_1=4
R_1=5
UP_1=13
DOWN_1=14
LEFT_1=11
RIGHT_1=12
START_1=7
SELECT_1=6
QUIT=96
ACCEL=97
QLOAD=98
QSAVE=99

Salve. Agora precisamos dizer para o Emulation Station que o SNES9x-rpi é o emulador que queremos usar para o Super Nintendo, no lugar do RetroArch. Execute, no terminal:

sudo nano /etc/emulationstation/es_systems.cfg

Procure, no arquivo, a seção dedicada ao Super Nintendo e altere a linha <command> dele para a seguinte:

<command>/opt/retropie/supplementary/runcommand/runcommand.sh 3 “/opt/retropie/emulators/snes9x-rpi/snes9x %ROM%”</command>

Salve. Inicie o Emulation Station e teste algum jogo de Super Nintendo. Deve estar super suave agora. SU-CES-SO! \o/

~BALD BULL!~

Tornando a escolha do jogo mais agradável

A interface do Emulation Station suporta informações extras sobre o jogo — descrição, ano de lançamento, imagem da capa etc. Esse recurso se chama scraping e a fonte dessas informações é um site chamado TheGamesDB.net. Para ativá-la, basta escolher o jogo, apertar o botão “back” do controle do Xbox (que faz o papel do “select”) e selecionar a opção “Edit this game’s metadata”.

Maaaas… principalmente se você tiver muitos jogos, o processo oferecido pelo Emulation Station é lento e manual ☹

A dica que eu dou é: faça o processo de scraping no computador, não no Raspberry Pi. Dá algum trabalho e funciona melhor se você usar Linux ou OSX. Mas, garanto, vai economizar muitas horas.

Seu acervo de jogos ainda está no computador, certo? Certifique-se disso e baixe o script Python disponibilizado em https://github.com/elpendor/ES-scraper. Em seguida, instale uma biblioteca Pyhton chamada PIL, para edição de imagens. No Linux, uma das maneiras de instalá-la é:

sudo apt-get install python-imaging

Agora você vai precisar criar uma pasta chamada .emulationstation no diretório do seu usuário (/home/nome-do-seu-usuario). O pontinho faz parte do nome do diretório, cuidado! Crie dentro dessa pasta um arquivo chamado es_systems.cfg e coloque um bloco de texto assim para cada console de sua biblioteca:

NAME=NES
DESCNAME=NES
PATH=~/ROMS/NES/
EXTENSION=.nes
PLATFORMID=7

Preste atenção no caminho onde estão os ROMs e no ID do console. A lista completa de IDs pode ser vista aqui.

Em seguida, rode o script, com a seguinte linha de comando, para cada console (ele irá perguntar qual logo em seguida):

python scraper.py -w 700 -p -f -newpath

Processo terminado, hora de tratar os arquivos e mandar para o Rasbperry Pi. No diretório /home/seu-usuario/.emulationstation/nome-do-console você encontrará um arquivo gamelist.xml com o resultado do scraping. O arquivo é uma lista e cada jogo tem a seguinte estrutura:

<game>
<path>./2020 Super Baseball (U).smc</path>
<name>Super Baseball 2020</name>
<desc>Different from real baseball and other baseball video games, this game consists of both male and female characters, as well as robots. All three types of players have the same basic abilities and vary only on their personal strengths. In many cases, human players are better than their robot counterparts. One major difference between the human and robot characters is that the robot characters can blow up (or lose all their power) if they are worked too hard during a game. That can happen if you constantly make them dive for a ball, run extra bases, or even if they get hit by a pitch. Under no stress whatsoever, some robots, especially pitchers, will naturally run out of power as the game progresses. When this happens, they will lose all their abilities and be useless, both offensively and defensively. When that occurs, you can either power them up or replace them with another person on the roster. Human players do not blow up, but human pitchers can tire out. When they are tired, they will pant heavily and throw the ball very slowly. This can be remedied by either an upgrade or, as in real baseball, switching to a relief pitcher.</desc>
<image>~/.emulationstation/downloaded_images/snes/2020 Super Baseball (U).png</image>
<releasedate>03/12/1993</releasedate>
<publisher>SNK</publisher>
<developer>SNK</developer>
<genres>
<genre>Sports</genre>
</genres>
</game>

Você precisa alterar a tag <path> para que seu valor seja exatamente ./nome-do-arquivo-rom, e a tag <image> para que seu valor seja exatamente ~/.emulationstation/downloaded_images/nome-do-console/nome-do-arquivo-imagem. Com um ou dois comandos de “find and replace”, no seu editor de texto predileto, você resolve isso fácil ;-)

Agora basta mandar tudo para o Raspberry Pi. Use o FileZilla ou outro programa de SFTP e envie os arquivos gamelist.xml para a pasta /home/pi/.emulationstation/gamelists/ (há uma para cada console) e as imagens para a pasta /home/pi/.emulationstation/downloaded_images/ (novamente, uma para cada console). Reinicie o Emulation Station e deleite-se:

O melhor jogo de todos os tempos, de acordo comigo mesmo.

Fazendo ajustes cosméticos

No blog do Rafael Rigues (um dos grandes inspiradores deste post) encontrei duas dicas que irão agradar os preciosistas.

A primeira ensina como tirar aquele monte de texto que surge na tela quando o Raspberry Pi é iniciado. Basta editar o arquivo /boot/cmdline.txt, substituir a opção console=tty1 por console=tty3 e adicionar, no final da mesma linha, o comando loglevel=3 logo.nologo.

A segunda mostra como tirar os textos que surgem na tela entre o carregamento dos jogos. É necessário editar o arquivo /opt/retropie/supplementary/runcommand/runcommand.sh e, antes da linha que diz starttype=$1, adicionar o seguinte código:

clear
exec 2> /dev/null

Mais à frente, depois das linhas que dizem echo “performance” e echo ondemand, acrescente outra linha com apenas uma palavra: clear.

Jogar

Divirta-se! \o/

Dar sua opinião

Achou algum furo neste guia? Tem técnicas melhores ou mais fáceis para algum dos passos descritos acima? Fale comigo! Ao lado de cada parágrafo há um botãozinho de “+” próprio para comentários. Vamos conversar! ☺

Gosta de jogos clássicos? Acesse o Pouco Pixel, a enciclopédia ilustrada do retrogaming! http://poucopixel.com

Gostou do texto? Então clique no botão Recommend, logo abaixo.
Fazendo isso, você ajuda esta história a ser encontrada por mais pessoas.

Não tem conta no Medium? Que tal fazer login clicando aqui? Leva um segundo. Após fazer isso, você pode seguir a publicação oficial do Medium Brasil e receber todos os dias nossas atualizações. Clique e siga o Medium Brasil. ☺

Siga o Medium Brasil | TwitterFacebookRSSCanal oficial
Show your support

Clapping shows how much you appreciated Adriano Brandão’s story.