如何在Raspberry Pi中使用MCP23017 I2C端口扩展器–第2部分

7

In 如何在Raspberry Pi中使用MCP23017 I2C端口扩展器– Part 1 我介绍了如何配置Pi以使用I2C,以便可以将MCP23017 16位端口扩展器连接到它。如果你’我已经阅读了那篇文章,并准备好电路,离使用简单的Python脚本控制芯片仅几步之遥。

MCP23017电路示例

在这篇文章中,我们将专注于控制输出。我们正在使用“GPA”组。还有另一组八个引脚(GPB0–GPB7),可以通过一些代码调整以相同的方式进行控制。

对于这种项目,可以在二进制,十进制和十六进制之间转换的计算器非常有用。无论您使用的是台式机还是移动计算机,都有很多计算器可以针对您的操作系统执行此操作。易于使用 二进制转换器 可以在我们的姐妹网站上找到。

输出的Python脚本

Here is an example script which will count from 1 to 8 setting the first three 平均绩点 pins as it goes :

import smbus
import time

#bus = smbus.SMBus(0)  # Rev 1 Pi uses 0
bus = smbus.SMBus(1) # Rev 2 Pi uses 1

DEVICE = 0x20 # Device address (A0-A2)
IODIRA = 0x00 # Pin direction register
OLATA  = 0x14 # Register for outputs
GPIOA  = 0x12 # Register for inputs

# Set all 平均绩点 pins as outputs by setting
# all bits of IODIRA register to 0
bus.write_byte_data(DEVICE,IODIRA,0x00)

# Set output all 7 output bits to 0
bus.write_byte_data(DEVICE,OLATA,0)

for MyData in range(1,8):
  # Count from 1 to 8 which in binary will count
  # from 001 to 111
  总线.write_byte_data(DEVICE,OLATA,MyData)
  print MyData
  time.sleep(1)

# Set all bits to zero
bus.write_byte_data(DEVICE,OLATA,0)

您可以使用以下命令直接下载到您的Pi:

wget //bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/mcp23017/mcp23017_outputs.py

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

sudo 蟒蛇 mcp23017_outputs.py

上面的脚本执行以下操作:

  • 导入smbus和时间库
  • 创建一个名为的smbus对象“bus”
  • 配置一些常量
  • Sets all the 平均绩点 pins as outputs
  • Sets all the 平均绩点 pins to zero
  • Counts from 1 to 8 and sets the 平均绩点 pins to the binary equivalent waiting 1 second between each step
  • Finally sets all 平均绩点 to zero

您应该看到的是LED以二进制顺序点亮:

000,001,010,011,100,101,110,111

需要注意的最重要的一点是,将数据发送到寄存器时,必须一次性设置所有8位。因此,要将所有GPA引脚配置为输出,请向IODIRA寄存器发送0000000。要将它们全部设置为输入,您需要发送1111111二进制或255十进制或0xFF十六进制。要将GPA0-3设置为输出,将GPA4-7设置为输入,则需要设置1111000二进制,240十进制或0xF0十六进制。

It’设置输出引脚的情况与此相同。如果你’将GPA引脚设置为输出,并且要将GPA1设置为高电平并将所有其他引脚设置为低电平,则需要将00000010发送到OLATA寄存器。如果要将GPA2和GPA7设置为高电平,则将发送10000100。

造访 如何在Raspberry Pi中使用MCP23017 I2C端口扩展器– Part 3 该页面说明了如何将引脚配置为输入并读取其状态。

分享。

7条留言

  1. 你好

    感谢您提供此信息,它非常有用。我对这一切非常陌生,并试图了解如何一次启用多个引脚。我不’不能真正理解二进制文件及其与GPA引脚的关系。您有什么机会可以帮助我吗?

    • 吉尔特·范科佩诺尔(Geert Vancompernolle)

      二进制只是另一个数字系统,就像我们都非常了解的十进制数字系统一样。但是我们没有使用基数10’将二进制2的基数重新使用。

      对于十进制数字系统,我们’的数字是0到9。对于二进制数字系统,我们’re只有0和1(bi = 2)。

      如果您有一系列1’s and 0’s,您必须为其分配权重为x的权重,其中x是1在位序列中的位置。
      如果位位置包含1,则它’s 2 ^ x,如果位位置包含0,则它’s 0^x (or simply 0).
      例如:1001 =>2 ^ 3 + 0 ^ 2 + 0 ^ 1 +1 => 2^3 + 1 => 8 + 1 => 9.

      现在回到MCP23017:
      If you want to control the pins through 平均绩点 or GPB, you have to represent each pin by a 0 0r a 1, for a maximum of 8 bits per port.
      因此,您可以发送到端口的最小值(以二进制表示)为00000000(十进制为0),最大值为11111111(十进制为255)。
      在第一种情况下,向所有引脚发送0,在第二种情况下,向所有引脚发送1。位序列的最左位,也称为最高有效位或MSB,代表GPA-7或GPB-7,位序列的最右位,也称为最低有效位或LSB,代表GPA-0或GPB-0。

      It should be clear now that, if I want to set pin 平均绩点-5 to 1 and all the other pins of 平均绩点 to 0, I have to send a 00100000b to the device, being 32 decimal (same calculation as I’ve used before).

      Note that 平均绩点-5 is in fact the 6th IO pin of port 平均绩点, since the datasheet starts from 平均绩点-0. Hence, 平均绩点-5 is the 6th bit in the bit sequence, starting from the right (LSB).

  2. My understanding was that the 平均绩点 would be addressed like “00000001”, “00000010”, “00000100”, “00001000”依此类推,因此向左移动会给您所需的东西;


    for MyData in range(0,8):
    # Count from 1 to 8 which in binary will count
    # from 001 to 111
    总线.write_byte_data(DEVICE,OLATA,1<<MyData)

  3. 谢谢,超级有用的信息!

    对于想使用GPB端的任何人,IODIRB = 0x01,OLATB = 0x15和GPIOB = 0x13。

    另外,我发现使用二进制而不是十六进制可以更直观地读取/写入引脚值。
    例如,如果我将输出引脚设置为0b11001100,’相对于编写0xCC而言,即使它们在python中具有相同的含义,也可以更轻松地查看输出内容。

  4. “To set 平均绩点0-3 as outputs and 平均绩点4-8 as inputs you need to set 1111000 binary, 240 decimal or 0xF0 hex.”

    我想你的意思是说:0-3作为输出,4-7作为输入
    要么,要么我’我误会了这里的东西。

发表评论

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