树莓派 pico rfid rc522 (Micropython)

2024-01-21

我想使用 RPi Pico 从 mfrc522 (Iduino RFID-rc522) 读卡器读取数据,但我不知道如何操作。我试图使用为此目的制作的 mfrc522.py MicroPython 库。阅读器正在通过 SPI 与 Pi 通信,我将其连接到 SPI0。 圆周率上的代码:

    import time
from machine import I2C, Pin, SPI

from mfrc522 import MFRC522

sck = Pin(6, Pin.OUT)
mosi = Pin(7, Pin.OUT)
miso = Pin(4, Pin.OUT)
spi = SPI(0, baudrate=100000, polarity=0, phase=0, sck=sck, mosi=mosi, miso=miso)
sda = Pin(5, Pin.OUT)
rst = Pin(22, Pin.OUT)

while True:
    rdr = MFRC522(spi, sda, rst)
    uid = ""
    (stat, tag_type) = rdr.request(rdr.REQIDL)
    if stat == rdr.OK:
        (stat, raw_uid) = rdr.anticoll()
        if stat == rdr.OK:
            uid = ("0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
            print(uid)

和图书馆:

from machine import Pin, SPI
from os import uname


class MFRC522:

    OK = 0
    NOTAGERR = 1
    ERR = 2

    REQIDL = 0x26
    REQALL = 0x52
    AUTHENT1A = 0x60
    AUTHENT1B = 0x61

    def __init__(self, spi, cs, rst):

        self.spi = spi
        self.cs = cs
        self.rst = rst
        self.rst.value(0)
        self.cs.value(1)
        self.spi.init()
        self.rst.value(1)
        self.init()

    def _wreg(self, reg, val):

        self.cs.value(0)
        self.spi.write(b'%c' % int(0xff & ((reg << 1) & 0x7e)))
        self.spi.write(b'%c' % int(0xff & val))
        self.cs.value(1)

    def _rreg(self, reg):

        self.cs.value(0)
        self.spi.write(b'%c' % int(0xff & (((reg << 1) & 0x7e) | 0x80)))
        val = self.spi.read(1)
        self.cs.value(1)

        return val[0]

    def _sflags(self, reg, mask):
        self._wreg(reg, self._rreg(reg) | mask)

    def _cflags(self, reg, mask):
        self._wreg(reg, self._rreg(reg) & (~mask))

    def _tocard(self, cmd, send):
        recv = []
        bits = irq_en = wait_irq = n = 0
        stat = self.ERR

        if cmd == 0x0E:
            irq_en = 0x12
            wait_irq = 0x10
        elif cmd == 0x0C:
            irq_en = 0x77
            wait_irq = 0x30

        self._wreg(0x02, irq_en | 0x80)
        self._cflags(0x04, 0x80)
        self._sflags(0x0A, 0x80)
        self._wreg(0x01, 0x00)

        for c in send:
            self._wreg(0x09, c)
        self._wreg(0x01, cmd)

        if cmd == 0x0C:
            self._sflags(0x0D, 0x80)

        i = 2000
        while True:
            n = self._rreg(0x04)
            i -= 1
            if ~((i != 0) and ~(n & 0x01) and ~(n & wait_irq)):
                break

        self._cflags(0x0D, 0x80)

        if i:
            if (self._rreg(0x06) & 0x1B) == 0x00:
                stat = self.OK

                if n & irq_en & 0x01:
                    stat = self.NOTAGERR
                elif cmd == 0x0C:
                    n = self._rreg(0x0A)
                    lbits = self._rreg(0x0C) & 0x07
                    if lbits != 0:
                        bits = (n - 1) * 8 + lbits
                    else:
                        bits = n * 8

                    if n == 0:
                        n = 1
                    elif n > 16:
                        n = 16

                    for _ in range(n):
                        recv.append(self._rreg(0x09))
            else:
                stat = self.ERR

        return stat, recv, bits

    def _crc(self, data):

        self._cflags(0x05, 0x04)
        self._sflags(0x0A, 0x80)

        for c in data:
            self._wreg(0x09, c)

        self._wreg(0x01, 0x03)

        i = 0xFF
        while True:
            n = self._rreg(0x05)
            i -= 1
            if not ((i != 0) and not (n & 0x04)):
                break

        return [self._rreg(0x22), self._rreg(0x21)]

    def init(self):

        self.reset()
        self._wreg(0x2A, 0x8D)
        self._wreg(0x2B, 0x3E)
        self._wreg(0x2D, 30)
        self._wreg(0x2C, 0)
        self._wreg(0x15, 0x40)
        self._wreg(0x11, 0x3D)
        self.antenna_on()

    def reset(self):
        self._wreg(0x01, 0x0F)

    def antenna_on(self, on=True):

        if on and ~(self._rreg(0x14) & 0x03):
            self._sflags(0x14, 0x03)
        else:
            self._cflags(0x14, 0x03)

    def request(self, mode):

        self._wreg(0x0D, 0x07)
        (stat, recv, bits) = self._tocard(0x0C, [mode])

        if (stat != self.OK) | (bits != 0x10):
            stat = self.ERR

        return stat, bits

    def anticoll(self):

        ser_chk = 0
        ser = [0x93, 0x20]

        self._wreg(0x0D, 0x00)
        (stat, recv, bits) = self._tocard(0x0C, ser)

        if stat == self.OK:
            if len(recv) == 5:
                for i in range(4):
                    ser_chk = ser_chk ^ recv[i]
                if ser_chk != recv[4]:
                    stat = self.ERR
            else:
                stat = self.ERR

        return stat, recv

    def select_tag(self, ser):

        buf = [0x93, 0x70] + ser[:5]
        buf += self._crc(buf)
        (stat, recv, bits) = self._tocard(0x0C, buf)
        return self.OK if (stat == self.OK) and (bits == 0x18) else self.ERR

    def auth(self, mode, addr, sect, ser):
        return self._tocard(0x0E, [mode, addr] + sect + ser[:4])[0]

    def stop_crypto1(self):
        self._cflags(0x08, 0x08)

    def read(self, addr):

        data = [0x30, addr]
        data += self._crc(data)
        (stat, recv, _) = self._tocard(0x0C, data)
        return recv if stat == self.OK else None

    def write(self, addr, data):

        buf = [0xA0, addr]
        buf += self._crc(buf)
        (stat, recv, bits) = self._tocard(0x0C, buf)

        if not (stat == self.OK) or not (bits == 4) or not ((recv[0] & 0x0F) == 0x0A):
            stat = self.ERR
        else:
            buf = []
            for i in range(16):
                buf.append(data[i])
            buf += self._crc(buf)
            (stat, recv, bits) = self._tocard(0x0C, buf)
            if not (stat == self.OK) or not (bits == 4) or not ((recv[0] & 0x0F) == 0x0A):
                stat = self.ERR

        return stat

我的输出绝对清晰,我没有得到任何打印。我的问题出在哪里?


在也与这个问题作斗争并发布了一个被删除的有用答案之后,我终于设法让它工作。看看这个线程树莓派.org https://www.raspberrypi.org/forums/viewtopic.php?t=303249,特别是在GitHub 仓库 https://github.com/danjperron/micropython-mfrc522来自那里提到的danjperron。

我将代码复制到我的 Pico 并更改了 PIN 码示例/Pico_read.py,第 11 行到reader = MFRC522(spi_id=0,sck=6,miso=4,mosi=7,cs=5,rst=22)以匹配您使用过的引脚。它会打印出类似的东西Card detected 0C9B5023如果有效的话。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树莓派 pico rfid rc522 (Micropython) 的相关文章

  • 与 CMake 交叉编译时的 Makefile 生成器规范

    我有两件事无法弄清楚 1 使用时CMake GUI 我们可以指定makefile生成器 我将使用 Debian Linux 交叉编译 Raspberry PI 我找不到相关的生成器 我必须选择哪种发电机 我有toolchain rpi cm
  • 如何在启动时运行命令?

    我试图弄清楚如何在启动时运行命令 就像我将其输入控制台一样 我在 Raspberry Pi 上使用 Rasbian 但我认为这个问题对于 Debian 来说通常是相同的 我尝试运行的命令是 sudo screen mono server e
  • 有没有模拟Raspberry Pi的Vagrant盒子?

    我正在考虑评估使用 Raspberry Pi 对 ARM 芯片进行编程的工具链 并且我想运行一个模拟 Raspberry 环境的 Vagrant 盒子 有谁知道是否有类似的东西可用 我已经在网上搜索了解决方案 但我可能向谷歌提出了错误的问题
  • 如何将日志记录添加到带有时间戳的文件到 Raspberry Pi 的 Python TCP 服务器

    我的项目有点陷入困境 我迫切需要帮助 我需要一个简单的 TCP 服务器 python 代码 它具有日志记录和时间戳等功能 我可以将其用于我的 Raspberry Pi 这是我的最后一年项目 我看过一些例子 但由于我在编写自己的脚本 代码方面
  • 在RaspberryPi上连接华为E3372

    我尝试使用华为 e3372 的 LTE 棒连接到互联网 我安装了 usb modeswitch ppp 和 wvdial modewswitch 工作正常 该设备安装在 dev ttyUSB0 上 我可以在其中发送 AT 命令 我想使用 w
  • 函数内部导入:函数退出时是否回收内存?

    相关问题 python 在文件顶部导入与在函数内部导入 https stackoverflow com questions 46813425 python import at top of file vs inside a function
  • 使用 re.match 或 re.search 返回多个匹配项

    我正在将一些代码转换为微型蟒蛇 http micropython org我陷入了一个特定的正则表达式 在Python中我的代码是 import re line 0 1 24 2 1 180108205500W 00001 290 m3 be
  • 如何跨架构使用 python-poetry?

    我的主要开发机器是x86 64虽然我的一些部署环境是arm7vl 树莓派 对于大多数 Python 开发来说 这不是问题 但某些 Python 库只能在PyPI https pypi org for x86 64 or piwheels h
  • UWP:模拟 Windows IoT 上特定坐标的点击

    有没有办法模拟 Windows IoT 上特定坐标的点击 我尝试使用 mouse event mouse event MOUSEEVENTF LEFTDOWN x y 0 0 但是 我收到此错误 System EntryPointNotFo
  • 此构造函数不带参数 lcd

    这是我尝试显示湿度传感器数据的代码 到我的液晶显示器 当我运行这个程序时 回溯 最近一次调用最后一次 文件 lcd py 第 7 行 lcd CharLCD cols 16 rows 2 pin rs 37 pin e 35 pins da
  • 无法挂载内存cgroup

    我尝试使用以下命令挂载内存 cgroup sudo mount t cgroup none sys fs cgroup memory o memory 我收到错误 mount sys fs cgroup memory wrong fs ty
  • Raspberry Pi 上的 Sqlite4java

    我想在 Raspberry Pi 上使用我的 java 项目 此代码依赖于 sqlite4java 它使用许多平台 包括 Arm 处理器 的本机实现link http code google com p sqlite4java downlo
  • 使用python发送消息时出现错误400

    我正在尝试使用 Gmail API 发送电子邮件 我已成功通过身份验证 并且我的计算机上有一个 client secret json 文件 我已经能够使用 Gmail API 网站上的快速入门示例获取标签列表 我已成功将范围重置为 SCOP
  • 使用 /dev/tty* 进行 9 位 uart 仿真

    我有一个不常见的协议 它需要 9600 波特率 9 位和 1 个停止位 我找不到任何可以实现此发送 接收的驱动程序 我可以寄东西到 dev tty 用于模拟这些查询 我应该发送什么 如何模拟 9600 波特率 您可以使用粘性奇偶校验 也称为
  • 带有 rpi 主站和从站的 Profibus [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我的任务是使用 Rpi 和 Rs 485 转换器构建 profibus 主站和从站网络 一个 Rpi 将成为主设备 另一个将成为从设备
  • 如何将timestamp_t转换为实际时间?

    我见过很多使用 time t 的例子 但 timestamp t 让我感到困惑 我正在做一个作业 我们需要打印出 GPS 数据 并且 GPS 设备返回一个类型 timestamp t 来表示它的时间戳和纪元时间 我尝试过使用 gmtime
  • Python VLC 实例全屏不起作用

    我对 Python 有点陌生 正在为连接运动传感器的 Raspberry Pi 开发一个应用程序 这个想法是把这个 Raspberry 放在一个房间里 在运动检测时 视频开始全屏播放 视频播放完毕后 我想让设备休眠 10 分钟 然后再次激活
  • PYGame - ImportError:没有名为 locals Raspberry Pi 的模块

    我有以下代码 usr bin python coding iso 8859 15 import pygame random from pygame locals import pygame init clock pygame time Cl
  • 是否可以将 SpaCy 安装到 Raspberry Pi 4 Raspbian Buster

    我一整天都在安装 SpaCy sudo pip install U spacy Looking in indexes https pypi org simple https www piwheels org simple Collectin
  • 使用 libx264 为 Raspberry pi 编译 Xuggler 时的问题 #2

    我正在尝试编译Xuggler http www xuggle com xuggler 对于 Raspberry Pi 在 Debian 操作系统上运行 又名 Raspbian 我遵循了可用的 基本构建说明 here http www xug

随机推荐

  • 如何避免Python中的循环导入? [复制]

    这个问题在这里已经有答案了 我知道 python 中的循环导入问题之前已经出现过很多次 并且我已经阅读了这些讨论 在这些讨论中反复提出的评论是 循环导入是糟糕设计的标志 应该重新组织代码以避免循环导入 有人可以告诉我在这种情况下如何避免循环
  • MariaDB/MySQL 选择查询将 id 的 json 数组替换为串联值

    我不太熟悉数据库查询 但我想执行以下操作 在表中 我存储了一列标签 ID 例如 1 6 8 我想回来 Music Dance Pop 例如在我的选择查询中 我没有设计数据库架构 也不允许我修改它 我想这样做的原因是这个查询的响应将直接发送到
  • javah 帮助 - “命令行上未指定类”

    我正在运行安装了 Eclipse 的 Ubuntu Linux 并且我正在尝试使用 JNI 为此 我需要使用 javah 但它似乎不起作用 我最近刚刚安装 Ubuntu 对 Linux bash shell 不熟悉 对于我名为 myJNI
  • 如何更改 JasperReports 的实际名称?

    我正在使用 Java 生成已编译的 jasper 报告的 PDF 预编译的报告名称为 statsReport 报告正确生成 问题是何时需要保存文件 我尝试通过 JasperPrint 对象更改报告名称 jasperPrint setName
  • 将大型打字稿文件拆分为跨多个文件的模块

    我目前有一个很大的打字稿文件 我想拆分它 有一些函数和变量仅在文件中使用 以及一些类 目前看起来是这样的 var numbers 1 2 3 function formatDate class Widget class Section 我尝
  • VBA字表复制丢失数据

    我继承了一些 VBA 代码 它将 Word 文档中的表格内容复制到 Excel 该代码本身来自 Excel 插件 该插件使用后期绑定调用 Word 以避免在旧版本的 Excel 中使用时出现引用错误 该插件本身在 Office 2016 中
  • Android:Google 地图 Android API:授权失败

    当我的应用程序尝试使用 Google Maps API 时 当我尝试访问 Google Map API 数据时 我会立即收到以下 logcat 错误 向右滚动以查看好东西 02 02 15 39 35 329 23868 24511 com
  • Android Xamarin TreeView nLevels

    我花了很多时间来探索如何在 Android Xamarin 中实现 TreeView 但不幸的是似乎没有任何例子说明这一点 我尝试使用可扩展列表视图但它只支持2级类别 我需要有人提供有关此内容的任何指南或一些相关示例 目的是探索服务器上的文
  • 挂起函数“callGetApi”只能从协程或另一个挂起函数调用

    我正在从 onCreate 调用挂起函数 override fun onCreate savedInstanceState Bundle callGetApi 暂停的功能是 suspend fun callGetApi 但错误出现了挂起函数
  • 将 Base64 编码的图像字符串加载到 JLabel 中

    我让转换器在这里工作 public class ImageProcessor public static void Base64TImage String base64 try byte btDataFile new sun misc BA
  • mailto:链接无法在cordova应用程序中打开Android上的邮件应用程序

    这真让我抓狂 我正在开发一个 Ionic 应用程序 Cordova Angular 等 我有一个联系我们链接 其中包含 mailto href href mailto email protected cdn cgi l email prot
  • 跨站脚本攻击和同源策略

    我熟悉持久性和非持久性XSS http en wikipedia org wiki Cross site scripting 我也知道同源政策 http en wikipedia org wiki Same origin policy防止
  • 注册计时器已过事件

    我想创建一个初始化计时器的类 该计时器将用作其他类成员的中央核心 以便为计时器已过事件注册自己 我的问题是我真的不知道如何向其他类公开计时器已用事件 我认为可能有效的一种解决方案是 我只需将计时器公开为公共属性 该属性将返回计时器对象 并且
  • 使用 log4j.xml 配置 Spark 日志记录

    我想这是一个愚蠢的问题 但我在任何地方都找不到答案 我可以使用 log4j xml 配置 Spark 中的日志记录吗 在火花中文档 http spark apache org docs latest configuration html c
  • jquery:history.back(1) 问题

    我对 jquery 和 History back 有疑问 我有一个链接 a href Link back a 我不能使用像 href javascript history back 这样的东西 因为使用的 CMS 正在阻止内联 JS 无论出
  • 使用 Windows 上运行的 iTunes 通过 USB 在 iOS 上安装 Ad Hoc 分布式应用程序

    我想通过 Windows iTunes 安装 iOS 7 iPhone 应用程序 继应用程序分发指南 https developer apple com library ios documentation IDEs Conceptual A
  • 使用ACTION_IMAGE_CAPTURE时返回什么数据?

    我对这个描述感到有点困惑 调用者可以传递一个额外的 EXTRA OUTPUT 来控制该图像的位置 将被写入 如果 EXTRA OUTPUT 不存在 则一个小 大小图像在额外字段中作为 Bitmap 对象返回 这是 对于只需要小图像的应用程序
  • Hibernate 的 MariaDB 方言类名称是什么?

    In Hibenate我在用MariaDB但我找不到方言类名称MariaDB 在 Hibernate 中 MySQL 5 方言名称是
  • Material UI 自动完成 - 警告:包含“key”道具的道具对象正在传播到 JSX 中

    因此 我将 Material UI Autocomplete 组件与 Next js 一起使用 并收到此警告 我尝试解决但无法解决 错误来自 renderInput 函数吗 如果是这样 params 中没有 key 属性 所以我无法像警告消
  • 树莓派 pico rfid rc522 (Micropython)

    我想使用 RPi Pico 从 mfrc522 Iduino RFID rc522 读卡器读取数据 但我不知道如何操作 我试图使用为此目的制作的 mfrc522 py MicroPython 库 阅读器正在通过 SPI 与 Pi 通信 我将