关于 WiPy 的一般信息

没有浮点支持

由于空间原因,没有浮点支持,也没有数学模块。这意味着不能在代码中的任何地方使用浮点数,并且必须使用“//”而不是“/”来执行所有除法。例子:

>>> r = 4 // 2  # this will work
>>> r = 4 / 2   # this WON'T

通电前

警告

WiPy 的 GPIO 引脚不能承受 5V 电压,将它们连接到高于 3.6V 的电压会对电路板造成无法修复的损坏。ADC 引脚在配置为模拟模式时不能承受 1.8V 以上的电压。在为电子设备接线时,请记住这些注意事项。

WLAN 默认行为

当 WiPy 以默认出厂配置启动时,以接入点模式ssid启动,以:wipy-wlan 和开头。连接到此网络,WiPy 将在。为了访问交互式提示,请在默认端口 (23) 上打开到该 IP 地址的 telnet 会话。您将被要求提供凭据: 和 key: www.wipy.io 192.168.1.1login: micro password: python

远程登录

Linux stock telnet 工作起来很有吸引力(也在 OSX 上),但其他工具(如 putty)也能很好地工作。默认凭据是: 用户: micro, 密码: python. 。有关network.Server 如何更改默认值的信息,请参阅。例如,在 linux shell 上(当在 AP 模式下连接到 WiPy 时):

$ telnet 192.168.1.1

本地文件系统和 FTP 访问

WiPy 上有一个小的内部文件系统(驱动器),称为/flash,存储在外部串行闪存中。如果连接并安装了微型 SD 卡,它也将可用。

当 WiPy 启动时,它总是从boot.py位于 /flash 文件系统中的位置 启动。启动时,当前目录为/flash.

文件系统可通过在 WiPy 中运行的本机 FTP 服务器访问。打开您选择的 FTP 客户端并连接到:

网址: ftp://192.168.1.1, 用户: micro, 密码: python

有关 network.Server如何更改默认值的信息,请参阅。推荐的客户端是:Linux stock FTP(也在 OSX 中)、Filezilla 和 FireFTP。例如,在 linux shell 上:

$ ftp 192.168.1.1

WiPy 上的 FTP 服务器不支持主动模式,只支持被动模式,因此,如果使用原生 unix ftp 客户端,只需登录后即可:

ftp> passive

除此之外,FTP 服务器一次只支持一个数据连接。查看下面的 Filezilla 设置部分了解更多信息。

FileZilla 设置

不要使用快速连接按钮,而是打开站点管理器并创建新配置。在General选项卡中确保加密设置为:。在传输设置选项卡中将最大连接数限制为一个,否则 FileZilla 将在检索和保存文件时尝试打开第二个命令连接,并且为了简单和减少代码大小,只能使用一个命令和一个数据连接。其他 FTP 客户端的行为方式可能类似。Only use plain FTP (insecure)

无线升级固件

OTA 软件更新可以通过 FTP 服务器执行。将mcuimg.bin文件上传到:/flash/sys/mcuimg.bin大约需要 6 秒。你不会看到文件被存储在里面,/flash/sys/因为它实际上是绕过用户文件系统保存的,所以它最终在内部隐藏文件系统中,但请放心,它已成功传输,并且已使用 MD5 校验和签名以验证其完整性。现在,通过按下板上的开关或键入以下内容来重置 WiPy:

>>> import machine
>>> machine.reset()

可以在以下位置找到软件更新:https://github.com/wipy/wipy/releases (Binaries.zip)。始终建议更新到最新软件,但请务必先阅读 发行说明

笔记

bootloader.bin 里面发现Binaries.zip有仅作参考,它并不需要的空中下载更新。

要检查您的软件版本,请执行以下操作:

>>> import os
>>> os.uname().release

如果版本号低于在发布中找到的最新 版本,请继续更新您的 WiPy!

启动模式和安全启动

如果您正常上电,或按下复位键,WiPy 将启动到标准模式;该 boot.py文件将首先执行,然后 main.py将运行。

您可以覆盖这个拉动启动顺序GP28 向上复位期间(其连接到3V3输出引脚)。此过程还允许及时返回到旧固件版本。WiPy 最多可以容纳 3 个不同的固件版本,它们是:出厂固件加上 2 个用户更新。

复位后,如果GP28保持高电平,心跳 LED 将开始缓慢闪烁,如果 3 秒后引脚仍然保持高电平,LED 将开始闪烁更快,WiPy 将选择上一个用户更新来启动。如果之前的用户更新是所需的固件映像,则GP28 必须在 3 秒以上之前发布。如果 3 秒后引脚仍为高电平,则将选择出厂固件,LED 将快速闪烁 1.5 秒,WiPy 将继续启动。固件选择机制如下:

安全引导引脚 GP28 在以下期间释放:

第一个 3 秒窗口

第二个 3 秒窗口

最后的 1.5 秒窗口

安全启动,最新
选择了固件
安全启动,以前
已选择用户更新
安全开机,出厂
选择了固件

在所有上述 3 种情况下,都进入了安全启动模式,这意味着跳过了boot.py 和的执行 main.py。这对于从用户脚本引起的崩溃情况中恢复很有用。在安全启动期间所做的选择不是持久的,因此在下一次正常重置后,最新的固件将再次运行。

心跳指示灯

默认情况下,心跳 LED 每 4 秒闪烁一次,表示系统处于活动状态。这可以通过 wipy 模块覆盖:

>>> import wipy
>>> wipy.heartbeat(False)

目前您可能会看到 2 种错误:

  1. 如果心跳 LED 快速闪烁,则 Python 脚本(例如main.py)有错误。使用 REPL 进行调试。

  2. 如果心跳灯一直亮,则是硬故障,无法恢复,唯一的办法就是按下复位开关。

有关睡眠模式的详细信息

  • machine.idle():功耗:~12mA(在 WLAN STA 模式下)。唤醒源:任何硬件中断(包括周期为 1ms 的 systick),无需特殊配置。

  • machine.lightsleep():950uA(在 WLAN STA 模式下)。唤醒源是Pin, RTC 并且WLAN

  • machine.deepsleep():~350uA。唤醒源是PinRTC

machine.Pin 的其他详细信息

在 WiPy 板上,引脚由其字符串 ID 标识:

from machine import Pin
g = machine.Pin('GP9', mode=Pin.OUT, pull=None, drive=Pin.MED_POWER, alt=-1)

您还可以配置引脚以生成中断。例如:

from machine import Pin

def pincb(pin):
    print(pin.id())

pin_int = Pin('GP10', mode=Pin.IN, pull=Pin.PULL_DOWN)
pin_int.irq(trigger=Pin.IRQ_RISING, handler=pincb)
# the callback can be triggered manually
pin_int.irq()()
# to disable the callback
pin_int.irq().disable()

现在每次在 gpio 引脚上看到下降沿时,都会执行回调。注意:机械按钮具有“弹跳”功能,按下或松开开关通常会产生多个边沿。请参阅:http://www.eng.utah.edu/~cs5780/debouncing.pdf 了解详细说明以及各种去抖动技术。

所有 pin 对象都通过 pin mapper 来产生一个 gpio pin。

对于 drive 参数,强度为:

  • Pin.LOW_POWER - 2mA 驱动能力。

  • Pin.MED_POWER - 4mA 驱动能力。

  • Pin.HIGH_POWER - 6mA 驱动能力。

对于 alt 参数请参考引脚和复用功能表在<https://raw.githubusercontent.com/wipy/wipy/master/docs/PinOUT.png>`_为特定复用功能,每个销支撑件。

对于中断,priority 可以采用 1-7 范围内的值。并且该 wake 参数具有以下属性:

  • 如果有 wake_from=machine.Sleep.ACTIVE 任何引脚可以唤醒电路板。

  • 如果 wake_from=machine.Sleep.SUSPENDED 引脚 GP2, GP4, GP10, GP11, GP17`` 或 GP24 可以唤醒电路板。请注意,此引脚中只能同时启用 1 个作为唤醒源,因此,只有最后启用的引脚作为machine.Sleep.SUSPENDED唤醒源才有效。

  • 如果wake_from=machine.Sleep.SUSPENDED引脚 GP2, GP4, GP10, GP11, GP17GP24 可以唤醒电路板。在这种情况下,可以同时启用所有 6 个引脚作为machine.Sleep.HIBERNATE唤醒源。

其他 Pin 方法:

machine.Pin.alt_list()

返回引脚支持的备用功能列表。列表项是以下形式的元组:('ALT_FUN_NAME', ALT_FUN_INDEX)

machine.I2C 的其他详细信息

在 WiPy 上有一个硬件 I2C 外设,标识为“0”。默认情况下,这是构建 I2C 实例时使用的外设。默认引脚是 SCL 的 GP23 和 SDA 的 GP13,可以通过执行以下操作来创建默认的 I2C 外设:

i2c = machine.I2C()

引脚和频率可以指定为:

i2c = machine.I2C(freq=400000, scl='GP23', sda='GP13')

只有某些引脚可以用作 SCL/SDA。有关更多信息,请参阅引脚排列。

已知的问题

创建 SSL 套接字的方式不兼容

在包装 SSL 套接字之前,需要通过以下方式创建它们。 ssl.wrap_socket:

import socket
import ssl
s = socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_SEC)
ss = ssl.wrap_socket(s)

必须使用证书来验证连接的另一端,以及向另一端验证我们自己。此类证书必须使用 FTP 服务器存储为文件,并且必须将它们放置在具有特定名称的特定路径中。

  • 验证对方的证书进入: ‘/flash/cert/ca.pem’

  • 验证我们自己的证书进入: ‘/flash/cert/cert.pem’

  • 我们自己证书的密钥在:‘/flash/cert/private.key’

笔记

当这些文件被存储时,它们被放置在内部隐藏文件系统中(就像固件更新一样),因此它们永远不可见。

例如,要使用证书连接到 Blynk 服务器,请获取ca.pem位于blynk 示例文件夹中的文件。并将其放入'/flash/cert/'。然后做:

import socket
import ssl
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_SEC)
ss = ssl.wrap_socket(s, cert_reqs=ssl.CERT_REQUIRED, ca_certs='/flash/cert/ca.pem')
ss.connect(socket.getaddrinfo('cloud.blynk.cc', 8441)[0][-1])

uhashlib 模块中的不兼容性

由于 WiPy 的硬件实现细节,数据在消化之前必须进行缓冲,这将导致无法计算 RAM 中无法容纳的大数据块的哈希值。在这种情况下,由于很可能预先知道数据的总大小,因此可以将大小传递给构造函数,因此可以正确初始化 WiPy 的 HASH 硬件引擎,而无需缓冲。如果block_size要给出,则还data 必须传递初始块。使用此扩展时,必须注意确保所有中间块(包括初始块)的长度是 4 字节的倍数。 最后一个块可以是任意长度。

例子:

hash = uhashlib.sha1('abcd1234', 1001)    # length of the initial piece is multiple of 4 bytes
hash.update('1234')                       # also multiple of 4 bytes
...
hash.update('12345')                      # last chunk may be of any length
hash.digest()

机器模块中的无关功能

main(filename)

将主脚本的文件名设置为在 boot.py 完成后运行。如果未调用此函数,则将执行默认文件 main.py。

只有在 boot.py 中调用这个函数才有意义。

通过网络模块控制telnet/FTP服务器的Adhoc方式

Server类控制行为和FTP的配置和对WiPy运行Telnet服务。使用此类的方法执行的任何更改都会影响两者。

例子:

import network
server = network.Server()
server.deinit() # disable the server
# enable the server again with new settings
server.init(login=('user', 'password'), timeout=600)
class network.Server(id, ...)

创建一个服务器实例,init初始化参数见。

server.init(\*, login=('micro', 'python'), timeout=300)

初始化(并有效地启动服务器)。可以选择传递一个新的user, passwordtimeout(以秒为单位)。

server.deinit()

停止服务器

server.timeout([timeout_in_seconds])

获取或设置服务器超时。

server.isrunning()

True如果服务器正在运行, False则返回,否则返回。

类似 VFS 的临时支持

WiPy 没有实现完整的 MicroPython VFS 支持,而是在uos 模块中定义了以下函数:

mount(block_device, mount_point, \*, readonly=False)

SD在指定的挂载点挂载块设备(如对象)。例子:

os.mount(sd, '/sd')
unmount(path)

从给定路径卸载先前安装的块设备。

mkfs(block_device or path)

格式化指定的路径,必须是/flash/sd。块设备也可以SD在挂载之前像对象一样传递。