【情人节选帽子】TCS34725颜色传感器和Python图形界面编程(STM32 HAL库)
截图

描述:
l STM32 HAL库编程
l 使用模拟IIC通信,方便程序移植
l Python界面编写,蘑菇头的帽子是什么颜色
l STM32 HAL库串口通信
l Python界面使用Pygame
视频演示地址:https://www.bilibili.com/video/BV1Sv411a7qq
一、 基础认识

l 工作电压:3.3~5V
l 检测距离:3~10mm
l 通信方式:IIC,可达400kbit/s
l 采集参数:红色,绿色,蓝色(RGB),光照强度
l 可屏蔽中断,可屏蔽的上下限值中断
l 低功耗,等待状态65uA,休眠状态25uA
l 可编程采集等待时间,2.4ms~614ms
l TCS34725彩色传感器有着广泛的应用,包括RGB LED背光控制、固态照明、 健康产品、工业过程控制和医疗诊断设备等;
引脚定义

光谱分布


二、 系统状态
内部状态机提供RGBC的系统控制和设备的电源管理特性。通电时,内部开机复位会初始化设备,使其处于低功耗睡眠状态。当在IIC总线上检测到一个开始信号时,设备转换到空闲状态,在那里它检查启用寄存器(Ox00) PON位。禁用PON后,设备会返回休眠状态以节省电量。否则,设备将一直处于空闲状态,直到AEN使能RGBC功能。一旦启用,设备将依次执行等待和RGBC状态,如图16所示。在完成并返回空闲状态时,只要PON和AEN保持启用状态,设备将自动开始一个新的WaitRGBC周期。
l Sleep -- 低功耗睡眠状态
l IdIe -- 空闲状态
l Wait and RGBC -- 工作状态(等待和RGBC状态)

RGBC操作


TCS3472光数字转换器包含一个3×4光电二极管阵列,集成光电二极管电流、数据寄存器、状态机和IIC接口的四个模数转换器(ADC), 3 × 4光电二极管阵列由红滤光、绿滤光、蓝滤光和透明(未滤光)光电二极管组成。此外,光电二极管被涂上ir阻挡滤波器。四个积分adc同时将放大的光电二极管电流转换为16位数字值。在完成一个转换周期后,结果被转移到数据寄存器,数据寄存器是双缓冲的,以确保数据的完整性。所有的内部定时以及低功耗等待状态都由状态机控制。
TCS3472的数据通信是通过一个快速,高达400khz,两线PC串行总线完成的。工业标准1PC总线简化了与微控制器和嵌入式处理器的直接连接。
除了IIC总线, TCS3472提供了一个单独的中断信号输出。当中断被启用,并且超过了用户定义的阈值时, active-low中断将被保持,直到控制器将其清除为止。这个中断特性通过消除对TCS3472的轮询,简化并提高了系统软件的效率。用户可以定义上中断阈值和下中断阈值,并应用中断持久过滤器。中断持久过滤器允许用户在生成中断之前定义必要的连续超出阈值事件的数量。中断输出是开路漏极,因此可以与其他设备连接。

l 模块包含RGBC增益控制器(AGAIN)和4个集成的RGBC光电二极管数模转换器(ADC)
l 转换时间(ATIME)影响RGBC读取的分辨率和灵敏度
l 4个通道整合同时发生,转换周期完成后,结果将转移到颜色数据寄存器
l 传输采用双缓存,以保证数据在传输期间不读取无效数据,读取完成数据后才会触发下一次数据读取和转移
l 可屏蔽的高低阈值中断引脚
三、编程准备
(一) 通信时序

这是一个标准的IIC通信时序
l 写命令寄存器时序:开始信号—写7位IIC地址—写1位读写标识—等待从机ACK—写命令寄存器地址—等待从机ACK—写数据—等待从机ACK--……--停止信号
l 读命令寄存器时序:开始信号—写7位IIC地址—写1位读写标识—等待从机ACK—写命令寄存器地址—等待从机ACK—开始信号—写7位IIC地址—写1位读写标识—等待从机ACK—等待从机数据—写应答ACK—等待从机数据—写应答ACK--……--停止信号
(二) 芯片的IIC地址

从时序可以看出,这是7位地址,所以有:
写地址:0x29<<1
读地址:(0x29<<1)|0x01
(三) 寄存器(命令)发送

CMD
发送命令最高位必须为1
TYPE:
发送类型:
00,重复字节协议,也就是读取数据时将一直读取当前寄存器的数据
01,自动递增协议,读取数据时会自动递增寄存器
10,不使用,保留
11,与SF同时使用
ADDR:
寄存器(命令)地址
寄存器地址描述
通常命令寄存器的头部为:0x80
所以寄存器地址应该是:0x80|Address

(四)寄存器数据分析
0x00启动寄存器



东提示:我们不使用中断,所以不用配置中断相关寄存器,PON写1后要等待至少2.4ms再开启AEN。PON是振荡器开启,AEN是RGBC转换开启
0x01 RGBC转换时间
RGBC Count = (256 − ATIME) × 1024

0x0f 增益控制
控制寄存器为模拟块提供8位杂项控制。这些位通常控制增益设置和/或二极管选择等功能。

0x12 设备ID
ID寄存器提供零件号的值。ID寄存器是只读寄存器。

东提示:通常读取ID用来判断与芯片是否通信成功
0x13 状态寄存器
状态寄存器提供设备的内部状态。
这个寄存器是只读的。

东提示:通常读取AVALID的值,如果是1的话表示RGBC转换完成,就可以读取RGBC的数据
0x14 - 0x1B RGBC通道数据寄存器
Clear、red、green、blue为16位数据。为了确保数据被正确读取,一个两字节的read IIC事务应该在命令寄存器中设置一个读字协议位。通过这个操作,当读低位字节寄存器时,高位8位被存储到阴影寄存器中,然后再读高位字节。高位寄存器将读取正确的值,即使是额外的值ADC集成周期结束于读取低位寄存器和高位寄存器之间。

四、 程序实现
(一) 硬件介绍
模块原理图

IIC的两条通信线一定要做上拉,所以初始化配置IO为:
SCL:上拉,推挽输出
SDA:上拉输入
接线:

(二) CubeMX配置

IO配置

串口配置

(三) Python界面编程
参考:
Python 游戏之旅(Pygame)
https://www.cnblogs.com/dongxiaodong/p/10015451.html
编程思路:
- 界面初始化
- 串口收到数据
- RGB三色数据提取
- 颜色更改与显示
演示视频:https://www.bilibili.com/video/BV1Sv411a7qq
原文地址:https://www.cnblogs.com/dongxiaodong/p/14402521.html
五、 我的微信

【情人节选帽子】TCS34725颜色传感器和Python图形界面编程(STM32 HAL库)的更多相关文章
- python图形界面编程
EasyGui(easygui-docs-0.96\tutorial\index.html) import easygui as g import sys while 1: g.msgbox('mes ...
- python图形界面(GUI)设计
不要问我为什么要用 python 来做这种事,我回到“高兴咋地”也不是不可以,总之好奇有没有好的解决方案.逛了一圈下来,总体上来说,python 图形界面有以下几个可行度比较高的解决方案. 1. py ...
- Python 图形界面(GUI)设计
不要问我为什么要用 Python 来做这种事,我回到“高兴咋地”也不是不可以,总之好奇有没有好的解决方案.逛了一圈下来,总体上来说,Python 图形界面有以下几个可行度比较高的解决方案. 1. py ...
- Python可视化界面编程入门
Python可视化界面编程入门具体实现代码如所示: (1)普通可视化界面编程代码入门: import sysfrom PyQt5.QtWidgets import QWidget,QApplicati ...
- python 图形界面开发
用python来开发图形界面,确实不是很方便,没有c#,Java,甚至VB来得容易.几个控件拖拽,然后响应事件. 用python写脚本,或者web service来处理一般工作,绰绰有余.但有的时候, ...
- Python图形界面Tk
最近在学习Python,在使用Tkinter做图形界面时遇到了几个小问题,网上查了一下,在Python2.x导入的是Tkinter,Python3则是tkinter.而且导入的simpledialog ...
- 使用PyQt进行Python图形界面程序开发文章目录
☞ ░ 前往老猿Python博文目录 ░ PyQt入门知识原来是作为老猿Python<Python基础教程目录>后的进阶学习章节存在,最近不少专栏作者提醒老猿整体的博文内容不错,但博文没有 ...
- 第十五章 使用PyQt进行Python图形界面程序开发
在基础知识部分的最后一章<第十三章 Python基础篇结束章>的<第13.3节 图形界面开发tkinter>简单介绍了Python内置图形界面标准库tkinter,当时特别强调 ...
- Python 的简单图形界面编程【草】
可用方案 Tkinter python官方附带,方便,但听说存在乱码问题 wxPython 更成熟一些,但需要额外安装(大约50M) pyQt 授权不够宽松 最短代码 Tkinter 待补充 wxPy ...
随机推荐
- STL_string容器
一.string概念 string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的.string与char*都可以用来表示字符串,那么二者有什么区别. ...
- MongoDB 总结
目录 1. 逻辑结构 2. 安装部署 2.1 系统准备 2.2 mongodb安装 2.2.1 创建所需用户和组 2.2.2 创建mongodb所需目录结构 2.2.3 上传并解压软件到指定位置 2. ...
- uni-app开发经验分享十九: uni-app对接微信小程序直播
uni-app对接微信小程序直播 1.登录微信小程序后台-点击>设置->第三方设置->添加直播插件 2.添加直播组件后->点击<详情> 记录这两个参数直播 ...
- uni-app开发经验分享六:页面跳转及提示框
在我们开发的uni-app的过程中,页面跳转及提示框往往是我们做数据交互及结果反馈所要使用的功能,这里分享下我收集的一些方法及看法. 一:页面跳转 事件跳转 :指通过tap等事件来实现页面的跳转,跳转 ...
- (01)-Python3之--字符串操作
1.字符串切片取值 字符串的取值通过索引来读取,从0开始. 取区间值如下:字符串变量名[起始索引:结束索引].包含起始,但不包含结束.例如: str_my = "hello,python!我 ...
- C#高级编程第11版 - 第七章 索引
[1]7.1 相同类型的多个对象 1.假如你需要处理同一类型的多个对象,你可以使用集合或者数组. 2.如果你想使用不同类型的不同对象,你最好将它们组合成class.struct或者元组. [2]7.2 ...
- libuv工作队列
目录 1.说明 2.API 2.1.uv_queue_work 2.2.uv_cancel 3.代码示例 1.说明 libuv 提供了一个线程池,可用于运行用户代码,libuv 中的工作队列中的任务会 ...
- CF460C Present
写在前面 由于菜,写树状数组写挂了. 于是想出了一种不像线段树或树状数组+二分答案那样显然,但是依旧不难想,复杂度比较优秀,代码难度低的做法. 算法思路 外部二分答案,不多解释,稍证明一下单调性: 若 ...
- 一:整合shiro
整合shiro 1.原生的整个 1.1 创建项目 1.2 创建Realm 1.3 配置shiro 2.使用Shiro Starter 2.1 项目创建 2.2 创建Realm 2.3 配置Shiro ...
- java架构《并发线程高级篇四》
本章主要讲并发线程的常见的两种锁.重入锁和读写锁 一:重入锁(ReentrantLock) 概念:重入锁,在需要进行同步的代码加锁,但最后一定不要忘记释放锁,否则会造成锁永远不能释放,其他线程进不了 ...