打印

MicroPython教程

[复制链接]
3528|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1.介绍pyboard

为了充分利用pyboard,需要了解一些基本的知识。下面出现的黑板就是指的pyboard,micropython开发板

1.1。关心你的黑板

由于黑板没有外壳,所以需要小心一点:

  • 插拔USB电缆时请小心。虽然USB连接器通过电路板焊接并且相对坚固,但是如果断开,则可能很难修复。
  • 静电会震动黑板上的组件,并将其摧毁。如果在您所在地区遇到大量静电(例如干燥和寒冷的气候),请格外小心不要撞击黑板。如果你的黑板是用黑色的塑料盒包装的,那么这个盒子就是存放和携带黑板的最好方法,因为它是一个防静电盒子(它由导电塑料制成,里面有导电泡沫)。

只要你照顾硬件,你应该没问题。要打破pyboard上的软件几乎是不可能的,所以随意随意编写代码。如果文件系统损坏,请参阅下面的如何重置它。在最糟糕的情况下,您可能需要刷新MicroPython软件,但可以通过USB完成。


1.2。黑板的布局

微型USB连接器位于主板左上角的微型SD卡插槽的右上角。SD插槽和USB连接器之间有4个LED指示灯。颜色是:底部红色,然后是绿色,橙色和蓝色的顶部。有2个开关:右边是复位开关,左边是用户开关。


1.3。插入并打开电源

黑板可以通过USB供电。通过micro USB电缆将其连接到电脑。只有一种方法,电缆将适合。一旦连接,电路板上的绿色LED应该快速闪烁。


1.4。由外部电源供电

黑板可以由电池或其他外部电源供电。

请务必将电源的正极连接到VIN,并接地。在黑板上没有极性保护,因此在连接任何VIN时必须小心。

输入电压必须在3.6V和10V之间。



相关下载

相关帖子

沙发
gaoyang9992006|  楼主 | 2018-1-21 16:25 | 只看该作者
本帖最后由 gaoyang9992006 于 2018-1-21 16:30 编辑

2.运行你的第一个脚本

让我们直接跳到pyboard上获取Python脚本。毕竟,这就是它的一切!

2.1。连接你的pyboard

用micro USB电缆将您的pyboard连接到您的PC(Windows,Mac或Linux)。电缆连接的方法只有一种,所以你不能弄错。

当黑板连接到你的电脑时,它将打开电源并进入启动过程(启动过程)。绿色指示灯应该点亮半秒钟或更少,关闭时表示启动过程已经完成。


2.2。打开pyboard USB驱动器

你的电脑现在应该识别pyboard。这取决于你所拥有的个人电脑的类型,

  • Windows:您的pyboard将显示为可移动USB闪存驱动器。Windows可能会自动弹出一个窗口,或者您可能需要使用资源管理器去那里。

    Windows也会看到pyboard有一个串口设备,它会尝试自动配置这个设备。如果是,则取消该过程。我们将在下一个教程中使用串口设备。

  • Mac:您的pyboard将作为可移动光盘出现在桌面上。它可能会被称为“NONAME”。点击它打开pyboard文件夹。

  • Linux:您的pyboard将显示为可移动介质。在Ubuntu上,它会自动挂载并弹出pyboard文件夹的窗口。在其他Linux发行版上,可能会自动安装pyboard,或者您可能需要手动执行。在终端命令行中,键入lsblk 以查看连接的驱动器列表,然后(替换 为适当的设备)。您可能需要以root身份执行此操作。mount /dev/sdb1sdb1



好的,现在你应该把pyboard作为一个USB闪存驱动器来连接,并且一个窗口(或命令行)应该显示pyboard驱动器上的文件。

您正在查看的驱动器被称为/flashpyboard,并应包含以下4个文件:

  • boot.py - 这个脚本在pyboard启动时执行。它设置为pyboard提供各种配置选项。
  • main.py - 这是包含你的Python程序的主脚本。它被执行后boot.py。
  • README.txt - 这包含了一些关于获取的基本信息从pyboard开始。
  • pybcdc.inf - 这是一个Windows驱动程序文件来配置串行USB设备。更多关于这在下一个教程。

2.3。编辑main.py

现在我们要编写我们的Python程序,所以main.py 在文本编辑器中打开文件。在Windows上,您可以使用记事本或任何其他编辑器。在Mac和Linux上,使用您最喜爱的文本编辑器。随着文件打开,你会看到它包含1行:

# main.py -- put your code here!

这行以#字符开始,这意味着它是一个评论。这样的行不会做任何事情,在那里你写关于你的程序的笔记。

让我们添加2行到这个main.py文件,使其看起来像这样:


# main.py -- put your code here!

import pyb

pyb.LED(4).on()


我们写的第一行说我们要使用pyb模块。这个模块包含了所有控制pyboard功能的函数和类。

我们写的第二行将打开蓝色LED:它首先LED 从pyb模块获取类,创建LED编号4(蓝色LED),然后打开它。


2.4。重置pyboard

要运行这个小脚本,您需要先保存并关闭该main.py文件,然后弹出(或卸载)pyboard USB驱动器。这样做就像一个普通的USB闪存驱动器。

当驱动器安全弹出/卸载时,您可以进入有趣的部分:按下pyboard上的RST开关重置并运行您的脚本。RST开关是电路板上USB连接器正下方的小黑按钮,位于右侧边缘。

当按下RST时,绿色指示灯将快速闪烁,然后蓝色指示灯应亮起并保持亮起。

恭喜!您已经编写并运行了您的第一个MicroPython程序!




使用特权

评论回复
板凳
gaoyang9992006|  楼主 | 2018-1-21 16:36 | 只看该作者
3.获取MicroPython REPL提示
REPL代表Read Evaluate Print Loop,是可以在pyboard上访问的交互式MicroPython提示符的名称。使用REPL是测试代码和运行命令的最简单方法。除了编写脚本之外,您还可以使用REPL main.py。

要使用REPL,您必须连接到黑板上的串行USB设备。你如何做到这一点取决于你的操作系统。

3.1。视窗
您需要安装pyboard驱动程序才能使用串行USB设备。驱动程序位于黑板的USB闪存驱动器上,并被调用pybcdc.inf。

要安装此驱动程序,您需要转到您的计算机的设备管理器,在设备列表中找到pyboard(它旁边应该有一个警告标志,因为它还没有工作),右键单击pyboard设备,选择属性,然后安装驱动。您需要选择手动查找驱动程序的选项(不要使用Windows自动更新),导航到pyboard的USB驱动器,然后选择该选项。它应该然后安装。安装完成后,回到设备管理器找到已安装的pyboard,并查看它是哪个COM端口(例如COM4)。在Windows上的pyboard指南(PDF)中可以找到更全面的说明 。如果您在安装驱动程序时遇到问题,请参阅本指南。

你现在需要运行你的终端程序。您可以使用超级终端(如果已安装),或者下载免费程序PuTTY: putty.exe。使用串行程序,您必须连接到您在上一步中找到的COM端口。使用PuTTY,点击左侧面板中的“Session”,然后点击右侧的“Serial”单选按钮,然后在“Serial Line”框中输入COM端口(例如COM4)。最后,点击“打开”按钮。

3.2。Mac OS X
打开一个终端并运行:

screen /dev/tty.usbmodem*
当您完成并想要退出屏幕时,请键入CTRL-A CTRL-。

3.3。Linux的
打开一个终端并运行:

screen /dev/ttyACM0
您也可以尝试picocom或minicom不是屏幕。您可能需要使用/dev/ttyACM1或更高的号码ttyACM。而且,你可能需要给自己正确的权限访问此设备(例如组uucp或dialout,或使用sudo的)。

3.4。使用REPL提示符
现在,让我们尝试直接在pyboard上运行一些MicroPython代码。

随着你的串行程序打开(腻子,屏幕,picocom等),你可能会看到一个空白的屏幕上闪烁的光标。按回车,你应该提交一个MicroPython提示,即>>>。让我们确保它与强制性测试一起工作:
>>> print("hello pyboard!")
hello pyboard!
在上面,你不应该输入>>>字符。他们在那里表明你应该在提示符后键入文本。最后,一旦你输入了文本并按下Enter,屏幕上的输出应该看起来像上面那样。print("hello pyboard!")

如果你已经知道一些Python,你现在可以在这里尝试一些基本的命令。

如果其中任何一个不能正常工作,您可以尝试进行硬复位或软复位; 见下文。

继续尝试输入其他一些命令。例如:

<p>>>> pyb.LED(1).on()</p><p>>>> pyb.LED(2).on()</p><p>>>> 1 + 2</p><p>3</p><p>>>> 1 / 2</p><p>0.5</p><p>>>> 20 * 'py'</p><p>'pypypypypypypypypypypypypypypypypypypypy'</p>


3.5。重置电路板
如果出现问题,您可以通过两种方式重置主板。首先是在MicroPython提示符下按下CTRL-D,该提示符执行软重置。你会看到一个类似的消息

<p>>>></p><p>PYB: sync filesystems</p><p>PYB: soft reboot</p><p>Micro Python v1.0 on 2014-05-03; PYBv1.0 with STM32F405RG</p><p>Type "help()" for more information.</p><p>>>></p>

如果不工作,你可以通过按RST交换机上(基板最接近的micro-USB插孔的黑色小按钮)(开启它关闭和开启,再次)执行硬重置。这会结束你的会话,断开你用来连接到pyboard的任何程序(PuTTY,屏幕等)。

如果您要进行硬重置,建议先关闭串口程序,然后弹出/取消安装pyboard驱动器。

使用特权

评论回复
地板
gaoyang9992006|  楼主 | 2018-1-21 16:47 | 只看该作者
本帖最后由 gaoyang9992006 于 2018-1-21 16:51 编辑

4.打开LED和基本的Python概念
在黑板上最简单的事情是打开连接到电路板上的LED。连接电路板,并按照教程1中的描述登录。我们将开始在解释器中打开并打开LED,键入以下内容

>>> myled = pyb.LED(1)
>>> myled.on()
>>> myled.off()

这些命令打开和关闭LED。

这一切都很好,但我们希望这个过程自动化。在你最喜欢的文本编辑器中的pyboard打开文件MAIN.PY。将以下行写入或粘贴到文件中。如果你是python新手,那么确保你的缩进是正确的,因为这很重要!
led = pyb.LED(2)
while True:
    led.toggle()
    pyb.delay(1000)

保存时,黑板上的红灯应亮起约一秒钟。要运行该脚本,请执行软重置(CTRL-D)。然后pyboard会重新启动,你应该看到一个绿灯不停地闪烁。成功,是您建设邪恶机器人大军的第一步!当您厌烦闪烁的灯光时,请在终端按CTRL-C停止运行。

那么这个代码是做什么的?首先,我们需要一些术语。Python是一种面向对象的语言,python中几乎所有的东西都是一个类,当你创建一个类的实例时,你会得到一个对象。类有与之相关的方法。一个方法(也称为成员函数)用于与对象交互或控制对象。

第一行代码创建一个LED对象,我们称之为led。当我们创建这个对象的时候,它需要一个参数,它必须在1到4之间,与板上的4个LED相对应。pyb.LED类有三个重要的成员函数:on(),off()和toggle()。我们使用的另一个函数是pyb.delay(),它只是等待一个给定的毫秒数。一旦我们创建了LED对象,声明为True:创建一个无限循环,在开启和关闭之间切换指示灯并等待1秒钟。

练习:尝试改变切换LED和打开不同的LED之间的时间。

练习:直接连接到pyboard,创建一个pyb.LED对象并使用on()方法打开它。

4.1。迪斯科在你的黑板上
到目前为止,我们只使用了一个LED,但是黑板上有4个可用的LED。让我们开始为每个LED创建一个对象,以便我们可以控制它们中的每一个。我们通过创建列表理解的LED列表来做到这一点。
leds = [pyb.LED(i) for i in range(1,5)]

如果你用一个不是1,2,3,4的数字调用pyb.LED(),你会得到一个错误信息。接下来我们将设置一个无限循环,循环通过每个LED打开和关闭。
n = 0
while True:
  n = (n + 1) % 4
  leds[n].toggle()
  pyb.delay(50)

在这里,n跟踪当前的LED,每次循环执行时,我们循环到下一个n(%符号是一个模数运算符,使n在0和3之间)。然后我们访问第n个LED并切换它。如果你运行这个,你应该看到每个LED都亮起,然后再次依次熄灭。

你可能发现的一个问题是,如果你停下脚本,然后重新开始,LED灯会从前一次运**住,破坏我们精心设计的迪斯科舞厅。我们可以通过在初始化脚本并使用try / finally块时关闭所有LED来解决这个问题。当你按下CTRL-C时,MicroPython会产生一个VCPInterrupt异常。异常通常意味着出现了问题,您可以使用try:命令来“捕捉”异常。在这种情况下,只是用户中断脚本,所以我们不需要捕捉错误,只需告诉MicroPython退出时该怎么做。finally块做到这一点,我们用它来确保所有的LED熄灭。完整的代码是:

leds = [pyb.LED(i) for i in range(1,5)]
for l in leds:
    l.off()

n = 0
try:
   while True:
      n = (n + 1) % 4
      leds[n].toggle()
      pyb.delay(50)
finally:
    for l in leds:
        l.off()

4.2。特殊的LED
黄色和蓝色LED是特殊的。除了打开和关闭它们之外,还可以使用强度()方法来控制强度。这需要一个0到255之间的数字来确定它是多么明亮。以下脚本使蓝色LED逐渐变亮,然后再次关闭。
led = pyb.LED(4)
intensity = 0
while True:
    intensity = (intensity + 1) % 255
    led.intensity(intensity)
    pyb.delay(20)

您可以调用LED 1和2的强度(),但只能关闭或打开。0将它们设置为关闭,而其他任何数字设置为255则打开它们。

使用特权

评论回复
5
gaoyang9992006|  楼主 | 2018-1-21 16:57 | 只看该作者
本帖最后由 gaoyang9992006 于 2018-1-21 16:58 编辑

5.开关,回调和中断
该pyboard有2个小开关,标记为USR和RST。RST开关是一个硬复位开关,如果按下它,则从头开始重新启动黑板,相当于关闭电源,然后重新开启。

USR开关是通用的,通过Switch对象进行控制。做一个开关对象:

>>> sw = pyb.Switch()

请记住,如果遇到名称不存在的错误,您可能需要键入。import pybpyb

通过开关对象,你可以得到它的状态:

>>> sw.value()

False如果开关没有拿着,或者拿着,这将打印True。尝试按住USR开关,同时运行上述命令。

通过“调用”开关对象,还有一个缩写符号来获得开关状态:

>>> sw()

5.1。切换回调
开关是一个非常简单的对象,但它有一个高级功能:sw.callback()功能。回调函数设置了按下开关时要运行的内容,并使用中断。在理解中断如何工作之前,最好从一个例子开始。尝试在提示符处运行以下命令:

>>> sw.callback(lambda:print('press!'))

这告诉开关press!每次按下开关时打印。继续尝试:按下USR开关,观察PC上的输出。请注意,此打印将打断您输入的任何内容,并且是异步运行的中断例程的一个示例。

另外一个例子试试:
>>> sw.callback(lambda:pyb.LED(1).toggle())

每按一下开关,这将切换红色LED。在其他代码运行时,它甚至可以工作。

要禁用切换回调,请传递None回调函数:
>>> sw.callback(None)

你可以传递任何函数(取零参数)到交换回调。上面我们使用lambdaPython的功能来即时创建一个匿名函数。但我们也可以这样做:
>>> def f():

这将创建一个函数调用f并将其分配给交换机回调。当你的函数比lambda允许的更复杂的时候,你可以用这种方法来做事情 。

请注意,您的回调函数不能分配任何内存(例如,它们不能创建元组或列表)。回调函数应该相对简单。如果你需要做一个列表,事先做好,然后把它存储在一个全局变量中(或者把它放在本地并关闭它)。如果你需要做一个长而复杂的计算,那么使用回调函数来设置一个其他代码然后响应的标志。

5.2。中断的技术细节
让我们一步一步了解交换机回调的细节。当您注册一个功能时sw.callback(),开关会在开关连接的引脚上设置一个外部中断触发(下降沿)。这意味着微控制器将监听引脚上的任何更改,并且会发生以下情况:

当按下开关时,引脚发生变化(引脚从低电平变为高电平),微控制器记录此变化。
微控制器完成执行当前机器指令,停止执行并保存其当前状态(将寄存器压入堆栈)。这有暂停任何代码的效果,例如你正在运行的Python脚本。
微控制器开始执行与开关外部触发相关的特殊中断处理程序。这个中断处理程序获取您注册的函数sw.callback()并执行它。
你的回调函数被执行直到完成,把控制返回到开关中断处理程序。
开关中断处理程序返回,并通知微控制器中断已被处理。
微控制器恢复在步骤2中保存的状态。
执行继续在开始运行的代码。除了暂停之外,这段代码并没有注意到它被中断了。
当多个中断同时发生时,上述事件顺序变得更加复杂一些。在这种情况下,优先级最高的中断先进行,然后按优先级顺序进行。开关中断设置在最低优先级。

使用特权

评论回复
6
gaoyang9992006|  楼主 | 2018-1-21 17:05 | 只看该作者
6.加速度计
在这里,您将学习如何使用LED状态(如向左倾斜和向右倾斜)读取加速度计和信号。
6.1。使用加速度计
黑板上有一个加速度计(微小的弹簧上的微小质量),可以用来检测电路板和运动的角度。每个x,y,z方向都有一个不同的传感器。为了得到加速度计的值,创建一个pyb.Accel()对象,然后调用x()方法。
>>> accel = pyb.Accel()
>>> accel.x()
7
这将返回一个有符号的整数值,大约在-30到30之间。请注意,测量非常嘈杂,这意味着即使您完全保持电路板完好,您所测量的数字也会有一些变化。正因为如此,你不应该使用x()方法的确切值,而是看它是否在一定范围内。

如果不平坦,我们将开始使用加速度计打开灯。
accel = pyb.Accel()
light = pyb.LED(3)
SENSITIVITY = 3

while True:
    x = accel.x()
    if abs(x) > SENSITIVITY:
        light.on()
    else:
        light.off()

    pyb.delay(100)
我们创建Accel和LED对象,然后得到加速度计x方向的值。如果x的大小大于某个值SENSITIVITY,则LED亮起,否则熄灭。循环有一个小的,pyb.delay() 否则当x的值接近时,LED会闪烁 SENSITIVITY。尝试在黑板上运行,左右倾斜电路板使LED打开和关闭。

练习:改变上面的脚本,使得倾斜黑板的蓝色LED越亮。提示:您将需要重新调整值,强度从0-255。

6.2。制定一个水平仪
上面的例子只对x方向上的角度敏感,但如果我们使用这个y()值和更多的LED,我们可以把pyboard转换成一个水平仪。
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()
        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()
    elif y < -SENSITIVITY:
        ylights[1].on()
        ylights[0].off()
    else:
        ylights[0].off()
        ylights[1].off()

    pyb.delay(100)
我们首先为x和y方向创建LED对象的元组。元组是Python中的不可变对象,这意味着一旦创建它们就不能被修改。然后,我们继续按照前面的步骤操作,但打开一个不同的LED指示灯,查看正值和负值。然后,我们在y方向上做同样的事情。这并不是特别复杂,但它是做这个工作的。在你的黑板上运行这个,你应该看到不同的LED打开,这取决于你如何倾斜电路板。

使用特权

评论回复
7
gaoyang9992006|  楼主 | 2018-1-21 17:06 | 只看该作者
7.安全模式和出厂重置
如果你的黑板出了问题,不要惊慌!通过编写错误的东西来破坏pyboard几乎是不可能的。

首先要尝试的是进入安全模式:这暂时跳过执行boot.py和main.py和给出默认的USB设置。

如果您在文件系统上遇到问题,则可以执行恢复出厂设置,将文件系统恢复到原始状态。

7.1。安全模式
要进入安全模式,请执行以下步骤:

将黑板连接到USB,以便启动。
按住USR开关。
在按住USR的同时,按下并释放RST开关。
然后,LED将以绿色循环至橙色至绿色+橙色,然后再次返回。
继续按住USR直到只有橙色LED亮起,然后松开USR开关。
橙色LED应快速闪烁4次,然后熄灭。
你现在处于安全模式。
在安全模式下,boot.py并且main.py文件不被执行,因此pyboard启动时使用默认设置。这意味着您现在可以访问文件系统(应该显示USB驱动器),您可以编辑boot.py 和main.py修复任何问题。

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

7.2。出厂重置文件系统
如果你的pyboard的文件系统被损坏(例如,你忘记弹出/卸载它),或者你有一些代码boot.py或者main.py你不能逃避,那么你可以重置文件系统。

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

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

将黑板连接到USB,以便启动。
按住USR开关。
在按住USR的同时,按下并释放RST开关。
然后,LED将以绿色循环至橙色至绿色+橙色,然后再次返回。
继续按住USR,直到绿色和橙色指示灯亮起,然后松开USR开关。
绿色和橙色LED应快速闪烁4次。
红色LED将亮起(红色,绿色和橙色现在亮起)。
pyboard现在重置文件系统(这需要几秒钟)。
LED全部熄灭。
您现在有一个重置文件系统,并处于安全模式。
按下并释放RST开关以正常启动。

使用特权

评论回复
8
gaoyang9992006|  楼主 | 2018-1-21 17:11 | 只看该作者
8.使黑板作为USB鼠标
pyboard是一个USB设备,可以配置为一个鼠标,而不是默认的USB闪存驱动器。

要做到这一点,我们必须先编辑boot.py文件来改变USB配置。如果你还没有碰到你的boot.py文件,那么它会看起来像这样:

#boot.py  - 在启动时
运行#可以运行任意的Python,但最好保持最小

<p>import  pyb </p><p>#pyb.main('main.py')#这个主要脚本</p><p>#pyb.usb_mode('VCP + MSC')#作为一个串口和一个存储设备</p><p>#pyb.usb_mode('VCP + HID ')#充当串口设备和鼠标</p>
要启用鼠标模式,取消注释文件的最后一行,使其看起来像:
pyb.usb_mode('VCP+HID') # act as a serial device and a mouse
如果你已经改变了你的boot.py文件,那么它需要工作的最小代码是:
import pyb
pyb.usb_mode('VCP+HID')
这告诉pyboard在启动时将其自身配置为USB设备的VCP(虚拟COM端口,即串行端口)和HID(人机界面设备,在我们的例子中是鼠标)。

弹出/取消安装pyboard驱动器并使用RST开关将其重置。你的电脑现在应该检测到pyboard作为一个鼠标!
8.1。手动发送鼠标事件
为了让py-mouse做任何事情,我们需要发送鼠标事件到PC。我们将首先使用REPL提示手动执行此操作。使用串行程序连接到您的pyboard,然后输入以下内容:
<p>>>> hid = pyb.USB_HID()</p><p>>>> hid.send((0, 10, 0, 0))</p>
你的鼠标应该向右移动10个像素!在上面的命令中,您将发送4个信息:按钮状态,x,y和滚动。数字10告诉PC,鼠标在x方向移动了10个像素。

让鼠标左右摆动:
>>> import math
>>> def osc(n, d):
...   for i in range(n):
...     hid.send((0, int(20 * math.sin(i / 10)), 0, 0))
...     pyb.delay(d)
...
>>> osc(100, 50)
函数的第一个参数osc是要发送的鼠标事件的数量,第二个参数是事件之间的延迟(以毫秒为单位)。尝试使用不同的数字。

练习:让鼠标围成一圈。

8.2。用加速度计制作鼠标
现在让我们使用加速度计根据pyboard的角度移动鼠标。下面的代码可以直接在REPL提示符下键入,或者放在main.py文件中。在这里,我们会main.py因为这样做而学习如何进入安全模式。

此时,pyboard充当串行USB设备和HID(鼠标)。所以你不能访问文件系统来编辑你的main.py文件。

你也不能编辑你boot.py的HID模式退出到USB驱动器的正常模式...

为了解决这个问题,我们需要进入安全模式。这在[安全模式教程](tut-reset)中有描述,但我们在这里重复说明:

按住USR开关。
在按住USR的同时,按下并释放RST开关。
然后,LED将以绿色循环至橙色至绿色+橙色,然后再次返回。
继续按住USR直到只有橙色LED亮起,然后松开USR开关。
橙色LED应快速闪烁4次,然后熄灭。
你现在处于安全模式。
在安全模式下,boot.py并且main.py文件不被执行,因此pyboard启动时使用默认设置。这意味着您现在可以访问文件系统(应该显示USB驱动器),并且可以编辑main.py。(保持boot.py原样,因为我们在完成编辑后仍然希望返回到HID模式main.py。)

在main.py下面的代码中:
import pyb

switch = pyb.Switch()
accel = pyb.Accel()
hid = pyb.USB_HID()

while not switch():
    hid.send((0, accel.x(), accel.y(), 0))
    pyb.delay(20)
保存您的文件,弹出/卸载您的pyboard驱动器,并使用RST开关重置。它现在应该作为一个鼠标,而董事会的角度会移动鼠标。试试看,看看你能不能让鼠标静止不动!

按USR开关停止鼠标移动。

你会注意到y轴是倒置的。这很容易解决:只需在hid.send()上面一行的y坐标前面加一个减号。

8.3。将你的pyboard恢复正常
如果您将pyboard保持原样,每次插入时都会像鼠标一样运行。您可能希望将其更改为正常。要做到这一点,你需要先进入安全模式(见上文),然后编辑boot.py文件。在该boot.py文件中,注释掉(在前面加一个#)该行的 VCP+HID设置,所以它看起来像:
#pyb.usb_mode('VCP + HID')#充当串口设备和鼠标
保存你的文件,弹出/卸载驱动器,并重置黑板。现在回到正常的操作模式。

使用特权

评论回复
9
gaoyang9992006|  楼主 | 2018-1-21 17:18 | 只看该作者
9.定时器
pyboard有14个定时器,每个定时器由一个以用户定义的频率运行的独立计数器组成。他们可以设置为以特定的时间间隔运行一个功能。14个定时器编号为1到14,但是3个保留供内部使用,5和6用于伺服和ADC / DAC控制。尽可能避免使用这些定时器。

我们来创建一个计时器对象:
>>> tim = pyb.Timer(4)
现在让我们看看我们刚刚创建的:
>>> tim
Timer(4)
pyboard告诉我们tim连接到4号计时器,但它还没有初始化。所以让我们初始化它在10赫兹(这是每秒10次)触发:
>>> tim.init(freq=10)
现在它已经被初始化了,我们可以看到关于定时器的一些信息:
>>> tim
Timer(4, prescaler=624, period=13439, mode=UP, div=1)
这个信息意味着这个定时器被设置为以外围时钟速度除以624 + 1运行,它将从0到13439计数,在这一点上它触发一个中断,然后从0开始再次计数。这些数字是设定为10Hz的定时器触发:定时器的源频率为84MHz(由运行发现tim.source_freq()),因此我们得到84MHz / 625/13440 = 10Hz。
9.1。定时器计数器
那么我们可以用我们的计时器做什么?最基本的是获得其计数器的当前值:
>>> tim.counter()
21504
这个计数器将会不断的改变,并且增加。
9.2。定时器回调
接下来我们可以做的就是注册一个回调函数,让定时器在触发时执行(参见[switch tutorial](tut-switch)了解回调函数):
>>> tim.callback(lambda t:pyb.LED(1).toggle())
这应该启动红色LED闪烁。它将以5 Hz闪烁(1次闪烁需要2次切换,所以10 Hz切换会使其以5 Hz闪烁)。您可以通过重新初始化定时器来更改频率:
>>> tim.init(freq=20)
您可以通过传递值来禁用回调None:
>>> tim.callback(None)
您传递给回调的函数必须带有1个参数,它是触发的计时器对象。这使您可以从回调函数中控制计时器。

我们可以创建2个定时器并独立运行它们:
>>> tim4 = pyb.Timer(4, freq=10)
>>> tim7 = pyb.Timer(7, freq=20)
>>> tim4.callback(lambda t: pyb.LED(1).toggle())
>>> tim7.callback(lambda t: pyb.LED(2).toggle())
由于回调是正确的硬件中断,所以在这些定时器运行时,我们可以继续使用pyboard来处理其他事情。

9.3。做一个微秒计数器
你可以使用定时器来创建一个微秒计数器,当你做一些需要精确计时的事情时这可能是有用的。我们将使用定时器2,因为定时器2有一个32位计数器(定时​​器5也是这样,但是如果使用定时器5,则不能同时使用伺服驱动器)。

我们设置定时器2如下:
>>> micros = pyb.Timer(2, prescaler=83, period=0x3fffffff)
预分频器设置为83,这个定时器计数在1 MHz。这是因为运行在168MHz的CPU时钟被2分频,然后被预分频器+1分频,定时器2的频率为168MHz / 2 /(83 + 1)= 1MHz。周期被设置为大数目,以便定时器可以计数到一个很大的数字,然后绕回到零。在这种情况下,大约需要17分钟才能回到零。

要使用此计时器,最好先将其重置为0:
>>> micros.counter(0)
然后执行你的时间:
>>> start_micros = micros.counter()

... do some stuff ...

>>> end_micros = micros.counter()




使用特权

评论回复
10
gaoyang9992006|  楼主 | 2018-1-21 17:24 | 只看该作者
10.内联汇编程序
在这里,您将学习如何在MicroPython中编写内联汇编器。

注意:这是一个高级教程,适用于那些已经了解了一些微控制器和汇编语言的人。

MicroPython包含一个内联汇编器。它允许你编写汇编程序作为Python函数,你可以像调用普通的Python函数那样调用它们。

10.1。返回一个值
内联汇编程序函数由特殊的函数装饰器表示。我们从最简单的例子开始:
@micropython.asm_thumb
def fun():
    movw(r0, 42)
您可以在脚本或REPL中输入。该函数不带任何参数,返回数字42. r0是一个寄存器,函数返回时该寄存器中的值是返回的值。MicroPython总是将其解释r0为一个整数,并将其转换为调用者的整数对象。

如果你运行,print(fun())你会看到它打印出42。

10.2。访问外围设备
对于一些更复杂的事情,让我们打开一个LED:

@micropython.asm_thumb
def led_on():
    movwt(r0, stm.GPIOA)
    movw(r1, 1 << 13)
    strh(r1, [r0, stm.GPIO_BSRRL])
这段代码使用了一些新的概念:

stm是一个提供一组常量的模块,可以方便地访问pyboard的微控制器的寄存器。尝试运行,然后在REPL。它会给你一个所有可用常量的列表。import stmhelp(stm)
stm.GPIOA是GPIOA外设存储器中的地址。在黑板上,红色的LED位于端口A的PA13脚上。
movwt将一个32位的数字移入一个寄存器。这是一个方便的功能,变成了两个拇指指示:movw其次movt。该movt还权由16位转移的立即值。
strh存储一个半字(16位)。上面的指令将低16位r1存储到内存位置。这具有将设置了相应位的端口A上的所有引脚设置为高的效果。在我们上面的例子中,第13位被设置,所以PA13被拉高。这将打开红色LED。r0 + stm.GPIO_BSRRLr0r0


10.3。接受参数
内联汇编器函数最多可以接受4个参数。如果它们时,它们必须被命名为r0,r1,r2和r3反映寄存器和调用约定。

这是一个添加参数的函数:
@micropython.asm_thumb
def asm_add(r0, r1):
    add(r0, r0, r1)
这将执行计算r0 = r0 + r1。由于结果被放入r0,这就是返回的结果。尝试asm_add(1, 2),它应该返回3。
10.4。循环
我们可以使用标签来分配标签label(my_label),也可以使用b(my_label)条件分支来 标签bgt(my_label)。

以下示例闪烁绿色LED。它闪烁它的r0时间。

@micropython.asm_thumb
def flash_led(r0):
    # get the GPIOA address in r1
    movwt(r1, stm.GPIOA)

    # get the bit mask for PA14 (the pin LED #2 is on)
    movw(r2, 1 << 14)

    b(loop_entry)

    label(loop1)

    # turn LED on
    strh(r2, [r1, stm.GPIO_BSRRL])

    # delay for a bit
    movwt(r4, 5599900)
    label(delay_on)
    sub(r4, r4, 1)
    cmp(r4, 0)
    bgt(delay_on)

    # turn LED off
    strh(r2, [r1, stm.GPIO_BSRRH])

    # delay for a bit
    movwt(r4, 5599900)
    label(delay_off)
    sub(r4, r4, 1)
    cmp(r4, 0)
    bgt(delay_off)

    # loop r0 times
    sub(r0, r0, 1)
    label(loop_entry)
    cmp(r0, 0)
    bgt(loop1)


使用特权

评论回复
11
gaoyang9992006|  楼主 | 2018-1-21 17:25 | 只看该作者
11.电源控制
pyb.wfi()用于在等待诸如中断的事件时降低功耗。您将在以下情况下使用它:

<p>while True:</p><p>    do_some_processing()</p><p>    pyb.wfi()</p>

使用pyb.freq()以下方法控制频率

pyb.freq(30000000) # set CPU frequency to 30MHz


使用特权

评论回复
12
gaoyang9992006|  楼主 | 2018-1-21 17:26 | 只看该作者
以上使用机器翻译和人工翻译结合得到,有什么疑问我们一起讨论。

使用特权

评论回复
13
风雨潇潇| | 2018-2-2 16:44 | 只看该作者
本帖最后由 风雨潇潇 于 2018-2-2 16:47 编辑

流弊!!!想问下,micropython 是从哪里学的。

使用特权

评论回复
14
gaoyang9992006|  楼主 | 2018-2-2 17:49 | 只看该作者
风雨潇潇 发表于 2018-2-2 16:44
流弊!!!想问下,micropython 是从哪里学的。

看本版块新发的一个PDF下载,第一本MicroPython教程,发明人写的。

使用特权

评论回复
15
风雨潇潇| | 2018-2-5 09:01 | 只看该作者
gaoyang9992006 发表于 2018-2-2 17:49
看本版块新发的一个PDF下载,第一本MicroPython教程,发明人写的。

没看到PDF啊

使用特权

评论回复
16
ningling_21| | 2018-2-6 20:14 | 只看该作者
这个板是哪个版本的?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1966

主题

15958

帖子

208

粉丝