米菲爸爸 发表于 2024-4-21 10:38:30

用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]
查看完整版本: 用Esp32C6复刻博物馆盖章机