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

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

[复制链接]
jinglixixi 提问时间:2017-8-12 12:15 /
基本介绍:
我们生活在一个色彩缤纷的世界,要展示色彩的构成原理,借助一个演示装置是一个十分自然的想法。那该如何来设计色彩构成原理演示仪呢?
它主要涉及以下的问题:
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, 下载次数: 14, 下载积分: ST金币 -1

收藏 1 评论13 发布时间:2017-8-12 12:15

举报

13个回答
wyxy163@126.com 回答时间:2017-8-13 22:39:58
提示: 作者被禁止或删除 内容自动屏蔽
jinglixixi 回答时间:2017-8-14 09:01:45

感谢支持!!!
霹雳之火 回答时间:2017-8-14 09:05:55
不错 不错
jinglixixi 回答时间:2017-8-14 09:10:43

多谢了您呢!
CC4 回答时间:2017-8-14 09:30:36
牛逼啊
jinglixixi 回答时间:2017-8-14 09:38:21

哈哈,只是想把这块板子的性能尽量地发挥出来。
zero99 回答时间:2017-8-14 11:22:20
ychlucky 回答时间:2017-8-14 16:01:27

jinglixixi 回答时间:2017-8-15 09:17:32

感谢您的支持!
ToddYam 回答时间:2017-8-15 16:47:45
jinglixixi 回答时间:2017-8-16 09:54:59

多谢啦!!!
samhong 回答时间:2017-8-18 09:25:34
72个赞,全赞给楼主。
jinglixixi 回答时间:2017-8-19 10:50:02
samhong 发表于 2017-8-18 09:25
72个赞,全赞给楼主。

感谢捧场,谢了!!!
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版