小玩具:知识卡(RFID)
知识卡功能:语音播放模块存储语音。刷卡即可播放相应的语音。
[En]
Knowledge card function: voice playback module stores voice. Swipe your card to play the corresponding voice.
使用场景:例如记录动物叫声,然后再卡上绘制或粘贴对应的动物介绍,通过刷卡可以听到此动物的叫声。当然还有其它用法,发挥自己的想想吧。对于小朋友是个不错的玩具~
本基础项目实现功能:
- 每张卡片贴上想要的图片做标识
- 根据RFID刷到的卡播放不同的音频
材料及接线
MR开发板
; RC522射频IC卡
C522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片,是一款低电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携式手持设备研发的较好选择。
引脚说明
开发板RC5223.3v3.3vC4RST 可接可不接GNDGNDA6MISOA7MOSIA5SCKC0SDA
JQ8900-16P 语音模块
J Q 8 9 0 0 – 1 6 P 选 用 的 是 S O C 方 案 , 集 成 了 一 个 1 6 位 的 M C U , 以 及 一 个 专 门针 对 音 频 解 码 的 A D S P , 采 用 硬 解 码 的 方 式 , 更 加 保 证 了 系 统 的 稳 定 性 和 音 质 。 小 巧 尺寸 更 加 满 足 嵌 入 其 它 产 品 的 需 求 。
; 引脚说明
语音模块JQ8900开发板busyA4IO1C1IO2C2IO3C35v5vGNDGND喇叭红线spk+喇叭黑线spk-
USB插入语音播放模块会出现U盘。打开U盘后即可替换里面的音频
示例程序:播放音频
main.py
import pyb
import mfrc522
from machine import SPI,Pin
busy = Pin('A4',Pin.IN)
do1= Pin('C1',Pin.OUT_PP)
do2= Pin('C2',Pin.OUT_PP)
do3= Pin('C3',Pin.OUT_PP)
def main():
SPI=pyb.SPI(1)
RC522_SDA='C0'
RC522_RST='C4'
rc52=mfrc522.MFRC522()
rc52.init_spi(SPI,RC522_RST,RC522_SDA)
while True:
(status,backBits)=rc52.SeekCard(0x26)
pyb.delay(1000)
if(status==0):
(status,id,)=rc52.Anticoll()
print("card_id=",id)
if id == [41, 8, 181, 85, 193]:
print(666)
pyb.delay(100)
do1(0)
pyb.delay(300)
while busy.value() == 1:
pyb.delay(200)
do1(1)
if id == [144, 241, 87, 122, 76]:
print(777)
pyb.delay(100)
do2(0)
pyb.delay(300)
while busy.value() == 1:
pyb.delay(200)
do2(1)
if id == [240, 210, 96, 133, 199]:
print(777)
pyb.delay(100)
do3(0)
pyb.delay(300)
while busy.value() == 1:
pyb.delay(200)
do3(1)
else:
print("NO_CARD")
main()
mfrc522.py
import pyb
from pyb import SPI,Pin
import time
CommandReg = 0x01
CommIEnReg = 0x02
CommIrqReg = 0x04
ErrorReg = 0x06
Status2Reg = 0x08
FIFODataReg = 0x09
FIFOLevelReg = 0x0A
ControlReg = 0x0C
BitFramingReg = 0x0D
ModeReg = 0x11
TxControlReg = 0x14
TxAutoReg = 0x15
RxSelReg = 0x17
RFCfgReg = 0x26
TModeReg = 0x2A
TPrescalerReg = 0x2B
TReloadRegH = 0x2C
TReloadRegL = 0x2D
class MFRC522:
PCD_IDLE = 0x00
PICC_REQIDL = 0x26
PICC_REQALL = 0x52
PCD_RESETPHASE = 0x0F
PCD_TRANSCEIVE = 0x0C
PCD_AUTHENT = 0x0E
PICC_ANTICOLL = 0x93
MI_OK = 0
MI_NOTAGERR = 1
MI_ERR = 2
MAX_LEN = 18
def init_spi(self,spi,rst,sda):
spi.init(spi.MASTER,baudrate=1000000,polarity=0, phase=0,bits=8,firstbit=SPI.MSB)
self.spi=spi
self.rst=Pin(rst,Pin.OUT_PP)
self.sda=Pin(sda,Pin.OUT_PP)
self.Init()
def Init(self):
self.Reset()
self.CloseAntenna()
time.sleep_ms(2)
self.OpenAntenna()
time.sleep_ms(2)
self.SetBitMask(0x08,0x08)
self.WriteToRC(ModeReg, 0x3D)
self.WriteToRC(0x17, 0x86)
self.WriteToRC(0x26, 0x7f)
self.WriteToRC(TReloadRegL,30)
self.WriteToRC(TReloadRegH, 0)
self.WriteToRC(TModeReg, 0x8D)
self.WriteToRC(TPrescalerReg, 0x3E)
time.sleep_ms(1)
self.OpenAntenna()
def Reset(self):
self.rst.value(1)
time.sleep_ms(1)
self.rst.value(0)
time.sleep_ms(1)
self.rst.value(1)
time.sleep_ms(1)
self.WriteToRC(0x01, 0x0f)
self.WriteToRC(ModeReg, 0x3D)
self.WriteToRC(TReloadRegL,30)
self.WriteToRC(TReloadRegH, 0)
self.WriteToRC(TModeReg, 0x8D)
self.WriteToRC(TPrescalerReg, 0x3E)
self.WriteToRC(TxAutoReg, 0x40)
def OpenAntenna(self):
temp=self.ReadRCData(TxControlReg)
if (temp & 0x03)==0:
self.SetBitMask(TxControlReg, 0x03)
def CloseAntenna(self):
self.ClearBitMask(TxControlReg, 0x03)
def WriteToRC(self,add,cmd):
self.sda.value(0)
data=bytearray(2)
self.spi.send(((add<<1)& 0x7E))
self.spi.send(cmd)
self.sda.value(1)
def ReadRCData(self,add):
self.sda.value(0)
u_add=((add << 1) & 0x7E) | 0x80
self.spi.send(u_add)
ucResult=self.spi.recv(1)
self.sda.value(1)
return ucResult[0]
def SetBitMask(self,add,mask):
tmp = self.ReadRCData(add)
self.WriteToRC(add, tmp | mask)
def ClearBitMask(self,add,mask):
tmp=self.ReadRCData(add)
data=tmp & (~mask)
self.WriteToRC(add,data)
def SendToCard(self,cmd,sendData):
backData = []
backLen = 0
status = self.MI_ERR
irqEn = 0x77
waitIRq = 0x30
lastBits = None
n = 0
i = 0
if cmd == self.PCD_AUTHENT:
irqEn = 0x12
waitIRq = 0x10
self.WriteToRC(CommIEnReg, irqEn|0x80)
self.ClearBitMask(CommIrqReg, 0x80)
self.WriteToRC(CommandReg, self.PCD_IDLE)
self.SetBitMask(FIFOLevelReg, 0x80)
while(i<len(sendData)):
self.WriteToRC(FIFODataReg, sendData[i])
i = i+1
self.WriteToRC(CommandReg, cmd)
if cmd == self.PCD_TRANSCEIVE:
self.SetBitMask(BitFramingReg, 0x80)
time.sleep_ms(1)
i = 2000
while True:
n = self.ReadRCData(CommIrqReg)
i = i - 1
if ((i!=0) and (n&0x01)==0 and (n&waitIRq)==0)==0:
break
self.ClearBitMask(BitFramingReg, 0x80)
if i != 0:
if (self.ReadRCData(ErrorReg) & 0x1B)==0x00:
status = self.MI_OK
if n & irqEn & 0x01:
status = self.MI_NOTAGERR
if cmd == self.PCD_TRANSCEIVE:
n = self.ReadRCData(FIFOLevelReg)
lastBits = self.ReadRCData(ControlReg) & 0x07
if lastBits :
backLen = (n-1)*8 + lastBits
else:
backLen = n*8
if n == 0:
n = 1
if n > self.MAX_LEN:
n = self.MAX_LEN
i = 0
while i<n:
backData.append(self.ReadRCData(FIFODataReg))
i = i + 1
else:
status = self.MI_ERR
self.SetBitMask(ControlReg, 0x80)
self.WriteToRC(CommandReg, self.PCD_IDLE)
return (status,backData,backLen)
def SeekCard(self,mode):
self.ClearBitMask(Status2Reg, 0x08)
self.WriteToRC(BitFramingReg, 0x07)
self.SetBitMask(TxControlReg, 0x03)
TagType=bytearray(1)
TagType[0] = mode
(status,backData,backBits) = self.SendToCard(self.PCD_TRANSCEIVE, TagType)
if status == self.MI_OK and backBits==0x10 :
card_l=backData
else :
status = self.MI_ERR
return (status,backData)
def Anticoll(self):
backData = []
Card_id = [0,0,0,0,0]
serNumCheck = 0
serNum = []
self.ClearBitMask(Status2Reg, 0x08)
self.WriteToRC(BitFramingReg, 0x00)
self.ClearBitMask(0x0e, 0x08)
serNum.append(self.PICC_ANTICOLL)
serNum.append(0x20)
(status,backData,backBits) = self.SendToCard(self.PCD_TRANSCEIVE,serNum)
if(status == self.MI_OK):
i = 0
print("OK")
while i<3:
serNumCheck = serNumCheck ^ backData[i]
i = i + 1
if serNumCheck != backData[i]:
status = self.MI_ERR
self.SetBitMask(0x0e,0x80)
return (status,backData)
Original: https://blog.csdn.net/weixin_45020839/article/details/121790559
Author: 咸鱼箘
Title: 小玩具:知识卡(RFID)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/512542/
转载文章受原作者版权保护。转载请注明原作者出处!