你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 2841|回复: 13

[活动] 【我爱DIY】基于STM32F072的色彩构成原理演示仪

[复制链接]

59

主题

1666

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2017-8-12 12:15:06 | 显示全部楼层 |阅读模式
基本介绍:
我们生活在一个色彩缤纷的世界,要展示色彩的构成原理,借助一个演示装置是一个十分自然的想法。那该如何来设计色彩构成原理演示仪呢?
它主要涉及以下的问题:
1)要有RGB类的发光器件,以便通过红、绿、蓝三基色来合成不同的色彩以供演示。
2)要能便捷的调节三基色的比例构成。
3)要具有一定的语音解说功能,以便指导装置的使用。
4)具有小巧的体积,以便于携带和使用。
5)避免采用电池供电方式,以利于环保。
思路说明:
基于上述的综合分析,这里选取STM32F072开发板作为处理的核心,它不但能提供设计所需要的运算处理能力,且在尺寸规格上也较为适宜。更为重要的是它在开发板上载有感应器件,可以滑动的方式快速设置参数,而非按键那样一个个地键入数字,从而能有效地提升响应性。
为了能实时性地演示色彩的合成效果,这里选取TFT彩色液晶屏作为显示器件,在配备小字库的情况下,还能够实现中文界面显示。
由于该色彩演示仪是供教学演示使用,为增强其演示效果,特为它配备了语音讲解功能。为了简化设计的复杂度,这里直接引用了MP3语音播放模块,并将播放的语音信息存放到mini SD卡中,因而在播放信息量上具有十分明显的优势。此外,该语音播放模块具有两种控制方式,一种是简单的I/O控制方式,另一种则是使用串行通讯方式,故使用起来十分方便,也利于在其它应用方面做进一步的扩展。
设计思路:
在色彩学中有多种色彩模式,如RGB模式、CYMK模式、Lab模式等。其中CYMK模式是用于印刷领域的,它符合我们日常的调色常识,如使用红色与黄色相调和,则可以调和成橙色,使用蓝色与黄色相调和,则可以产生绿色,若将红绿蓝三色混合到一起则是黑色,由于这样产生的黑色并不完全符合印刷的需要,故又单独增添了符合要求的黑色并以K来表示。对于RGB模式则不然,它适于显示屏之类的发光体,它在色彩合成方面则是基于色彩的三基色原理,即红色与蓝色相叠加会形成粉色,而红色与绿色相叠加,则会形成黄色,当红绿蓝三色混合后则是白色,当红绿蓝色都不含有时就是黑色。故二者中一个是符合减色原理,另一个则是符合加色原理。
因此在显示色彩合成效果时,我们选取TFT彩色液晶屏即可满足要求,其合成色彩的原理便是按RGB色彩模式。为了达到明显的演示效果,特在演示界面设置了RGB的色彩样本框及色彩合成样本框,以便实时地观察不同色彩成分的显示效果和作用。

原理图:
演示仪由色彩显示、语音播放、滑动输入及USB供电等模块组成,详见图1所示,其实物图则如图2所示。
a.png


图片1.png
    图2 实物构成图

功能实现:
在功能实现方面主要涉及界面的规划及程序设计这两部分,其中界面的规划会影响到使用时的方便性,而程序设计则直接关系到功能的实现。
1.界面规划
在界面规划上,主要涉及主界面和演示界面。主界面的作用在于介绍该设计的性能及环境配置,演示界面的作用则在于突出设计用途和功效。主界面如图3所示,演示界面则见图4。

图片2.png
    图3 主界面

       图片3.png
    图4 演示界面

2.程序代码
为了节省GPIO资源,所以选取了TFT串口显示屏,它与STM32F072的连接关系如下:
CS   --PB.4
SCK  --PB.3
SDI  --PB.2
DC   --PB.6
REST --PB.5
为控制各引脚的高低电平输出,其定义语句如下:
  1. #define LCD_CS_High()       HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4,GPIO_PIN_SET);
  2. #define LCD_CS_Low()              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4,GPIO_PIN_RESET);

  3. #define LCD_SCK_High()      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3,GPIO_PIN_SET);
  4. #define LCD_SCK_Low()              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3,GPIO_PIN_RESET);

  5. #define LCD_SDI_High()      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2,GPIO_PIN_SET);
  6. #define LCD_SDI_Low()              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2,GPIO_PIN_RESET);

  7. #define LCD_DC_High()             HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_SET);
  8. #define LCD_DC_Low()            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_RESET);

  9. #define LCD_REST_High()           HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_SET);
  10. #define LCD_REST_Low()            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_RESET);
复制代码
TFT显示屏的引脚配置函数如下:
  1. void GPIO_Configuration(void)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStruct;
  4.   __GPIOB_CLK_ENABLE();
  5.   GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4;
  6.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  7.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  8.   GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  9.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);       
  10. }
复制代码
由于感应板的数值范围与色彩的表现空间存在一定的差异,故在色彩显示时需要进行相应的变换处理以形成16位的565色彩格式。
色彩随动显示程序如下:
  1. static void ProcessSensors(void)
  2. {
  3.   if ((MyLinRots[0].p_Data->StateId == TSL_STATEID_DETECT) ||
  4.       (MyLinRots[0].p_Data->StateId == TSL_STATEID_DEB_RELEASE_DETECT))
  5.   {

  6.         //读取感应器件的数据
  7. dat=MyLinRots[0].p_Data->Position;
  8.                 if(k==0)  
  9.                 {
  10. //实现红色分量的样本色
  11.                 R=dat;
  12.                 LCD_ShowString(10,40,32,16,16,"R:");
  13.                 LCD_ShowNum(40,40,R*2+1,3,16);
  14.                 LCD_ShowString(80,40,32,16,16,"->");
  15.                 R=R/4<<11;//色彩值处理
  16.                 LCD_Fill(180,40,220,80,R);
  17.                 }
  18.                 if(k==1)  
  19.                 {
  20. //显示绿色分量的样本色
  21.                 G=dat;
  22.                 LCD_ShowString(10,100,32,16,16,"G:");
  23.                 LCD_ShowNum(40,100,G*2+1,3,16);
  24.                 G=G/2<<5;        //色彩值处理
  25.                 LCD_Fill(180,100,220,140,G);
  26.                 }
  27.                 if(k==2)  
  28.                 {
  29. //显示蓝色分量的样本色
  30.                 B=dat;
  31.                 LCD_ShowString(10,160,32,16,16,"B:");
  32.                 LCD_ShowNum(40,160,B*2+1,3,16);
  33.                 B=B/4;     //色彩值处理
  34.                 LCD_Fill(180,160,220,200,B);
  35.                 }
  36. //显示色彩分量叠加后的样本色
  37.                 LCD_ShowString(10,220,48,16,16,"Color:");
  38.                 LCD_Fill(180,220,220,260,R+G+B);
  39.   }
  40. }
复制代码
利用板载用户键切换RGB色彩对象的程序如下:
  1. while(BSP_PB_GetState(BUTTON_USER) != GPIO_PIN_SET)
  2.   {       
  3.     /* Execute STMTouch Driver state machine */
  4.     if (TSL_user_Action() == TSL_STATUS_OK)
  5.     {      
  6.       ProcessSensors(); // Execute sensors related tasks
  7.     }
  8.   }
  9.     // 切换色彩对象
  10.   k++;
  11.         if(k>=3) k=0;  //实现色彩对象轮回
  12.         if(k==0)
  13.         {
  14.         //  指示当前操作对象为红色
  15.                 LCD_ShowString(80,40,32,16,16,"->");
  16.                 LCD_Fill(80,160,120,180,WHITE);
  17.         }
  18.         if(k==1)
  19. {
  20. //  指示当前操作对象为绿色
  21.                 LCD_ShowString(80,100,32,16,16,"->");
  22.                 LCD_Fill(80,40,120,80,WHITE);
  23.     }
  24.         if(k==2)
  25. {
  26. //  指示当前操作对象为蓝色
  27.             LCD_ShowString(80,160,32,16,16,"->");
  28.             LCD_Fill(80,100,120,120,WHITE);
  29.         }       
  30.   // 等待用户键释放
  31.   while(BSP_PB_GetState(BUTTON_USER) != GPIO_PIN_RESET)
  32.   {
  33.   }
复制代码
MP3语音模块控制程序:
语音播放部分主要是通过MP3播放模块来实现,这样有利于节省MCU资源并可形成并行处理关系。为节省连线,可以采用通讯方式来控制MP3播放模块。MP3播放模块的引脚功能如图5所示。

图片4.png
   图5  MP3播放模块引脚图

其与MCU的连接关系为:
Rx   --PA.09
Tx   --PA.10
BUSY --PD3
对串口通讯的设置如下:
  1. /* UART configured as follows:
  2.       - Word Length = 8 Bits
  3.       - Stop Bit = One Stop bit
  4.       - Parity = None
  5.       - BaudRate = 9600 baud
  6.       - Hardware flow control disabled (RTS and CTS signals) */
  7.      UartHandle.Instance        = USARTx;
  8.      UartHandle.Init.BaudRate   = 9600;
  9. UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
  10.      UartHandle.Init.StopBits   = UART_STOPBITS_1;
  11.      UartHandle.Init.Parity     = UART_PARITY_NONE;
  12.      UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
  13.      UartHandle.Init.Mode       = UART_MODE_TX_RX;
  14.       UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
复制代码
播放指令被存放在数组中,的内容如下:
unsigned char play_cmd [10] = { 0X7E, 0xFF, 0x06, 0X0D, 00, 00, 00, 0xFE, 0xee, 0XEF};
使用播放指令的语句为:
HAL_UART_Transmit(&UartHandle, (uint8_t*)play_cmd, 10, 5000);
串口通讯的测试界面如图6所示。
图片5.png
6  通讯测试界面

使用方法:
在接通电源后,首先启动主界面的显示,随后即由扬声器播放出该演示仪的功能介绍及操作方法。伴随语音的讲解,显示界面也自动进入演示界面。
在演示界面下,可依据RGB的顺序来设置色彩的比例构成,并在对应的色彩样本框中指示色彩的效果。由于引入了感应板来设置色彩比例参数,故在参数设置时要比按键方式更便捷,且色彩随动效果更更快、更流畅。在进行色彩的切换时,是使用开发板上的蓝色用户键,伴随色彩的选取会在对应色彩行显示出对应的提示符“->”,以便于识别和操作。
结束语
  尽管该设计的功能不是十分复杂,但所涉及的内容还是较为丰富的,既有基于TFT屏的字符、中文及色彩的显示,也有语音的存储和播放;特别是感应器件的所用,能够快速地对参数进行设置,极大地增强人机交互性能。此外,以该设计为基础能进一步拓展系统的功能。

源程序

main.zip

下载

5.62 KB, 下载次数: 12, 下载积分: ST金币 -1

<
回复

使用道具 举报

52

主题

3313

回帖

61

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2017-8-13 22:39:58 | 显示全部楼层
不错,支持一下
回复 支持 反对

使用道具 举报

59

主题

1666

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-12-9
 楼主| 发表于 2017-8-14 09:01:45 | 显示全部楼层

感谢支持!!!
回复 支持 反对

使用道具 举报

6

主题

462

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-12-28
发表于 2017-8-14 09:05:55 | 显示全部楼层
不错 不错
回复 支持 反对

使用道具 举报

59

主题

1666

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-12-9
 楼主| 发表于 2017-8-14 09:10:43 | 显示全部楼层

多谢了您呢!
回复 支持 反对

使用道具 举报

26

主题

992

回帖

169

蝴蝶豆

论坛元老

最后登录
2020-11-13
发表于 2017-8-14 09:30:36 | 显示全部楼层
牛逼啊
回复 支持 反对

使用道具 举报

59

主题

1666

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-12-9
 楼主| 发表于 2017-8-14 09:38:21 | 显示全部楼层

哈哈,只是想把这块板子的性能尽量地发挥出来。
回复 支持 反对

使用道具 举报

1182

主题

3785

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-3-17
发表于 2017-8-14 11:22:20 | 显示全部楼层
回复 支持 反对

使用道具 举报

6

主题

296

回帖

2

蝴蝶豆

高级会员

最后登录
2019-11-13
发表于 2017-8-14 16:01:27 | 显示全部楼层

回复 支持 反对

使用道具 举报

59

主题

1666

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-12-9
 楼主| 发表于 2017-8-15 09:17:32 | 显示全部楼层

感谢您的支持!
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版