我们在前期的准备过程中准备了很多内容,实际上除了进行一般的界面设计和额外的舵机控制基本上都已经实现了,接下来我们回顾一下:
开箱:【电子测光表】1、开箱贴
https://forum.eepw.com.cn/thread/387942/1
在开箱贴中,我们介绍了本次活动使用的基本物件以及功能
过程贴:
【电子测光表】2、过程贴-制作转接板,参考了网友的设计思路进行了一下优化
https://forum.eepw.com.cn/thread/387943/1
【电子测光表】3、过程贴-配置开发环境以及页面控制,熟悉了一下开发环境和配置过程,并显示了中文字幕
https://forum.eepw.com.cn/thread/387944/1
【电子测光表】4、过程贴-按键的控制,作为主要的输入控制,了解基本控制方式和方法
https://forum.eepw.com.cn/thread/387945/1
【电子测光表】5、过程贴-光照强度采集与显示,光照强度是本次活动作重要的采集参数,可以说本次活动都是围绕着其进行的设计
https://forum.eepw.com.cn/thread/387946/1
【电子测光表】6、过程贴-算法推演,最终的显示参数与采集参数都有什么关系呢,该文对重要参数进行了解析,以及各自之间的关系进行了介绍,从而进行具体的算法设计
https://forum.eepw.com.cn/thread/387947/1
接下来我们继续进行一些关键功能进行介绍了实现。
1、舵机的控制
舵机是本次扩展功能的一部分,首先要了解舵机的基本信息,其控制方式是通过不定市场的高电平控制的,最终的表现是PWM,50Hz,其占空比仅为0.5ms-2ms之间,不过cpy已经集成了一些控制库,其中adafruit_motor中的servo就是本次使用的,可以实现固定位置的控制,控制代码如下:
import pwmio from adafruit_motor import servo pwm = pwmio.PWMOut(board.D10, frequency=50) motor_servo = servo.ContinuousServo(pwm) motor_servo.throttle = -1
控制范围为-1~1之间,直接修改motor_servo.throttle就可以。
2、页面的设计
本次一共设计了三个页面:
欢迎页面:显示的是本次活动的一些信息代码如下:
page1text = label.Label( font=font, # 你需要指定一个字体对象 text="\n EEPW&&DigiKey \n Let's do! \n 电子测光表", # 显示的文本 x=2, # 文本的起始X坐标 y=2, # 文本的起始Y坐标 color=color_FreshLeaves, # 文本颜色 ) # 首页 show_page1 = displayio.Group() show_page1.append(page1text) def Show_Page1(): global ShowingPageFlag display.root_group = show_page1 ShowingPageFlag = 1
设置页面:设置页面主要是对使用过程一些定参数进行设置,例如模式、ISO等参数,需要对不同显示内容进行定义,代码如下:
page2text1 = label.Label( font=font1, text="设置界面", x=78, y=10, color=color_Gray, ) page2text2 = label.Label(font, scale=1) page2text2.x = 40 page2text2.y = 40 page2text2.color = color_Gray page2text2.text = "模式:" page2data2 = label.Label( font=font, x=100, y=40, color=color_DeepSkyBlue, ) page2text3 = label.Label( font=font, text="ISO:", x=40, y=60, color=color_Gray, ) page2data3 = label.Label( font=font, x=100, y=60, color=color_DeepSkyBlue, ) page2text4 = label.Label( font=font, text="光圈:", x=40, y=80, color=color_Gray, ) page2data4 = label.Label( font=font, x=100, y=80, color=color_DeepSkyBlue, ) page2text5 = label.Label( font=font, text="快门:", x=40, y=100, color=color_Gray, ) page2data5 = label.Label( font=font, x=100, y=100, color=color_DeepSkyBlue, ) # 设置界面 show_page2 = displayio.Group() show_page2.append(page2text1) show_page2.append(page2text2) show_page2.append(page2data2) show_page2.append(page2text3) show_page2.append(page2data3) show_page2.append(page2text4) show_page2.append(page2data4) show_page2.append(page2text5) show_page2.append(page2data5) # display.root_group = show_page2 def Show_Page2(): global ShowingPageFlag display.root_group = show_page2 page2data2.text = Mode[DataModecnt] page2data3.text = ISO[DataIOScnt] page2data4.text = "F"+F[DataFSetcnt] page2data5.text = T[DataTSetcnt] Page2Meun() if DataModecnt == 0: page2data5.color = color_Gray page2data4.color = color_DeepSkyBlue else: page2data5.color = color_DeepSkyBlue page2data4.color = color_Gray ShowingPageFlag = 2
page3text1 = label.Label( font=font1, text="检测界面", x=78, y=10, color=color_LimeGreen, ) page3text2 = label.Label( font=font1, text="当前模式:", x=2, y=30, color=color_Gray, ) page3data2 = label.Label( font=font1, x=120, y=30, color=color_Gray, ) page3text3 = label.Label( font=font1, text="ISO :", x=4, y=50, color=color_Gray, ) page3data3 = label.Label( font=font1, x=120, y=50, color=color_Gray, ) page3text4 = label.Label( font=font1, text="光圈 :", x=4, y=70, color=color_Gray, ) page3data4 = label.Label( font=font1, x=120, y=70, color=color_Persimmon, ) page3text5 = label.Label( font=font1, text="快门速度:", x=2, y=90, color=color_Gray, ) page3data5 = label.Label( font=font1, x=120, y=90, color=color_Persimmon, ) page3text6 = label.Label( font=font, text="Lux:", x=2, y=115, color=color_Gray, ) page3data6 = label.Label( font=font, x=42, y=115, color=color_TurquoiseBlue, ) page3text7 = label.Label( font=font, text="EV:", x=150, y=115, color=color_Gray, ) page3data7 = label.Label( font=font, x=190, y=115, color=color_TurquoiseBlue, ) # 检测界面 show_page3 = displayio.Group() show_page3.append(page3text1) show_page3.append(page3text2) show_page3.append(page3data2) show_page3.append(page3text3) show_page3.append(page3data3) show_page3.append(page3text4) show_page3.append(page3data4) show_page3.append(page3text5) show_page3.append(page3data5) show_page3.append(page3text6) show_page3.append(page3text7) show_page3.append(page3data6) show_page3.append(page3data7) # display.root_group = show_page3 ef Show_Page3(): global ShowingPageFlag display.root_group = show_page3 page3data2.text = Mode[DataModecnt] page3data3.text = ISO[DataIOScnt] ShowingPageFlag = 3 if DataModecnt == 0: page3data4.text = "F"+F[DataFSetcnt] page3data4.color = color_Gray page3data5.text = "--" page3data5.color = color_Persimmon elif DataModecnt == 1: page3data4.text = "F"+"--" page3data4.color = color_Persimmon page3data5.text = T[DataTSetcnt] page3data5.color = color_Gray
可以看到每一个页面都是一个单独的displayio.Group(),通过切换显示进行单独页面的展示,刷新效果还是挺不错的。通过不同部分的不同配置的修改实现了比较直观的显示,比如通过不同的颜色区分哪些是静态部分,哪些是动态部分,哪些是不变的,哪些是变化的,可以说一目了然。
3、按键的控制
按键的采集与处理这里是通过扫描的方式实现,一共进行了两个函数来实现的,Sub_Hey_Collect()和Sub_Hey_deal()一个是按键扫描,一个是按键处理,主要的逻辑判断以及页面控制和参数变化设置等等。相关代码可以在分享的附件中进行查看。
4、参数的计算
我们在算法验算中得到了所有的参数之间的关系,其中Lux与EV之间是需要进行运算的,而三要素之间的关系实际上我们是不需要进行复杂运算的,为此我们创建了一个数据集合:
Mode = [ '光圈优先 ', '快门优先 ', ] ISO = [ '100 ', '200 ', '400 ', '800 ', '1600 ', '3200 ', '6400 ', '12800 ', ] F = [ '1 ', '1.4', '2 ', '2.8', '4 ', '5.6', '8 ', '11 ', '16 ', '22 ', '32 ' ] T = [ '32 ', '16 ', '8 ', '4 ', '2 ', '1 ', '1/2 ', '1/4 ', '1/8 ', '1/15 ', '1/30 ', '1/60 ', '1/125 ', '1/250 ', '1/500 ', '1/1000' ]
以上就是我们比较常用的参数范围,其参数规律非常明显,通过简单的加减法就可以得到我们想要的参数。
实际的运算如下:
Datalux = sensor.lux DataEV = 2 + math.log(Datalux/10, 2) + DataIOScnt DataEV = math.floor(DataEV) DataTcnt = DataEV-DataFSetcnt+5 DataFcnt = DataEV-(DataTSetcnt-5)
这里的5实际上是快门速度与我们设置的类之间的一个过渡关系。
总结
本次的活动非常有意义,我们通过学习可以了解一种新的开发方式(cpy),其有众多的模块可以让我们快速验证。同时我们还可以通过本次活动了解到了摄影相关的知识。再次感谢论坛和得捷电子组织的本次活动,让大家收获满满
效果展示视频如下:【电子测光表效果展示】 https://www.bilibili.com/video/BV1gXB1YUEQ5/?share_source=copy_web&vd_source=2a202874768d99b0acaa1aceb9a9b93e
EETV视频链接:https://v.eepw.com.cn/video/play/id/16199