Nintendo Wii遥控器, 蟒蛇 和 的Raspberry Pi

26

Nintendo Wii遥控器我一直在寻找通过蓝牙将数据发送到Raspberry Pi的方法。理想情况下,我想通过Android平板电脑和自定义应用程序执行此操作,但我无法’无法连接该应用。

在大量的Google搜索过程中,我遇到了一个名为“CWiid”。它允许您通过蓝牙从Nintendo Wii控制器读取数据,并在您自己的Python脚本中使用它。

因此,我决定尝试一下,看看它有多容易。事实证明,一旦您知道要采取的步骤,这并不困难。我使用了最新的Raspbian图片和“Origo”USB蓝牙加密狗。

按钮映射

任天堂Wii按钮映射

Nintendo Wii远程按钮映射

在开始实际操作之前,我们需要查看Wii遥控器的按钮映射。当您按下Wii遥控器上的按钮时,它会通过蓝牙连接发送一些数据。

的data sent is a number that is the sum of the unique codes associated with each button.

右图和下表以十进制和二进制表示法显示了代码。您会注意到,每个按钮都将“1”在二进制数中。

Decimal
 Number       Binary       Button
=================================
     1    00000000000001   2
     2    00000000000010   1
     4    00000000000100   B
     8    00000000001000   A
    16    00000000010000   MINUS
   128    00000010000000   HOME
   256    00000100000000   DOWN
   512    00001000000000   UP
  1024    00010000000000   RIGHT
  2048    00100000000000   LEFT
  4096    01000000000000   PLUS
=================================

因此,按A将发送8。按LEFT将发送2048。同时按MINUS和A将发送8 + 16(即24)。您将在此页面的下方看到的示例脚本将接收到该数字并确定正在使用的按钮按下。

第1步– Update 树莓派

我下载了最新的Raspbian映像进行测试并 创建了一个新的SD卡。为确保获得最新更新,我首先运行以下两个命令:

sudo apt-get update

sudo apt-get upgrade

这些步骤可能需要一段时间才能完成,因此请在等待时冲泡一杯茶。

第2步–安装蓝牙驱动程序

为了与蓝牙设备(例如Wii遥控器)进行通信,您需要安装驱动程序。因此,通过键入以下命令开始:

sudo apt-get install --没有安装建议 蓝牙

的“–没有安装建议”确保我们只安装基本蓝牙通信所需的位,而不是其他东西(例如打印机驱动程序)的负载。

第三步–安装CWiid模块

接下来,我们需要CWiid 蟒蛇库,因此键入:

sudo apt-get install 蟒蛇-cwiid

步骤4– Test the Connection

插入蓝牙加密狗。对于可以与Pi搭配使用的设备,请参阅 eLinux Pi Wiki。给它10秒钟的电源。

此时,最好测试一下Pi是否可以看到Nintendo Wii遥控器。输入以下命令:

sudo service 蓝牙 status

并且您应该得到答复说:

[ ok ] 蓝牙 is running.

如果你不这样做’看不到此消息,您应该重新启动Pi,然后重试。

Press the 1 和 2 buttons 上 your Wii controller at the same time. 的blue LEDs should flash. Now type :

hcitool scan

如果一切顺利,您应该会看到一个响应,显示您的Pi可以看到您的遥控器:

Scanning ...
         00:19:1C:B6:BB:41       Nintendo RVL-CNT-01

第5步–示例Python脚本

这是我的示例脚本。它是相当基本的,但显示了如何连接到遥控器并读取11个按钮状态。

#!/usr/bin/python
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#|R|a|s|p|b|e|r|r|y|P|i|-|S|p|y|.|c|o|.|u|k|
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#
# wii_remote_1.py
# Connect a Nintendo Wii遥控器 via Bluetooth
# 和  read the button states in 蟒蛇.
#
# Project URL :
# //www.ytguangda.com/?p=1101
#
# Author : 马特 Hawkins
# Date   : 30/01/2013

# -----------------------
# Import required 蟒蛇 libraries
# -----------------------
import cwiid
import time

button_delay = 0.1

print 'Press 1 + 2 上 your Wii Remote now ...'
time.sleep(1)

# Connect to the Wii Remote. If it times out
# then quit.
try:
  wii=cwiid.Wiimote()
except RuntimeError:
  print "Error opening wiimote connection"
  quit()

print 'Wii Remote connected...\n'
print 'Press some buttons!\n'
print 'Press PLUS 和 MINUS together to disconnect 和 quit.\n'

wii.rpt_mode = cwiid.RPT_BTN

while True:

  buttons = wii.state['buttons']

  # If Plus 和 Minus buttons pressed
  # together then rumble 和 quit.
  if (buttons - cwiid.BTN_PLUS - cwiid.BTN_MINUS == 0):
    print '\nClosing connection ...'
    wii.rumble = 1
    time.sleep(1)
    wii.rumble = 0
    exit(wii)

  # Check if other buttons are pressed by
  # doing a bitwise AND of the buttons number
  # 和 the predefined constant for that button.
  if (buttons & cwiid.BTN_LEFT):
    print 'Left pressed'
    time.sleep(button_delay)

  if(buttons & cwiid.BTN_RIGHT):
    print 'Right pressed'
    time.sleep(button_delay)

  if (buttons & cwiid.BTN_UP):
    print 'Up pressed'
    time.sleep(button_delay)

  if (buttons & cwiid.BTN_DOWN):
    print 'Down pressed'
    time.sleep(button_delay)

  if (buttons & cwiid.BTN_1):
    print 'Button 1 pressed'
    time.sleep(button_delay)

  if (buttons & cwiid.BTN_2):
    print 'Button 2 pressed'
    time.sleep(button_delay)

  if (buttons & cwiid.BTN_A):
    print 'Button A pressed'
    time.sleep(button_delay)

  if (buttons & cwiid.BTN_B):
    print 'Button B pressed'
    time.sleep(button_delay)

  if (buttons & cwiid.BTN_HOME):
    print 'Home Button pressed'
    time.sleep(button_delay)

  if (buttons & cwiid.BTN_MINUS):
    print 'Minus Button pressed'
    time.sleep(button_delay)

  if (buttons & cwiid.BTN_PLUS):
    print 'Plus Button pressed'
    time.sleep(button_delay)

要将以下脚本直接下载到您的Pi,您可以输入:

wget //www.ytguangda.com/archive/python/wii_remote_1.py

然后,您可以使用以下命令运行脚本:

蟒蛇 wii_remote_1.py

按下Wii控制器上的按钮应导致文本被打印到屏幕上。该文本应告诉您按下了哪个按钮。同时按加号和减号将退出脚本。

您如何使用新的Wii遥控器电源来完成您的想象。对我来说,我将用它来控制便宜的无线电遥控汽车。

分享。

26条留言

    • 您是读心者吗?昨天我去了特易购(Tesco)寻找其中之一,他们没有’没有任何东西!我想要一个用于我的RC汽车项目。

  1. 谢谢Matt,自从我在圣诞节购买Pi以来,这一直是我要做的事情,所以我以为’d昨天您的帖子突然弹出并且没有任何问题时,请尝试一下。一世’我什至现在已经编辑了代码来点亮一些LED’开启和关闭,作为下一步驱动某些电动机的步骤(I’我对编码完全陌生,所以我对自己留下了深刻的印象!)

    您是否知道有什么方法可以将Wiimote MAC地址传递给CWiid,以便Wiimote将自动连接而不必将其置于可发现模式?

  2. 约翰·克罗

    的Bluetooth Dongle looks almost identical to the 上es in poundworld.
    我有几个,其中一台在笔记本电脑上,第二台在Rpi上等待类似的东西。
    请问我是否可以找到BT手机并进行操作。
    感谢您的发布

  3. 嗨,当我在Wii遥控器上按1和2,然后运行hcitool scan时,我得到“设备不可用:没有这样的设备”。我尝试了sudo hcitool scan,结果相同。我尝试按“sync”在远程,但仍然没有。我该如何解决?

  4. 刚买了一个pi,发现了应用程序的这个小地方。作为参考,我最近在Poundland购买了一个蓝牙加密狗(每个售价1英镑)。第一次工作!
    明天下班,再多买几口。感谢您的努力。

  5. 马克·鲁特里奇

    任何以‘DEVICE’尝试时没有列出任何内容‘hcitool dev’应该尝试从PI(而不是集线器)运行蓝牙,还尝试将其拔出并重新插入,重新启动似乎也对我有用!

    I’m使用磅USB蓝牙加密狗(上次购买了5个!),效果不错。一世’d recommend if you’重新考虑将wii-motes用于您要拖网到/ etc / cwiid / wminput /的其他项目,然后使用Nano或类似方法(不要’如果你忘记了须藤’不是ROOT!)以查看此处的任何文件,‘fps_config’是一个很好的开始,然后将其另存为其他。要运行此安装程序,只需调用wminput -c或以静默方式将其作为守护程序运行。

    I’我只是写一个与我的世界一起工作!所以wminput -d -c / etc / cwiid / wminput / mcpi_config

    希望能对某人有所帮助!

  6. 谢谢,这真的很有用!–一件事如果你’在geany或等价的非IDLE程序中重新使用这些函数,必须在while循环之前包含time.sleep(1),因为它不会’没有工作。我花了一个月的困惑表情来解决:/

  7. 先生,
    hcitool扫描给出了mac地址和Nintendo RVL-CNT-01-TR
    蟒蛇 wii_remote_1.py给出txt立即在Wii遥控器上按1 + 2…
    几秒钟后在屏幕上显示一条消息。
    找不到维诺特人
    有解决方案吗?
    问候和感谢您的努力。
    马丁

    • 问题方案。
      有一个Wii U遥控器,它不’工作。没有发现错误’s in program.
      扫描Wii U遥控器可获得Nintendo RVL-CNT-01-TR。
      扫描Wii遥控器可获得Nintendo RVL-CNT-01。
      现在所有按钮都可以正常工作。
      问候语

      • 香农斯普林

        错误。显然带有WiiMotion Plus的新WiiMotes显示为RVL-CNT-01-TR。一世’米在同一条船上,有点被嘲笑,因为它’对我也一样,我可以’找不到供源或开发人员修复的信息。
        It’正常的WiiMote绿色路易吉控制器。
        谁有想法?

  8. 罗伯·杰弗里

    您可以通过这种设置期望什么样的范围。一世’我见过人们在很远的距离上使用Wiimotes和Wii,但是Pi会很好地工作吗?我需要至少有20米。

  9. pingback: WiiリモコンからRapiroを动かす|アンドロイドな日々

  10. 托尼·萨维奇

    I’我是Raspberry Pi,Python和Linux的一个完整的新手(只有我的Pi有4周的时间)。但这是第一次完美。谢谢,马特。一世’我打算将其用于我的(半)自动驾驶汽车’米目前正在建设中。

  11. 嗨,马特,
    这对我来说很好。我想将其扩展到包括我的Wii经典控制器,尤其是两个操纵杆。有任何想法吗 ?

  12. pingback: Wiimote的Initio机器人第1部分| bungleofhay.co.uk

发表评论

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.