使用MCP3008在Raspberry 体育彩票31选7上使用操纵杆

17

在浏览eBay的电子产品时,我发现了一些有趣的物品可以连接到体育彩票31选7。第一项是小型2轴模拟操纵杆。它们类似于现代游戏机控制器上的指拨杆。这些模块便宜且易于连接到电路,因此我决定购买一个。输出是模拟的,因此您需要一种机制让体育彩票31选7读取这些电压。

在这篇文章中,我’ll显示如何在体育彩票31选7上使用此设备。一旦工作,它就可以用作各种项目的输入设备。也许是使用Pygame模块编写的Python游戏?

模拟操纵杆我购买的设备被标记为“Keyes_SJoyes”。它由两个电位计组成,它们根据指尖杆的水平和垂直位置提供模拟电压。按下操纵杆可激活一个小开关。板上没有花哨的组件,因为尽管5V 印刷电路板标签,实际上只有两个可变电阻在3.3V电压下仍能正常工作。

MCP3008引脚排列为了测量X和Y电压,我决定使用MCP3008 10位模数转换器。这些设备价格便宜,易于设置,并允许体育彩票31选7使用它读取8个模拟输入’s SPI接口。在本教程中,我们仅需要三个输入。

看我的 以前的MCP3008帖子 有关我如何使用它读取光线水平和温度的详细信息。

面包板电路

这是我的测试电路。我的游戏杆的引出线与我在此图中使用的Sparkfun符号略有不同,但导线颜色编码与照片匹配。

MCP3008和操纵杆电路

这是操纵杆模块的接线信息:

Joystick          体育彩票31选7/MCP3008              Wire Colour
--------------    ----------------------  ----------------
GND  (Ground)     体育彩票31选7 通用输入输出 体育彩票31选7n 6 (Ground)  Black
5V   (3.3V)       体育彩票31选7 通用输入输出 体育彩票31选7n 1 (3.3V)    White
SW   (Switch)     MCP3008 体育彩票31选7n 1 (CH0)     Purple
VRx  (X voltage)  MCP3008 体育彩票31选7n 2 (CH1)     Blue
VRy  (Y voltage)  MCP3008 体育彩票31选7n 3 (CH2)     Green

MCP3008的连线方式与我之前的文章相同:

MCP3008           体育彩票31选7                      Wire Colour
--------------    ----------------        -----------
体育彩票31选7n 1  (CH0)      -                       Purple
体育彩票31选7n 2  (CH1)      -                       Blue
体育彩票31选7n 3  (CH2)      -                       Green
体育彩票31选7n 9  (DGND)     体育彩票31选7n 6  (Ground)         Black
体育彩票31选7n 10 (CS)       体育彩票31选7n 24 (GPIO8)          Orange
体育彩票31选7n 11 (DIN)      体育彩票31选7n 19 (GPIO10)         Yellow
体育彩票31选7n 12 (DOUT)     体育彩票31选7n 21 (GPIO9)          Green
体育彩票31选7n 13 (CLK)      体育彩票31选7n 23 (GPIO11)         Blue
体育彩票31选7n 14 (AGND)     体育彩票31选7n 6  (Ground)         Black       
体育彩票31选7n 15 (VREF)     体育彩票31选7n 1  (3.3V)           Red
体育彩票31选7n 16 (VDD)      体育彩票31选7n 1  (3.3V)           Red

模拟操纵杆在这种情况下,我们使用三个模拟输入。您可以使用普通的GPIO引脚读取Switch值,但在这种情况下,为方便起见,我决定使用模拟输入。

10K电阻器用于将开关输入拉高(3.3V)。按下开关后,输入将接地(0V)。如果没有电阻,则当开关处于断开状态时,输入将处于不确定状态’t被按下并读取随机值。试试看。

体育彩票31选7 SPI配置

为了使用MCP3008,我们需要首先在体育彩票31选7上配置SPI总线。不要在这里重复说明,而是打开 使用MCP3008在Raspberry 体育彩票31选7上的模拟传感器 在新的浏览器窗口中完成本教程,并完成以下部分:

  • 启用硬件SPI
  • 安装Python SPI包装器

蟒蛇测试脚本

希望你能’正确连接并配置SPI接口,我们准备运行Python脚本来读取操纵杆值。

ADC是10位的,因此它可以报告0到1023之间的数字范围(2的幂为10)。读数为0表示输入为0V,读数为1023表示输入为3.3V。在我们的电路中,该开关将读取3.3V(1023),直到按下该开关时它将读取0V(0)。当X和Y操纵杆从一个极端移动到另一个极端时,其值将在0到1023之间变化。在中间位置,我们期望值为511.5。实际上,这将在509和514之间变化。

#!/usr/bin/python
#--------------------------------------
# This script reads data from a
# MCP3008 ADC device using the SPI bus.
#
# Analogue joystick version!
#
# Author : 马特 Hawkins
# Date   : 17/04/2014
#
# //www.ytguangda.com/
#
#--------------------------------------

import spidev
import time
import os

# Open SPI bus
spi = spidev.SpiDev()
spi.open(0,0)

# Function to read SPI data from MCP3008 chip
# Channel must be an integer 0-7
def ReadChannel(channel):
  adc = spi.xfer2([1,(8+channel)<<4,0])
  data = ((adc[1]&3) << 8) + adc[2]
  return data

# Define 传感器 channels
# (channels 3 to 7 unused)
swt_channel = 0
vrx_channel = 1
vry_channel = 2

# Define 延迟 between readings (s)
delay = 0.5

while True:

  # Read the joystick position data
  vrx_pos = ReadChannel(vrx_channel)
  vry_pos = ReadChannel(vry_channel)

  # Read switch state
  swt_val = ReadChannel(swt_channel)

  # Print out results
  print "--------------------------------------------"
  print("X : {}  Y : {}  Switch : {}".format(vrx_pos,vry_pos,swt_val))

  # Wait before repeating loop
  time.sleep(delay)

您可以使用以下命令将此脚本直接下载到您的体育彩票31选7:

wget //bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/mcp3008/mcp3008_joystick.py

然后可以使用以下命令运行它:

sudo 蟒蛇 mcp3008_joystick.py

如果一切正常,您应该会看到类似以下内容的输出:

MCP3008操纵杆输出

开关读数有所不同,但始终>1010未按时<10 when pressed.

移动指尖杆时,应该看到X和Y值正在变化。您可以降低“delay”变量以提高更新率。

现在您可以从操纵杆读取值,您只需要考虑一个项目即可使用它!您可以在MCP3008上添加一个附加模块并使用另外三个通道。

这是测试电路和拇指操纵杆模块的一些照片:

您可能会注意到照片中的面包板上有一些多余的电线(红色长线,蓝色长线和黑色弯曲线)。这些是以前的MCP3008教程遗留的,可以忽略。

这是我在Raspberry 体育彩票31选7上使用模拟2轴操纵杆发现的一些其他博客文章:

http://devilqube.blogspot.co.uk/2014/02/analog-thumbstick-and-raspberry-pi.html

//learn.adafruit.com/cupcade-raspberry-pi-micro-mini-arcade-game-cabinet

分享。

17条留言

  1. 克里斯·约翰斯通

    嗨,马特,

    感谢您提供这些详细信息。这些图像也非常有帮助。一世’m希望使用这样的操纵杆来控制两个舵机,以移动将流至屏幕的摄像机。

    首先,是否可以通过略微定制的设置来使用这种类型的输入来控制伺服器?

    其次,这可能是一个新手问题,即使某些GPIO引脚用于控制伺服器和操纵杆,我仍然可以使用微型TFT屏幕吗?一世 ’我想到了一个位于GPIO引脚上的迷你触摸屏。

    谢谢,

    克里斯

    • 读取操纵杆位置后,您可以使用这些数字驱动您可以想到的其他任何事情。操纵杆位置范围可以映射到发送到伺服控制系统的值范围。一世’伺服器并没有做很多事情,这很大程度上取决于您用来控制伺服器的内容。

  2. 克里斯·约翰斯通

    好的,我想我理解原理。一世’我已经看到了我想使用Arduino实现的示例,但是我’我不确定我对R体育彩票31选7的掌握程度是否与对R体育彩票31选7的掌握程度相同。

    感谢您的答复。

    克里斯

  3. 运行脚本时,我得到的都是0。我不确定发生了什么,我已经三重检查了我所有的连接,但得到的结果相同。也许我没有正确安装SPI,但我也仔细检查了所有这些内容。也许我的MCP3008芯片坏了?我不’不知道发生了什么。

    • 在没有操纵杆的情况下进行尝试,并检查使用0V或3.3V输入可获得的值。这至少会确认MCP3008是否在工作。

  4. 感谢您提供清晰的教程Matt!

    我不久前得到了一组Arduino传感器,并根据您的建议上周刚购买了MCP3008。我很高兴今晚能通过您的练习,并很高兴地说操纵杆运转良好(嗯,我的“resting”x和y的位置是532506… I’我假设我的操纵杆有点混乱,但是那’d易于补偿)。现在看看我能做什么…

  5. 我确实使用Raspberry 体育彩票31选7 3和Retropi尝试了此操作,但没有使其工作。

    当我运行sudo 蟒蛇 mcp3008_joystick.py时,我onlu得到0。我认为问题是Retropi

    • It’可能是可行的,但是您需要一个软件驱动程序才能与GUI交互。一世’我不知道该怎么写,但是也许有一些事情要做。

  6. 汉斯·韦布鲁格

    在我的体育彩票31选7 3上,脚本没有’直到我添加max_speed行如下:

    spi = spidev.SpiDev()
    spi.open(0,0)
    spi.max_speed_hz = 50000

    希望对其他用户有所帮助。

发表评论

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