pyboard :开关,回调和中断,加速度传感器,安全模式和出厂重置

开关,回调和中断

反正我买的板子上面有三个按钮。。USR,RST,BOOT0。

RST就是一个硬复位的,就是重新启动。BOOT0加RST就是进入DFU模式。

USR用户开关通常的用法就是通过开关控制程序运行,首先创建一个开关对象:

>>> sw=pyb.Switch()           # 不知道为啥总是打成pyd..
>>> sw
Switch()
>>> sw.value()               # 获取其状态
False
>>> sw.value()         # 这是按住了USER 按钮
True

切换回调

开关是很简单的对象,但是他有一个NB的功能,sw.callback() 。回调函数设置了按下开关时要运行的内容,并使用了中断。

>>> sw.callback(lambda:print('press!'))               # 按下就打印这个
# 此打印会中断你正在输入的任何内容,并且是异步运行的中断例程。。。

>>> sw.callback(lambda:pyb.LED(1).toggle())        # 这个可用在其他代码运行时也可以工作。试试就知道了
>>>> sw.callback(None)      # 就相当于关闭了

中断的技术细节

当使用了sw.callback() 这个回调函数,USER按钮就变成了一个外部实时监测的中断目标。当按下了就是产生一个下降沿的电平变化,回调函数响应这个物理变化。也就是pyboard 可以实时监听PIN(引脚)的状态并作出响应,过程:

  • 当按下开关,引脚上发生变化(电平变化),微控制器会记录这个变化,作为一个中断标识
  • 微控制器完成当前机器指令的执行,停止执行,并保存当前状态。这会暂停任何代码,例如正在运行的python脚本。
  • 微控制器开始执行与开关的外部触发相关的特殊中断处理程序(就是识别要执行哪一个中断程序吧),该中断处里程序获取定义的函数callback() 并执行。
  • 回调函数执行完成,将控制权返回开关中断处理程序
  • 切换中断处理程序返回,并通知微处理器该中断以处理
  • 微控制器恢复其在步骤2保存的状态
  • 继续执行开始时运行的代码,处理暂停,此代码不会注意到它被中断。

当多个中断同时发生时,上述事件序列会变得更加复杂。在这种情况下,具有最高优先级的中断将首先执行,然后按照优先级依次处理其他中断。切换中断设置为最低优先级。

额。。。是不是还要看看电路的知识啊。。

加速度传感器

学习如何使用LED状态(如向左倾斜和向右倾斜)读取加速度计和信号。感觉好厉害的亚子

使用加速度传感器

pyboard有一个板载小型加速度传感器,可以用来检测板子的角度和运动。xyz 方向都可以。首先创建一个pyd.Accel() 对象,然后调用x函数。

>>> accel=pyb.Accel()
>>> accel.x()    
0
>>> accel.x()      # 随便晃晃。。。。。
-5
>>> accel.x()
-29
>>> accel.x()
-4
>>> accel.x()
-18

返回一个带符号的整数,在 -30 30 之间。但是测量结果是非常不准的,这意味着即使你放着不动它的值也不一定。。。所以不应该使用x() 方法获得确切值,而是应查看他是否在某个范围内。

使用加速度计,当板子倾斜时亮灯。

>>> pyb.LED(3).off()
>>> accel = pyb.Accel()
>>> light=pyb.LED(3)           # 获取加速度计的x方向的值,如果x的大小大于某个值,LED亮起
>>> a=3
>>> while True:
...     x=accel.x()
...     if abs(x)>a:
...         light.on()
...     else:
...         light.off()
...     pyb.delay(100)

import pyb

led1=pyb.LED(3)
led2=pyb.LED(4)         # 但是上面那个感觉不够nb

accel=pyb.Accel()

while True:
    x=accel.x()
    if abs(x) > 3:
        led1.on()
    else:
        led1.off()
    intensity= int(abs(x)*(255/30))      # 根据倾斜程度改变蓝灯的亮度,,
    led2.intensity(intensity)
    pyb.delay(100)

额,,这跟x方向的加速度有什么关系嘛。。。。

制作一个水平仪

上面的我们只用了x ,现在我们用上y 和更多的led,把我们的板子变成水平仪。。

xlights = (pyb.LED(2), pyb.LED(3))
ylights = (pyb.LED(1), pyb.LED(4))

accel = pyb.Accel()
SENSITIVITY = 3

while True:
    x = accel.x()
    if x > SENSITIVITY:
        xlights[0].on()       # 绿蓝等代表x方向
        xlights[1].off()
    elif x < -SENSITIVITY:
        xlights[1].on()
        xlights[0].off()
    else:
        xlights[0].off()
        xlights[1].off()

    y = accel.y()
    if y > SENSITIVITY:
        ylights[0].on()
        ylights[1].off()        # 红蓝灯代表y方向
    elif y < -SENSITIVITY:
        ylights[1].on()
        ylights[0].off()
    else:
        ylights[0].off()
        ylights[1].off()

    pyb.delay(100)

额,usb线拿在右手的话,左倾蓝,右红,前绿,后黄,-y , +y , +x , -x,,,是不是就是左手系啊。。

安全模式和出厂重置

如果你的板子出现问题,,重置一下就好,通过编程错误的东西来破坏板子几乎是不可能的。

首先就是进入安全模式,这个暂时跳过执行boot.py and main.py 并给出了默认的USB设置。

如果文件系统有问题,可以恢复出厂设置,这会恢复文件系统

安全模式

  • 将pyboard连接到USB,以使其通电。

  • 按住USR开关。

  • 在仍然按住USR的同时,按下并释放RST开关。

  • 然后,LED将从绿色变为橙色,再变为绿色+橙色,然后再次返回。

  • 持续按住USR,直到仅橙色LED点亮,然后松开USR开关。

  • 橙色LED应快速闪烁4次,然后熄灭。

  • 您现在处于安全模式。

在安全模式下,boot.py和main.py文件不会执行,因此pyboard会使用默认设置启动。这意味着您现在可以访问文件系统(应该出现USB驱动器),并且您可以编辑boot.py 并main.py解决任何问题。

进入安全模式是暂时的,不会对pyboard上的文件进行任何更改。

恢复出厂设置

如果pyboard的文件系统损坏(例如,您忘记退出/卸载它),或者其中包含某些代码boot.py或main.py无法逃脱,则可以重置文件系统。

重置文件系统删除的内部pyboard存储(不是SD卡)的所有文件,并恢复文件boot.py,main.py,README.txt 并pybcdc.inf返回到原来的状态。

要恢复文件系统的出厂设置,请按照与进入安全模式相同的步骤进行操作,但以绿色+橙色释放USR:

  • 将pyboard连接到USB,以使其通电。

  • 按住USR开关。

  • 在仍然按住USR的同时,按下并释放RST开关。

  • 然后,LED将从绿色变为橙色,再变为绿色+橙色,然后再次返回。

  • 持续按住USR,直到绿色和橙色LED均点亮,然后松开USR开关。

  • 绿色和橙色LED应快速闪烁4次。

  • 红色LED指示灯将点亮(现在红色,绿色和橙色点亮)。

  • pyboard现在正在重置文件系统(这需要几秒钟)。

  • LED全部熄灭。

  • 您现在拥有一个重置的文件系统,并且处于安全模式。

  • 按下并释放RST开关即可正常启动。

以上就是复制的官方文档。。。谷歌翻译真香

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值