模块
什么是模块?
随着代码的增多,在一个文件里的代码会越来越长,越来越难看懂。
为了编写可维护的代码,我们把很多函数分组,放到不同的文件里。在Python中,一个.py文件就称之为一个模块(Module)。
模块有什么好处?复用代码方便!如果我写了一个模块,你也写了一个模块,我们就有了两个模块。我们把这些模块都组织起来,大家就可以少写很多代码了!
比如:
– pyb:是板上设备的功能,比如GPIO,IIC,PWM
– math:数学计算,例如sin和cos
– os:文件系统,例如获取路径,新建文件
– time:实时时钟
– struct:数据类型的打包和解包
– json:一种轻量级的数据交换格式
如何使用模块?
import pyb
red_led = pyb.LED(1)
red_led.on()
import pyb就是引入pyb这个模块。通过import语句,就可以引入模块。
还有from xxx import ooo 的语句,意思是通过xxx模块引入ooo类,或者通过xxx模块引入ooo函数。比如上面的程序可以写成:
from pyb import LED
red_led = LED(1)
red_led.on()
这就是通过pyb的模块来引入LED类了。
##如何添加自定义模块?
之前我们提到了,OpenMV是有文件系统的。
文件系统的根目录存在一个main.py,代码执行的当前目录就是根目录。
所以我们把模块的文件复制到OpenMV的“U盘”里就可以。如图:
这里的pid.py只是举一个举例。
我把pid.py复制到了U盘的根目录下。那么在程序中:
import pid
就可以引入pid模块了了。或者通过:
from pid import PID
这就是引入了PID类。
对象
什么是对象呢?一个猪就是一个对象,猪可以叫,可以吃东西,可以出生,可以死亡。同理,一个IO引脚也可以看成一个对象,引脚可以设置成输入输出,可以设置高低电平……
#举个例子,一个PIG就是一个类,pig是一个对象
pig=Pig() #使用PIG类生成一个pig对象
pig.name="Peppa" #给pig取名字叫"Peppa"
pig.eat() #让猪吃饭
pig.sleep() #让猪睡觉
del(pig) #删掉pig
同理:
import pyb
pin1 = pyb.Pin('X1', pyb.Pin.OUT_PP) #生成一个pin1引脚对象
pin1.high() #让这个引脚电平变高
引脚
电气规格
pyboard的输出为3.3V,输入是5V兼容的,意思是如果输入了5V,pyboard可以识别到是逻辑1。(因为以前的一些芯片,如果电源是3.3V,IO输入超过3.3V,芯片会烧)。
可以这样直接连接
电平输入
import pyb
pin1 = pyb.Pin('X1', pyb.Pin.IN, Pin.PULL_NONE) #设置为输入
pin1.value() #获取这个引脚的电平高低,0或者1
注意:
– Pin.PULL_NONE: 不开启上拉电阻或者下拉电阻。如果引脚空载,那么由于噪声,会随机获得0或者1
– Pin.PULL_UP: 开启上拉电阻。如果引脚空载,会为高电平
– Pin.PULL_DOWN: 开启下拉电阻。如果引脚空载,会为低电平
开关1,不使用上拉电阻和下拉电阻
import pyb
pin1 = pyb.Pin('X1', pyb.Pin.IN, Pin.PULL_NONE) #生成一个pin1对象,pyb.Pin.IN代表输入,Pin.PULL_NONE代表不开启上拉电阻
pin1.value() #获取这个引脚的电平高低,0或者1
开关2,使用上拉电阻
import pyb
pin1 = pyb.Pin('X1', pyb.Pin.IN, Pin.PULL_UP) #开启上拉电阻
pin1.value() #获取这个引脚的电平高低,不按下为1,按下为0
开关3,使用外置的上拉电阻,程序里不开启上拉电阻
import pyb
pin1 = pyb.Pin('X1', pyb.Pin.IN, Pin.PULL_NONE)#生成一个pin1对象,pyb.Pin.IN代表输入,Pin.PULL_NONE代表不开启上拉电阻
pin1.value() #获取这个引脚的电平高低,不按下为1,按下为0
模拟输入
模拟输入就是ADC,(analog-digit-converter),可以读取一个电压的数值。
import pyb
adc = pyb.ADC("X1") # 创建一个模拟引脚
val = adc.read() # 读取一个引脚的值(0~3.3V)对应(0~4095)
输出
- pyb.Pin.OUT_OD: 开漏输出,IO 输出 0 接 GND,IO 输出 1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为 1 时,IO 口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样 IO 口也就可以由外部电路改变为低电平或不变。可以读 IO 输入电平变化,实现 C51 的 IO 双向功能
- pyb.Pin.OUT_PP: 推挽输出,IO 输出 0-接GND, IO 输出 1-接VCC,读输入值是未知的
LED例子1:推挽输出
import pyb
pin1 = pyb.Pin('X1', pyb.Pin.OUT_PP) #生成一个pin1对象,设置为推挽输出
pin1.high() #让这个引脚电平变高
当引脚高电平时:LED亮,当引脚低电平时:LED灭。
LED例子2:开漏输出
import pyb
pin1 = pyb.Pin('X1', pyb.Pin.OUT_OD) #生成一个pin1对象,设置为开漏输出
pin1.low() #让这个引脚电平变低,灯亮
pin1.high() #让这个引脚变悬空(高阻态),灯灭