不知道你们注意没有,很多在博物馆或者旅游景点都有一种红白色的机器,
投入一张卡(往往有个彩色的边),
机器就会在卡片上盖好一个特色章,往往代表了这个地方的标志或记忆。这种盖章机给人带来了有趣的体验。 现在咱们用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([0x03]))
- i2c.writeto_mem(TCS34725_I2C_ADDR, TCS34725_REG_ATIME | TCS34725_CMD, bytes([0xEB]))
-
- 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[1] << 8 | scanned_color[0]
- red = scanned_color[3] << 8 | scanned_color[2]
- green = scanned_color[5] << 8 | scanned_color[4]
- blue = scanned_color[7] << 8 | scanned_color[6]
-
- 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以及开锁机械部分都需要独立供电保持功率足够大
|