用Esp32C6复刻博物馆盖章机
不知道你们注意没有,很多在博物馆或者旅游景点都有一种红白色的机器,投入一张卡(往往有个彩色的边),
机器就会在卡片上盖好一个特色章,往往代表了这个地方的标志或记忆。这种盖章机给人带来了有趣的体验。现在咱们用Esp32C6和颜色传感器tcs37425制造一个自动化盖章机。 一、原理分析:首先,为了增加收入很多盖章机都是收费的,当然,机器本身不能收钱,收费的方法是卖打卡专用卡。也就是说只是随便一张卡塞进去并不能开启机器,如果我们仔细观察这些售卖的卡片我们就会发现,这些卡都有一个彩色的边,这个边不仅是为了好看而是而是为了区分哪些卡是“正版卡“。如果我们在塞进一张白纸的同时在纸边一段距离再放上一张”色卡“,那么奇迹就发生了,盖章机就可以正常盖章了!(当然我们只是为了研究原理,请支持正版)第二,一个盖章机往往还独自在博物馆里“工作“一整天,如果你再观察一下其实并没有线缆连接(有线是为了防盗,捆在桌子上的),也就是说盖章机需要用电池供电,如果在室外的话我们也可以考虑使用太阳能板+电池共同供电的策略,比如北京大观园中的打卡台就全部在室外。 二、材料准备1. Firebeetle Esp32C6开发板2. TCS37425颜色传感器3. 电池4. 太阳能板5. 盖章装置(MP3板 给mp3板供电15秒在声音播放期间表示开锁15秒) 三、制造过程: 1. Esp32C6刷好Micropython固件(可以参考我下面的视频) 2. 连接Esp32C6和色彩传感器。 3. 连接Esp32C6和MP3板(或者任何一种可以表达开关的东西)
四. 编写代码:用micropython来编写Esp32C6的代码,使其能够正确接收到TCS37425传感器的信号完成允许盖章的动作。 这里TCS34725的库文件是个深坑(当然也不排除是小弟学艺不精),目前主流的库都是基于Cpy的,基于mpy的大部分都出现颜色不准确的问题(RGB颜色取值范围偏向0这一侧)即使大家给了集中修正算法依然偏小。但是具体到我们的项目不需要颜色那么准确,所以只要校准到一个合适的取值范围即可,因为实际售卖的卡片颜色已知,我们只需要知道这张卡在机器上读取成什么值即可,不必是接近真实的颜色值。 附加代码示例: TCS34725.py lib
# Endereço I2C do TCS34725
TCS34725_I2C_ADDR = 0x29
# Controle do sensor
TCS34725_CMD = 0x80
TCS34725_CMD_AUTO_INC = 0xA0
# Registros do sensor
TCS34725_REG_ENABLE = 0x00
TCS34725_REG_ATIME = 0x01
TCS34725_REG_CONTROL = 0x0F
TCS34725_REG_CDATAL = 0x14
TCS34725_REG_CDATAH = 0x15
TCS34725_REG_RDATAL = 0x16
TCS34725_REG_RDATAH = 0x17
TCS34725_REG_GDATAL = 0x18
TCS34725_REG_GDATAH = 0x19
TCS34725_REG_BDATAL = 0x1A
TCS34725_REG_BDATAH = 0x1B
gamma = lambda x, c : int((x/c) * 256)
htmlrgb = lambda x, c : int(pow((int((x/c) * 256) / 255), 2.5) * 255)
class TCS34725:
def __init__(self, i2c):
self.i2c = i2c
i2c.writeto_mem(TCS34725_I2C_ADDR, TCS34725_REG_ENABLE | TCS34725_CMD, bytes())
i2c.writeto_mem(TCS34725_I2C_ADDR, TCS34725_REG_ATIME | TCS34725_CMD, bytes())
def read(self, mode="gamma"):
scanned_color = self.i2c.readfrom_mem(TCS34725_I2C_ADDR, TCS34725_REG_CDATAL | TCS34725_CMD_AUTO_INC, 8)
c = scanned_color << 8 | scanned_color
red = scanned_color << 8 | scanned_color
green = scanned_color << 8 | scanned_color
blue= scanned_color << 8 | scanned_color
if c :
if mode == "gamma" :
return gamma(red, c), gamma(green, c), gamma(blue, c)
elif mode == "htmlrgb" :
return htmlrgb(red, c), htmlrgb(green, c), htmlrgb(blue, c)
else :
return red, green, blue
else :
return 0,0,0
def html_hex(data):
r, g, b = data
return "{0:02x}{1:02x}{2:02x}".format(int(r),int(g),int(b))
Demo.py
from machine import Pin, I2C
from tcs34725 import TCS34725
import time
i2c = I2C(0, sda=Pin(19, pull=Pin.PULL_UP), scl=Pin(20, pull=Pin.PULL_UP), freq = 100_000)
# And a short delay to wait until the I2C port has finished activating.
time.sleep(0.1)
# 打印出连接的设备的地址
#print("Detected devices at I2C-addresses:",
# " ".join(["0x{:02X}".format(x) for x in i2c.scan()]))
tcs = TCS34725(i2c)
mp3pin = Pin(2, Pin.OUT)
countDown = 0
while True:
try :
#print("gamma red:%.2d green:%.2d blue:%.2d " % (tcs.read("gamma")))
#print("htmlrgb red:%.2d green:%.2d blue:%.2d " % (tcs.read("htmlrgb")))
#print("raw red:%.2d green:%.2d blue:%.2d " % (tcs.read("raw")))
red, green, blue = tcs.read("gamma")
print("red:%.2d green:%.2d blue:%.2d count:%.2d" % (red, green, blue, countDown))
#yellow
if red > 90 and green > 90 and not countDown:
countDown = 15
mp3pin.value(1)
countDown -= 1
if not countDown:
mp3pin.value(0)
except Exception as e:
print("Error", e)
time.sleep(1)
注意,这里GIO2的功率不足以带动mp3模块,只能发出信号通过三极管或者继电器来驱动mp3模块,MP3以及开锁机械部分都需要独立供电保持功率足够大
页:
[1]