[任性DIY] Micropython 炫目流水灯

流水灯可能是大家最经常DIY的东西,一个是因为简单容易实现,在就是效果不错。

为了演示MicroPython的强大功能,展现不同的用法,所以前几天DIY了一个小流水灯板,支持标准的Arduino Uno插座,可以在Nucelo开发板上使用。先看看原理图和DIY后的效果图:

原理图

上面右下角的两个LED没有用右下角的两个GPIO,因为在Arduino上这两个GPIO是串口的TX/RX,如果使用了这两个GPIO,会造成micropython的REPL失去响应,所以就改用了另外的GPIO。

正面

反面

为了省事,同时元件也不多,所以直接用洞洞板焊接。因为Arduino接口不是标准的2.54mm,和洞洞板配合不是很好,主要是右上角那个10pin的排母和其它排母间距不同,所以焊接时需要将排针折弯一点,这样才能对上。

连接在STM32F7DISCO开发板上

运行效果

如果只是象以前那样,通过一个一个IO去控制,可能没有什么特别的,那样也不能展现出micropython的特点。不知道大家是否用过Mbed中的BusOut()函数,它可以将任意多个GPIO组合起来,然后一起控制,使用起来特别方便,如:

BusOut myleds(LED1, LED2, LED3, LED4);

int main() {

while(1) {

for(int i=0; i<16; i++) {

myleds = i;

wait(0.25);

}

}

}

在micropython中,我们同样可以实现这样的功能:

from machine import Pin

class Bus(object):

def __init__(self, bus):

self.pins = [Pin(i) for i in bus]

def Out(self, val):

d = 0

n = len(self.pins)-1

for i in self.pins:

d = val%2

val=val>>1

self.pins[n].init(Pin.OUT)

self.pins[n].value(d)

n = n - 1

使用Bus类,就可以实现类似Mbed的BusOut、BusIn功能,非常实用(上面的代码中没有包含BusIn的功能,其实已经完成了,只是为了重点讲BusOut把它删除了)。需要几个GPIO就定义几个,不一定需要是8的倍数。

在定义一个Bus对象,在STM32F7DISCO开发板上是这样:

b=Bus(['B15','A8','G6','B4','G7','I0','H6','I3','I2','A15','A0','F10','F9','F8','F7','F6'])

如果在ESP8266上,可以定义成:

b=Bus([12, 16, 15, 13])

在做一个简单的演示函数,产生伪随机数,然后用Bus.Out去控制:

def run(n):

x=1

while(1):

b.Out(~x)

t = ((x>>13)%2)^((x>>12)%2)

x=(x<<1) | t

pyb.delay(n)

上面b.Out输出前先取反,这是因为LED采用了共阳的接法,输出1时LED灭,输入0时LED才亮。

最后运行,看看效果,还不错吧。

run(50)

如果改用其它函数或参数,就会产生另外的效果,大家可以自己试试。

最后上传运行的动画效果

以上图文内容均是EEWORLD论坛网友:dcexpert 原创,在此感谢。

欢迎微博@EEWORLD

如果你也写过此类原创干货请关注微信公众号:EEWORLD(电子工程世界)回复“投稿”,也可将你的原创发至:bbs_service@eeworld.com.cn,一经入选,我们将帮你登上头条!

与更多行业内网友进行交流请登陆EEWORLD论坛。

原文链接:,转发请注明来源!