首页 > 编程问答 >在 Raspberry Pi 4 上使用 Python 从具有 SPI 连接的 MT6816 磁性编码器读取

在 Raspberry Pi 4 上使用 Python 从具有 SPI 连接的 MT6816 磁性编码器读取

时间:2024-07-20 23:57:37浏览次数:13  
标签:python spi raspberry-pi4

我对这个领域完全陌生,并不真正知道自己在做什么并且需要帮助。我正在尝试使用 MT6816 14 位磁性编码器通过 Raspberry Pi 的 SPI 连接读取绝对角度。

我有以下问题:

  1. 在硬件方面,是否只是简单地连接必要的连接(3.3V、MOSI、MISO、SCK、GND、CE01)?

  2. 对于编码部分,我使用 Thonny,似乎 spidev 库已预安装为“Raspberry Pi SPI 环回测试代码”(| ||https://gist.github.com/fnishio/b2063941b82f2cf1b935 ) 运行没有任何错误。因此,我假设除了在 r​​aspi-config 中启用 SPI 之外不需要其他设置。我对吗?或者有没有办法测试SPI连接是否有效? 根据我的理解,根据MT6816数据表(

  3. https://www.compel.ru/item-pdf/c51a62edcf72a97fdb3c3d9108c3c3d5/pn/magntek~mt6816ct-std。 pdf :第23页),我需要的(即14位角度数据)存储在寄存器地址0x03和0x04[7:2]中。我不知道如何访问所述地址并读取这些值。 我连接了 6 根电线并使用了代码(再次不知道我在做什么)。我在传感器周围移动磁铁,期望值的摆动范围,输出只是在 [0, 0, 0] 和 [255, 255, 255] 之间来回切换。

我渴望学到很多东西!我将不胜感激您提供的任何帮助。

import spidev
import time

spi = spidev.SpiDev()
spi.open(0, 0)
spi.threewire = False
spi.mode = 3

def BytesToHex(Bytes):
    return ''.join(["0x%02X " % x for x in Bytes]).strip()

try:
    while True:
        resp = spi.xfer2([0x8300, 0x8400, 0x8500])
        #print(BytesToHex(resp))
        print(resp)
        time.sleep(0.1)

except KeyboardInterrupt:
    spi.close()
    print("Ctrl-C pressed")

I'm eager to learn a lot! I'll appreciate any help you can offer.


好的,让我们将任务分解为读取 MT6816 磁性编码器数据的分步指南。

1. 硬件连接

是对的,第一步是将 MT6816 连接到的 Raspberry Pi 4。以下是连接引脚的典型方法:

  • MT6816 引脚 | Raspberry Pi 引脚 | 说明
  • ---|---|---
  • 3.3V | 引脚 1 或 17 | 3.3V 电源
  • GND | 引脚 6、9 或 39 | 接地
  • CS/CE01 | 引脚 26 (GPIO7) | 片选(可以使用其他 GPIO 引脚,更新的代码以反映)
  • SCK | 引脚 23 (GPIO11/SCLK) | 时钟
  • MOSI | 引脚 19 (GPIO10/MOSI) | 主输出从输入
  • MISO | 引脚 21 (GPIO9/MISO) | 主输入从输出

重要提示:

  • 确保的 MT6816 和 Raspberry Pi 都使用相同的逻辑电平(3.3V)。
  • 仔细检查的 MT6816 数据表,以确认引脚分配,因为它可能会因模块而异。

2. 测试 SPI 连接

是对的,运行 SPI 环回测试是验证 SPI 设置的绝佳方法。但是,让我们使用 Python 脚本直接测试 MT6816:

import spidev
import time

spi = spidev.SpiDev()
spi.open(0, 0)  # 总线 0,设备 0(可以根据需要更改)
spi.mode = 0b01  # 设置 SPI 模式(请参阅数据表,了解的传感器)
spi.max_speed_hz = 1000000  # 设置 SPI 时钟速度(开始时较低)

def read_mt6816_register(register_address):
    # 构建读取命令(请参阅数据表以了解命令结构)
    command_byte = 0x80 | register_address  # 0x80 通常表示读取操作

    # 发送命令并接收数据
    response = spi.xfer2([command_byte, 0x00])  # 发送两个字节(命令和虚拟数据)

    return response[1]  # 返回收到的数据字节

try:
    while True:
        # 读取寄存器 0x00(例如)
        register_value = read_mt6816_register(0x00)
        print("寄存器值:0x{:02X}".format(register_value))
        time.sleep(0.5)

except KeyboardInterrupt:
    spi.close()
    print("程序已停止。")

如果的 SPI 连接正常工作,并且 MT6816 已正确响应,应该会看到从传感器返回的寄存器值。如果没有,请仔细检查的连接并参考 MT6816 数据表,以获取有关通信协议的特定说明。

3. 从 MT6816 读取角度数据

现在让我们编写代码以从 MT6816 读取角度数据:

import spidev
import time

spi = spidev.SpiDev()
spi.open(0, 0) 
spi.mode = 0b01  # 根据的传感器和数据表进行调整
spi.max_speed_hz = 1000000  # 根据的传感器和数据表进行调整

def read_mt6816_register(register_address):
    # 构建读取命令(针对 MT6816 进行调整)
    command_byte = 0x80 | register_address 

    response = spi.xfer2([command_byte, 0x00]) 
    return response[1] 

def read_mt6816_angle():
    # 从寄存器 0x03 读取高字节
    high_byte = read_mt6816_register(0x03)

    # 从寄存器 0x04 读取低字节
    low_byte = read_mt6816_register(0x04)

    # 合并字节以形成 14 位角度值
    angle_raw = ((high_byte & 0x3F) << 8) | low_byte

    # 将原始角度值转换为度数
    angle_degrees = angle_raw * 360 / 16384 

    return angle_degrees

try:
    while True:
        angle = read_mt6816_angle()
        print("角度:{: .2f} 度".format(angle))
        time.sleep(0.1) 

except KeyboardInterrupt:
    spi.close()
    print("程序已停止。")

此代码应执行以下操作:

  • 初始化 SPI: 设置 SPI 连接。
  • 读取寄存器: read_mt6816_register() 函数从指定的寄存器地址读取数据。
  • 读取角度: read_mt6816_angle() 函数从寄存器 0x03 和 0x04 读取角度数据,组合字节,并将原始值转换为度数。
  • 主循环: 连续读取并打印角度。

请记住:

  • 根据的 MT6816 数据表仔细检查和调整 SPI 模式、时钟速度、命令结构和寄存器地址。
  • 该代码假设角度数据以 14 位格式表示,分辨率为 0.0219 度/计数(360 度 / 16384 计数)。根据的传感器,可能需要相应地修改计算。

通过遵循这些步骤并根据 MT6816 数据表中的特定详细信息调整代码,应该能够从的 Raspberry Pi 4 读取角度数据。祝好运,编码愉快!

标签:python,spi,raspberry-pi4
From: 78292392

相关文章

  • PythonW 不运行脚本。严重地
    因此,使用Windows10和Python3.6。我创建了一个.py脚本,它可以使用命令pythonmyscript.py在命令提示符下正常运行,但是当我制作该脚本的精确副本并为其赋予扩展名.pyw,并尝试使用pythonw运行它时命令pythonwmyscript.pyw,什么也没有发生......
  • 如何使用Python和Selenium模拟产品购买以获取库存信息
    我正在开发一项网络抓取服务,主要针对时尚行业。我的目标是提供有关产品的全面数据,包括库存水平。为了实现这一目标,我需要模拟购买以确定每种尺寸的产品的最大可用数量。我一直在使用Python和Selenium进行网络抓取部分,但在准确模拟购买方面面临着挑战检索股票信息的过程。......
  • 连接Python套接字的问题
    当我写“关闭”时,我试图让我的电报机器人关闭计算机。我不想将机器人连接到网站上的托管。我选择我的手机(AndroidRedmiNote10)作为托管。我在上面安装了Termux和Pydroid。我写了两个文件:main到我的电脑,client到我的手机。通过在计算机上运行这两个文件,一切正常。但是,当我在......
  • 如何修复导入 Numexpr Python 时的错误
    在Windows10Python3.7.9(IDLE)上,我成功安装了“pipinstallnumexpr”,但在“importnumexprasne”时出现错误:Traceback(最近一次调用):文件“<pyshell#21>”,第267行,位于将numexpr导入为ne文件“C:\Python379\lib\site-packages\numexpr_init_.py”......
  • 让 cpython 优化恒定条件
    我正在用Python编写需要尽可能高效运行的代码,但有时我需要深入挖掘调试语句。不要注释这些输入或输出(或者使用外部预处理器来处理代码,就像这里建议的那样Python相当于#ifdefDEBUG或这里如何在python中实现“#ifdef”?|||)我想在模块的开头定义一个变量......
  • 如何使用 for 循环在 python jupyter 笔记本中创建动态图?
    我正在学习本课关于用Python求解热方程。该课程指出,在求解热方程后,我们可以通过在循环中简单地调用pyplot.plot()来可视化解的动画图,其中下面的代码将动态绘制每次每个点的温度,从而得到一个动画情节(课程帖子中提供了动画情节的示例)。importnumpyfrommatplotlibi......
  • Python:动态爱心代码
    importrandomfrommathimportsin,cos,pi,logfromtkinterimport*CANVAS_WIDTH=640CANVAS_HEIGHT=480CANVAS_CENTER_X=CANVAS_WIDTH/2CANVAS_CENTER_Y=CANVAS_HEIGHT/2IMAGE_ENLARGE=11HEART_COLOR="#FF99CC"defcenter_......
  • 如何在 PYTHON 中查找输入数字的千位、百位、十位和个位中的数字?例如:256 有 6 个一、5
    num=int(input("Pleasegivemeanumber:"))print(num)thou=int((num//1000))print(thou)hun=int((num//100))print(hun)ten=int((num//10))print(ten)one=int((num//1))print(one)我尝试过这个,但它不起作用,我被困住了。代码几乎是正确的,但需......
  • ModuleNotFoundError:没有名为“pyaes”的模块 python 虚拟机
    在此处输入图像描述当我在启动python项目的虚拟机上构建某个工具时,几秒钟后会出现此消息。我已经尝试重新安装pyaes但无济于事。谁能帮我?非常感谢我已经尝试重新安装pyaes但无济于事,我搜索了tepyaes模块的十个路径,但我没有找到它,而我在另一台虚拟机上完成了......
  • 如何通过 mutagen (Python) 为 mp3 文件中的情绪添加价值?
    我找不到通过mutagen(Python库)将情绪写入mp3文件的方法初始化:frommutagen.mp3importMP3frommutagen.id3importID3,TIT2,TALB,TPE1,TPE2,TCON,TPUB,TENC,TIT3,APIC,WOAR,PRIVaudio=MP3(mp3_file,ID3=ID3)我可以使用audio['TIT3']=TIT3(......