netPYB快速入门

该板子是在pyboard(PYB)标准板基础之上加入了W5500以太网控制芯片,重新魔改mpy系统底层程序,它可以提供稳定可靠的互联网接入,轻松实现物联网应用,我们为该板子起名为netPYB.

PYBv1.1 pinout PYBv1.1 pinout

硬件方面:STM32F405RGT6也就是PYB标准版的最小系统的硬件电路,以太网使用的W5500控制芯片,板载MM7660加速度芯片,RTC后备电池座,用户按键,复位按键及进入dfu模式的BOOT0按键,USB口可以实现USB通讯,生成类似优盘,轻松打开用户编程文件,进行用户程序的编写,USB接口同时生成虚拟串口,用于REPL调试及程序信息打印,TF卡座可以挂载外部TF卡由于存放海量的用户程序和用户数据。 编程方面:推荐使用Python语言,简单高效,快速应用。这里的Python指的是mpy(MicroPython这个单词缩写,初学者可以完全当做Python,懂Python可以当做阉割版的Python,鉴于该单词的商标争议和这个单词确实太长了不好键入,我们下文和以后就是用mpy来代替这个单词,请大家多多谅解,避免商标投诉),如果我们文章和学习资料中提到了μPython或者uPython大家自动地等效为mpy。

netPYB与Arduino UNO区别

该学习板一个大特点,或许大家已经看到了,没错,外形像极了,Ardxxxx UNO开发板(很火的那个电子入门的板子,意大利同行开发的风靡一时的板子)。

PYBv1.1 pinout

先说一下它们的共同点吧! netPYB在机械结构尺寸,电平信号输入标准,引脚标号,引脚功能对应上完全兼容Ardxxxx UNO,也就说Ardxxxx UNO所有外设板子(外接模块)都可以拿来在这个板子上用。 不同点:

  • 1、由于netPYB是采用了32位ARM的Cortex-M4内核的MCU(STM32F405RGT6),不管从核心板频率,总线架构,和外设种类数目,都对Ardxxxx所使用的AVR8位单片机,形成碾压之势,从运算速度上说一个16M频率,一个100~168M频率,从带宽上一个一次运行8位一个是32位,性能可以极端认为是40倍的差距(有点不准确,也足以说明差距明显);一个外设功能捉襟见肘,一个全副武装,例如Ardxxxx有1个物理串口,连接电脑还需要外置芯片生成串口,咱家的netPYB有个5个物理串口芯片无需外接自己生成一个可连接电脑的虚拟串口。
  • 2、netPYB板载TF卡,可以挂载海量的外扩空间(我们最大测试过64G的TF,更大的tf应该也是可以的)可以放程序,可以放用户数据,懂行的可能看出来了,如果你写一个占用1M空间的程序你就NB大了,64G=64*1024M,这么大的程序存放空间,也真是没有朋友了,好吧暂不写这么大程序,用来放数据,例如1s存一个温度数据吧,可以连续存储十几年吧。Ardxxxx这方面不具备外扩板载外扩的硬件,芯片内部用户程序可用空间也是不能与之相比的。
  • 3、netPYB板载W5500以太网控制芯片,可以轻松实现稳定可靠的接入互联网,实现物联网应用,学习基础的联网知识,实现万物互联的实验。稳定性要比WIFI和蓝牙好。Ardxxxx UNO板这方面没有(或需要外接其他模块可以实现)。
  • 4、板载加速度芯片,可以实现很多的有趣应用,板载RTC实时时钟,相当于板子知道今天是几号,星期几,几点几分几秒。
  • 5、悄悄地告诉你,netPYB比正版的Ardxxxx还要便宜。
  • 6、从学习的编程语言来看,Ardxxxx本质上是学习的C语言(不是纯净的C语言,语法上像C语言,关键词上有吸纳其他编程语言的迹象),Ardxxxx在编程的时候,有意的回避了硬件底层,将应用封装成一个一个的库,应用倒是很简单,用户在学习了Ardxxxx会对电子电路入了门,在编程方面也入了门,也是很Happy的事情,可是接下来怎么走就有些迷茫了,由于学的语言不纯粹,如果需要转向其他语言需要自己慢慢适应找出不同点和相同点,向下,到是好一点,继续撸硬件。netPYB的硬件架构本来也是使用的C语言的(纯C),C语言的严谨,高效令人折服,但是C语言的哲学是偏向于硬件,需要适应硬件编程,一旦使用C语言编程几乎都是从底层干起,这就要命了,重复性工作很多,造成的纯C语言入门难,应用更难。幸运的是STM32为首的MCU在当今性能过剩,Damien George教授及团队将Python解释器内置于芯片内,相对于给裸机装上了WIN系统,让用户在系统上应用了,从此Python可以控制单片机了,这里用的Python语言虽然是阉割版的,但是是纯粹Python。这门语言十分友好,入门十分容易,关键是学会了Python上可以与常见的程序猿干一架,下可以玩转硬件,从研发速度和成功率上,揍挺成天苦大仇深的硬件工程师。

哎~~说这么多就这个理由也值得一学,这板子可以学习Python。 在可预见的未来:

儿童编程启蒙用Python

少年编程用Python

高考考试很可能考Python

服务器维护可以用Python

网络应用可以用Python

人工智能用Python

程序猿防脱发用Python

程序猿嫌命短改行用Python

程序猿节省时间找媳妇用Python

人生苦短用Python。

netPYB板推荐使用Python编程学习,别以为玩转咱的netPYB板子,只是入门了电路硬件,很可能你收获的是学会了Python,从此你将走向人生巅峰。

netPYB功能硬件信息示意图

PYBv1.1 pinout

netPYB淘宝购买链接

netPYB V1.1淘宝淘一个

手机淘宝扫一个:

PYBv1.1 pinout

netPYB硬件资料

netPYB硬件原理图

python脚本编程工具推荐

python是一种解释性语言,如果将板子内部植入了Mircropython系统,也就意味着将python语言的解释器,植入到了STM32芯片内,这样用户程序就不像C语言那样,在芯片外编译,链接了,这就意味着,Pyboard使用的python程序,不需要像C语言那样需要复杂的IDE了,理论上讲,windows自带的记事本软件就可以了,不过记事本这样的软件,无法提供关键词高亮,提示,格式的对齐也是挺不直观的,显的十分LOW,我推荐用户使用专业的程序编辑软件,如果你有高级语言使用基础,大型的高级语言开发工具一般都支持Python语言,继续用就行,如果用户没有编程基础或者只是想入门编程,我推荐使用

Sublime Text 下载

PYBv1.0 pinout

netPYB通讯基本测试代码

参考 pyb.LED.

# -*- coding: utf-8 -*-
# @Time    : 2019/06/23
# @Author  : WU HENG 源地工作室
# @File    : main.py
# @程序原理:netPYB通过使用W5500进行网络通讯,netPYB角色是客户端,pc端使用TCP/UDP调试工具
#           角色是服务器端。
# @外设模块:
# @接线引脚:netPYB占用SPI1,CS使用X5(PYB),RST使用Y11
# @实验现象:PC端的服务端会收到hello world,按板子上的USR按键会收到bye world
# @实验注意:netPYB是使用了改造的固件,标准版的PYB是不能使用network SOCKET功能的需要加载相应的固件
# @硬件购买:netPYB购买某宝搜索netPYB或者upython或者源地工作室
import network
import pyb #板载驱动库
import socket #网络通信协议库

nic = network.WIZNET5K(pyb.SPI(1),pyb.Pin.board.X5,pyb.Pin.board.Y11)   #W5500初始化
nic.ifconfig(('192.168.1.145','255.255.255.0','192.168.1.1','8.8.8.8')) #设置开发板的网络属性
print(nic.ifconfig()) #打印一下是否设置好

s=socket.socket() #创建socket对象
addr=('192.168.1.151',1234) #设置服务器的ip地址和端口号
s.connect(addr) #连接服务器
pyb.delay(500)
s.send("hello world!") #连接成功以后,向服务器发送hello world,如果服务器收到表示实验成功
pyb.Switch().callback(lambda:s.send("bye world!")) #按键中断发送一段话

网络基本功能实验测试

测试一下在同一局域网内通讯,程序稍加改动就可以接入广域网,上云服务器,或者实现其他的物联应用,这里我们进行最简单的实验,电脑上使用TCP&UDP调试软件,创建一个服务器启动并等待客户端的接入。

PYBv1.0 pinout
  • 1、将这台运行这服务器程序的pc接入到路由器,将netPYB通过网线也接入这台路由器。确保pc、路由器(也就是网关)和netPYB都是在统一网段下。
  • 2、将netPYB接入USB口供电并使用USB通讯,PC电脑上会生成一个优盘,编写程序在main.py文件中,使用程序脚本软件打开就行,在接入USB同时也会生成一个虚拟串口,如果电脑不识别,驱动程序也在生成的优盘中,请自行引导安装。
  • 3、编写程序,使用的是Python语言,由于Python解释器已经内置到芯片中了,所以编程理论上不需要什么IDE,记事本就可以编写脚本程序,不过还是推荐使用专业的脚本编辑软件,推荐Sublime Text。编写完毕,点击保存就相当于下载烧写程序。
  • 4、一般启动程序有两种方法,一种是硬启动,一种是软启动。硬启动是按复位键,或者重新上电。软启动是通过生成的虚拟串口打开串口调试软件,进行命令交互发送ctrl+D指令启动,强烈建议使用软启动,因为你不能保证你写的程序没有BUG,如果进行软启动,程序如果bug会在串口调试程序窗口交互中(REPL)提示哪一行,出现什么问题,对应修改就行。
PYBv1.0 pinout
  • 5、实现现象,在netPYB执行软启动后,tcp&udp软件创建的服务器端会收到hello world,按按键后会收到bye world。
PYBv1.0 pinout

基本功能测试示例

由于netPYB是从标准板PYB改造而来,自然PYB大部分程序是兼容的,在功能示意图中有硬件引脚对应表,使用哪一种标号都是可以的。 详情参考 pyb.

import pyb

pyb.repl_uart(pyb.UART(1, 9600)) # duplicate REPL on UART(1)
pyb.wfi() # pause CPU, waiting for interrupt
pyb.freq() # get CPU and bus frequencies
pyb.freq(60000000) # set CPU freq to 60MHz
pyb.stop() # stop CPU, waiting for external interrupt

延时和定时

使用 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 value of millisecond counter
delta = time.ticks_diff(time.ticks_ms(), start) # compute time difference

板载LED控制

参考 pyb.LED.

from pyb import LED

led = LED(1) # 1=red, 2=green, 3=yellow, 4=blue
led.toggle()
led.on()
led.off()

# LEDs 3 and 4 support PWM intensity (0-255)
LED(4).intensity()    # get intensity
LED(4).intensity(128) # set intensity to half

板子用户按键

参考 pyb.Switch.

from pyb import Switch

sw = Switch()
sw.value() # returns True or False
sw.callback(lambda: pyb.LED(1).toggle())

引脚和通用输入输出引脚控制

参考 pyb.Pin.

from pyb import Pin

p_out = Pin('X1', Pin.OUT_PP)
p_out.high()
p_out.low()

p_in = Pin('X2', Pin.IN, Pin.PULL_UP)
p_in.value() # get value, 0 or 1

舵机控制

参考 pyb.Servo.

from pyb import Servo

s1 = Servo(1) # servo on position 1 (X1, VIN, GND)
s1.angle(45) # move to 45 degrees
s1.angle(-60, 1500) # move to -60 degrees in 1500ms
s1.speed(50) # for continuous rotation servos

外部中断

参考 pyb.ExtInt.

from pyb import Pin, ExtInt

callback = lambda e: print("intr")
ext = ExtInt(Pin('Y1'), ExtInt.IRQ_RISING, Pin.PULL_NONE, callback)

定时器

参考 pyb.Timer.

from pyb import Timer

tim = Timer(1, freq=1000)
tim.counter() # get counter value
tim.freq(0.5) # 0.5 Hz
tim.callback(lambda t: pyb.LED(1).toggle())

RTC (实时时钟)

参考 pyb.RTC

from pyb 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

PWM (脉宽调制输出)

参考 pyb.Pin & pyb.Timer.

from pyb import Pin, Timer

p = Pin('X1') # X1 has TIM2, CH1
tim = Timer(2, freq=1000)
ch = tim.channel(1, Timer.PWM, pin=p)
ch.pulse_width_percent(50)

ADC (模数转换)

参考 pyb.Pin & pyb.ADC.

from pyb import Pin, ADC

adc = ADC(Pin('X19'))
adc.read() # read value, 0-4095

UART (串口)

参考 pyb.UART.

from pyb import UART

uart = UART(1, 9600)
uart.write('hello')
uart.read(5) # read up to 5 bytes

SPI 总线

参考 pyb.SPI.

from pyb import SPI

spi = SPI(1, SPI.MASTER, baudrate=200000, polarity=1, phase=0)
spi.send('hello')
spi.recv(5) # receive 5 bytes on the bus
spi.send_recv('hello') # send and receive 5 bytes

I2C 总线

参考 pyb.I2C.

from pyb import I2C

i2c = I2C(1, I2C.MASTER, baudrate=100000)
i2c.scan() # returns list of slave addresses
i2c.send('hello', 0x42) # send 5 bytes to slave with address 0x42
i2c.recv(5, 0x42) # receive 5 bytes from slave
i2c.mem_read(2, 0x42, 0x10) # read 2 bytes from slave 0x42, slave memory 0x10
i2c.mem_write('xy', 0x42, 0x10) # write 2 bytes to slave 0x42, slave memory 0x10

CAN 总线

参考 pyb.CAN.

from pyb import CAN

can = CAN(1, CAN.LOOPBACK)
can.setfilter(0, CAN.LIST16, 0, (123, 124, 125, 126))
can.send('message!', 123)   # send a message with id 123
can.recv(0)                 # receive message on FIFO 0

板载加速度传感器

参考 pyb.Accel.

from pyb import Accel

accel = Accel()
print(accel.x(), accel.y(), accel.z(), accel.tilt())