我对这个领域完全陌生,并不真正知道自己在做什么并且需要帮助。我正在尝试使用 MT6816 14 位磁性编码器通过 Raspberry Pi 的 SPI 连接读取绝对角度。
我有以下问题:
-
在硬件方面,是否只是简单地连接必要的连接(3.3V、MOSI、MISO、SCK、GND、CE01)?
-
对于编码部分,我使用 Thonny,似乎 spidev 库已预安装为“Raspberry Pi SPI 环回测试代码”(| ||https://gist.github.com/fnishio/b2063941b82f2cf1b935 ) 运行没有任何错误。因此,我假设除了在 raspi-config 中启用 SPI 之外不需要其他设置。我对吗?或者有没有办法测试SPI连接是否有效? 根据我的理解,根据MT6816数据表(
-
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