kali如何重启network_如何在ESP8266上进行MicroPython开发?

本文详述了如何在ESP8266上进行MicroPython开发,包括烧录固件、运行环境搭建、基本测试以及使用资源如GPIO、PWM、ADC等。还介绍了如何实现上电自动连接WiFi。
摘要由CSDN通过智能技术生成

764b1a29783814b83518b9d4abedb64b.png

本文介绍了ESP8266 MicroPython开发入门。

通过本文你能了解到如下知识:

  1. 烧录MicroPython固件
  2. MicroPython基础知识
  3. 编写MicroPython程序

什么是MicroPython?

MicroPython简单来说就是用Python来对微控制器进行编程(Python for controller),使用MicroPython做开发简洁明了。Micropython的由来得益于Damien George这位伟大的计算机工程师,Damien George每天都会使用Python工作,他有一天冒出一个大胆的想法:能否用Python来控制单片机,从而实现对机器人的操作呢?

Python语言本身就是一款简单上手的脚本语言,一些非计算机专业的爱好者都选Python语言作为入门语言,但是美中不足(中国跟美国为什么不参加世界杯足球赛),它不能实现对一些底层的操作,在硬件领域毫不起眼。所以,Damien George利用6个月时间打造了MicroPython,这就是MicroPyhton的由来。

MicroPython基于ANSI C,语法跟Python3基本一致,拥有独立的解析器、编译器、虚拟机和类库等。目前它支持STM32F401、STM32F405、STM32F407、ESP8266、ESP32、nRF52840等。相信不远的将来MicroPython将会支持更多的单片机,这样Python统治应用层和底层硬件的时代将会到来。

MicroPython在ESP8266上支持哪些资源?

根据官方的快速参考的描述,MicroPython已经实现了ESP8266基本硬件资源接口,包括GPIO、PWM、ADC、软SPI和硬SPI、I2C、睡眠模式(Deep-sleep mode)、OneWire单总线等,带有APA102、DHT和DS18B20库。所以使用MicroPython可以快速实现产品原型,比如智能插座,温湿度检测、智能RGB调光器等。

如何在ESP8266上运行MicroPython?

  1. 硬件

ESP8266开发板NodeMCU

2. 下载固件

到MicroPython官网下载基于ESP8266的MicroPython的固件。本文撰写时最新的固件版本是esp8266-20190529-v1.11.bin

3. 烧写固件

使用ESP8266官方提供的烧录工具ESP Flash Download Tool选择对应的串口,将固件烧录到0x0地址即可(勾选,先Erase擦除后再点击Start开始烧录)。

fa55b4a7dcefd6e4bc221db7068ac5cf.png
ESP8266烧录MicroPython配置

上电打印

打开常用的串口工具,设置波特率为115200,打开串口工具按下ESP8266开发板上的RST复位按钮,重启开发板。

一切正常的情况下,将会看到软件的输出窗口上一片乱码,并在最终会显示出当前的MicroPython版本信息重启上电,打印如下字符说明烧写固件成功:

a7a4fdbe0dceeb642a4f8641d6263de4.png

如果按下开发板的RST按钮后,并且串口工具上没有收到任何信息或者只收到一堆乱码最后没有以 Type "help()" for more information.结尾,均表示此次固件烧写失败,需要重新烧写固件

需要特别注意的是烧录固件时各项参数的设置(可尝试选择DIO或者DOUT等)。

自此,基本的ESP8266的MicroPython环境搭建完成。

4. 基本测试

串口工具勾选上加回车换行

在串口工具上输入help()打印的信息会告诉你如何连接WiFi:

463b0a43d92c655675649abdea9bd9d9.png

内置machine模块:

import machine
 
machine.freq()          # get the current frequency of the CPU
machine.freq(160000000) # set the CPU frequency to 160 MHz

96fabba01f1feebbb41cb943a2cfac37.png

内置esp模块:

import esp

esp.osdebug(None)       # turn off vendor O/S debugging messages
esp.osdebug(0)          # redirect vendor O/S debugging messages to UART(0)

查看内存资源

import micropython
micropython.mem_info()

联网network模块:

import network

wlan = network.WLAN(network.STA_IF) # create station interface
wlan.active(True)       # activate the interface
wlan.scan()             # scan for access points
wlan.isconnected()      # check if the station is connected to an AP
wlan.connect('meanea', '{85208520}') # connect to an AP(SSID/password)
wlan.config('mac')      # get the interface's MAC adddress
wlan.ifconfig()         # get the interface's IP/netmask/gw/DNS addresses

ap = network.WLAN(network.AP_IF) # create access-point interface
ap.active(True)         # activate the interface
ap.config(essid='ESP-AP') # set the ESSID of the access point

bfdeb0df1dab91ecb8ce5d1cf112d5df.png

614bc22fa53ce7128f681ea954935f70.png

bec7f2acf0f18cc1fb12afb6fee1e923.png

连接到本地WiFi网络的功能函数是:

def do_connect():
    import network
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect('meanea', '{85208520}')#Change to your SSID and password
        while not wlan.isconnected():
            pass
    print('network config:', wlan.ifconfig())

一旦连接上了网络,就可以像往常一样使用socket模块用于创建和使用TCP/UDP套接字。

延迟和时间

使用time模块:

import time

time.sleep(1)           # sleep for 1 second
time.sleep_ms(500)      # sleep for 500 milliseconds
time.sleep_us(10)       # sleep for 10 microseconds
start = time.ticks_ms() # get millisecond counter
delta = time.ticks_diff(time.ticks_ms(), start) # compute time difference

计时器

支持虚拟(基于RTOS)的计时器(周期以毫秒为单位)。使用计时器ID为-1 的machine.Timer类:

from machine import Timer

tim = Timer(-1)
tim.init(period=5000, mode=Timer.ONE_SHOT, callback=lambda t:print(1))
tim.init(period=2000, mode=Timer.PERIODIC, callback=lambda t:print(2))

GPIO引脚

使用machine.Pin类:

from machine import Pin

p2 = Pin(2, Pin.OUT)    # create output pin on GPIO0
p2.on()                 # set pin to "on" (high) level
p2.off()                # set pin to "off" (low) level
p2.value(1)             # set pin to on/high

p0 = Pin(0, Pin.IN)     # create input pin on GPIO2
print(p0.value())       # get value, 0 or 1

p4 = Pin(4, Pin.IN, Pin.PULL_UP) # enable internal pull-up resistor
p5 = Pin(5, Pin.OUT, value=1) # set pin high on creation

9c780442fa79a1a19323ab551005d8fe.png

未按Flash按键时输入命令print(p0.value()) 可看见打印为1;按住Flash按键时输入命令print(p0.value()) 可看见打印为0;

86cc7f300c1e3b3a9d2096eba1ea91cb.png

操作GPIO2可看到ESP8266开发板上的灯亮/灭。

可用引脚为:0,1,2,3,4,5,12,13,14,15,16,分别对应ESP8266芯片的实际GPIO引脚编号。请注意,许多最终用户板使用自己的逻辑引脚编号(标记为例如D0,D1,...)。有关板逻辑引脚和物理芯片引脚之间的映射参考如下:

9dc2153ad40311004c963ddcf8a1da79.png

注意,引脚(1)和引脚(3)分别是UART_TXD和UART_RXD。另请注意,Pin(16)是一个特殊引脚(用于从深度睡眠模式唤醒),可能无法用于更高级别的类 Neopixel

PWM(脉冲宽度调制)

除引脚(16)外,所有引脚均可用于输出PWM。所有通道都有一个频率,范围在1Hz到1000Hz之间,占空比介于0~1023之间。

使用machine.PWM类

from machine import Pin, PWM

pwm2 = PWM(Pin(2))      # create PWM object from a pin
pwm2.freq()             # get current frequency
pwm2.freq(1000)         # set frequency
pwm2.duty()             # get current duty cycle
pwm2.duty(200)          # set duty cycle
pwm2.deinit()           # turn off PWM on the pin

pwm2 = PWM(Pin(2), freq=500, duty=512) # create and configure in one go

pwm2 = PWM(Pin(2), freq=1000, duty=700) 调节duty的值能看到板上LED灯明亮的变化。

ADC(模数转换)

ESP8266模数转换ADC有一个专用引脚。请注意,ADC0引脚上的输入电压必须介于0v~1.0v之间。

使用machine.ADC类:

from machine import ADC

adc = ADC(0)            # create ADC object on ADC pin
adc.read()              # read value, 0-1024

软件SPI总线

MicroPython在ESP8266上实现了两个SPI驱动程序。一个是用软件实现的(bit-banging),适用于所有引脚,可通过machine.SPI类:

from machine import Pin, SPI

# construct an SPI bus on the given pins
# polarity is the idle state of SCK
# phase=0 means sample on the first edge of SCK, phase=1 means the second
spi = SPI(-1, baudrate=100000, polarity=1, phase=0, sck=Pin(0), mosi=Pin(2), miso=Pin(4))

spi.init(baudrate=200000) # set the baudrate

spi.read(10)            # read 10 bytes on MISO
spi.read(10, 0xff)      # read 10 bytes while outputing 0xff on MOSI

buf = bytearray(50)     # create a buffer
spi.readinto(buf)       # read into the given buffer (reads 50 bytes in this case)
spi.readinto(buf, 0xff) # read into the given buffer and output 0xff on MOSI

spi.write(b'12345')     # write 5 bytes on MOSI

buf = bytearray(4)      # create a buffer
spi.write_readinto(b'1234', buf) # write to MOSI and read from MISO into the buffer
spi.write_readinto(buf, buf) # write buf to MOSI and read MISO back into buf

硬件SPI总线

硬件SPI速度更快(总线时钟高达80Mhz),但仅适用于以下引脚:MISO—GPIO12,MOSI—GPIO13,SCK—GPIO14。除了构造函数和init的引脚参数(因为它们是固定的)硬件SPI具有与上面的bit-banging SPI类相同的方法,:

from machine import Pin, SPI

hspi = SPI(1, baudrate=80000000, polarity=0, phase=0)

注意:SPI(0)用于内部FlashROM,用户无法使用。

I2C总线

I2C驱动程序以软件实现,适用于所有引脚,可通过访问machine.I2C类:

from machine import Pin, I2C

# construct an I2C bus
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)

i2c.readfrom(0x3a, 4)   # read 4 bytes from slave device with address 0x3a
i2c.writeto(0x3a, '12') # write '12' to slave device with address 0x3a

buf = bytearray(10)     # create a buffer with 10 bytes
i2c.writeto(0x3a, buf)  # write the given buffer to the slave

实时时钟(RTC)

使用machine.RTC

from machine import RTC

rtc = RTC()
rtc.datetime((2017, 8, 23, 1, 12, 48, 0, 0)) # set a specific date and time
rtc.datetime() # get date and time

深度睡眠模式

将GPIO16连接到复位引脚RST,然后可以使用以下代码来休眠,唤醒并检查重置原因:

import machine

# configure RTC.ALARM0 to be able to wake the device
rtc = machine.RTC()
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)

# check if the device woke from a deep sleep
if machine.reset_cause() == machine.DEEPSLEEP_RESET:
    print('woke from a deep sleep')

# set RTC.ALARM0 to fire after 10 seconds (waking the device)
rtc.alarm(rtc.ALARM0, 10000)

# put the device to sleep
machine.deepsleep()

OneWire单总线驱动程序

OneWire驱动程序在软件中实现,适用于所有引脚:

from machine import Pin
import onewire

ow = onewire.OneWire(Pin(12)) # create a OneWire bus on GPIO12
ow.scan()               # return a list of devices on the bus
ow.reset()              # reset the bus
ow.readbyte()           # read a byte
ow.writebyte(0x12)      # write a byte on the bus
ow.write('123')         # write bytes on the bus
ow.select_rom(b'12345678') # select a specific device by its ROM code

DS18S20和DS18B20设备有一个特定的驱动程序:

import time, ds18x20
ds = ds18x20.DS18X20(ow)
roms = ds.scan()
ds.convert_temp()
time.sleep_ms(750)
for rom in roms:
    print(ds.read_temp(rom))

硬件设计上确保在数据线上放置一个4.7k的上拉电阻。请注意,convert_temp()每次要对温度进行采样时都必须调用该方法。

NeoPixel驱动程序

使用neopixel模块:

from machine import Pin
from neopixel import NeoPixel

pin = Pin(0, Pin.OUT)   # set GPIO0 to output to drive NeoPixels
np = NeoPixel(pin, 8)   # create NeoPixel driver on GPIO0 for 8 pixels
np[0] = (255, 255, 255) # set the first pixel to white
np.write()              # write data to all pixels
r, g, b = np[0]         # get first pixel colour

对于NeoPixel的低级驱动:

import esp
esp.neopixel_write(pin, grb_buf, is800khz)

APA102驱动程序

使用apa102模块:

from machine import Pin
from apa102 import APA102

clock = Pin(14, Pin.OUT)     # set GPIO14 to output to drive the clock
data = Pin(13, Pin.OUT)      # set GPIO13 to output to drive the data
apa = APA102(clock, data, 8) # create APA102 driver on the clock and the data pin for 8 pixels
apa[0] = (255, 255, 255, 31) # set the first pixel to white with a maximum brightness of 31
apa.write()                  # write data to all pixels
r, g, b, brightness = apa[0] # get first pixel colour

对于APA102的低级使用:

import esp
esp.apa102_write(clock_pin, data_pin, rgbi_buf)

DHT驱动

DHT驱动程序在软件中实现,适用于所有引脚:

import dht
import machine

d = dht.DHT11(machine.Pin(4))
d.measure()
d.temperature() # eg. 23 (°C)
d.humidity()    # eg. 41 (% RH)

d = dht.DHT22(machine.Pin(4))
d.measure()
d.temperature() # eg. 23.6 (°C)
d.humidity()    # eg. 41.3 (% RH)

WebREPL(Web浏览器交互式提示)

WebREPL通过Web浏览器进行REPL,可通过Web浏览器访问ESP8266和进行信息交互。

我们先查看主目录下的文件列表

可以使用os.listdir()命令查看主目录下的文件,后面我们可以用webrepl下载或上传文件。

>>> import os
>>> os.listdir()

932cf0b159851127dcc338bfdc6b1b64.png
图示直接输入import os;os.listdir();

可以看到主目录下只有一个boot.py文件。

执行以下命令对其进行配置webrepl:

import webrepl_setup

4b06a5397e94544f5753086ae8975dfe.png

输入E后提示输入4~9位密码

a30fc131ef6763396d73b4d8350242df.png

1aee280072f767deb86cb615063bdc0f.png

输入y重启。这时一起输入import os;os.listdir();可看到主目录下多了一个webrepl_cfg.py文件。

4b9958bc74b72db4a04b93003a20c7ff.png

重启后,它将可用于连接。如果在引导时禁用了自动启动,则可以使用以下命令按需运行已配置的守护程序:

import webrepl
webrepl.start()

875ded59a4fdcab579e6f11b3b88dc22.png

浏览器中打开链接MicroPython WebREPL

MicroPython WebREPL​micropython.org

将IP修改为串口工具提示的IP地址后点击连接:

8b9662f5674abc5e7779c1d71c4fb9f5.png

输入密码后回车。

400e8074bec8e06cfdc26043dce69658.png

输入boot.py然后点击Get from device按钮下载boot.py文件,打开能够看见文件的内容。

031a8eb8cf328b4378a54e3d4d9ac386.png

2acf3360fbeb0508cc15e130ea9a1e0b.png

如何实现ESP8266上电自动连接WiFi?

MicroPython初始化后都会自动执行main.py文件,所以我们只需要设置该文件即可上电自动连接WiFi。打开自己常用的编辑器,输入下面代码(注意SSID修改为你本地路由器的名称,PASSWORD修改为路由器密码),并保存为main.py文件:

# main.py
import network
import webrepl
import time


SSID = "meanea"
PASSWORD = "{85208520}"

def do_connect():
    import network
    import time
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect(SSID, PASSWORD)

    start = time.ticks_ms() # get millisecond counter
    while not wlan.isconnected():
        time.sleep(1) # sleep for 1 second
        if time.ticks_ms()-start > 20000:
            print("connect timeout!")
            break

    if wlan.isconnected():
        print('network config:', wlan.ifconfig())

do_connect()

85c9556c196d27f4bc8941bc79c5b57d.png

通过WebREPL客户端上传该文件,完成之后,按RST复位键重启ESP8266,输入命令可看到多了一个main.py文件。

57a2573c21d6658dff8c83d61175bfa3.png
import network;wlan = network.WLAN(network.STA_IF);wlan.active(True);wlan.isconnected();wlan.connect('meanea', '{85208520}');wlan.isconnected();wlan.config('mac');wlan.ifconfig();

然后启动webrepl

import webrepl;webrepl.start();

重连,时间修改为30s重传main.py

9feb3607c64ff1e6ff01e4a869df1d6d.png

附件:

ESP Flash Download Tool 工具

MicroPython固件

串口工具

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值