Mô-đun đọc RFID RC522 với Raspberry Pi Pico

Mô-đun đọc RFID RC522 với Raspberry Pi Pico

Mô-đun đọc RFID RC522

RC522 là một Mô-đun RFID đa giao tiếp cho Arduino và Vi điều khiển. RC522 được gọi là MFRC-522 do vi điều khiển bán dẫn NFX của nó. Mô-đun cho phép các nhà phát triển giao tiếp nó với bất kỳ vi điều khiển dựa trên SPI, I2C và UART nào khác. Nó đi kèm với một thẻ thẻ RFID và fob khóa bao gồm 1KB bộ nhớ.

RC522 RFID CARD READER MÔ-ĐUNThẻ RFID

Mô-đun đọc RFID RC522

                                                          Thẻ RFID và chìa khóa fob

 

Mô-đun RC522 hoạt động trên tần số 13.56 MHz và nó có thể hoạt động như một đầu đọc và ghi cho thẻ UID / RFID. Các thẻ RFID giao tiếp với mô-đun ở khoảng cách ngắn với tần số vô tuyến do kỹ thuật cảm ứng lẫn nhau. Trong hầu hết các sản phẩm bảo mật và thương mại, mô-đun có hiệu quả vì nó có thể phát hiện được các lỗi và sự cố với Thẻ RFID.

RFID thẻ RFID Tag Bố cục bộ nhớ 1KB

Thẻ RFID là một thiết bị lưu trữ bộ nhớ có bộ nhớ trị giá 1KB. Bộ nhớ này được chia thành 16 cung (0-15), trong đó mỗi khu vực được chia thành 4 khối (0,1,2,3). Mỗi khối là 16 byte mỗi khối. Như vậy 4 khối x 16 byte x 16 cung = 1024 byte là 1KB

RC522 RFID Reader Tính năng, đặc điểm

  • RFID RC522 sử dụng cảm ứng lẫn nhau để kích hoạt thẻ và 13.56MHz để truyền dữ liệu.

  • Thẻ RFID có thể sử dụng từ cả hai phía của mô-đun ở mức tối đa 5cm.

  • Cần 3.3V duy nhất để kích hoạt thiết bị.

  • Chế độ ngủ tự động của nó làm cho nó ít mô-đun tiêu thụ điện năng hơn.

  • Mô-đun có ba loại giao tiếp (UART, SPI, I2C). Do đó, nó có thể sử dụng được với hầu hết mọi bộ vi điều khiển hoặc thiết bị trên thị trường.

  • Thẻ và đầu đọc RFID (RC522) có thể truyền dữ liệu lên đến 10Mb / s.

Ứng dụng mô-đun RFID RC522

  • RFID có hầu hết việc sử dụng như một thiết bị bảo mật.

  • Ở một số công ty, các thiết bị sử dụng với các mặt hàng mua sắm.

  • Một số sân bay cũng bắt đầu sử dụng RFID để xác định và theo dõi hành lý và các vật dụng khác.

  • Hệ thống chấm công hoặc đỗ xe cũng sử dụng RFID để giữ an toàn cho hệ thống.

Ghim ra

Trong mô-đun này, chỉ có hai loại chân. Vì vậy, cái đầu tiên là sức mạnh và cái thứ hai là chân giao tiếp. Do đó, thiết bị có thể có chip vi điều khiển trên chính nó nhưng nó chỉ làm cho nó hoạt động như một RFID. Bộ vi điều khiển tích hợp sẽ không làm cho mô-đun trở thành một thiết bị độc lập.

Tất cả các chân của Đầu đọc thẻ RFID MFRC / RC522 là:

RC522 RFID CARD READERS Pinout

Bảng dưới đây cho thấy tám chân được tìm thấy trên mô-đun RFID RC522. Bạn cũng có thể xem mô tả của họ.

Ghim

Mô tả:__________

VCC

Các chân nguồn là VCC. Trong một số phiên bản của RC522, chân này được ký hiệu là 3V3 trên mô-đun thay vì VCC.

RST

Đây là chân đặt lại cho mô-đun. Do đó, nó sẽ đặt lại thiết bị trong trường hợp có lỗi khi thiết bị không đưa ra bất kỳ phản hồi nào.

GND ·

Ground giúp tạo ra điểm chung với mọi thiết bị bên ngoài, ví dụ như Nguồn điện hoặc vi điều khiển.

IRQ ·

Thiết bị có thể chuyển sang chế độ ngủ để tiết kiệm năng lượng. Vì vậy, IRQ giúp đánh thức nó.

MISO

Chân này kết nối với bộ vi điều khiển để giao tiếp SPI. Tuy nhiên, nó chuyển dữ liệu từ mô-đun sang vi điều khiển.
Chân MISO cũng có thể sử dụng cho các chức năng khác thay vì SPI.
Nó cũng có thể giao tiếp với I2C cho xung đồng hồ và UART Serial để truyền dữ liệu từ mô-đun.

MOSI ·

MOSI là chân nhập dữ liệu cho mô-đun RFID trong giao tiếp SPI

SCK ·

Các chân SCK giúp gửi xung đồng hồ trong giao tiếp SPI.

SS

Chân SS là một con chip cho phép pin trong giao tiếp SPI. Do đó, nó nhận được tín hiệu khi Master (Raspberry Pi Pico) phải thực hiện giao tiếp SPI.
Chân SS trong RFID có thể sử dụng làm chân thứ hai (SDA) để giao tiếp I2C.
Nó cũng nhận dữ liệu trong quá trình giao tiếp UART.

Giới thiệu đèn LED RGB

RGB LED là một diode phát ra ánh sáng màu đỏ, xanh lá cây và xanh lam. Nó bao gồm ba đèn LED kín đáo: đỏ, xanh lá cây và xanh lam được đặt trong một gói duy nhất để bằng cách kết hợp ba màu này, chúng ta có thể tạo ra bất kỳ màu nào. Bất cứ khi nào điện áp được đặt vào cực màu đỏ, đèn đỏ sẽ phát ra và tương tự khi điện áp được đặt vào cực Xanh lục và xanh lam, đèn xanh lục và xanh lam sẽ phát ra tương ứng.

Đèn LED RGB có bốn chân. Các chân này được sử dụng để kiểm soát màu sắc của đèn LED. Chân dài nhất là cực dương hoặc cực âm tùy thuộc vào loại đèn LED RGB.

Có hai loại điốt phát sáng RGB có sẵn trên thị trường.

  1. Loại Anode phổ biến: Trong loại Anode thông thường, Anode là phổ biến cho cả ba điốt phát sáng và Anode của tất cả các điốt phát sáng kết nối với nguồn điện dương. Các thiết bị đầu cuối khác kết nối với bộ vi điều khiển và chúng tôi bật và tắt các thiết bị đầu cuối này theo đèn LED mà chúng tôi muốn bật hoặc tắt.

  2. Loại catốt thông thường: Trong loại Cathode thông thường, Cực âm của cả ba điốt phát sáng là phổ biến và đầu cuối catốt thông thường được kết nối với mặt đất của nguồn điện và các thiết bị đầu cuối khác của mỗi đèn LED nguồn được kết nối với vi điều khiển pic theo đó đèn LED chúng ta muốn bật hoặc tắt.

Hình ảnh của cả cực dương thông thường và các loại cực âm phổ biến RGB LED được hiển thị dưới đây:

Anode thông thường và đèn LED RGB catốt chung





Sơ đồ chân

Đèn LED RGB và sơ đồ chân của nó được hiển thị bên dưới.

Sơ đồ chân LED RGB

Ghim

Mô tả:__________

1

Đây là ghim chọn màu đỏ. Kết nối với chân đầu ra kỹ thuật số của vi điều khiển.

2

Đây là chân nối đất cho loại catốt thông thường và chân Vdd 5 volt cho loại cực dương thông thường.

3

Đây là ghim chọn màu Xanh lam. Kết nối với chân đầu ra kỹ thuật số của vi điều khiển.

4

Đây là ghim chọn màu xanh lá cây. Kết nối với chân đầu ra kỹ thuật số của vi điều khiển.

Điểm cần lưu ý:

  • Để hạn chế dòng điện sẽ chạy qua RGB LED , chúng ta sẽ cần sử dụng ba điện trở một cho mỗi chân màu. Nếu chúng ta không sử dụng điện trở hoặc nếu chúng ta sử dụng giá trị điện trở thấp, đèn LED sẽ bị phá hủy. Chúng ta cần sử dụng điện trở 220 ohm trở lên. Giá trị điện trở càng cao, độ sáng của đèn LED càng thấp.

Mô-đun LED RGB

Đèn LED RGB cũng đi kèm trong một mô-đun với các điện trở giới hạn hiện tại đã được gắn vào. Chúng cũng có sẵn trong hai loại: mô-đun catốt chung và mô-đun cực dương chung.

Mô-đun LED RGB đã đi kèm với các điện trở giới hạn hiện tại, vì vậy chúng tôi không thêm điện trở bên ngoài.

Dưới đây, bạn có thể xem hai mô-đun bằng mã pin của chúng.

Sơ đồ sơ đồ chân mô-đun LED RGB

Giao diện mô-đun đầu đọc RFID RC522 và đèn LED RGB với Raspberry Pi Pico

Chúng tôi sẽ cần các thành phần sau để kết nối bảng Raspberry Pi Pico của chúng tôi với mô-đun RC522 và mô-đun LED RGB.

  • Raspberry Pi Pico

  • Mô-đun đầu đọc RFID RC522

  • Mô-đun LED RGB

  • Breadboard

  • Dây kết nối

Mô-đun RC522 có 8 thiết bị đầu cuối mà chúng tôi sẽ kết nối với Raspberry Pi Pico. Vì RC522 yêu cầu điện áp hoạt động trong phạm vi 2.5-3.3V, do đó đầu cuối VCC của mô-đun RC522 sẽ chung với chân 3.3V của bảng. Tương tự như vậy, tất cả các thiết bị sẽ có điểm chung.

Giao tiếp SPI giúp giao tiếp với mô-đun đầu đọc RFID, phổ biến trong mọi bộ vi điều khiển. Vì vậy, chúng tôi sẽ sử dụng giao diện SPI của Raspberry Pi Pico. Trước tiên chúng ta hãy tìm hiểu về giao diện Raspberry Pi Pico SPI.

Chân Raspberry Pi Pico SPI

Raspberry Pi Pico hỗ trợ hai thiết bị ngoại vi. Cả hai chân mô-đun SPI đều có thể truy cập được thông qua các chân GPIO của Raspberry Pi Pico. Bảng sau đây cho thấy kết nối của các chân GPIO với cả hai mô-đun SPI. Mỗi kết nối của chân điều khiển SPI có thể được cấu hình thông qua nhiều chân GPIO như trong hình. Nhưng trước khi sử dụng SPI, bạn nên định cấu hình trong phần mềm chân GPIO nào bạn muốn sử dụng với một thiết bị ngoại vi SP cụ thể.

Bộ điều khiển SPI

Chân GPIO

SPI0_RX

GP0 / GP4 / GP16

SPI0_TX

GP3 / GP7 / GP19

SPI0_SCK

GP2 / GP6 / GP18

SPI0_CSn

GP1 / GP5 / GP17

SPI1_RX

GP8 / GP12

SPI1_TX

GP11 / GP15

SPI1_SCK

GP10 / GP14

SPI1_CSn

GP9 / GP13

Hình dưới đây cho thấy các chân SPI của Raspberry Pi Pico.

Bảng dưới đây cho thấy các kết nối giữa các thiết bị mà chúng tôi sẽ sử dụng trong dự án của mình.

Raspberry Pi Pico với Mô-đun RC522

Mô-đun đọc RFID RC522

Raspberry Pi Pico

VCC

3.3V

RST

GP0 ·

GND ·

GND ·

IRQ ·

Không được kết nối

MISO

GP4 ·

MOSI ·

GP3 ·

SCK ·

GP2 ·

SDA

GP1 ·

Raspberry Pi Pico với Mô-đun LED RGB (Cực âm thông thường)

Chúng tôi đang sử dụng mô-đun LED RGB catốt phổ biến cho dự án này. Bảng dưới đây cho thấy các kết nối chúng tôi đang sử dụng giữa mô-đun LED và Raspberry Pi Pico.

Mô-đun LED RGB

Raspberry Pi Pico

R

GP13 ·

G

GP12 ·

B

GP11 ·

GND ·

Các chân màu đỏ, xanh lá cây và xanh lam của mô-đun LED RGB sẽ được kết nối với các chân GPIO của Raspberry Pi Pico. Chúng tôi sẽ sử dụng GP13, GP12 và GP11 để kết nối với từng chân màu. Bạn có thể sử dụng bất kỳ mã pin GPIO thích hợp nào.

Sơ đồ 

Thực hiện theo sơ đồ bên dưới và kết nối ba thiết bị cho phù hợp.

Tất cả các kết nối giữa các thiết bị đều giống như chúng tôi đã liệt kê chúng trong các bảng trên.

Raspberry Pi Pico với sơ đồ kết nối mô-đun RC522 và RGB LED

Raspberry Pi Pico với mô-đun LED RC522 và RGB

Cài đặt thư viện MicroPython MFRC522

Đối với dự án này, chúng tôi sẽ yêu cầu thư viện MicroPython MRRC522. Sao chép thư viện này và lưu nó trong Raspberry Pi Pico của bạn với tên tệp tương ứng (mfrc522.py) 

Mở một tệp mới trong Thonny. Sao chép thư viện được cung cấp bên dưới hoặc từ liên kết được cung cấp ở trên. Lưu nó vào Raspberry Pi Pico với tên mfrc522.py trong thư mục lib.

mfrc522.py

from machine import Pin, SPI

from os import uname

 

 

class MFRC522:

 

    DEBUG = False

    OK = 0

    NOTAGERR = 1

    ERR = 2

 

    REQIDL = 0x26

    REQALL = 0x52

    AUTHENT1A = 0x60

    AUTHENT1B = 0x61

  

    PICC_ANTICOLL1 = 0x93

    PICC_ANTICOLL2 = 0x95

    PICC_ANTICOLL3 = 0x97

  

 

    def __init__(self, sck, mosi, miso, rst, cs,baudrate=1000000,spi_id=0):

 

        self.sck = Pin(sck, Pin.OUT)

        self.mosi = Pin(mosi, Pin.OUT)

        self.miso = Pin(miso)

        self.rst = Pin(rst, Pin.OUT)

        self.cs = Pin(cs, Pin.OUT)

 

        self.rst.value(0)

        self.cs.value(1)

        

        board = uname()[0]

 

        if board == 'WiPy' or board == 'LoPy' or board == 'FiPy':

            self.spi = SPI(0)

            self.spi.init(SPI.MASTER, baudrate=1000000, pins=(self.sck, self.mosi, self.miso))

        elif (board == 'esp8266') or (board == 'esp32'):

            self.spi = SPI(baudrate=100000, polarity=0, phase=0, sck=self.sck, mosi=self.mosi, miso=self.miso)

            self.spi.init()

        elif board == 'rp2':

            self.spi = SPI(spi_id,baudrate=baudrate,sck=self.sck, mosi= self.mosi, miso= self.miso)

        else:

            raise RuntimeError("Unsupported platform")

 

        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,anticolN):

 

        ser_chk = 0

        ser = [anticolN, 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 PcdSelect(self, serNum,anticolN):

        backData = []

        buf = []

        buf.append(anticolN)

        buf.append(0x70)

        #i = 0

        ###xorsum=0;

        for i in serNum:

            buf.append(i)

        #while i<5:

        #    buf.append(serNum[i])

        #    i = i + 1

        pOut = self._crc(buf)

        buf.append(pOut[0])

        buf.append(pOut[1])

        (status, backData, backLen) = self._tocard( 0x0C, buf)

        if (status == self.OK) and (backLen == 0x18):

            return  1

        else:

            return 0

    

    

    def SelectTag(self, uid):

        byte5 = 0

        

        #(status,puid)= self.anticoll(self.PICC_ANTICOLL1)

        #print("uid",uid,"puid",puid)

        for i in uid:

            byte5 = byte5 ^ i

        puid = uid + [byte5]

        

        if self.PcdSelect(puid,self.PICC_ANTICOLL1) == 0:

            return (self.ERR,[])

        return (self.OK , uid)

        

    def tohexstring(self,v):

        s="["

        for i in v:

            if i != v[0]:

                s = s+ ", "

            s=s+ "0x{:02X}".format(i)

        s= s+ "]"

        return s

        

  

            

    

    def SelectTagSN(self):

        valid_uid=[]

        (status,uid)= self.anticoll(self.PICC_ANTICOLL1)

        #print("Select Tag 1:",self.tohexstring(uid))

        if status != self.OK:

            return  (self.ERR,[])

        

        if self.DEBUG:   print("anticol(1) {}".format(uid))

        if self.PcdSelect(uid,self.PICC_ANTICOLL1) == 0:

            return (self.ERR,[])

        if self.DEBUG:   print("pcdSelect(1) {}".format(uid))

        

        #check if first byte is 0x88

        if uid[0] == 0x88 :

            #ok we have another type of card

            valid_uid.extend(uid[1:4])

            (status,uid)=self.anticoll(self.PICC_ANTICOLL2)

            #print("Select Tag 2:",self.tohexstring(uid))

            if status != self.OK:

                return (self.ERR,[])

            if self.DEBUG: print("Anticol(2) {}".format(uid))

            rtn =  self.PcdSelect(uid,self.PICC_ANTICOLL2)

            if self.DEBUG: print("pcdSelect(2) return={} uid={}".format(rtn,uid))

            if rtn == 0:

                return (self.ERR,[])

            if self.DEBUG: print("PcdSelect2() {}".format(uid))

            #now check again if uid[0] is 0x88

            if uid[0] == 0x88 :

                valid_uid.extend(uid[1:4])

                (status , uid) = self.anticoll(self.PICC_ANTICOLL3)

                #print("Select Tag 3:",self.tohexstring(uid))

                if status != self.OK:

                    return (self.ERR,[])

                if self.DEBUG: print("Anticol(3) {}".format(uid))

                if self.MFRC522_PcdSelect(uid,self.PICC_ANTICOLL3) == 0:

                    return (self.ERR,[])

                if self.DEBUG: print("PcdSelect(3) {}".format(uid))

        valid_uid.extend(uid[0:5])

        # if we are here than the uid is ok

        # let's remove the last BYTE whic is the XOR sum

        

        return (self.OK , valid_uid[:len(valid_uid)-1])

        #return (self.OK , valid_uid)

    

    

   

       

    

 

    def auth(self, mode, addr, sect, ser):

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

    

    def authKeys(self,uid,addr,keyA=None, keyB=None):

        status = self.ERR

        if keyA is not None:

            status = self.auth(self.AUTHENT1A, addr, keyA, uid)

        elif keyB is not None:

            status = self.auth(self.AUTHENT1B, addr, keyB, uid)

        return status

       

 

    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 stat, recv

 

    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

 

 

    def writeSectorBlock(self,uid, sector, block, data, keyA=None, keyB = None):

        absoluteBlock =  sector * 4 + (block % 4)

        if absoluteBlock > 63 :

            return self.ERR

        if len(data) != 16:

            return self.ERR

        if self.authKeys(uid,absoluteBlock,keyA,keyB) != self.ERR :

            return self.write(absoluteBlock, data)

        return self.ERR

 

    def readSectorBlock(self,uid ,sector, block, keyA=None, keyB = None):

        absoluteBlock =  sector * 4 + (block % 4)

        if absoluteBlock > 63 :

            return self.ERR, None

        if self.authKeys(uid,absoluteBlock,keyA,keyB) != self.ERR :

            return self.read(absoluteBlock)

        return self.ERR, None

 

    def MFRC522_DumpClassic1K(self,uid, Start=0, End=64, keyA=None, keyB=None):

        for absoluteBlock in range(Start,End):

            status = self.authKeys(uid,absoluteBlock,keyA,keyB)

            # Check if authenticated

            print("{:02d} S{:02d} B{:1d}: ".format(absoluteBlock, absoluteBlock//4 , absoluteBlock % 4),end="")

            if status == self.OK:                    

                status, block = self.read(absoluteBlock)

                if status == self.ERR:

                    break

                else:

                    for value in block:

                        print("{:02X} ".format(value),end="")

                    print("  ",end="")

                    for value in block:

                        if (value > 0x20) and (value < 0x7f):

                            print(chr(value),end="")

                        else:

                            print('.',end="")

                    print("")

            else:

                break

        if status == self.ERR:

            print("Authentication error")

            return self.ERR

        return self.OK

Điều khiển LED RFID RC522 RGB

Chúng tôi sẽ sử dụng Raspberry Pi Pico với nó và cho bạn thấy một dự án MicroPython sẽ sử dụng các thẻ RFID khác nhau để làm sáng đèn LED RGB với ba màu khác nhau. Một thẻ sẽ làm cho đèn LED sáng lên màu xanh lá cây trong khi một thẻ khác sẽ sáng lên bằng màu xanh lam. Bất kỳ thẻ không xác định nào cũng sẽ đặt ánh sáng RGB thành màu đỏ. Người dùng mang thẻ / thẻ RFID đến gần đầu đọc RFID và đèn RGB được đặt thành màu thích hợp cùng với các thông báo liên quan trong Thonny Shell.

Raspberry Pi Pico MicroPython: Đọc thẻ RFID

Mở Thonny IDE của bạn và đi tới Tệp > Mới để mở tệp mới. Sao chép đoạn mã sau trong tệp đó. Bản phác thảo này sẽ xác định ID thẻ / thẻ RFID. Khi người dùng mang thẻ / thẻ RFID đến gần mô-đun RC522, nó sẽ phát hiện thẻ và đọc giá trị của nó.

from mfrc522 import MFRC522

import utime

 

reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0)

 

print("Bring TAG closer...")

print("")

 

 

while True:

    reader.init()

    (stat, tag_type) = reader.request(reader.REQIDL)

    if stat == reader.OK:

        (stat, uid) = reader.SelectTagSN()

        if stat == reader.OK:

            card = int.from_bytes(bytes(uid),"little",False)

            print("CARD ID: "+str(card))

utime.sleep_ms(500) 

Mã hoạt động như thế nào?

Bước đầu tiên là bao gồm tất cả các thư viện cần thiết cho dự án này. Chúng tôi sẽ nhập mô-đun utime để tạo độ trễ và lớp MFRC522 từ mô-đun mfrc522 để hoạt động với đầu đọc RC522 cho tác vụ này.

from mfrc522 import MFRC522

import utime

Sau đó, chúng tôi sẽ xác định kết nối RFID RC522 bằng cách tạo một đối tượng 'đầu đọc'. Bằng cách sử dụng MFRC522 (), chúng tôi đã chỉ định số kênh SPI làm tham số đầu tiên và chân SPI là phần còn lại của các tham số.

reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0)

Thông báo sau được in trong Thonny Shell cho biết người dùng mang thẻ / thẻ RFID của họ đến gần mô-đun RFID hơn.

print("Bring TAG closer...")

print("")

Bên trong vòng lặp vô hạn, trước tiên chúng ta sẽ khởi tạo đầu đọc RFID bằng phương thức init() trên đối tượng reader. Sau đó, chúng tôi sẽ có được trạng thái từ người đọc. Nếu trạng thái là hợp lệ thì chúng tôi sẽ tiếp tục với chương trình của mình. Chúng ta sẽ tạo một 'thẻ' đối tượng khác có chứa ID thẻ RFID. Chúng tôi sẽ lấy ID thẻ duy nhất được liên kết với thẻ bất cứ khi nào nó được phát hiện. Điều này được in trong bảng điều khiển vỏ Thonny.

while True:

    reader.init()

    (stat, tag_type) = reader.request(reader.REQIDL)

    if stat == reader.OK:

        (stat, uid) = reader.SelectTagSN()

        if stat == reader.OK:

            card = int.from_bytes(bytes(uid),"little",False)

            print("CARD ID: "+str(card))

utime.sleep_ms(500) 

Demonstration

Sau khi bạn đã sao chép mã sau vào một tệp mới, hãy nhấp vào biểu tượng 'Lưu' để lưu mã chương trình trên PC của bạn.

Sau khi bạn đã lưu mã, hãy nhấn nút Run để tải mã lên mô-đun Raspberry Pi Pico của bạn. Trước khi tải mã lên, hãy đảm bảo rằng bảng chính xác được chọn.

Bây giờ hãy mang theo thẻ / thẻ RFID gần đầu đọc RC522. Ngay lập tức ID thẻ của nó sẽ được in trong thiết bị đầu cuối shell. Ở đây chúng tôi đã quét hai thẻ khác nhau và lấy được ID của chúng.

Raspberry Pi Pico với đầu đọc RC522 đầu đọc thonny shell terminal

Chúng tôi sẽ sử dụng hai ID này để chiếu sáng đèn LED RGB một cách thích hợp. Nếu đầu đọc quét ID đầu tiên thì đèn LED RGB sẽ được đặt thành đèn xanh lục và nếu ID thứ hai được quét thì đèn LED RGB sẽ được đặt thành ánh sáng xanh lam. Đối với bất kỳ thẻ RFID nào khác được quét, sẽ đặt đèn LED RGB thành màu đỏ.

Raspberry Pi Pico MicroPython: Điều khiển LED RFID RC522 RGB

Khi người dùng mang thẻ / thẻ RFID đến gần RC522, nó sẽ phát hiện thẻ và đọc giá trị của nó. Nếu giá trị giống như được xác định trong mã cho màu xanh lá cây thì thông báo 'PASS: Green Light Activated' được hiển thị trong thiết bị đầu cuối shell. Nếu giá trị giống như được xác định trong mã cho màu xanh lam thì thông báo 'PASS: Blue Light Activated' sẽ được hiển thị trong thiết bị đầu cuối shell. Nếu không thì 'THẺ KHÔNG XÁC ĐỊNH! Thay vào đó, thông báo của Red Light Activated được hiển thị. Đèn LED RGB sẽ được đặt thành các màu xanh lá cây, xanh dương hoặc đỏ trong quá trình này. Quá trình này xảy ra mỗi khi người dùng đưa thẻ RFID đến gần mô-đun hơn.

from machine import Pin

from mfrc522 import MFRC522

import utime

       

reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0)

 

red = Pin(13, Pin.OUT)

green = Pin(12, Pin.OUT)

blue = Pin(11, Pin.OUT)

 

print("Bring RFID TAG Closer...")

print("")

 

 

while True:

    reader.init()

    (stat, tag_type) = reader.request(reader.REQIDL)

    if stat == reader.OK:

        (stat, uid) = reader.SelectTagSN()

        if stat == reader.OK:

            card = int.from_bytes(bytes(uid),"little",False)

            

            if card == 612121286:

                print("Card ID: "+ str(card)+" PASS: Green Light Activated")

                red.value(0)

                green.value(1)

                blue.value(0)

                

                

            elif card == 1002696326:

                print("Card ID: "+ str(card)+" PASS: Blue Light Activated")

                red.value(0)

                green.value(0)

                blue.value(1)

                

            else:

                print("Card ID: "+ str(card)+" UNKNOWN CARD! Red Light Activated")

                red.value(1)

                green.value(0)

                blue.value(0)           

Mã hoạt động như thế nào?

Hầu hết các mã tương tự như mã ở trên mà chúng tôi đang lấy ID thẻ RFID. Sau khi nhận được ID thẻ, chúng tôi sẽ kiểm tra xem ID có phải là một trong hai ID mà chúng tôi đã thiết lập cho thẻ xanh lá cây và xanh lam hay không, sau đó đặt đèn LED RGB thành màu cụ thể đó.

Vì chúng tôi đang sử dụng mô-đun RGB catốt thông thường, do đó để đặt màu thành màu xanh lá cây, chúng tôi sẽ phải đảm bảo GPIO được kết nối với chân màu xanh lá cây ở trạng thái cao và phần còn lại của cả hai ở trạng thái thấp.

 

red.value(0)

green.value(1)

blue.value(0)

Để đặt màu thành màu xanh lam, chúng tôi sẽ phải đảm bảo GPIO được kết nối với chân màu xanh lam ở trạng thái cao và phần còn lại của cả hai ở trạng thái thấp.

red.value(0)

green.value(0)

blue.value(1)

Tương tự như vậy, để đặt màu thành màu đỏ, chúng ta sẽ phải đảm bảo GPIO được kết nối với chân màu đỏ ở trạng thái cao và phần còn lại của cả hai ở trạng thái thấp.

red.value(1)

green.value(0)

blue.value(0)

Demonstration

Sau khi bạn đã sao chép mã sau vào một tệp mới, hãy nhấp vào biểu tượng 'Lưu' để lưu mã chương trình trên PC của bạn.

Sau khi bạn đã lưu mã, hãy nhấn nút Run để tải mã lên mô-đun Raspberry Pi Pico của bạn.

Đưa thẻ / thẻ RFID đến gần đầu đọc RC522 và ngay lập tức đèn LED RGB sẽ sáng lên thành màu xanh lá cây, xanh dương hoặc đỏ.

Raspberry Pi Pico với RC522 và RGB LED mô-đun demo

Thiết bị đầu cuối Thonny Shell cũng sẽ in các thông điệp có liên quan khi mỗi thẻ được quét.

Raspberry Pi Pico với đầu đọc RC522 và thiết bị đầu cuối vỏ LED thonny RGB

>>> 100+ Mã Sản Phẩm Dây Rút: https://mecsu.vn/san-pham/day-rut-nhua.5op

>>> 1000+ Mã Sản Phẩm Đầu Cosse: https://mecsu.vn/san-pham/dau-cosse.Q1j

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn