MicroPython 之 PYBoard
一、MicroPython 简介
Python,是一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件,源代码和解释器CPython遵循GPL(GNU General Public License)协议。Python的设计目标之一是让代码具备高度的可阅读性。它设计时尽量使用其它语言经常使用的标点符号和英文单字,让代码看起来整洁美观。它不像其他的静态语言如C、Pascal那样需要重复书写声明语句,也不像它们的语法那样经常有特殊情况和意外。总之,Python是一种简单易用的、能够运行在多个平台下的计算机编程语言。
而microPython,是跑在MCU(微控制器)上的Python,通过内置的解释器执行py文件或者py命令,就可以让微控制器运行您想要的功能了。microPython和Python编程语言一样,在任何板子上都可以使用通用的API控制硬件底层,比如点亮 LED 灯,读取传感器信息, LCD 显示字符串、控制电机、连接网络、连接蓝牙等等。
如果说Arduino让创客摆脱了各种编程环境配置,那么micropython直接让创客摆脱了底层。命令行和解释执行,都是C语言所不具备的优势,运行micropython的soc,就类似一台完整的电脑,我们用python文件和命令行,轻松控制这台电脑中的一切。
microPython是人们连接各种任务的粘合剂,即便您不懂编程,不懂硬件,也可以通过它来控制MCU,要给microPython下一个最准确的定义,最好用一些实例来描述。
您想当咖啡煮好时,咖啡壶就发出“吱吱”声提醒您吗?
您想当邮箱有新邮件时,电话会发出警报通知您吗?
想要一件闪闪发光的绒毛玩具吗?
想要一款具备语音和酒水配送功能的X教授蒸汽朋克风格轮椅吗?
想要一套按下快捷键就可以进行实验测试蜂音器吗?
想为您的儿子自制一个《银河战士》手臂炮吗?
想自制一个心率监测器,将每次骑脚踏车的记录存进存储卡吗?
想过自制一个能在地面上绘图,能在雪中驰骋的机器人吗?
想做一台机械臂,通过摇杆,您做什么动作,它就做什么动作吗?
想过自制一个智能气象站,自动获取天气预报数据吗?
microPython都可以为您实现。
MicroPython诞生啦!
Damien George是一名计算机工程师,他每天都要使用Python语言工作,同时也在做一些机器人项目。有一天,他突然冒出了一个想法:能否用Python语言来控制单片机,进行实现对机器人的操控呢?
要知道,Python是一款比较容易上手的脚本语言,而且有强大的社区支持,一些非计算机专业领域的人都选它作为入门语言。遗憾的是,它不能实现一些非常底层的操控,所以在硬件领域并不起眼。
Damien为了突破这种限制,他花费了六个月的时间来打造Micro Python。它基于ANSI C,语法跟Pyton 3基本一致,拥有自家的解析器、编译器、虚拟机和类库等。目前它支持基于32-bit的ARM处理器,比如说pyboard(STM32F405),支持NRF51822(micro:bit)、支持FireBeetle-ESP32、支持WiPy、支持ESP8266核心主控、支持CC3200等等。
二、Pyboard 简介
pyboard是microPython官方出的一款支持microPython的微控制器,采用stm32f405rg MCU主芯片,邮票孔设计,体积小巧。在性能方面,pyboard除了将stm32f405rg本身的外设延用出来,还拓展了微型SD卡插槽、三周加速度计(mma7660)。在小巧的pyboard上,设有29个GPIO,4个LED灯,板载3.3V LDO电源管理芯片,可以提供高达250mA的电流,3.6~16V的宽电压输入。
本次测试板是在淘宝购买
https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-24145583300.9.7e233746ulqmzT&id=594145340736
三、PYBoard配置
#获取pyboard上引脚的别名和芯片定义的引脚名
help(pyb.Pin.board)
#获取LED类方法
help(pyb.LED)
1、开发环境配置
#Thonny软件安装 https://thonny.org/ #Thonny配置 工具 --> ESP8266 --> 串口号 #MicroPython官网 https://micropython.nxez.com/docs/micropython/en-us/index.html
2、通用配置
import pyb # 设置串口及波特率 pyb.repl_uart(pyb.UART(1, 9600)) # 暂停CPU,等待外部中断 pyb.wfi() # 获取CPU和总线频率 pyb.freq() # 设置cpu频率为60MHZ pyb.freq(60000000) # 停止CPU,等待外部中断 pyb.stop()
四、PYBoard基本功能快速浏览
引用博客:http://t.zoukankan.com/iBoundary-p-11495199.html
1、延迟和计时(Delay and timing)
Use the time
module:
import time # 休眠1秒 time.sleep(1) # 休眠500毫秒 time.sleep_ms(500) # 休眠10微秒 time.sleep_us(10) # 获取毫秒计数器的值 start = time.ticks_ms() # 计算时差 delta = time.ticks_diff(time.ticks_ms(), start)
2、内部发光二极管(Internal LEDs)
from pyb import LED # 1=red, 2=green, 3=yellow, 4=blue led = LED(1)
#翻转 led.toggle()
#点亮 led.on()
#熄灭 led.off() # LED 3和4支持PWM强度(0-255) # 获取强度 LED(4).intensity() # 设置50%的强度 LED(4).intensity(128)
3、内部开关(Internal switch)
from pyb import Switch import time sw = Switch() # 返回 True 或 False while True: time.sleep(0.2) #获取开关状态 print(sw()) #当开关按下时注册回调函数 sw.callback(lambda: pyb.LED(4).toggle()) #取消注册 #sw.callback(None)
4、引脚和GPIO(Pins and GPIO)
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
5、伺服控制(Servo control)
""" 在 pyboard 板上有4个用于连接业余hobby伺服电机的专用连接点。这些电机有3条线:地线、电源线和信号线。您可在板上将三条线连接在右下角,信号引脚在最右边。引脚X1、X2、X3和X4是4个专用伺服信号引脚。 """ from pyb import Servo # servo位置 (X1, VIN, GND) s1 = Servo(1) # 移动到45度 s1.angle(45) # 移动到 -60 度在 1500ms 内 s1.angle(-60, 1500) # 设置速度,用于连续移动 s1.speed(50)
6、外部中断(External interrupts)
from pyb import Pin, ExtInt #回调函数 callback = lambda e: print("intr") #外部中断触发条件设置 ext = ExtInt(Pin('Y1'), ExtInt.IRQ_RISING, Pin.PULL_NONE, callback)
7、计时器(Timers)
""" 定时器是嵌入式系统中最基本的功能之一,它除了可以实现定时器功能外,还能够实现延时、PWM输出、波形发生器、舵机控制、节拍器、周期唤醒、自动数据采集等功能。在MicroPython中,很多函数的功能也依赖定时器 """ from pyb import Timer tim = Timer(1, freq=1000) # 获取counter 的值 tim.counter() #设置频率为 0.5 Hz tim.freq(0.5) #设置回调函数 tim.callback(lambda t: pyb.LED(1).toggle())
8、实时时钟(RTC)
from pyb import RTC rtc = RTC() #设置年、月、日、星期、时、分、秒、次秒 rtc.datetime((2017, 8, 23, 1, 12, 48, 0, 0)) #返回当前系统时间 rtc.datetime()
9、脉宽调制模块(PWM)
from pyb import Pin,Timer #X1是定时器2的CH1 p = Pin('X1') tim = Timer(2,freq=1000) #设置PWM引脚 ch = tim.channel(1,Timer.PWM,pin=p) #设置PWM输出占空比 ch.pulse_width_percent(50)
10、模数转换(ADC)
from pyb import Pin, ADC #设定ADC输入引脚 adc = ADC(Pin('X19')) #读取ADC转换结果,默认12位方式,参数范围0~4095 adc.read()
11、数模转换(DAC)
from pyb import Pin, DAC #设置DAC输出引脚 dac = DAC(Pin('X5')) #设置输出电压,默认8位模式,参数范围0~255 dac.write(120)
12、UART(串口)
from pyb import UART #设置串口号,波特率 uart = UART(1, 9600) #输出 uart.write('hello') #最多读取5个字节 uart.read(5) # read up to 5 bytes
13、SPI总线
from pyb import SPI #设置SPI参数 spi = SPI(1, SPI.CONTROLLER, baudrate=200000, polarity=1, phase=0) spi.send('hello') #读取5个字节 spi.recv(5) #发送并接收5个字节 spi.send_recv('hello')
14、I2C总线
from machine import I2C # 定义硬件I2C对象 i2c = I2C('X', freq=400000) # 定义软件I2C对象 i2c = I2C(scl='X1', sda='X2', freq=100000) # 返回扫描到的从机地址 i2c.scan() # 往地址为 0x42 的从机写5个字节 i2c.writeto(0x42, 'hello') # 从地址为 0x42 的从机读取5个字节 i2c.readfrom(0x42, 5) # 从设备地址 0x42和存储器地址为0x10中读取2个字节 i2c.readfrom_mem(0x42, 0x10, 2) # 从设备地址 0x42和存储器地址为0x10中写入2个字节 i2c.writeto_mem(0x42, 0x10, 'xy')
15、CAN总线 (CAN bus)
from pyb import CAN can = CAN(1, CAN.LOOPBACK) can.setfilter(0, CAN.LIST16, 0, (123, 124, 125, 126)) #发下ID为123的消息 can.send('message!', 123) #在FIF0 0 上接收消息 can.recv(0)
16、板载三轴加速度传感器(Internal accelerometer)
from pyb import Accel import time accel = Accel() while True: time.sleep(0.2) print(accel.x(), accel.y(), accel.z(), accel.tilt())
五、PYBoard案例
1、流水灯
from pyb import LED leds = [pyb.LED(i) for i in range(1,5)] n = 0 while True: n = (n+1) % 4 leds[n].toggle() pyb.delay(100)
2、往返式流水灯
from pyb import LED leds = [pyb.LED(i) for i in range(1,5)] n = 0 while True: n = (n+1) % 4 leds[n].toggle() if n == 3: leds.reverse() pyb.delay(100)
3、呼吸灯
led = pyb.LED(3) intensity = 0 flag = True while True: if flag: intensity = (intensity + 1) % 255 if intensity == 0: flag = False intensity = 255 else: intensity = (intensity - 1) % 255 if intensity == 0: flag = True led.intensity(intensity) pyb.delay(30)