模块

什么是模块?

随着代码的增多,在一个文件里的代码会越来越长,越来越难看懂。

为了编写可维护的代码,我们把很多函数分组,放到不同的文件里。在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()                           #让这个引脚变悬空(高阻态),灯灭