Índice:

Pistola de luz Wiimote precisa para framboesa PI: 9 etapas (com fotos)
Pistola de luz Wiimote precisa para framboesa PI: 9 etapas (com fotos)
Anonim
Pistola de luz Wiimote precisa para framboesa PI
Pistola de luz Wiimote precisa para framboesa PI
Pistola de luz Wiimote precisa para framboesa PI
Pistola de luz Wiimote precisa para framboesa PI

Normalmente, o Wii Remote usado como uma arma leve não é preciso o suficiente para jogos retrô como NES Duck Hunt, porque o Wii Remote não seleciona de fato o ponto na TV para o qual está apontado. Não pode! O Wii Remote tem uma câmera infravermelha em sua frente que vê a linha de LEDs infravermelhos na barra de sensores, mas não pode saber a que distância (ou em que direção) a TV está da barra ou o tamanho da TV. Emuladores e jogos contornam isso exibindo retículos ou outro indicador de mira, mas essa não é uma experiência precisa de tiro ao alvo.

Para fazer o Wii Remote funcionar como uma arma de luz precisa que você pode mirar para selecionar um alvo em uma TV, são necessários quatro LEDs infravermelhos dispostos em um padrão quadrilateral conhecido (não uma linha reta) no mesmo plano da TV. O Wii Remote então vê os quatro LEDs e a imagem da câmera pode ser usada para calcular uma homografia que nos permite descobrir para onde a câmera está apontando.

O hardware para este projeto é simples. Existem quatro LEDs infravermelhos em caixas simples impressas em 3D que podem ser coladas nas partes superior e inferior da caixa da TV e conectadas a um carregador USB. Além disso, caso você não tenha o invólucro da arma Wii, eu tenho uma alça impressa em 3D simples e miras que você pode anexar ao Wii Remote (embora, para economizar plástico, fiz para mim um híbrido entre madeira e plástico impresso em 3D).

O software baseado em python era mais difícil de fazer do que o hardware e atualmente é somente Linux. Ele calibra os LEDs e o Wii Remote e então usa cálculos de homografia para emular um mouse absoluto que funciona muito bem no emulador NES fceumm do Retroarch (e provavelmente alguns outros emuladores) no meu Raspberry PI 3B +.

Suprimentos

  • Wii Remote
  • Quatro LEDs infravermelhos de 940 nm e 5 mm
  • Cabo USB antigo com plugue tipo A funcional
  • Raspberry PI 3 ou outro computador Linux com suporte para Bluetooth
  • Impressora 3D e filamento (opcional)

Etapa 1: Cadeia de LED infravermelho

Corrente de LED infravermelho
Corrente de LED infravermelho
Corrente de LED infravermelho
Corrente de LED infravermelho

Obtenha um cabo USB antigo com uma tomada macho tipo A que funcione (normalmente os cabos de carregamento do meu telefone quebram na extremidade micro USB, então tenho cabos restantes com uma tomada macho tipo A que funcione). Na verdade, está tudo bem se os cabos de dados forem quebrado enquanto as linhas de energia funcionarem. Corte a outra extremidade. Em teoria, o cabo vermelho deve ser de + 5V e o preto deve ser aterrado, mas verifique com um multímetro (conecte-o a um carregador e verifique a tensão entre os fios vermelho e preto).

Como os LEDs infravermelhos têm uma queda de tensão de 1,2-1,3 V, acabei de soldar quatro deles em loop em série ao cabo USB. Certifique-se de que os fios que você solda sejam longos o suficiente para que você possa colocar LEDs na parte inferior da TV e dois na parte superior, com uma quantidade razoável de espaço horizontal entre os LEDs (cerca de 10 polegadas ou mais).

Mais precisamente para fazer o loop de LED:

  • soldar o lado negativo (cátodo, perna mais curta, com borda plana) do primeiro LED ao fio USB de + 5V
  • junte o lado positivo do primeiro LED (ânodo, perna mais longa, com borda redonda) ao lado negativo do segundo LED
  • repita para juntar o segundo LED ao terceiro e o terceiro ao quarto
  • em seguida, conecte o lado positivo do quarto LED com um fio ao fio terra USB.

Para deixar as coisas mais organizadas, você pode usar tubos termorretráteis ao fazer as conexões. Caso contrário, use fita isolante para evitar curtos.

Certifique-se de que não haja curto-circuitos. Em seguida, conecte-o a um carregador USB e verifique se ele está emitindo luz infravermelha olhando para os LEDs com a câmera de um telefone. (Muitas câmeras de telefone são sensíveis ao infravermelho.)

Etapa 2: conectar à TV

Anexar à TV
Anexar à TV
Anexar à TV
Anexar à TV
Anexar à TV
Anexar à TV

Agora, conecte dois dos LEDs na parte inferior da TV e dois na parte superior. O espaçamento horizontal deve ser de cerca de dez polegadas. Se for muito, você pode ter problemas com o campo de visão da câmera do Wii Remote capturando todos eles. Mas se eles estiverem muito próximos, então minha intuição geométrica diz que você terá uma precisão menor.

Para o teste, colei os LEDs com fita isolante e, para uma conexão permanente, projetei e imprimi quatro pequenos clipes de LED (os arquivos estão aqui) que colei a quente na TV. Você deve fazer com que os LEDs fiquem o mais próximo possível do plano da tela da TV, sem que a moldura os obscureça do local onde você estará filmando.

Etapa 3: Instale o software

Atualmente, o software é apenas para Linux. A configuração a seguir foi projetada para o Raspberry PI 3 com Raspbian Stretch. Outros sistemas Linux exigirão algumas mudanças. Em modelos anteriores, você precisará de um dongle Bluetooth e executá-lo também a partir de uma linha de comando:

sudo get-apt instalar bluetooth

Etapa A: udev

Em seguida, crie um arquivo em /etc/udev/rules.d/wiimote.rules que contém a única linha:

KERNEL == "uinput", MODE = "0666"

Você pode fazer isso, por exemplo, com um editor de texto ou digitando o seguinte na linha de comando:

sudo sh -c 'echo KERNEL == / "uinput \", MODE = / "0666 \"> /etc/udev/rules.d/wiimote.rules'

E então reinicie o udev:

sudo /etc/init.d/udev restart

Etapa B: cwiid

Em seguida, você precisará do meu pacote cwiid modificado. Aqui fica um pouco complicado, pois idealmente você precisaria construí-lo no Raspberry PI, mas devo confessar que perdi o controle de quais pacotes você precisa instalar para fazê-lo funcionar. Existem três opções para fazer isso.

Opção B1: Construa você mesmo

cd ~

git clone https://github.com/arpruss/cwiid-1 autoconf./configure make -C libcwiid sudo make -C libcwiid install make -C python sudo make -C python install

Infelizmente, há uma boa chance de você estar perdendo um monte de coisas necessárias para construir isso, e./configure reclamará. Você pode ver todas as coisas sobre as quais ele reclama e executar sudo apt install em todas elas.

Opção B2: usar meus binários

cd ~

wget https://github.com/arpruss/cwiid-1/releases/download/0.0.1/cwiid-rpi.tar.gz tar zxvf cwiid-rpi.tar.gz cd cwiid sudo make install

Etapa C: bibliotecas python

Por fim, obtenha material de suporte para meu script lightgun python:

sudo pip3 install uinput numpy pygame opencv-python

sudo apt-get install libatlas-base-dev sudo apt-get install libjasper-dev sudo apt-get install libqtgui4 sudo apt-get install python3-pyqt5

Etapa D: lightgun.py

Finalmente, pegue meu script python lightgun:

cd ~

git clone

Se tudo tiver corrido bem, agora você tem ~ / lightgun.py, que pode ser usado para calibrar a arma de luz.

Etapa 4: Calibração Parte I: Centralizar a Câmera

Calibração Parte I: Centralizando a Câmera
Calibração Parte I: Centralizando a Câmera
Calibração Parte I: Centralizando a Câmera
Calibração Parte I: Centralizando a Câmera
Calibração Parte I: Centralizando a Câmera
Calibração Parte I: Centralizando a Câmera

Existem dois aspectos para a calibração. O primeiro é calibrar o centro da câmera em cada Wiimote. Isso requer o uso da câmera para tirar duas imagens dos LEDs ao redor da tela da TV, uma com o controle remoto voltado para cima e a outra com o lado direito voltado para baixo.

Para evitar pressionar os botões ao colocar o Wii Remote na sua frente, e para fazer com que o Wii Remote tenha uma elevação consistente, você pode imprimir em 3D a ferramenta de calibração que incluí aqui. Basicamente, você precisa de coisas com 10,5 mm de espessura para colocar embaixo do Wii Remote quando ele estiver virado para a frente. Na verdade, usei alguns pedaços de compensado para economizar no plástico.

Ligue os LEDs e verifique se o Raspberry PI ou outro computador está sendo exibido na TV. Conecte um teclado (isso não funcionará em ssh) ou use o VNC. Então corra:

python3 ~ / lightgun / lightgun.py -M

Se tudo correr bem, você verá uma tela inteira pedindo que pressione 1 + 2 no Wii Remote. Faça isso. As luzes piscarão no Wii Remote e as luzes 1 e 4 permanecerão acesas. Você também verá um pequeno retângulo verde no topo da tela, com a visão da câmera do Wii Remote. Aponte o Wii Remote para os LEDs e, se tudo correr bem, você verá os quatro LEDs, numerados de 1 a 4.

Agora você precisa encontrar uma superfície sólida com uma borda afiada, como uma mesa de centro, que possa apontar para a tela da TV e que possa permitir que o Wii Remote veja todos os LEDs com o Wii Remote alinhado contra a borda. Comece alinhando o Wii Remote com o lado direito para cima, com o lado do Remote alinhado contra a borda da superfície, certificando-se de que todos os quatro LEDs sejam vistos. Em seguida, pressione ESPAÇO no teclado (ou conecte um Nunchuck e pressione C se for mais conveniente). Em seguida, você será solicitado a girar o Wii Remote. Agora, certifique-se de que ele esteja elevado 10,5 mm acima de sua superfície, usando a ferramenta de calibração ou outra coisa, e o mais próximo do mesmo local que antes (por exemplo, alinhado contra a mesma borda de sua superfície). Pressione ESPAÇO novamente.

Se tudo correr bem, você irá agora para a etapa de calibração do LED. Sim, isso é complicado! Mas você vai ter uma arma de luz muito precisa. Esse é apenas o preço.

Nota: Se, como eu, você tem um Wii embaixo da TV, o Wii precisa ser desligado por dois motivos: primeiro, se o Wii estiver ligado, ele se conectará ao Wiimote e, segundo, os LEDs infravermelhos da barra do sensor irão interferir com este projeto. Por razões semelhantes, enquanto você usa o Wii, é uma boa ideia desconectar os LEDs ao redor da TV.

Etapa 5: Calibração Etapa II: LEDs

Calibração Etapa II: LEDs
Calibração Etapa II: LEDs
Calibração Etapa II: LEDs
Calibração Etapa II: LEDs

Agora você precisa informar ao software onde os LEDs estão localizados ao redor da borda da TV. Você verá uma tela de calibração mostrando quatro setas, uma delas selecionada (brilhante) e três delas acinzentadas, ao redor da borda da TV. Use +/- para alternar para alterar a seta que está ajustando.

Para cada uma das quatro setas ao redor da borda, faça o seguinte:

  1. pressione esquerda / direita no Wiimote para mover as setas até que elas apontem o mais precisamente possível para o LED correspondente;
  2. pressione para cima / para baixo no Wiimote para alterar o comprimento da seta até que o comprimento da seta corresponda à distância entre o LED e a borda da tela da TV; em outras palavras, o comprimento da seta precisa ser igual à distância da ponta da seta ao LED.

Assim que suas quatro setas estiverem corretas (e talvez até anteriores), você verá uma cruz vermelha quando apontar o Wiimote para a tela. Você pode verificar se é aqui que deveria estar. (Lembre-se de que você precisa estar longe o suficiente para que o Wiimote possa ver todos os LEDs. Também é importante que não haja outras fontes de infravermelho no campo de visão. Uma vez eu tive problemas por causa da luz do sol refletindo em uma cabeça de parafuso no Suporte de TV.)

Finalmente, há uma quinta seta, que só aparece quando você pressiona + na quarta seta do LED ou - na primeira (e por padrão tem comprimento zero, então é apenas um pixel). Esta seta ajusta o quão acima da câmera do Wii Remote a foto será registrada. O problema é o seguinte: você estará avistando ao longo da superfície superior do Wii Remote. Mas a câmera está localizada a alguma distância abaixo dessa superfície, no meio do retângulo preto na frente do Wii Remote. Se registrássemos as fotos para onde a câmera está apontando, elas seriam registradas cerca de 8 mm abaixo da superfície superior do Wii Remote. Você pode verificar isso observando que, conforme avista ao longo da superfície superior, o centro da mira fica oculto pela câmera.

Você pode conviver com isso, ou você pode aumentar esta quinta seta para o software alinhar as fotos com a parte superior do Wii Remote, ou você pode ajustar os arquivos 3D imprimíveis para as miras de ferro para compensar isso (mas a compensação só funcionará para uma distância particular da TV). Eu mesmo fui para o alinhamento do software.

Pressione HOME no Wii Remote para sair da calibração e salvar todos os dados no diretório ~ /.wiilightgun.

Etapa 6: teste e uso

Teste e uso
Teste e uso
Teste e uso
Teste e uso
Teste e uso
Teste e uso

Você provavelmente quer experimentar sua arma leve agora. Basta executar em um emulador de terminal (ou script):

python3 ~ / lightgun / lightgun.py -t

Você precisará pressionar os botões 1 + 2 ao mesmo tempo e, depois disso, se tudo correr bem, enquanto o lightgun.py estiver em execução, o lightgun emulará um mouse absoluto de dois botões. O botão de disparo é o botão 1 do mouse e o botão A é o botão 2. Pressione ctrl-c para sair.

Agora você só precisa configurar seus emuladores e / ou jogos para funcionar com um mouse absoluto. Infelizmente, isso nem sempre será tão fácil.

Uma coisa divertida que você pode tentar é meu mod de iminurnamez's duck-duck-shoot:

cd ~

git clone https://github.com/arpruss/duck-duck-shoot cd duck-duck-shoot python play_game.py

Para jogos NES, eu uso o libretro fceumm core no Retroarch. Vá para o menu Opções e configure o Zapper para ser uma tela sensível ao toque. (Configurá-lo como um mouse realmente não funciona, pois o fceumm espera um movimento relativo em vez de um mouse de posição absoluta.)

Se você iniciar seus jogos com um script, poderá editar a parte que inicia o jogo ou emulador para dizer:

python3 ~ / lightgun / lightgun.py -t -B 30 "comando para iniciar o jogo"

Então, durante os primeiros 30 segundos da execução do jogo (daí a opção -B 30), você pode conectar sua arma de luz pressionando 1 + 2.

A propósito, o script lightgun.py também pode ser usado para jogos do Wii Remote em geral com Retroarch. Basta adicionar a opção -o e as funções de lightgun serão desligadas e, em vez disso, o Wii Remote funcionará horizontalmente, com os três botões sendo 1, 2 e B respectivamente. Existem outras funções relacionadas ao Retroarch nos mapeamentos de lightgun.py que você descobrirá lendo o código. Por exemplo, a tecla menos atua como um deslocamento e, junto com o dpad, controla o salvamento e o carregamento (para cima / para baixo = alterar o número de salvamento; esquerda = restaurar; direita = salvar).

Etapa 7: punho e mira da arma

Cabo e mira da arma
Cabo e mira da arma
Cabo e mira da arma
Cabo e mira da arma
Cabo e mira da arma
Cabo e mira da arma

Você pode usar o Wii Remote sozinho como uma arma, mirando na parte superior. Você também pode comprar um dos invólucros de armas comerciais para ele. Mas como o Wii Remote original não era capaz de ser usado como uma arma de mira, os invólucros tendem a não vir com miras de ferro, e as miras de ferro melhoram muito a precisão.

Eu projetei um sistema simples para impressão em 3D de três partes: uma alça deslizante que fica logo atrás do gatilho (então se parece um pouco com um phaser Star Trek Original Series) e miras deslizantes. Os arquivos para impressão estão aqui. Se você quiser economizar em plástico em detrimento de restos de madeira, você também pode fazer o que eu fiz e em vez de imprimir a alça inteira, imprimir apenas a parte que segura o Wiimote, cortar um pedaço de madeira e aparafusar.

Para ver, concentre os olhos nas imagens. Alinhe a saliência da mira dianteira entre as saliências da mira traseira de modo que o espaço de ar em qualquer uma delas seja igual e todas as três saliências fiquem igualmente altas. Em seguida, alinhe o meio do alvo com o topo das saliências.

Nota: A altura das saliências é ligeiramente desigual, com a saliência da mira frontal um pouco mais baixa, a fim de compensar a altura das próprias saliências quando você avista ao longo delas a uma distância de 2,5 metros (minha distância até a TV). Se você tem uma distância significativamente diferente da TV, pode colocá-la nos arquivos OpenSCAD. De qualquer forma, esse ajuste pode estar abaixo das tolerâncias da impressora. Além disso, se você não fez o ajuste vertical no software, você pode adicionar mais alguns ajustes às vistas no software definindo extraSightAdjust para algo em torno de -8 (em milímetros).

Etapa 8: Calibração III (opcional): Ajuste Fino

Se você quiser ainda mais precisão, pode executar:

python3 ~ / lightgun / lightgun.py -d

(para demonstração) e observe cuidadosamente se a mira está alinhada com a mira. Caso contrário, saia e edite manualmente ~ /.wiilightgun / wiimotecalibration, e ajuste as coordenadas xey do centro da câmera ligeiramente para ajustar a mira. Por exemplo, minha arma estava disparando ligeiramente para a direita, então acabei mudando a coordenada x de 529 para 525. Os números de cada pessoa provavelmente serão diferentes.

Etapa 9: Apêndice: o algoritmo

Apêndice: o Algoritmo
Apêndice: o Algoritmo

O código de emulação do mouse funciona aproximadamente da seguinte maneira.

  • Pressões de botão de processo.
  • Obtenha dados da câmera e ajuste para calibração de centralização da câmera.
  • Se menos de três LEDs estiverem visíveis na câmera:

    Mantenha a última posição do mouse

  • Se três ou quatro LEDs estiverem visíveis:

    • Use os dados do acelerômetro do Wiimote para obter a orientação do Wiimote e identificar qual imagem da câmera LED corresponde a qual LED físico.
    • Se quatro LEDs estiverem visíveis:

      • Calcule a homografia entre as imagens da câmera de LED e as localizações de LED (nas coordenadas da tela).
      • Use a homografia para calcular a localização da tela que corresponde ao centro do campo de visão da câmera.
      • Faça o ajuste Y para ajustar o centro do cano da arma virtual abaixo da linha de visão. Este é um algoritmo um tanto confuso, mas funciona.
      • Defina a posição do mouse para o local da tela ajustado.
    • Se três LEDs estiverem visíveis:

      • Use o OpenCV para resolver o problema P3P entre as imagens da câmera de LED e as localizações físicas de LED. Isso gera até quatro soluções.
      • Se bem-sucedido:

        • Se tivermos um cálculo de localização anterior bem-sucedido, escolha a solução que faz com que o LED ausente seja o mais próximo da última posição observada ou calculada desse LED.
        • Se não tivermos um cálculo de localização anterior bem-sucedido, escolha a solução que melhor prevê a direção do acelerômetro.
        • Use a melhor solução para calcular onde o quarto LED deve ficar.
        • Faça o resto como na caixa de quatro LEDs.
      • Se não for bem-sucedido:

        Mantenha a última posição do mouse

Recomendado: