目录:
显示(display)
from microbit import * display.scroll("Hello World!") # 让microbit滚动显⽰字符串“hello world!”
Images(图像)
Microbit配备5*5格红⾊LED灯,使⽤micropython,让你领略艺术图案。
Micropython拥有许多内置图⽚⽤于显⽰。
例如:开发板显⽰图⽚HAPPY
内置Image图⽚
from microbit import * display.show(Image.HAPPY)
Classes(类)
class microbit.Image(string) class microbit.Image(width=None,height=None,buffer=None)
width() #返回图像的列数 height() #返回图像的行数 set_pixel(x,y,value) #设置x列y⾏的像素亮度为value,在0(暗)和图9(亮)之间.这种⽅法不能改变任何内置的图像,否则会异常,因为内置图像是只读的,例如 Image.HEART 。 get_pixel(x,y) #返回x列y⾏的像素亮度值,范围在0(暗)到9(亮)之间 shift_left(n) #返回通过将图⽚左移n位⽽得到的新图像 shift_right(n) #返回通过将图⽚右移n位⽽得到的新图像 shift_up(n) #返回通过将图⽚上移n位⽽得到的新图像 shift_down(n) #返回通过将图⽚下移n位⽽得到的新图像 crop(x,y,w,h) #从x列y⾏将图像裁剪为宽度w,⾼度h的新图像 copy() #返回该图像复制的新图像 invert() #通过反转图像中像素的亮度来返回新图像 fill(value) #将图像中所有像素的亮度设置为 value ,必须在0(暗)和9(亮)之间,这种⽅法会在任何内置的只读图像调⽤时发⽣异常,例如Image.HEART blit(src,x,y,w,h,xdest=0,ydest=0) #将图像 src 中的 x , y , w , h 指定的矩形图像复制到这个图像中, xdest , ydest 为⽬标图 像中的坐标。
shift_left() , shift_right() , shift_up() , shift_down() 和 crop() 可以通过使 ⽤ blit() 全部实现。例, img.crop(x,y,w,h) 可以实现为: def crop(self, x, y, w, h): res = Image(w, h) res.blit(self, x, y, w, h) return res

Image.HEART
Image.HEART_SMALL
Image.HAPPY
Image.SMILE
Image.SAD
Image.CONFUSED
Image.ANGRY
Image.ASLEEP
Image.SURPRISED
Image.SILLY
Image.FABULOUS
Image.MEH
Image.YES
Image.NO
Image.CLOCK12,Image.CLOCK11,Image.CLOCK10,Image.CLOCK9,Image.CLOCK8,Image.CLOCK7,Image.CLOCK6,Image.CLOCK5,Image.CLOCK4,Image.CLOCK3,Image.CLOCK2,Image.CLOCK1
Image.ARROW_N,Image.ARROW_NE,Image.ARROW_E,Image.ARROW_SE,Image.ARROW_S,Image.ARROW_SW,Image.ARROW_W,Image.ARROW_NW
Image.TRIANGLE
Image.TRIANGLE_LEFT
Image.CHESSBOARD
Image.DIAMOND
Image.DIAMOND_SMALL
Image.SQUARE
Image.SQUARE_SMALL
Image.RABBIT
Image.COW
Image.MUSIC_CROTCHET
Image.MUSIC_QUAVER
Image.MUSIC_QUAVERS
Image.PITCHFORK
Image.XMAS
Image.PACMAN
Image.TARGET
Image.TSHIRT
Image.ROLLERSKATE
Image.DUCK
Image.HOUSE
Image.TORTOISE
Image.BUTTERFLY
Image.STICKFIGURE
Image.GHOST
Image.SWORD
Image.GIRAFFE
Image.SKULL
Image.UMBRELLA
Image.SNAKE
这⾥有很多图⽚,你可以使⽤这些图⽚来代替 HAPPY ,只需要将Image.HAPPY 替换成你想要显⽰的图 ⽚即可。
Operations(操作)
repr(image) #获取图像的字符串表⽰ str(image) #将图像转化为字符串 image1+image2 #将两个图像对应的像素相加,得到新图像 image*n #通过乘以每个像素的亮度创建⼀个新的图像
DIY Images(⾃⼰⼿动制作图⽚)
如果你想在microbit开发板上显⽰你⾃⼰设计的图⽚,很简单。
每⼀个LED灯都有⼗种模式可以设置。如果设置为0,则关闭该LED灯;如果设置为9则LED灯亮度最⼤;
1-8可设置LED灯不同的亮度,值越⼤,亮度越⼤。
所以,你可以创建⼀个新图像,如下所⽰:
from microbit import * boat=Image("05050:" #第⼀⾏的五个灯,每个值对应每个灯的亮度(0为关闭LED灯) "05050:" "05050:" "99999:" "09990") display.show(boat)
你也可以写成这样:
boat=Image("05050:05050:05050:99999:09990")
Animation(动态图)
显⽰动态图⽚,只需要使⽤图像列表即可
列表的写法如下:
列表中也可以包含不同的数据类型,如下,包含字符串,浮点数,内置图⽚: mixed_up_list=["hello!",1.234,Image.HAPPY] 我们可以使⽤图⽚动画,例如 Image.ALL_CLOCKS 和 Image.ALL_ARROWS : from microbit import * display.show(Image.ALL_CLOCKS,loop=True,delay=100) 使⽤ display.show 来显⽰这个动画, Image.ALL_CLOCKS 中包含⼀个图⽚列表, loop 表⽰循环显⽰, delay=100 表⽰每隔100毫秒改变⼀次
创建自己的动画:
from microbit import * boat1=Image("05050:05050:99999:09990:00900") boat2=Image("00000:05050:05050:99999:09990") boat3=Image("00000:00000:05050:05050:99999") boat4=Image("00000:00000:00000:05050:05050") boat5=Image("00000:00000:00000:00000:05050") boat6=Image("00000:00000:00000:00000:00000") while True: all_boats=[boat1,boat2,boat3,boat4,boat5,boat6] display.show(all_boats,delay=200)
按钮
microbit的LED左右两侧各有⼀枚按键,标记为A和B。我们可以通过⼀些⽅法让microbit在按钮被按下时做出反应。
属性
button_a:A按钮,按钮左下⾓有A字符
button_b:B按钮,按钮右上⾓有B字符
类和⽅法
注意:⽤户不可创建新button,两个button都是已经内置,且只能使⽤这两个button。
is_pressed() #如果指定的按钮被按下返回 True ,否则返回 False was_pressed() #如果指定的按钮在开机或复位之后被按下过,则返回 True ,否则返回 False get_presses() #返回开机或复位后,button被按下的次数,并且调⽤此⽅法后,会将计数置0 示例: from microbit import * sleep(10000) display.scroll(str(button_a.get_presses())) 这个程序的功能:记录10秒内,A按键被按下的次数,并在10秒后将次数滚动显⽰出来 虽然这是⼀个没什么⽤的程序,但是它引⼊了⼀些新的点: 1. sleep() :设置microbit睡眠的时间,以毫秒为单位, sleep(10000) 则是睡眠10秒。 2. 有⼀个 button_a 对象被调⽤,通过它的 get_presses() ⽅法得到它被按下的次数。 由于 get_presses() 返回的是⼀个整数,但是 display.scroll() 只接收字符,所以我们需要将整数转 换为字符串。
事件循环
通常你需要你的程序挂起来等待某事发⽣或者⼀直运⾏。为此,您可以循环⼀段代码。
该代码定义了如何对某些预期事件(如按下按钮)做出反应。
from microbit import * while running_time() < 10000: display.show("1") display.show("2")
running_time() 返回⾃设备启动以来的毫秒数。
这段程序检测microbit的启动时间,如果⼩于10秒,显⽰"1",⼤于10秒,显⽰"2"。
处理事件
from microbit import * while True: if button_a.is_pressed(): display.show(Image.HAPPY) elif button_b.is_pressed(): break else: display.show(Image.SAD) display.clear() is_pressed() ⽅法只产⽣两个结果:True(正确)或False(错误)。 如果你按下按钮返回 True ,否则返回 False 。上⾯的代码⽤语⾔表述,“永远执⾏下⾯的循环代码,如果按下按钮A,就显⽰⼀个笑脸,否则如果按钮B被按下就跳出循环,否则显⽰⼀个悲伤的脸”,我们跳出 了循环(停⽌程序循环阶段)⽤break声明。最后,当网络宠物死亡时,我们⽤clear()清除屏幕。
Input/Output(输⼊/输出)
microbit的底部边缘有⾦属条,这些是输⼊与输出引脚(也称为I/O引脚)
⼀些引脚⽐其他的⼤,可以⽤鳄⻮夹夹住,这些引脚的标记分别是: 0 , 1 , 2 , 3V 和 GND 。
如果将microbit与拓展板拼接上,可以通过导线连接其他设备。
microbit的每个引脚都有编号,也是⼀个对象,和button相似,所以如果要调⽤N引脚,则可以⽤pinN表⽰。
总共有19个引脚,编号为0-16和19-20。引脚17和18不可⽤。
例如,下⾯的程序将根据引脚0上的数字输⼊信号改变microbit上的显⽰:
from microbit import * while True: if pin0.read_digital(): display.show(Image.HAPPY) else: display.show(Image.SAD)
这些引脚可以作为microbit模块的属性来使⽤:microbit.pin0- microbit.pin20
这些引脚可以作为microbit模块的属性来使⽤:microbit.pin0- microbit.pin20

脉冲宽度调制
板⼦上的引脚输出模拟信号的⽅式与⾳频扬声器不同,它不能够调整引脚上的电压,这些引脚只⽀持3.3V输出,或者被拉低为0V。但是我们仍然可以通过很快地切换电压的⾼低来控制LED的亮度或电动机的速
度。这种技术称为脉宽调制(PWM),这就是下⾯的 write_analog() ⽅法。
以上您可以看到三种不同PWM信号的图表。这些都具有相同的周期,但它们具有不同的占空⽐(⾼电平占整个周期的⽐例)。
第⼀个由 write_analog(511) ⽣成,因为它的占空⽐为50%,⾼低电平各占⼀半,其结果和1.65V差不多。
第⼆个由 write_analog(255) ⽣成,占空⽐为25%。它的效果如同引脚上输出0.825V。
第三个由 write_analog(767) ⽣成,信号占空⽐为75%。它的电压是第⼆个信号的三倍,相当于在引脚上输出2.475V。
这适⽤于诸如电机本⾝具有很⼤惯性的设备或LED,但是在⽣成声波时效果不会很好。
这个板⼦本⾝只能产⽣⽅波的声⾳,这听起来就像是以前的电脑游戏(主要是因为这些游戏的声⾳就是⽅波产⽣的)。
类
有三种引脚,它们的⽤途不同,下⾯会列出它们的类。注意,它们形成层次结构,因此每个类都具有上⼀个类的所有功能。
注意:这些类已经被实例化,您⽆法创建新的实例。您只能使⽤已提供的实例对象,代表电路板上的物理引脚。
class microbit.MicroBitDigitalPin
read_digital() #如果引脚为⾼电平则返回1,如果引脚为低电平则返回0 write_digital(value) #如果 value 为1,将引脚设置为⾼电平;如果为0,就将其设置为低电平
class microbit.MicroBitAnalogDigitalPin read_analog() #读取引脚的电压,并将其作为0(0V)和1023(意为3.3V)之间的整数返回 write_analog(value) #将 value 作为PWM值输出。value可以是0(0%占空⽐)与1023(100%占空⽐)之间的数 set_analog_period(period) #将PWM信号的周期设置为 period 毫秒,最⼩有效值为1ms set_analog_period_microseconds(period) #将PWM信号的周期设置为 period 微秒。最⼩有效值为256μs
class microbit.MicroBitTouchPin is_touched() #如果引脚被触摸返回 True ,否则返回 False
引脚的模式会⾃动配置,当你调⽤ read_analog / read_digital / is_touched 时,会变为input模式。
在 read_digital 模式时,你可以通过 set_pull 来改变默认的拉模式,拉模式: NO_PULL ,PULL_DOWN , PULL_UP 。
注意:
microbit仅在引脚0,1和2上安装了外部弱上拉(10M),以便触摸感应⼯作。可以参阅边缘连接器数据表:http://tech.microbit.org/hardware/edgeconnector_ds/
检测引脚是否被触摸:
from microbit import * while True: if pin0.is_touched(): display.show(Image.HAPPY) else: display.show(Image.SAD) 当Pin0引脚与GND连接时,会显⽰⼀张笑脸,否则显⽰⼀张哭脸
哔哔声和杂⾳
我们可以在microbit上附加⼀个扬声器,让它发声
引脚0的电线应连接到扬声器上的正极连接器,并⽤导线将GND连接到负极
from microbit import * while True: pin0.write_digital(1) sleep(20) pin0.write_digital(0) sleep(480) 在这⾥1表⽰开,0表⽰关。这个程序是⼀个⽆限循环,让蜂鸣器发声20毫秒,然后安静480毫秒,然后循 环,重新开始,所以你会在1秒钟内听到两次哔哔声
Music(⾳乐)
Microbit开发板拥有⼀个⾳乐模块。如果Pin0和GND连接扬声器,调⽤相应⽅法,可以播放⼀些⾳乐
播放⾳乐:
import music music.play(music.NYAN)
注意:导⼊music模块;它包含⽣成和控制声⾳的⽅法
music.set_tempo(ticks=4,bpm=120) 设置播放的速度,⼀个⾳节(表⽰为整数)构成⼀个节拍。每个节拍将以每分钟的特定频率播放。 建议的默认值允许以下有⽤的⾏为: 45 music.set_tempo() 将速度设为默认值:ticks = 4,bpm = 120。 music.set_tempo(ticks=8) 改变⼀个节拍的“定义”。 music.set_tempo(bpm=180) 只改变速度。 计算出毫秒的刻度⻓度⾮常简单: 60000/bpm/ticks_per_beat 。默认值 为 60000/120/4=125milliseconds 或 1beat=500milliseconds music.get_tempo() 获取当前节奏作为整数元组: (ticks,bpm) music.play(music,pin=microbit.pin0,wait=True,loop=False) music 包含上⾯定义的⾳乐DSL的播放。 如果 music 是⼀个字符串,它将被预期为单个注释,例如 'c1:4' 。 如果 music 被指定为⾳符列表(如上⾯⾳乐DSL中的部分所定义的),则将它们连续地播放出来。 在这两种情况下,在播放⾳乐之前,将 duration 和 octave 重置为默认值。 指定输出引脚 microbit.pin0 。 如果 wait 设置 True ,则阻塞。 如果loop设置为True,则重复播放直到stop被调⽤(⻅下⽂)或被阻塞中断。 music.pitch(frequency,len=-1,pin=microbit.pin0,wait=True) 在指定的时间(单位:毫秒)内播放1个⾳调。例如,如果 frequency 为440, len 为1000,那么我们 听到⼀种⾳调(frequency为440)⼀秒钟。 如果 wait 设置为 True ,则此函数处于阻塞状态。 如果 len 为负,⾳调将持续播放,直到阻塞被中断。 music.stop(pin=microbit.pin0) 停⽌给定针脚上的所有⾳乐播放 music.reset() 以下列⽅式重置以下属性的状态: ticks=4 bpm=120 duration=4 octave=4
Micropython包含许多内置⾳律,你可以使⽤如下旋律演⽰:
music.DADADADUM---⻉多芬C⼩调第五交响曲开幕 music.ENTERTAINER---Scott Joplin的Ragtime经典“The Entertainer”的开场⽚段 music.PRELUDE---在JSBach的48个Preludes and Fugues的C⼤调第⼀个序曲开幕 music.ODE---⻉多芬第九交响曲“DOD”中的“欢乐”主题 music.NYAN---Nyan Cat主题 music.RINGTONE---听起来像⼿机铃声的东西。⽤于指⽰传⼊的消息 music.FUNK---⼀个时髦的低⾳线 music.BLUES---boogie-woogie 12杆蓝调散步低⾳ music.BIRTHDAY---“祝你⽣⽇快乐” music.WEDDING---⽡格纳歌剧“Lohengrin” music.FUNERAL---“葬礼游⾏”,⼜称FrédéricChopin的钢琴奏鸣曲“B”⼩调中的第2号钢琴奏鸣曲 music.PUNCHLINE---⼀个有趣的⽚段 music.PYTHON---约翰·菲利普·苏萨(John Philip Sousa)的“⾃由钟” music.BADDY---沉默的电影时代⼊⼝的⼀个坏蛋 music.CHASE---沉默的电影时代追逐的场景 music.BA_DING---⼀些事情的简短信号 music.WAWAWAWAA---⾮常难过的⻓号 music.JUMP_UP---⽤于游戏,指⽰向上移动 music.JUMP_DOWN---⽤于游戏,表⽰向下移动 music.POWER_UP---表⽰成就解锁的狂欢 music.POWER_DOWN---表⽰失去成就的悲伤狂欢
创建⾃⼰的曲调很容易!
每个⾳符表⽰为⼀串字符是这样的:
NOTE[octave][:duration]
每⼀个⾳符都有⼀个名称(⽐如C调或F调),⾳阶(向Micropython传递⾳符⾳调⾼低)和周期(⾳调的持续时间)。⾳阶由数字表⽰。0是最低阶,4代表中⾳C调,8是最⾼⾳阶。你应该不会⽤到8,除⾮你想魔⾳穿⽿。周期也是由数字表⽰,数字越⼤持续时间越⻓。不同周期值之间互有联系,⽐如说周期4的持续时间是周期2的两倍等等。如果你调⽤周期R,Micropython会在指定周期内不发声。
例如, “A1:4” 表⽰1个为A的⾳符在⼋度⾳阶持续播放“4”周期。
列出的基调来创建⼀个旋律(相当于创建⼀个动画的图像)。例如,下⾯是如何使MicroPython播放“FrereJaques”:
import music tune=["C4:4","D4:4","E4:4","C4:4","C4:4","D4:4","E4:4","C4:4","E4:4", "F4:4","G4:8","E4:4","F4:4","G4:8"] music.play(tune)
Sound Effects(⾳效)
Micropython可以让你制作曲调,例如,制作⼀个警笛声:
import music while True: for freq in range(880,1760,16): music.pitch(freq,6) for freq in range(1760,880,-16): music.pitch(freq,6)
上⾯例⼦中的range⽤户循环改变曲调。Range(800,1760,16)表⽰在800到1760之间,每循环⼀次,freq增加16.(-16每循环⼀次,减少16)。
注意music.pitch这个实例如何使⽤。它需要⼀个频率,例如,频率设置为440,⽤于调出管弦乐中的A调。
上⾯例⼦中的range⽤户循环改变曲调。Range(800,1760,16)表⽰在800到1760之间,每循环⼀次,freq增加16.(-16每循环⼀次,减少16)。
Examples
from microbit import * import music # play Prelude in C. notes=['c4:1','e','g','c5','e5','g4','c5','e5','c4','e','g','c5','e5','g4','c5','e5','c4','d','g','d5','f5','g4','d5','f5','c4','d','g','d5','f5','g4','d5','f5','b3','d4','g', 'd5','f5','g4','d5','f5','b3','d4','g','d5','f5','g4','d5','f5','c4','e','g','c5','e5', 'g4','c5','e5','c4','e','g','c5','e5','g4','c5','e5','c4','e','a','e5','a5','a4','e5','a5', 'c4','e','a','e5','a5','a4','e5','a5','c4','d','f#','a','d5','f#4',' a','d5','c4','d','f#','a','d5','f#4','a','d5','b3','d4','g','d5','g5','g4','d5','g5','b3', 'd4','g','d5','g5','g4','d5','g5','b3','c4','e','g','c5','e4','g','c5','b3','c4','e','g','c5' ,'e4','g','c5','b3','c4','e','g','c5','e4','g','c5','b3','c4','e','g','c5','e4','g','c5','a3', 'c4','e','g','c5','e4','g','c5','a3','c4','e','g','c5','e4','g','c5','d3','a','d4','f#','c5' ,'d4','f#','c5','d3','a','d4','f#','c5','d4','f#','c5','g3','b','d4','g','b','d','g','b','g3', 'b3','d4','g','b','d','g','b'] music.play(notes)
Random(随机)
有时候你想预留⼀些⾃由发展的可能性,希望设备能够⾃由操作。
MicroPython提供了⼀个random模块,该模块基于Python标准库中的random模块,它包含⽣成随机数的函数。
警告:因为底层⽣成器函数最多返回30位,n可能只有1-30之间的值。
import random random.getrandbits(n) #以⻓整型形式返回n个随机位。 警告: 因为底层⽣成器函数最多返回30位,n可能只有1-30之间的值。 random.seed(n) #⽤⼀个已知的整数初始化随机数产⽣器。这将从给定的起始状态开始,有⼀定规律的给出随机值 random.randint(a,b) #返回⼀个在a和b之间的随机整数N,包括b。 random.randrange(n) #返回0到n之间的随机选择的整数,不包括n。 random.randrange(a,b) #返回⼀个在a和b之间的随机整数N,不包括b random.randrange(a,b,step) #返回在a和b之间的随机整数N,step为递增基数 random.choice(seq) #从⾮空序列返回⼀个随机元素seq。如果seq是空的则会报出误差指⽰ random.random() #返回范围[0.0,1.0]中的⼀个随机⼩数(浮点数) random.uniform(a,b) #返回⼀个a和b之间的随机浮点数N。
你可以轻松地实现随机选择,例如:
from microbit import * import random names = ["Mary", "Yolanda", "Damien", "Alia", "Kushal", "Mei Xiu", "Zoltan" ] display.scroll(random.choice(names)) 定义的列表中有7个名字。最后⼀⾏是⼀个嵌套。这个 random.choice() ⽅法返回 names 列表中随机选 择的⼀个对象。 然后将这个对象作为 display.scroll() ⽅法的参数,滚动显⽰出来。
随机数字
随机数是⾮常有⽤的,⽐如我们可以做⼀个虚拟的骰⼦
from microbit import * import random display.show(str(random.randint(1, 6))) 每⼀次下载这个程序的时候,都会显⽰⼀个在1到6之间的随机数
如果你想选择⼀个⼩数(也称为浮点数),可以⽤ random.random() ⽅法。他只能选择0到1之间的浮点数。如果你需要其他的⼩数可以这样:
from microbit import * import random answer = random.randrange(100) + random.random() display.scroll(str(answer))
Movement(移动)
microbit⾃带三轴加速计:
X:左右运动
Y:前后运动
Z:上下运动
每个⽅向都有⼀种⽅法,它返回⼀个正数或负数,当读数为0时,你是沿着那个特定轴的“⽔平”。
例如,这⾥有⼀个⾮常简单的例⼦,它使⽤ get_x() ⽅法来测量设备在X轴上的⽔平:
from microbit import * while True: reading = accelerometer.get_x() if reading > 20: display.show("R") elif reading < -20: display.show("L") else: display.show("-") 如果你把设备固定住,它应该显⽰ - ,然后向左或向右旋转它会分别显⽰ L 和 R
我们想要设备能够不断地根据变化作出反应,因此我们使⽤while死循环。
在循环体内部做的第⼀件事是沿着X轴的测量,叫做读数。因为加速度计很灵敏,所以我们的测量范围是+/-20。如果读数在-20到20之间,那么我们认为它是⽔平的。对于每⼀种情况,我们使⽤ show() 来显⽰
相应的字符。
还有⽤于Y轴的 get_y() ⽅法和Z轴的 get_z() ⽅法。
⼿机的⼀些重⼒感应游戏,使⽤的加速度计和上⾯的程序是⼀样的。游戏控制器包含加速计,帮助你在游戏中操控和移动。
控制播放⾳乐:
microbit可以和不同的设备连接在⼀起,实现不同的功能。
例如,让我们把它变成⼀种乐器。
连接扬声器,就像在⾳乐教程中⼀样。使⽤鳄⻥夹将引脚pin0和GND连接到扬声器的正极和负极。
如果我们从加速度计读取数据并将其作为⾳调播放,会发⽣什么?我们来看看
from microbit import * import music while True: music.pitch(accelerometer.get_y(), 10)
⾮常简单。我们将Y轴读取的值传⼊ music.pitch() ⽅法。我们只让它播放10毫秒,因为我们希望⾳调随着设备的翻转⽽迅速改变。由于该程序处于while循环,因此它会⼀直对Y轴上的变化做出反应。 music.pitch() 给扬声器传⼊特定频率的⾳调,并播放指定时间。