2024年寒假练-基于RP2040 12指神探扩展板实现颜色识别
该项目使用了Micropython 语言,实现了一个RP2040系统板设计的设计,它的主要功能为:基于RP2040,板上2MFlash ,两个按键,一个波轮按键和扩展口。 该项目使用了12指神探扩展板,实现了颜色采集的设计,它的主要功能为:采集环境的颜色(RGB),然后通过屏幕显示相应颜色色块。
标签
RP2040
颜色识别
2024寒假在家练
xinshuwei
更新2024-03-29
28

1.项目介绍


本项目主要基于RP2040的12指神探及扩展板实现颜色的采集,然后将识别的颜色转换成RGB值,然后根据屏幕显示原理,转换成与采集颜色一致的颜色,显示到屏幕上。

2.设计思路

此次项目基于硬禾的micropython固件实现屏幕驱动,通过IIC 接口实现与扩展板上颜色传感器LTR-381RGB-WA通讯。

获取到颜色的RGB值后,通过屏幕显示相应的颜色。

3.硬件框图

image.png

通过usb连接电脑进行uart 通讯 程序下载 py文件上传下载

通过按键进行逻辑控制

通过屏幕显示相关颜色信息

通过颜色传感器获取颜色相关信息

主控板信息:

  • TYPE-C接口用于供电和数据传输
  • 一个boot按键用于进入boot模式
  • 两个可程控按键和一个拨轮用于自定义功能
  • 搭载240*240分辨率的LCD彩屏,通过SPI接口进行通信,控制器为常用的ST7789芯片,例程丰富便于开发
  • 扩展接口包含5v、3.3v输出、GND。9个GPIO,可同时使能最多三个通道ADC


主控板原理图

image.png

接口定义

3e8350ed74ab840f0cdc21fcdbe502c.png

扩展板信息

扩展板搭载了几款常用的传感器,包括麦克风、蜂鸣器、红外收发、霍尔效应开关、加热电阻、温湿度传感器、六轴传感器、接近/环境光/IR 传感器、颜色传感器。其中温湿度传感器、六轴传感器、接近传感器、颜色传感器可拆卸为单个模块,通过杜邦线等连接线延伸其使用的空间范围。

扩展板原理图

image.png

4 软件流程图及主要代码说明

image.png

颜色读取参考datasheet 实现

1.初始化

    def __init__(self,i2c):
        self.i2c =i2c
        self.addr = 0x053
        self.temp  = bytearray(2)
        self.write_reg(0x00,0x06)
        sleep_ms(6)
        self.write_reg(0x04,0x41)
        #self.set_ALS_Gain(0)
        self.write_reg(0x05,0x00)

进入ALS模式 采用16bit 精度 50ms 平均,设置 ALS_CS_GAIN 为1

  1. 获取 RGB 值
    def read_blue(self):
        ALL=self.i2c.readfrom_mem(self.addr,0x13,3)
        return ALL[0]| (ALL[1]<<8) | ((ALL[2]&0X0F)<<16)
    def read_red(self):
        ALL=self.i2c.readfrom_mem(self.addr,0x10,3)
        return ALL[0]| (ALL[1]<<8) | ((ALL[2]&0X0F)<<16)
    def read_green(self):
        ALL=self.i2c.readfrom_mem(self.addr,0x0D,3)
        return ALL[0]| (ALL[1]<<8) | ((ALL[2]&0X0F)<<16)
    def read_ir(self):
        ALL=self.i2c.readfrom_mem(self.addr,0x0A,3)
        return ALL[0]| (ALL[1]<<8) | ((ALL[2]&0X0F)<<16)

这里B R 调整了下,主要应对屏幕的显示,后续显示直接可以用这样顺序,如果获取实际值,则需将BR 进行调换,满足datasheet的相关定义。

3.计算流明公式

    def get_lux(self,gain,wfac):
        GainInt =0
        if gain==0:
            GainInt=0.25
        elif gain==1:
            GainInt=1.5
        elif gain==2:
            GainInt=6
        elif gain==3:
            GainInt=18
        elif gain==4:
            GainInt=72
        green =self.read_green()
        ir    = self.read_ir()
        return (0.74*green/GainInt)*(1-0.033*ir/green)*wfac

4.根据颜色值进行界面颜色转换

def get_rgb255(rgb):
maxVal = max(rgb)
if maxVal ==0:
maxVal=1
r255 = rgb[0]/maxVal*255
g255 = rgb[1]/maxVal*255
b255 = rgb[2]/maxVal*255
return[int(r255),int(g255),int(b255)]

正常获取的rgb 值随明暗程度 取值范围会发生变化,这里已最大值进行归一化,然后map到0~255中,方便进行颜色的显示。此芯片还有设计阈值中断触发功能,这里由于只是用做转换,未曾使用。


颜色源的话,用了之前活动得的RP2040 2812B的版本,通过按键进行颜色切换,通过2812B发出相应的光,实现代码如下

import button
import time
import ws2812b
from machine import Pin
red = "#ff0000"
blue = "#0000ff"
yellow = "#ffff00"
green = "#00ff00"
purpe ="#ff00ff"

cyan= "#00ffff"
#k1 = button.button(13)
k1 = button.button(12)
color =[red,yellow,green,blue,cyan]
#color = [red,green]
idx =0

while True:
if k1.value() == True:
ws2812b.on_all(color[idx])
idx= idx+1
idx = idx%len(color)


5.功能实现图片

837cab058b4d4fbddf6248ed52e8bdb.jpg

颜色传感器通过其他板块的电源灯照射,可以看到界面显示的颜色也是红色,其它颜色展示可参照视频里面的展示

6.意见建议

建议寒假在家练可以分平台提早上线,对于有多项目想一起开发的伙伴们来说不是很友好,时间不是很充分

后续希望硬禾多举办这样的活动,大家可以互相学习,互相进步

7.未来计划

网上发现有及于此芯片去做肤色检测、识别等项目感觉挺有趣的,后续有机会做相应的尝试,如https://ask.csdn.net/questions/7875147

板载了许多其他器件,后续有时间可做相关的开发,学习


附件下载
24_寒假在家练.zip
团队介绍
苏州工程师一枚
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号