1.项目介绍
本项目主要基于RP2040的12指神探及扩展板实现颜色的采集,然后将识别的颜色转换成RGB值,然后根据屏幕显示原理,转换成与采集颜色一致的颜色,显示到屏幕上。
2.设计思路
此次项目基于硬禾的micropython固件实现屏幕驱动,通过IIC 接口实现与扩展板上颜色传感器LTR-381RGB-WA通讯。
获取到颜色的RGB值后,通过屏幕显示相应的颜色。
3.硬件框图
通过usb连接电脑进行uart 通讯 程序下载 py文件上传下载
通过按键进行逻辑控制
通过屏幕显示相关颜色信息
通过颜色传感器获取颜色相关信息
主控板信息:
- TYPE-C接口用于供电和数据传输
- 一个boot按键用于进入boot模式
- 两个可程控按键和一个拨轮用于自定义功能
- 搭载240*240分辨率的LCD彩屏,通过SPI接口进行通信,控制器为常用的ST7789芯片,例程丰富便于开发
- 扩展接口包含5v、3.3v输出、GND。9个GPIO,可同时使能最多三个通道ADC
主控板原理图
接口定义
扩展板信息
扩展板搭载了几款常用的传感器,包括麦克风、蜂鸣器、红外收发、霍尔效应开关、加热电阻、温湿度传感器、六轴传感器、接近/环境光/IR 传感器、颜色传感器。其中温湿度传感器、六轴传感器、接近传感器、颜色传感器可拆卸为单个模块,通过杜邦线等连接线延伸其使用的空间范围。
扩展板原理图
4 软件流程图及主要代码说明
颜色读取参考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
- 获取 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.功能实现图片
颜色传感器通过其他板块的电源灯照射,可以看到界面显示的颜色也是红色,其它颜色展示可参照视频里面的展示
6.意见建议
建议寒假在家练可以分平台提早上线,对于有多项目想一起开发的伙伴们来说不是很友好,时间不是很充分
后续希望硬禾多举办这样的活动,大家可以互相学习,互相进步
7.未来计划
网上发现有及于此芯片去做肤色检测、识别等项目感觉挺有趣的,后续有机会做相应的尝试,如https://ask.csdn.net/questions/7875147
板载了许多其他器件,后续有时间可做相关的开发,学习