502浏览
查看: 502|回复: 0

[ESP8266/ESP32] 用Esp32C6复刻博物馆盖章机

[复制链接]
不知道你们注意没有,很多在博物馆或者旅游景点都有一种红白色的机器,
用Esp32C6复刻博物馆盖章机图1

投入一张卡(往往有个彩色的边),
用Esp32C6复刻博物馆盖章机图2

机器就会在卡片上盖好一个特色章,往往代表了这个地方的标志或记忆。这种盖章机给人带来了有趣的体验。
现在咱们用Esp32C6和颜色传感器tcs37425制造一个自动化盖章机。
一、原理分析:
首先,为了增加收入很多盖章机都是收费的,当然,机器本身不能收钱,收费的方法是卖打卡专用卡。也就是说只是随便一张卡塞进去并不能开启机器,如果我们仔细观察这些售卖的卡片我们就会发现,这些卡都有一个彩色的边,这个边不仅是为了好看而是而是为了区分哪些卡是“正版卡“。如果我们在塞进一张白纸的同时在纸边一段距离再放上一张”色卡“,那么奇迹就发生了,盖章机就可以正常盖章了!(当然我们只是为了研究原理,请支持正版)
第二,一个盖章机往往还独自在博物馆里“工作“一整天,如果你再观察一下其实并没有线缆连接(有线是为了防盗,捆在桌子上的),也就是说盖章机需要用电池供电,如果在室外的话我们也可以考虑使用太阳能板+电池共同供电的策略,比如北京大观园中的打卡台就全部在室外。
二、材料准备
1. Firebeetle Esp32C6开发板
2. TCS37425颜色传感器
3. 电池
4. 太阳能板
5. 盖章装置(MP3板 给mp3板供电15秒在声音播放期间表示开锁15秒)
三、制造过程:
1.      Esp32C6刷好Micropython固件(可以参考我下面的视频)
2.      连接Esp32C6和色彩传感器。
3.      连接Esp32C6和MP3板(或者任何一种可以表达开关的东西)
用Esp32C6复刻博物馆盖章机图3

用Esp32C6复刻博物馆盖章机图4

四. 编写代码:用micropython来编写Esp32C6的代码,使其能够正确接收到TCS37425传感器的信号完成允许盖章的动作。
这里TCS34725的库文件是个深坑(当然也不排除是小弟学艺不精),目前主流的库都是基于Cpy的,基于mpy的大部分都出现颜色不准确的问题(RGB颜色取值范围偏向0这一侧)即使大家给了集中修正算法依然偏小。但是具体到我们的项目不需要颜色那么准确,所以只要校准到一个合适的取值范围即可,因为实际售卖的卡片颜色已知,我们只需要知道这张卡在机器上读取成什么值即可,不必是接近真实的颜色值。
附加代码示例:
TCS34725.py lib
  1. # Endereço I2C do TCS34725
  2. TCS34725_I2C_ADDR = 0x29
  3. # Controle do sensor
  4. TCS34725_CMD = 0x80
  5. TCS34725_CMD_AUTO_INC = 0xA0
  6. # Registros do sensor
  7. TCS34725_REG_ENABLE = 0x00
  8. TCS34725_REG_ATIME = 0x01
  9. TCS34725_REG_CONTROL = 0x0F
  10. TCS34725_REG_CDATAL = 0x14
  11. TCS34725_REG_CDATAH = 0x15
  12. TCS34725_REG_RDATAL = 0x16
  13. TCS34725_REG_RDATAH = 0x17
  14. TCS34725_REG_GDATAL = 0x18
  15. TCS34725_REG_GDATAH = 0x19
  16. TCS34725_REG_BDATAL = 0x1A
  17. TCS34725_REG_BDATAH = 0x1B
  18. gamma   = lambda x, c : int((x/c) * 256)
  19. htmlrgb = lambda x, c : int(pow((int((x/c) * 256) / 255), 2.5) * 255)
  20. class TCS34725:
  21.     def __init__(self, i2c):
  22.         self.i2c = i2c
  23.         i2c.writeto_mem(TCS34725_I2C_ADDR, TCS34725_REG_ENABLE | TCS34725_CMD, bytes([0x03]))  
  24.         i2c.writeto_mem(TCS34725_I2C_ADDR, TCS34725_REG_ATIME | TCS34725_CMD, bytes([0xEB]))
  25.     def read(self, mode="gamma"):
  26.         scanned_color = self.i2c.readfrom_mem(TCS34725_I2C_ADDR, TCS34725_REG_CDATAL | TCS34725_CMD_AUTO_INC, 8)
  27.         c     = scanned_color[1] << 8 | scanned_color[0]
  28.         red   = scanned_color[3] << 8 | scanned_color[2]
  29.         green = scanned_color[5] << 8 | scanned_color[4]
  30.         blue  = scanned_color[7] << 8 | scanned_color[6]
  31.         if c :
  32.             if mode == "gamma" :
  33.                 return gamma(red, c), gamma(green, c), gamma(blue, c)
  34.             elif mode == "htmlrgb" :
  35.                 return htmlrgb(red, c), htmlrgb(green, c), htmlrgb(blue, c)
  36.             else :
  37.                 return red, green, blue
  38.         else :
  39.             return 0,0,0
  40. def html_hex(data):
  41.         r, g, b = data
  42.         return "{0:02x}{1:02x}{2:02x}".format(int(r),int(g),int(b))
复制代码

Demo.py

  1. from machine import Pin, I2C
  2. from tcs34725 import TCS34725
  3. import time
  4. i2c = I2C(0, sda=Pin(19, pull=Pin.PULL_UP), scl=Pin(20, pull=Pin.PULL_UP), freq = 100_000)
  5. # And a short delay to wait until the I2C port has finished activating.
  6. time.sleep(0.1)
  7. # 打印出连接的设备的地址
  8. #print("Detected devices at I2C-addresses:",
  9. #      " ".join(["0x{:02X}".format(x) for x in i2c.scan()]))
  10. tcs = TCS34725(i2c)
  11. mp3pin = Pin(2, Pin.OUT)
  12. countDown = 0
  13. while True:
  14.     try :
  15.         #print("gamma   red:%.2d green:%.2d blue:%.2d " % (tcs.read("gamma")))
  16.         #print("htmlrgb red:%.2d green:%.2d blue:%.2d " % (tcs.read("htmlrgb")))
  17.         #print("raw     red:%.2d green:%.2d blue:%.2d " % (tcs.read("raw")))
  18.         red, green, blue = tcs.read("gamma")
  19.         print("red:%.2d green:%.2d blue:%.2d count:%.2d" % (red, green, blue, countDown))
  20.         #yellow
  21.         if red > 90 and green > 90 and not countDown:
  22.             countDown = 15
  23.             mp3pin.value(1)
  24.             
  25.         countDown -= 1
  26.         if not countDown:
  27.             mp3pin.value(0)
  28.             
  29.     except Exception as e:
  30.         print("Error", e)
  31.     time.sleep(1)
复制代码
注意,这里GIO2的功率不足以带动mp3模块,只能发出信号通过三极管或者继电器来驱动mp3模块,MP3以及开锁机械部分都需要独立供电保持功率足够大





您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail