2022-4-1 12:20:04 [显示全部楼层]
4617浏览
查看: 4617|回复: 12

【行空板Python入门教程】第二课:小小捕光仪

[复制链接]
本帖最后由 木子呢 于 2022-4-1 12:21 编辑

行空板,新一代国产开源硬件平台,仅需2步,即可让你轻松开启Python学习之路。



在日常生活中,光线的强弱对人类的情绪有着很大的影响。无论是积极还是消极的情绪,愈明亮的光线会让这种感情愈加剧。也正因此,书房、厨房等一些具有实用功能的家居环境,往往会采用较强光线的灯光,这样更能让人集中精神饱满的投入工作或家务。而卧室则适合较弱光线的灯光,给人一种温馨舒适的感觉,有助于身心放松。然而,仅凭主观的感受很难精准地判断光线强弱,那如何才能获悉环境光的大小,继而判断家庭中各个房间的灯光是否合理呢?

让我们利用行空板一起来制作一个捕光仪更好地了解房间的环境光强度吧!

qw1.jpg

任务目标

将通过光线传感器检测到的光线值显示在屏幕上,同时,将光线强弱平均划分为四个等级,并在强弱不同的环境光线下,显示不同亮度等级的小灯背景图。

qw2.jpg

知识点

1、认识光线传感器
2、认识Pinpong库
3、学习使用Pinpong库检测光线值的方法
4、学习使用unihiker库显示图片、切换文字及图片的方法

材料清单

硬件清单:

qw3.jpg

软件使用:Mind+编程软件

知识储备

1、什么是光线传感器

光线传感器是一种能够将光信号转换成电信号的器件,可用于检测光线值,行空板的光线传感器是内置在板子上的,检测时返回的是一个模拟量,数值范围在0-4095,光线越亮数值越高,光线越暗数字越低。

qw4.jpg

2、什么是Pinpong库

通过Mind+软件我们可以使行空板与计算机连接起来,但如何才能控制行空板上的元器件运行起来呢?

这里我们需要使用Pinpong库。Pinpong库是一套控制开源硬件主控板的Python库,基于Firmata协议,5分钟即可让你上手使用Python控制开源硬件。其原理是给开源硬件烧录一个特定的固件,使开源硬件可以通过串口与电脑通讯,执行各种命令。

Pinpong库的名称由“Pin”和“Pong”组成,“Pin”指引脚,“Pinpong”为“乒乓球”的谐音,指信号的往复。

Pinpong库的设计,是为了让开发者在开发过程中不用被繁杂的硬件型号束缚,而将重点转移到软件的实现。哪怕程序编写初期用其他板子开发,部署时改成了行空板,只要修改一下硬件的参数就能正常运行,实现“一次编写处处运行”。

那么,行空板上的所有硬件都可以通过Pinpong库来控制吗?

事实上,行空板整体由一块单板机和单片机系统组成。单片机系统类似一块Arduino,板载的金手指、Gravity接口、I2C接口、按键、蜂鸣器、光线传感器、加速度计陀螺仪 都接在了单片机上,在使用时,可通过Pinpong库来控制。而单板机我们可以当作是一台小电脑,行空板上的触摸屏、USB口、麦克风、Home键等都是接在单板机上,类似于电脑上的显示屏、USB口、麦克风等,可通过Python库来控制。

3、Pinpong库导入方法及板子初始化

当我们使用Pinpong库控制行空板时,需要先初始化板子,而由于Pinpong库的“pinpong.board”包中已经提供了相应的Board类,因此我们需要从中先导入这个模块。同样的,为了能够控制行空板上各元器件,我们也需要导入“pinpong.extension.unihiker”这个包中的模块。

  1. from pinpong.board import Board # 从pinpong.board包中导入Board模块
  2. from pinpong.extension.unihiker import * # 导入pinpong.extension.unihiker包中所有模块
  3. Board('UNIHIKER').begin() # 初始化,选择板型和端口号,不输入则进行自动识别
复制代码

其中,在 Board('') 中输入主控板型号“UNIHIKER”,在 begin() 中输入主控板端口号,不输入型号和端口号则进行自动识别。

4、Pinpong库“light.read()”指令读取光线值

在初始化板子后,我们可通过Pinpong库中的“light.read()”指令读取光线值。

  1. Light = light.read() # 读取光线值
复制代码

其中,“light.read()”表示读取光线值,是固定用法,“Light”是一个变量,用来存储读取到的光线值。

Tips:Pinpong库中对于板载元器件的功能大都封装在了“pinpong.extension.unihiker”文件的各自的类中,并且由于在文件中已经对类进行过实例化,生成了一个light对象,因此,我们在使用时,可直接通过“light.read()”来读取光线值。

5、Unihiker库GUI类draw_image()方法显示图片

GUI类中的draw_image()方法可以实现在行空板屏幕上显示图片,在编程时,通过“对象.方法名()”的形式来实现功能,同时,此方法会返回一个图片对象,使用变量存储起来方便后续进行对象更新操作。

  1. img = gui.draw_image(x=0,y=0,w=240, h=320, image='light-1.png')  # 显示初始背景图为light-1
复制代码

其中,参数w和h分别表示图片的宽度和高度,按照长宽最小边等比例缩放,可省略,宽高参数都省略则保持原图分辨率,这里我们使宽高和屏幕保持一致。image对应图片源,可以传入路径或image对象,img则是用来存储图片对象的一个变量。

Tips:当需要设定图片的位置时,也可通过固定x和y的值来确定图片的横纵坐标。当位置为(0,0)时可省略。

6、Unihiker库GUI类通用知识及功能

(1)更新控件对象config

行空板屏幕上显示的所有元素对象我们可称之为控件,如图片、文字、表情、按钮等,控件对象在初次生成后是可以改变的,我们可以通过“对象.config()”的形式来实现。

  1. img = gui.draw_image(x=0,y=0,w=240, h=320, image='light-1.png')  # 显示初始背景图为light-1
  2. img.config(image='light-2.png')  # 切换背景图为light-2
复制代码

这里,我们先显示了一张初始的背景图'light-1.png'并将它存储到了变量img中作为一个图片控件,之后通过config更新控件对象的方式将背景图换成了'light-2.png'。

  1. value = gui.draw_text(x=153, y=28, text='800', font_size=18) #显示默认光线值
  2. value.config(text='666') # 更新显示光线值
复制代码

这里,我们先在(153,28)坐标位显示了一行文字,内容为“800”,并将它存储到了变量value中作为一个文字控件,之后通过config更新控件对象的方式将文字内容换成了“666”。

动手实践

任务描述1:显示固定光线值

将大小为800的光线值呈现在屏幕上,同时显示一张小灯背景图。

1、硬件搭建
通过USB连接线将行空板连接到计算机

2、程序编写
STEP1:创建与保存项目文件

启动Mind+,另存项目并命名为“002、小小捕光仪”。

STEP2:创建与保存Python文件

创建一个Python程序文件“main1.py”,双击打开。

STEP3:
导入图片

在项目文件夹中导入需要的png图。(图片与程序文件同在项目文件夹中),具体操作如下。

(1)将准备好的图片文件依次拖入项目文件夹中

Tips:图片下载链接见附录1

qw5.jpg


(2)拖入后可见

qw6.jpg


Step4:程序编写

(1) 导入所需功能库

在这个任务中,我们需要使用unihiker库中的GUI模块来在屏幕上显示图片和文字,因此,我们首先需要导入它,代码如下。同时,由于后续在保持程序运行时需要一定的延时,因此,我们还需导入time时间库。

  1. from unihiker import GUI  # 导入unihiker库GUI 模块
  2. import time  # 导入时间库
复制代码

(2) 实例化GUI类

在使用unihiker库中的GUI模块显示文字和图片前,我们需要先实例化GUI类,来创建一个对象,以便使用该类中的各种方法。

  1. gui = GUI()  # 实例化GUI类,创建对象
复制代码

(3) 显示图片

在创建gui对象后,我们可以在行空板的屏幕上添加背景图。

  1. img = gui.draw_image(x=0,y=0,w=240, h=320, image='light-1.png')  # 显示初始背景图为light-1
复制代码

(4) 显示光线值

之后,我们给定一个确定的光线值“800”并使其呈现在屏幕上。

  1. value = gui.draw_text(x=153, y=28, text='800', font_size=18)  # 显示默认光线值
复制代码

(5) 保持内容显示

最后,为了能够保持屏幕内容的长久显示,我们使程序处于运行状态。

  1. while True:  # 循环
  2.     time.sleep(1)  # delay1秒
复制代码

Tips:完整示例程序如下:

  1. from unihiker import GUI  # 导入unihiker库
  2. import time  # 导入time库

  3. gui = GUI()  # 实例化GUI类,创建gui对象

  4. img = gui.draw_image(x=0,y=0,w=240, h=320, image='light-1.png')  # 显示初始背景图为light-1
  5. value = gui.draw_text(x=153, y=28, text='800', font_size=18) #显示默认光线值

  6. while True:  # 循环
  7.     time.sleep(1)  # delay1秒
复制代码

3、程序运行

STEP1:远程连接行空板

(1) 确认板子处于连接且开机状态

(2) 开启远程连接终端

qw7.jpg


(3) 连接行空板

qw8.jpg


qw9.jpg


STEP2:点击右上方的运行按钮

STEP3:观察效果

观察行空板,可看到一只蓝色的小灯显示在屏幕的中间,光线值栏中显示的出800的数值。

qw10.jpg

任务描述2:实时检测光线值

通过板载的光线传感器实时检测光线值,显示在屏幕上,同时将光线值均匀划分为4个不同的等级,并以此显示不同亮度的小灯图。

1、程序编写

STEP1:创建与保存项目文件

之前我们已经新建并保存过了项目文件,这里我们只需再建立一个新的名为“main2.py”的Python程序文件即可,具体操作方法同上。创建完成后,我们双击打开它进行编程。

qw11.jpg

Step2:程序编写

(1)导入所需功能库

由于我们将通过板载的光线传感器来检测光线值,因此,我们需要补充导入相关的Pinpong库并初始化行空板。

  1. from unihiker import GUI  # 导入unihiker库
  2. import time  # 导入time库

  3. from pinpong.board import Board # 从pinpong.board包中导入Board模块
  4. from pinpong.extension.unihiker import * # 导入pinpong.extension.unihiker包中所有模块

  5. Board().begin() # 初始化,选择板型和端口号,不输入则进行自动识别
复制代码

(2)实例化GUI类并在屏幕上显示背景图和初始光线值

  1. gui = GUI()  # 实例化GUI类,创建gui对象

  2. img = gui.draw_image(x=0,y=0,w=240, h=320, image='light-1.png')  # 显示初始背景图为light-1
  3. value = gui.draw_text(x=145, y=28, text='0', font_size=18) #显示初始光线值
复制代码

(3)循环检测光线值并更新数值显示及图片

在上个任务中,我们将光线值存储到变量Light中,并赋值800。而在这个任务中,我们将通过板载的光线传感器来检测光线值,再赋值给变量Light。而为了使光线值能够每隔一秒不停地被监测并更新显示在屏幕上,这里,我们使用while语句。

  1. while True :
  2.     Light = light.read() # 读取光线值
  3.     value.config(text = Light) # 更新显示光线值
  4.     # 光线值等级
  5.     if 0 <= Light < 1024:
  6.         img.config(image='light-2.png')  # 切换背景图为light-2
  7.     elif 1024 <= Light < 2048:
  8.         img.config(image='light-3.png')  # 切换背景图为light-3
  9.     elif 2048 <= Light < 3072:
  10.         img.config(image='light-4.png')  # 切换背景图为light-4  
  11.     else:

  12.         img.config(image='light-5.png')  # 切换背景图为light-5

  13.     time.sleep(1) # delay 1 s
复制代码

Tips:完整示例程序如下:

  1. from unihiker import GUI  # 导入unihiker库
  2. import time  # 导入time库

  3. from pinpong.board import Board # 从pinpong.board包中导入Board模块
  4. from pinpong.extension.unihiker import * # 导入pinpong.extension.unihiker包中所有模块

  5. Board().begin() # 初始化,选择板型和端口号,不输入则进行自动识别

  6. gui = GUI()  # 实例化GUI类,创建gui对象

  7. img = gui.draw_image(x=0,y=0,w=240, h=320, image='light-1.png')# 显示初始背景图为light-1
  8. value = gui.draw_text(x=145, y=28, text='0', font_size=18) # 显示初始光线值

  9. while True :
  10.     Light = light.read() # 读取光线值
  11.     value.config(text = Light) # 更新显示光线值
  12.     # 光线值等级
  13.     if 0 <= Light < 1024:
  14.         img.config(image='light-2.png')  # 切换背景图为light-2
  15.     elif 1024 <= Light < 2048:
  16.         img.config(image='light-3.png')  # 切换背景图为light-3
  17.     elif 2048 <= Light < 3072:
  18.         img.config(image='light-4.png')  # 切换背景图为light-4  
  19.     else:
  20.         img.config(image='light-5.png')  # 切换背景图为light-5

  21.     time.sleep(1) # delay 1 秒
复制代码

2、程序运行

STEP1:远程连接行空板

STEP2:运行程序并观察效果

点击运行后,观察行空板,同时从不同的角度给行空板光线传感器打光,可以发现屏幕上方的光线值每隔一定的时间在不停地变化,而小灯的亮度及进度条的填充度也在相应地改变。光线越强,数值越大,小灯越亮,进度条填充度也越高。



挑战自我

想一想,当光线值过大(>3072)或过小(<1024)时,我们是否可以添加提醒功能,在屏幕上显示相应的文字信息呢,自己来试一试吧。

扩展阅读

光线传感器原理

光线传感器是由两个组件,即投光器和受光器组成,利用投光器将光线由透镜将之聚集,经传输而至受光器之透镜,再至接收感应器,接收感应器将收到的光线信号转变成电信号,此电信号可进一步作各种不同的开关和控制动作,其基本原理即对投光器和受光器间的做遮蔽的动作所获得的信号加以运用以完成各种自动化控制。


附录


附录1:小灯图片链接
链接:https://pan.baidu.com/s/1XiiudbVcxNDkWzFm-bhNOg
提取码:eu71

小企鹅  高级技师

发表于 2022-4-2 18:40:25

厉害厉害
回复

使用道具 举报

盐焗海盐  见习技师

发表于 2022-4-2 20:41:08

牛人啊!666
回复

使用道具 举报

赤星三春牛!  中级技匠

发表于 2022-4-10 10:12:06

厉害厉害
回复

使用道具 举报

zhouzhuofeng  中级技师

发表于 2022-6-14 08:28:06

期待更多教程
回复

使用道具 举报

安卓机器人  中级技神

发表于 2022-7-31 15:04:56

自动感应,666
回复

使用道具 举报

木子呢  NPC
 楼主|

发表于 2022-8-1 10:41:39

回复

使用道具 举报

木子呢  NPC
 楼主|

发表于 2022-8-4 11:26:18


后续会持续更新的,请继续关注~
回复

使用道具 举报

木子呢  NPC
 楼主|

发表于 2022-8-4 11:26:33

回复

使用道具 举报

木子呢  NPC
 楼主|

发表于 2022-8-4 11:26:41

回复

使用道具 举报

赤星三春牛!  中级技匠

发表于 2022-8-8 15:35:44

6666666666
回复

使用道具 举报

赤星三春牛!  中级技匠

发表于 2022-8-8 15:56:55

项目不错!
回复

使用道具 举报

赤星三春牛!  中级技匠

发表于 2022-8-8 15:57:58

感谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail