数字IO
本章节介绍了掌控板的I/O引脚的数字输入输出使用方法。引脚是掌控板与连接到它的外部设备进行通信的方式。掌控板可以通过拓展板将IO引脚拓展并连接控制或读取其他元器件或模块。
注意:
除P2(只限数字输入)P3,P4,P10以外,其他引脚均可是使用数字输入、输出模式。有关更详细说明,请查看 :ref:`掌控板接口引脚说明<mPythonPindesc>` 。
数字输入
首先,从如何读取引脚的数字输入开始。以下使用掌控板内置的按键a,作为按键输入:
from mpython import * # 导入mpython模块
p5=MPythonPin(5,PinMode.IN) # 实例化MPythonPin,将按键a引脚(P5)设置为"PinMode.IN"模式
while True:
value=p5.read_digital() # 读取P5引脚的数字输入
oled.DispChar("Button_a:%d" %value,30,20) # 将读取到值显示至oled上
oled.show() # 刷新
oled.fill(0) # 清屏
注意:
这时,你可以按下button a按键看下“按下”和“未按下”的读值。由于按键a电路做了上拉,所以“未按下”时输出为高电平, “按下”时输出为低电平。
from mpython import *
p5=MPythonPin(5,PinMode.IN)
使用前,请务必先将 mpython 模块导入,方可使用。
实例化引脚对象并设置模式。这里使用到 MPythonPin(pin, mode=PinMode.IN,pull=None)
类。
pin
是您要访问的引脚。如果未指定mode,则默认为 PinMode.IN
。如果未指定pull,则默认为 None
。
p5.read_digital()
注解:
使用read_digital(),返回引脚的电平值。高电平(1),低电平(0)。
数字输出
以下是简单的驱动外部LED灯闪烁:
from mpython import * # 导入mpython模块
p0=MPythonPin(0,PinMode.OUT) # 实例化MPythonPin,将P0设置为"PinMode.OUT"模式
while True:
p0.write_digital(1) # P0写高电平
sleep(1) # 延时
p0.write_digital(0) # P0写高电平
sleep(1) # 延时
注意:
材料、连接方式
上面需要使用到一块面包板、1个LED灯、mPython拓展板、杜邦线。LED灯的正极连接至掌控板的P0引脚,LED负极连接至掌控板的GND。
p0=MPythonPin(0,PinMode.OUT)
注解:
``MPythonPin`` 实例化。``mode`` 设置为 ``PinMode.OUT`` 数字输出模式。
对P0引脚写高低电平:
p0.write_digital(1)
p0.write_digital(0)
注解:
使用 ``write_digital(value)`` 方法对引脚写高低电平。其中 ``value`` 是电平值,“1”代表高电平,“0”代表低电平。
外部中断
什么是中断呢?
在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。
在出现需要时,CPU必须暂停现在的事情,处理别的事情,处理完了再回去执行暂停的事情。
当输入引脚发生电平变化时触发硬件中断,触发器会执行中断处理函数。你可以定义回调函数来做中些断响应的工作。引脚中断使用和掌控板的a,b按键中断本质是一样的。
以下使用掌控板内置的按键a((P5引脚),作为输入中断,按下按键 A 时蜂鸣器发出声音:
from mpython import * # 导入mpython模块
import music # 导入music模块
p5=MPythonPin(5,PinMode.IN) # 实例化MPythonPin,将P5设置为"PinMode.IN"模式
def BuzzOn(_): # 定义中断的回调函数
music.play(music.BA_DING,wait=False)
p5.irq(trigger=Pin.IRQ_FALLING,handler=BuzzOn) # 设置P5引脚中断的回调函数
提示:
效果和时用 ``button_a.irq()`` 按键中断时一样的,button_a的中断也是使用到 ``Pin.irq`` 的方法。
我们首先实例化MPythonPin,将P5引脚配置为 PinMode.IN
:
p5=MPythonPin(5,PinMode.IN)
定义回调函数:
def BuzzOn(_):
music.play(music.BA_DING,wait=False)
注解:
回调函数,必须包含一个参数,否则无法使用, 上面 BuzzOn()
定义回调函数,参数为 _
,你可以任意定义该参数。
最后我们需要告诉引脚何时触发,以及在检测到事件时调用的函数::
p5.irq(trigger=Pin.IRQ_FALLING,handler=BuzzOn)
注解:
我们将P5设置为仅在下降沿触发 ``Pin.IRQ_FALLING`` (当它从高电平变为低电平时)。设置回调函数
handler="你定义中断处理的回调函数"。更详细的触发方式,请查阅 :ref:`MPythonPin.irq <MPythonPin.irq>` 。
模拟IO
本章节介绍掌控板引脚的模拟输入输出的使用方法。引脚是您的电路板与连接到它的外部设备进行通信的方式。掌控板可以通过拓展板将IO引脚拓展并连接控制或读取其他元器件或模块。
注意:
你可以查阅 :ref:`掌控板接口引脚说明<mPythonPindesc>` ,了解可供使用的模拟引脚 。
模拟输入
掌控板可供使用的模拟输入引脚有 P0、P1、P2、P3、P4、P10,其中P4,P10分别被掌控板的光线和麦克风传感器使用。
什么是模拟输入呢?
模拟输入是将模拟信号转换为数字信号,简称ADC。
以下是使用P0引脚读取模拟输入:
from mpython import * # 导入mpython模块
p0=MPythonPin(0,PinMode.ANALOG) # 实例化MPythonPin,将P0设置为"PinMode.ANALOG"模式
while True:
value=p0.read_analog() # 读取P0引脚模拟量
oled.DispChar("analog:%d" %value,30,20)
oled.show()
oled.fill(0)
from mpython import *
p0=MPythonPin(0,PinMode.ANALOG)
注解:
``MPythonPin`` 实例化。``mode`` 设置为 ``PinMode.ANALOG`` 模拟输入模式。
读模拟输入:
p0.read_analog()
注解:
因为adc采样数据宽度为12bit,所以满量程为4095。
EXT鳄鱼夹
接下来,你可以通过鳄鱼夹线将阻性元件(如光敏、热敏电阻)接到掌控板的 EXT
和 GND
焊盘 ,测量传感器的输入值变化……
EXT连接是掌控板的P3引脚:
from mpython import * # 导入mpython模块
p3=MPythonPin(3,PinMode.ANALOG) # 实例化MPythonPin,将P3设置为"PinMode.ANALOG"模式
while True:
value=p3.read_analog() # 读取EXT(P3)引脚模拟量
oled.DispChar("analog:%d" %value,30,20)
oled.show()
oled.fill(0)
模拟输出模拟输出
什么是模拟输出呢?
电路板的引脚不能像音频放大器那样输出模拟信号 - 通过调制引脚上的电压。这些引脚只能使能全3.3V输出,或者将其下拉至0V。
然而,仍然可以通过非常快速地接通和断开该电压来控制LED的亮度或电动机的速度,并控制它的开启时间和关闭时间。
这种技术称为脉冲宽度调制(PWM),这就是 ``write_analog`` 的方法。
输出某电压的PWM信号:
from mpython import * # 导入mpython模块
p0=MPythonPin(0,PinMode.PWM) # 实例化MPythonPin,将P0设置为"PinMode.PWM"模式
voltage=2.0 # 电压2V
p0.write_analog(int(voltage/3.3*1023)) #计算对应电压PWM的占空比
注解:
* ``write_analog(value)`` 中的 ``value`` 为PWM信号的占空比。
* 由于IO引脚电压为3.3V,我们需要输出电压为2V。因此,映射值是2/3*1023。
* 由于计算出来的为浮点型数,我们还需要使用 ``int()`` 转成整型。
您可以在上面看到三种不同PWM信号的图表。它们都具有相同的周期(因此具有频率),但它们具有不同的占空比。
-
第一个产生的是
write_analog(511)
,因为它具有恰好50%的占空比 - 功率在一半的时间内,而在一半的时间内。结果是该信号的总能量是相同的,就好像它是1.65V而不是3.3V。 -
第二个信号具有25%的占空比,可以用
write_analog(255)
。它具有类似的效果,就好像在该引脚上输出0.825V一样。 -
第三个信号具有75%的占空比,并且可以生成
write_analog(767)
。它的能量是第二个信号的三倍,相当于在第二个引脚输出2.475V。