开关,回调和中断
反正我买的板子上面有三个按钮。。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开关即可正常启动。
以上就是复制的官方文档。。。谷歌翻译真香