Índice:
- Suprimentos
- Etapa 1: Cadeia de LED infravermelho
- Etapa 2: conectar à TV
- Etapa 3: Instale o software
- Etapa 4: Calibração Parte I: Centralizar a Câmera
- Etapa 5: Calibração Etapa II: LEDs
- Etapa 6: teste e uso
- Etapa 7: punho e mira da arma
- Etapa 8: Calibração III (opcional): Ajuste Fino
- Etapa 9: Apêndice: o algoritmo
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:35
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
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
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
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
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:
- pressione esquerda / direita no Wiimote para mover as setas até que elas apontem o mais precisamente possível para o LED correspondente;
- 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
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
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
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:
Monitor inteligente de plantas internas - saiba quando sua planta precisa de rega: 8 etapas (com fotos)
Monitor inteligente de plantas internas - saiba quando sua planta precisa de rega: alguns meses atrás, eu fiz um bastão de monitoramento de umidade do solo que funciona com bateria e pode ser colocado no solo no vaso de sua planta interna para fornecer algumas informações úteis sobre o solo nível de umidade e LEDs intermitentes para avisar quando esperar
SENSLY HAT PARA O DETECTOR DE QUALIDADE DO AR E GÁS DE FRAMBOESA PI V1.1: 9 etapas
SENSLY HAT PARA O RASPBERRY PI AIR QUALITY & GAS DETECTOR V1.1: Sensly é um sensor de poluição portátil capaz de detectar os níveis de poluição no ar usando seus sensores de gás a bordo para coletar informações sobre os vários gases presentes. Essas informações podem ser alimentadas diretamente para o seu smartphone para pu
Uma luz respiratória controlada por um Pi de framboesa: 5 etapas
Uma luz de respiração controlada por um Raspberry Pi: a " luz de exercício de respiração " A descrição aqui é uma luz pulsante simples e relativamente barata que pode apoiá-lo em suas execuções respiratórias e ajudá-lo a manter um ritmo respiratório constante. Também pode ser usado, por ex. como um calmante n
Luz reativa para música -- Como tornar uma luz reativa para música super simples para tornar a área de trabalho incrível: 5 etapas (com imagens)
Música reativa luz || Como fazer música super simples luz reativa para tornar a área de trabalho incrível .: Ei, e aí galera, hoje vamos construir um projeto muito interessante. Hoje vamos construir uma luz reativa musical. O led mudará seu brilho de acordo com o baixo, que na verdade é um sinal de áudio de baixa frequência. É muito simples de construir. Vamos
Alternativa DIY barata e precisa para luva com sensor flexível: 8 etapas (com fotos)
Faça você mesmo uma alternativa barata e precisa para a luva com sensor flexível: Olá a todos, Esta é a minha primeira luva instrutível e neste instrutível vou ensiná-los a fazer uma luva com sensor flexível barata e precisa. Usei várias alternativas para o sensor flex, mas nenhuma delas funcionou para mim. Então, eu pesquisei e encontrei um novo