基于搭配带屏12指神探传感器扩展版制作的颜色识别系统
该项目使用了LTR-381RGB-WA传感器、RP2040主控芯片、Micropython汇编,实现了颜色识别系统的设计,它的主要功能为:识别屏幕颜色并在LCD屏幕上输出识别到的颜色RGB,并展示色块。
标签
RP2040
2024寒假在家练
LTR-381RGB-WA
jxwm
更新2024-03-28
北京邮电大学
141

2024年寒假练 基于搭配带屏12指神探传感器扩展版制作的颜色识别系统

一.项目介绍

本项目依托2024寒假在家一起练,基于RP2040平台,实现了基于搭配带屏12指神探传感器扩展版制作的颜色识别系统。本项目基于RP2040主控,通过LTR-381RGB-WA传感器识别颜色,并在LCD屏幕上实时显示颜色的RGB信息并恢复色块,取得了良好的效果,具有一定的价值。

项目任务:

  • 可识别至少五种颜色
  • 可在LCD上显示基本信息如当前识别颜色
  • 可在LCD上用色块显示识别的颜色并大致接近

二.设计思路

a1dc7a00eb1ff3e4b3a4aa1201b8f46.jpg

  • 通过LTR-381RGB-WA传感器识别颜色
  • 在LCD屏幕上实时显示RGB信息及色块

三.硬件介绍

1.带屏12指神探

Probe2040_00.png

这个模块是通过Type C的USB接口提供供电、下载以及通信的功能,板上有5V转3.3V,最高支持800mA的电压变换器,在12根引脚上也将5V和3.3V引出,方便对其它外设板供电。

主控芯片:采用树莓派Pico核心芯片RP2040

  • 双Arm Cortex M0+内核,可以运行到133MHz
  • 264KBSRAM,板卡上外扩2MBFlash
  • 性能强大、高度灵活的可编程IO(PIO)可用于高速数字接口
  • 拥有2个UART、2个SPI、2个I2C、16个PWM通道以及4路12位精度ADC
  • 支持MicroPython、C、C++编程
  • 拖拽UF2固件至U盘的方式烧录固件,方便快捷

板上功能

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

2.传感器扩展版

sensor_board-V1.0_00.png

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

image.png

颜色传感器通过IIC协议进行编程。

四.功能介绍

  • 开机直接识别颜色并输出信息
  • 具体使用详见视频

image.png

五.主要代码

1.LTR-381RGB-WA通过I2C协议工作,初始化传感器

# 配置LTR-381RGB-WA传感器
def init():
i2c.writeto_mem(LTR381_ADDR, 0x00, b'\x06')
i2c.writeto_mem(LTR381_ADDR, 0x04, b'\x41')
i2c.writeto_mem(LTR381_ADDR, 0x05, b'\x00')

2.读取传感器识别到的颜色信息,并返回RGB

def read():
Data0=i2c.readfrom_mem(LTR381_ADDR, 0x0A, 2)#lower byte data.
Data1=i2c.readfrom_mem(LTR381_ADDR, 0x0B, 2)#1 middle byte data.
Data2=i2c.readfrom_mem(LTR381_ADDR, 0x0C, 4)#2 upper byte data
D0=int.from_bytes(Data0, 'little')
D1=int.from_bytes(Data1, 'little')
D2=int.from_bytes(Data2, 'little')
CS_IR_Data =(D2<<16)| (D1 << 8) | D0
#红外

Data0=i2c.readfrom_mem(LTR381_ADDR, 0x0D, 1)#lower byte data.
Data1=i2c.readfrom_mem(LTR381_ADDR, 0x0E, 1)
Data2=i2c.readfrom_mem(LTR381_ADDR, 0x0F, 1)
D0=Data0[0]
D1=Data0[0]
D2=Data0[0]
CS_GREEN_ADC_Data =(D2<<16)| (D1 << 8) | D0
sr = str(hex(CS_GREEN_ADC_Data))
G=sr[2:4]
G=int(G,16)
#GREEN

Data0=i2c.readfrom_mem(LTR381_ADDR, 0x10, 1)#lower byte data.
Data1=i2c.readfrom_mem(LTR381_ADDR, 0x11, 1)
Data2=i2c.readfrom_mem(LTR381_ADDR, 0x12, 1)
D0=Data0[0]
D1=Data0[0]
D2=Data0[0]
CS_BLUE_ADC_Data =(D2<<16)| (D1 << 8) | D0
sr = str(hex(CS_BLUE_ADC_Data))
B=sr[2:4]
B=int(B,16)
#BLUE

Data0=i2c.readfrom_mem(LTR381_ADDR, 0x13, 1)#lower byte data.
Data1=i2c.readfrom_mem(LTR381_ADDR, 0x14, 1)
Data2=i2c.readfrom_mem(LTR381_ADDR, 0x15, 1)
D0=Data0[0]
D1=Data0[0]
D2=Data0[0]
CS_RED_ADC_Data =(D2<<16)| (D1 << 8) | D0
sr = str(hex(CS_RED_ADC_Data))
R=sr[2:4]
R=int(R,16)
return R,G,B

3.将RGB值转换为RGB565格式,便于在屏幕上显示色块

def rgb_to_rgb565_int(r, g, b):
# 将RGB值转换为RGB565格式
r5 = (r >> 3) & 0x1F
g6 = (g >> 2) & 0x3F
b5 = (b >> 3) & 0x1F

# 合并RGB565格式的值
rgb565 = (r5 << 11) | (g6 << 5) | b5

return rgb565

4.全部代码

import uos
import st7789_new as st7789
from test.fonts import vga2_8x8 as font1
from test.fonts import vga1_16x32 as font2
import random
import framebuf
from machine import Pin, SPI, ADC,PWM,I2C
import time, math,array
from utime import sleep_ms
import struct
from time import sleep
import utime
from micropython import const

spi_sck=Pin(2)
spi_tx=Pin(3)
spi0=SPI(0,baudrate=4000000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)
st7789_res = 0
st7789_dc = 1
disp_width = 240
disp_height = 240
CENTER_Y = int(disp_width/2)
CENTER_X = int(disp_height/2)
display = st7789.ST7789(spi0, disp_width, disp_width,
reset=machine.Pin(st7789_res, machine.Pin.OUT),
dc=machine.Pin(st7789_dc, machine.Pin.OUT),
xstart=0, ystart=0, rotation=0)
display.fill(st7789.BLACK)
# xAxis = ADC(Pin(28))
# yAxis = ADC(Pin(29))

buttonM = Pin(5,Pin.IN, Pin.PULL_UP) #B
buttonS = Pin(6,Pin.IN, Pin.PULL_UP) #A
buttonL = Pin(7,Pin.IN, Pin.PULL_UP) #A
buttonPRESS = Pin(8,Pin.IN, Pin.PULL_UP) #A
buttonR = Pin(9,Pin.IN, Pin.PULL_UP) #A

LTR381_ADDR = 0x53

# 初始化I2C总线
i2c = I2C(0, sda=Pin(20),scl=Pin(21), freq=100000)
#print(i2c.scan())

def init():
i2c.writeto_mem(LTR381_ADDR, 0x00, b'\x06')
i2c.writeto_mem(LTR381_ADDR, 0x04, b'\x41')
i2c.writeto_mem(LTR381_ADDR, 0x05, b'\x00')

def read():
Data0=i2c.readfrom_mem(LTR381_ADDR, 0x0A, 2)#lower byte data.
Data1=i2c.readfrom_mem(LTR381_ADDR, 0x0B, 2)#1 middle byte data.
Data2=i2c.readfrom_mem(LTR381_ADDR, 0x0C, 4)#2 upper byte data
D0=int.from_bytes(Data0, 'little')
D1=int.from_bytes(Data1, 'little')
D2=int.from_bytes(Data2, 'little')
CS_IR_Data =(D2<<16)| (D1 << 8) | D0
#红外

Data0=i2c.readfrom_mem(LTR381_ADDR, 0x0D, 1)#lower byte data.
Data1=i2c.readfrom_mem(LTR381_ADDR, 0x0E, 1)
Data2=i2c.readfrom_mem(LTR381_ADDR, 0x0F, 1)
D0=Data0[0]
D1=Data0[0]
D2=Data0[0]
CS_GREEN_ADC_Data =(D2<<16)| (D1 << 8) | D0
sr = str(hex(CS_GREEN_ADC_Data))
G=sr[2:4]
G=int(G,16)
#GREEN

Data0=i2c.readfrom_mem(LTR381_ADDR, 0x10, 1)#lower byte data.
Data1=i2c.readfrom_mem(LTR381_ADDR, 0x11, 1)
Data2=i2c.readfrom_mem(LTR381_ADDR, 0x12, 1)
D0=Data0[0]
D1=Data0[0]
D2=Data0[0]
CS_BLUE_ADC_Data =(D2<<16)| (D1 << 8) | D0
sr = str(hex(CS_BLUE_ADC_Data))
B=sr[2:4]
B=int(B,16)
#BLUE

Data0=i2c.readfrom_mem(LTR381_ADDR, 0x13, 1)#lower byte data.
Data1=i2c.readfrom_mem(LTR381_ADDR, 0x14, 1)
Data2=i2c.readfrom_mem(LTR381_ADDR, 0x15, 1)
D0=Data0[0]
D1=Data0[0]
D2=Data0[0]
CS_RED_ADC_Data =(D2<<16)| (D1 << 8) | D0
sr = str(hex(CS_RED_ADC_Data))
R=sr[2:4]
R=int(R,16)
return R,G,B

def rgb_to_rgb565_int(r, g, b):
# 将RGB值转换为RGB565格式
r5 = (r >> 3) & 0x1F
g6 = (g >> 2) & 0x3F
b5 = (b >> 3) & 0x1F

# 合并RGB565格式的值
rgb565 = (r5 << 11) | (g6 << 5) | b5

return rgb565
def main():
init()
while True:
R,G,B=read()
print("R=",R,"G=",G,"B=",B)
rgb565_color = rgb_to_rgb565_int(R,G,B)
time.sleep(2)
display.fill(rgb565_color)
display.text(font2, "R="+str(R), 0, 40,st7789.WHITE,rgb565_color)
display.text(font2, "G="+str(G), 0, 70,st7789.WHITE,rgb565_color)
display.text(font2, "B="+str(B), 0, 100,st7789.WHITE,rgb565_color)
main()

六.活动总结与未来计划

通过对本项目的学习,对I2C又有了进一步的了解,本次项目锻炼了我的编程能力,对嵌入式开发有了新的体会,受益匪浅。未来期望再次参加活动,开拓电子芯片在生活中运用的视野,改变思维模式。

团队介绍
BUPT电子人
团队成员
T-&10
BUPT业余人士
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号