前面几篇基本演示了MCUSH/Python的基本用法,这次搭个廉价的实验板,方便大家动手实践。
首先从某宝下单,买如下任一款实验板(STM32F103C8 CortexM3主控芯片),20元以内。
下载预编译好的固件:https://github.com/pengshulin/mcush/tree/master/build。用STLINK等工具烧入工具(烧写方法这里就不介绍了,网上有许多教程)。
注意共有4各个版本,对应2种板子(蓝/黑),2种端口方式(VCP/UART)的组合。
VCP是USB虚拟串口,Linux下无须驱动,自动可识别成/dev/ttyACMx:
~ dmesg | tail -n5
[1453924.041945] usb 1-4: Product: mcush vcp
[1453924.041951] usb 1-4: Manufacturer: mcush designed by pengshulin
[1453924.041957] usb 1-4: SerialNumber: 50FF69064883525649292287
[1453924.042471] usb 1-4: ep 0x82 - rounding interval to 1024 microframes, ep desc says 2040 microframes
[1453924.043164] cdc_acm 1-4:1.0: ttyACM0: USB ACM device
~ ls -l /dev/ttyACM*
crw-rw---- 1 root dialout 166, 0 10月 4 16:00 /dev/ttyACM0
~
Windows下需要下载驱动:https://github.com/pengshulin/mcush/tree/master/vcp_driver/1.4.0
安装正确后识别成COM口:
如果使用UART版本固件还需要用USB转串口板,安装相应驱动。需要注意串口引脚是PA9/PA10。
推荐在LINUX环境下使用VCP的固件。VCP不受波特率限制,速度会快很多。
第一个例子:驱动继电器循环动作:
继电器控制端口PB9,接通2秒,断开0.5秒,反复循环。
# GPIO - Relay on/off test
import time
from mcush import *
RELAY = '1.9' # PB9 Pin
s = Mcush.Mcush('/dev/ttyACM0')
s.pinOutput(RELAY)
counter = 0
while True:
print( 'Count: %d'% counter )
s.pinSet(RELAY)
time.sleep(2)
s.pinClr(RELAY)
time.sleep(0.5)
counter += 1
第二个例子:模拟交通灯:
需要两组三色灯,绿黄红分别接PA0~PA2,PA3~PA5,换灯周期10秒,换灯时黄灯闪1秒,反复循环。
# Traffic lights control
import time
from mcush import *
GREEN = '0.0' # PA0
YELLOW = '0.1' # PA1
RED = '0.2' # PA2
GREEN2 = '0.3' # PA3
YELLOW2 = '0.4' # PA4
RED2 = '0.5' # PA5
DELAY = 10 # light switch delay time
s = Mcush.Mcush(‘/dev/ttyACM0’)
s.pinOutputLow([GREEN, YELLOW, RED, GREEN2, YELLOW2, RED2])
# yellow blink for 5 seconds
for i in range(5):
s.pinSet([YELLOW, YELLOW2]) # on
time.sleep(0.5)
s.pinClr([YELLOW, YELLOW2]) # off
time.sleep(0.5)
while True:
# green
s.pinSet([GREEN, RED2]) # on
for i in range(DELAY):
print( "green %d"% (DELAY-i) )
time.sleep( 1 )
s.pinClr([GREEN, RED2]) # off
# yellow
print( "yellow" )
s.pinSet([YELLOW, YELLOW2]) # on
time.sleep( 1 )
s.pinClr([YELLOW, YELLOW2]) # off
# red
print( "red" )
s.pinSet([RED, GREEN2]) # on
for i in range(DELAY):
print( "red %d"% (DELAY-i) )
time.sleep( 1 )
s.pinClr([RED, GREEN2]) # off
# yellow
print( "yellow" )
s.pinSet([YELLOW, YELLOW2]) # on
time.sleep( 1 )
s.pinClr([YELLOW, YELLOW2]) # off
控制IO口就是这么简单。