最后更新于2020-11-24
更新摘要
01 Micropython API
『进入了Micropython的世界,这一节将为你提供丰富的接口,帮助你用喵家编程硬件做更多的事情』
导入meowbit库
只有导入了meowbit库,才能使用完整的功能API噢😶
# Micropython中的导包缩写形式,可以少些一些代码
from meowbit import *
screen.text('hello world')
按键
喵比特上有6个可编程按键,布局贴合游戏机
sensor.btnValue(btn)
返回按键状态值,数字信号。参数:
- btn: 取值 ‘a’、’b’、’up’、’down’、’left’、’right’,分别代表6个按键
sensor.btnTrig[btn] = fn
按键的中断事件,可以给按键按下绑定一个执行函数。参数:
fn:中断时要执行的函数 :::warning 这个自定义中断函数内不要做
延时太长或执行内容太多的工作
- 带有内存分配的操作,比如新建一个变量 :::
示例程序📋:
# 按键A控制LED1开关
from meowbit import *
while 1:
if(sensor.btnValue('a')):
led1.on()
else:
led1.off()
# 按键A的中断事件控制LED1亮灭
from meowbit import *
import time
def fn():
led1.toggle()
time.sleep_ms(500) # delay(ms)/消除机械抖动
sensor.btnTrig['a'] = fn
sensor.startSchedule() # 不管开了几个中断线程,这条只需一次
LED
喵比特右上角有2颗LED,分别是绿色led1和红色led2
led1.on() / led1.off()
开关控制
led1.toggle()
状态切换,根据当前该灯的状态去另一个状态
led1.intensity(brightness)
更改LED灯的亮度
- brightness:0~255(暗~亮,默认255,建议50)
示例程序📋:
# 开关_开机绿灯闪烁5次
from meowbit import *
from time import sleep
for i in range(5):
led1.on()
sleep(1)
led1.off()
sleep(1)
# 状态切换_开机红灯闪烁5次
from meowbit import *
from time import sleep
for i in range(5): # 红色灯不太明显,可能需要拨开套子看
led2.toggle()
sleep(1)
# 状态切换_从暗到亮再到灭
from meowbit import *
import time
for i in range(256):
led1.intensity(i)
time.sleep_ms(10)
for i in range(255, 0, -1):
led1.intensity(i)
time.sleep_ms(10)
蜂鸣器
无源蜂鸣器是采用定时器模拟PWM驱动发声
buzzer.tone(freq, d = 0.5)
频率对应音调表
- freq:频率,对应音调
- d:持续时间(单位秒),默认为0.5s,当d=-1时,设置为持续发声
buzzer.note(note, rest = 0.5)
- note:0~130共12个八度,12的整处倍数为C调
- rest:持续时间(单位秒),默认为0.5s
buzzer.rest(rest)
静音一定时间
- rest:持续时间(单位秒)
buzzer.melody(m, bpm = 120)
播放一段旋律
- bpm:拍速,默认为120,即120拍/分钟
- m:m=octave:duration=音符+八度音阶[默认为4]:滴答音的次数[默认4],规定duration = 4为1个四分音符,并且滴答音单位时长是由bpm决定的,可为任意时长
- 当c4:4在bpm为默认情况下,效果为响1拍(即0.5s)
- 当c4:8在bpm为默认情况下,效果为c4:4时长的2倍
- 改变bpm为60,c4:4的时长变为1s
- 固件内保留了以下3个简单音效 | CORRECT | “c6:1 f6:2” | | —- | —- | | ERROR | “a3:2 r a3:2” | | NOTICE | “d5:1 b4:1” | | DADAD | “r4:2 g g g eb:8 r:2 f f f d:8” | | ENTERTAINER | “d4:1 d# e c5:2 e4:1 c5:2 e4:1 c5:3 c:1 d d# e c d e:2 b4:1 d5:2 c:4” | | PRELUDE | “c4:1 e g c5 e g4 c5 e c4 e g c5 e g4 c5 e c4 d g d5 f g4 d5 f c4 d g d5 f g4 d5 f b3 d4 g d5 f g4 d5 f b3 d4 g d5 f g4 d5 f c4 e g c5 e g4 c5 e c4 e g c5 e g4 c5 e” | | ODE | “e4 e f g g f e d c c d e e:6 d:2 d:8 e:4 e f g g f e d c c d e d:6 c:2 c:8” | | RING | “c4:1 d e:2 g d:1 e f:2 a e:1 f g:2 b c5:4” | | FUNK | “c2:2 c d# c:1 f:2 c:1 f:2 f# g c c g c:1 f#:2 c:1 f#:2 f d#” | | BLUES | “c2:2 e g a a# a g e c2:2 e g a a# a g e f a c3 d d# d c a2 c2:2 e g a a# a g e g b d3 f f2 a c3 d# c2:2 e g e g f e d” | | BIRTHDAY | “c4:3 c:1 d:4 c:4 f e:8 c:3 c:1 d:4 c:4 g f:8 c:3 c:1 c5:4 a4 f e d a#:3 a#:1 a:4 f g f:8” | | WEDDING | “c4:4 f:3 f:1 f:8 c:4 g:3 e:1 f:8 c:4 f:3 a:1 c5:4 a4:3 f:1 f:4 e:3 f:1 g:8” | | PUNCHLINE | “c4:3 g3:1 f# g g#:3 g r b c4 “ | | BADDY | “c3:3 r d:2 d# r c r f#:8” | | CHASE | “a4:1 b c5 b4 a:2 r a:1 b c5 b4 a:2 r a:2 e5 d# e f e d# e b4:1 c5 d c b4:2 r b:1 c5 d c b4:2 r b:2 e5 d# e f e d# e” | | BA_DING | “b5:1 e6:3” | | WAWA | “e3:3 r:1 d#:3 r:1 d:4 r:1 c#:8” | | JUMP_UP | “c5:1 d e f g” | | JUMP_DOWN | “g5:1 f e d c” | | POWER_UP | “g4:1 c5 e g:2 e:1 g:3” | | POWER_DOWN | “g5:1 d# c g4:2 b:1 c5:3” |
buzzer.stop()
蜂鸣器停止播放,可以放置于按键中断里强行中断播放旋律,也可以和持续播放旋律配合使用制作按下发声抬起收声的效果
示例程序📋:
# 展示所有蜂鸣器函数效果,按键A能中断播放
from meowbit import *
def stopBuzzer():
buzzer.stop()
sensor.btnTrig['a'] = stopBuzzer # 绑定中断函数
sensor.startSchedule() # 打开中断线程
buzzer.tone(262, 1)
buzzer.rest(1)
buzzer.note(60, 1)
buzzer.rest(1)
buzzer.melody("d r d4:4")
buzzer.rest(1)
buzzer.melody(CORRECT) # 当播放这段旋律的时候,按下案件A,执行停止蜂鸣器操作,声音停止
# 按键A按下蜂鸣器响起,松开蜂鸣器收声
from meowbit import *
while 1:
if sensor.btnValue('a'):
buzzer.tone(240, -1)
else:
buzzer.stop()
温度传感器
sensor.getTemp()
获取温度数值,单位是摄氏度
示例程序📋:
from meowbit import *
screen.sync = 0 # 0为关闭同步刷新,默认为1(打开)则每次screen单条函数都会调用一次tft.show(fb),会造成闪屏
while 1:
screen.fill(1)
tempValue = sensor.getTemp()
screen.text('Temperature:' + str(tempValue), 20, 50)
screen.refresh()
光线传感器
sensor.getLight()
亮度传感器检测环境明暗程度,返回值为模拟量0~4096,随着光线越强数值越大
示例程序📋:
from meowbit import *
screen.sync = 0 # 0为关闭同步刷新,默认为1(打开)则每次screen单条函数都会调用一次tft.show(fb),会造成闪屏
while 1:
screen.fill(0)
lightValue = sensor.getLight()
screen.text('brightness' + str(lightValue), 20, 50)
screen.refresh()
陀螺仪
sensor.acc轴()
返回x,y,z三轴各自当加速度值,单位为g(m/s)。参数:
- 轴:X、Y、Z 需要大写
sensor.gyro轴()
返回x,y,z三轴各自的轴转向加速度,单位为g(角度/s)。参数:
- 轴:X、Y、Z 需要大写
:::warning
加速度轴和转向加速的方向如下图所示,箭头所指的方向为对应轴速度的正方向(屏幕朝向的方式
:::
sensor.roll()
横滚,返回单位为角度,如图所示
sensor.pitch()
旋转,返回单位为角度,如图所示
sensor.gesture(ges)
姿态,返回值为布尔类型。参数:
- ges:’shake’ 摇晃、’freefall’ 自由落体、’tilt_up’ 后倾、’tilt_down’ 前倾、’tilt_left’ 左倾、’tilt_right’ 右倾、’face_up’ 朝上、’face_down’ 朝下 :::warning 倾斜和朝向的参考物为手持正对喵比特时的屏幕 :::
sensor.gesTrig[ges] = fn
姿态中断事件,档设定的姿态达到时会出发自定义的中断函数。参数:
ges:’shake’ 摇晃、’freefall’ 自由落体、’tilt_up’ 后倾、’tilt_down’ 前倾、’tilt_left’ 左倾、’tilt_right’ 右倾、’face_up’ 朝上、’face_down’ 朝下 :::warning 需要注意的是这里参数是使用 [ ]包裹 :::
fn:自定义函数 :::warning 自定义函数的定义需要注意:
- 这个函数内容执行应尽量短并且耗时短
- 函数不允许有任何的内存申请,如:a = i+1
- 如需要使用全局变量,除了提前定义一个全局变量外,函数内还需要用global修饰 :::
示例程序📋:
# 测试所有相关返回值,打印到屏幕上
from meowbit import *
screen.sync = 0
while 1:
screen.fill(0) #清屏操作
screen.textCh('轴加速度:x/y/z', 20, 10, 1, (168, 233, 74))
screen.text(round(sensor.accX(), 2), 10, 30)
screen.text(round(sensor.accY(), 2), 60, 30)
screen.text(round(sensor.accZ(), 2), 110, 30)
screen.textCh('转向加速度:x/y/z', 10, 50, 1, (74, 233, 168))
screen.text(round(sensor.gyroX(), 2), 10, 70)
screen.text(round(sensor.gyroY(), 2), 60, 70)
screen.text(round(sensor.gyroZ(), 2), 110, 70)
screen.textCh('横滚:' + str(round(sensor.roll())), 20, 90, 1,(233, 74, 168))
screen.textCh('旋转:' + str(round(sensor.pitch())), 20, 110, 1, (233, 168, 74))
screen.textCh('屏幕朝上', 100, 95, 1, (74, 168, 233))
screen.text(sensor.gesture('face_up'), 105, 110)
screen.refresh()
屏幕模拟点阵
display.show(list)
- list:25个元素的数组,顺序为从上到下从左到右分别各自表示模拟点阵上的25个点的亮灭情况
lis = [0, 0, 1, 0, 0
0, 0, 1, 0, 0
0, 0, 1, 0, 0
0, 0, 1, 0, 0
0, 0, 1, 0, 0]
:::info
运行display.show(lis)后可以看到屏幕显示1
:::
from meowbit import *
import time
HEART = [0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,1,0,0]
HEART_SMALL = [0,0,0,0,0,0,1,0,1,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0]
YES = [0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0]
NO = [1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1]
HAPPY = [0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,1,1,1,0]
SAD = [0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,1]
CONFUSED = [0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1]
ANGRY = [1,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1]
ASLEEP = [0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0]
SURPRISED = [0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0]
SILLY = [1,0,0,0,1,0,0,0,0,0,1,1,1,1,1,0,0,1,0,1,0,0,1,1,1]
FABULOUS = [1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,1,0,1,0,0,1,1,1,0]
MEH = [1,1,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0]
TSHIRT = [1,1,0,1,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0]
ROLLERSKATE = [0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0]
DUCK = [0,1,1,0,0,1,1,1,0,0,0,1,1,1,1,0,1,1,1,0,0,0,0,0,0]
HOUSE = [0,0,1,0,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1,0,0,1,0,1,0]
TORTOISE = [0,0,0,0,0,0,1,1,1,0,1,1,1,1,1,0,1,0,1,0,0,0,0,0,0]
BUTTERFLY = [1,1,0,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1,1,1,1,1,0,1,1]
STICKFIGURE = [0,0,1,0,0,1,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1]
GHOST = [0,1,1,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1]
SWORD = [0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,0,0]
GIRAFFE = [1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,0,0,1,0,1,0]
SKULL = [0,1,1,1,0,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,0]
UMBRELLA = [0,1,1,1,0,1,1,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,1,0,0]
SNAKE = [1,1,0,0,0,1,1,0,1,1,0,1,0,1,0,0,1,1,1,0,0,0,0,0,0]
RABBIT = [1,0,1,0,0,1,0,1,0,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0]
COW = [1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,1,1,0,0,0,1,0,0]
display.show(HEART) # 显示爱心
time.sleep(1)
display.show(HEART_SMALL) # 显示爱心
time.sleep(1)
display.show(YES) # 显示爱心
time.sleep(1)
display.show(NO) # 显示爱心
time.sleep(1)
display.show(HAPPY) # 显示爱心
time.sleep(1)
display.show(SAD) # 显示爱心
time.sleep(1)
display.show(CONFUSED) # 显示爱心
time.sleep(1)
display.show(ANGRY) # 显示爱心
time.sleep(1)
display.show(ASLEEP) # 显示爱心
time.sleep(1)
display.show(SURPRISED) # 显示爱心
time.sleep(1)
display.show(SILLY) # 显示爱心
time.sleep(1)
display.show(FABULOUS) # 显示爱心
time.sleep(1)
display.show(MEH) # 显示爱心
time.sleep(1)
display.show(TSHIRT) # 显示爱心
time.sleep(1)
display.show(ROLLERSKATE) # 显示爱心
time.sleep(1)
display.show(STICKFIGURE) # 显示爱心
time.sleep(1)
display.show(GHOST) # 显示爱心
time.sleep(1)
display.show(SWORD) # 显示爱心
time.sleep(1)
display.show(GIRAFFE) # 显示爱心
time.sleep(1)
display.show(SKULL) # 显示爱心
time.sleep(1)
display.show(UMBRELLA) # 显示爱心
time.sleep(1)
display.show(SNAKE) # 显示爱心
time.sleep(1)
display.show(RABBIT) # 显示爱心
time.sleep(1)
display.show(COW) # 显示爱心
time.sleep(1)
display.clear()
display.scroll(text)
- text:只能是英文字符串
display.pix(x, y, color)
- x / y :分别表示模拟点阵的坐标,范围均为0~4
- color:(R, G, B) 设置颜色
display.clear()
- 清空点阵
屏幕显示
screen.refresh()
屏幕刷新显示,档屏幕屏幕的同步刷新关闭时需要用到
screen.sync = val
设置同步刷新 。参数:
- val: 1 开启、 0 关闭,默认为开启状态
screen.fill(color)
屏幕填充,填充方式可以时RGB数值或者明度,参数:
- color:
- (R,G,B):数值区间为0~255
- 明度:数值区间为0~255,常用screen.fill(0)来清屏
:::warning
坐标点(x, y)对应屏幕尺寸160x128如图所示 👀
:::
:::warning 🔎 以下使用color参数的地方均可使用
- RGB色值 :(R, G, B)
- 明度值:0~255 :::
screen.pixel(x, y, color=255)
绘制像素点。参数:
color:R红色,G绿色,B蓝色,数值范围0~255,为标准RGB色彩数值。默认不填即为白色,明度=255
screen.line(x1, y1, x2, y2, color=255)
以坐标(x1, y1)和(x2, y2)为顶点绘制线段绘制线条
screen.rect(x, y, weight, height, color=255, fill=0)
🟥 以坐标(x, y)为矩形左上角顶点,绘制weight宽度和height高度的矩形。参数:
- fill:填充功能
- 0:不填充
- 1:填充
- 默认不填为0
screen.triangle(x1, y1, x2, y2, x3, y3, color=255, fill=0)
🔺 以坐标(x1, y1)、(x2, y2)和(x3, y3)为顶点绘制三角形
screen.circle(x, y, r, color=(R, G, B), fill=0)
🔴 以坐标(x, y)为圆形绘制半径为r的圆形
screen.polygon(x, y, sides=3, r=10, th=3, rot=0, color=255, fill=0)
🔷 以坐标(x, y)为中心点,绘制变数为多边形。参数:
- sides,n:多边形边数,默认为3
- r:中心点到顶点到距离,默认10
- th:边框到厚度,默认3
- rot:旋转角度(正数为逆时针转),默认0
screen.text(text, x=0, y=0, ext=1, color=255)
在屏幕上显示非中文字符(比如数字和字母)。参数:
- 坐标为第一个字符左上角,不填默认为(0, 0)
- ext:英文字符字号,默认为1号——8x8像素。字号增大的规律为8*ext
screen.textCh(text, x=0, y=0, ext=1, color=255)
在屏幕上显示中文的字符(也包含英文及数字,但显示非中文字符的视觉上不如用screen.text( ))。参数:
- 坐标为第一个字符左上角,不填默认为(0, 0)
- ext:中文字符字号,默认为1号——12x12像素。字号增大的规律为12*ext :::warning 由于采用动态字库技术,只能通过KittenCode的上传按钮实现中文显示,无法通过REPL和在线运行方式显示 ::: ```python ‘’’ 酷炫的古诗展示 ‘’’
from meowbit import * #导入meowbit专用库 from time import sleep
存储诗词的二元数组
poem = [(‘床前明月光’),(‘疑是地上霜’),(‘举头望明月’),(‘低头思故乡’)] screen.sync = 0 screen.fill(0)
‘’’ 标题漂浮出现 ‘’’ for i in range (0,255,15): screen.fill(0) screen.textCh(“静夜思”,55,i/15,1,(0, i, i)) screen.refresh()
‘’’
诗词单独渐变出现,采用3层嵌套的for循环结构
‘’’
for i in range (0,len(poem)):
for j in range (0,len(poem[0])):
for k in range(0,255,15):
screen.textCh(poem[i][j],40+j16,40+i20,1,(k, k, k))
screen.refresh()
`screen.loadBmp(path, x=0, y=0)`<br />在屏幕上显示一张bmp格式的图片,仅支持24/32位的bmp。参数:<br />path:bmp的相对位置,一般直接将图片放在PYBFLASH盘符和main.py同目录,此时path='name.bmp'<br />坐标:不填默认图片左上角(0, 0)
📥 测试图片资源
```python
# 显示bmp
from meowbit import *
screen.loadBmp('haimian.bmp')
# 内存问题不支持使用gif
screen.loadgif
由于内存空间问题,显示gif图的API已取消了
引脚控制
p1 = MeowPin(pin, mode)
实例化引脚,设置某个引脚位特定模式。参数:
- pin:字符串类型,如’P1’
- mode:
- IN:数字输入,默认已上拉
- OUT:数字输出
- ANALOG:模拟输入
- PWM:模拟输出
getDigital()
设置为数字输入模式(mode = IN)时可用,返回值为高低电平0 / 1
'''
数字读
当P1接通GND时蜂鸣器响,否则停止
'''
from meowbit import *
p1 = MeowPin('P1',IN)
while 1:
if p1.getDigital() == 0:
buzzer.tone(240,-1)
else:
buzzer.stop()
getAnalog()
设置为模拟输入模式(mode = ANALOG)时可用,由于时12位ADC,所以返回值为0~4095
'''
模拟读
范围:12位(0~4096)
只支持P0、P1、P2、P3、P4、P8、P10、P12
'''
from meowbit import *
import time
screen.sync = 0
p1 = MeowPin('P1',ANALOG)
while 1:
screen.fill(0)
screen.text('Analog value: %s' %(p1.getAnalog()))
screen.refresh()
setDigital(val)
设置为数字输出模式(mode = OUT)时可用,输出引脚高低电平0V / 3.3V。参数:
- val
- 0:电压0V
- 1:电压3.3V
'''
数字写
使用P1脚控制LED灯,高电平点亮
'''
from meowbit import *
import time
p1 = MeowPin('P1',OUT)
while 1:
p1.setDigital(1)
time.sleep(1)
p1.setDigital(0)
time.sleep(1)
setAnalog(val)
设置为模拟输出模式(mode =PWM)时可用,输出0~1023,将0~3.3V分解成1024份的区间电压。参数:
- val
- 0:电压0v
- 1023:电压3.3V(对地)
set_pulse_width(duty)
设置为模拟输出模式(mode =PWM)时可用,输出PWM占空比,一般作用于舵机控制,通过计算得到一个周期内的占空比,精确控制角度。参数:
- duty:比如500~2500us脉宽的9g普通舵机的0°~180°范围,在喵比特默认的20ms周期中,占空比为2.5%~12.5% ```python ‘’’ PWM 只支持P0、P1、P2、P12 setAnalog常用于呼吸灯、set_pulse_width常用于控制舵机 ‘’’
呼吸灯
from meowbit import * import time p1 = MeowPin(‘P1’,PWM)
while 1: for i in range(0,1023,5): p1.setAnalog(i) time.sleep_ms(10) for i in range(1023,0,-5): p1.setAnalog(i) time.sleep_ms(10)
控制舵机
普通9g蓝色舵机脉宽对应角度为500~2500us对应0~180°
from meowbit import * p1 = MeowPin(‘P1’,PWM) while 1: if sensor.btnValue(‘a’): p1.set_pulse_width(500) if sensor.btnValue(‘b’): p1.set_pulse_width(2500)
`irq(trigger=ExtInt.IRQ_FALLING, handler=None, pull=Pin.PULL_UP)`<br />引脚的外部中断,可设置中断函数,档中断条件触发后执行。参数:
- trigger:触发条件
- ExtInt.IRQ_FALLING 下降沿触发(默认)
- ExtInt.IRQ_RISING 上升沿触发
- ExtInt.IRQ_RISING_FALLING 上升沿和下降沿都触发
- handler:中断触发后跳入执行的函数,需要自定义
- pull:
- Pin.PULL_UP 开启该引脚上拉(默认,且常用)
- PULL_DOWN 开启该引脚下拉
- PULL_NONE 不开启该引脚的上拉和下拉(少用)
```python
'''
外部中断
只支持P1、P3、P8、P13、P14、P16
'''
from meowbit import *
import time
x = 0
def on_p1_irq_falling(_):
global x
x += 1
time.sleep(0.1)
P1 = MeowPin('P1', IN)
P1.irq(trigger=ExtInt.IRQ_FALLING,pull=Pin.PULL_UP,handler=on_p1_irq_falling)
while 1:
screen.fill(0)
screen.text(x)
screen.refresh()
02 RobotbitAPI
Robotbit为喵比特的功能扩展板
注意使用Robotbit拓展板时,要先确保电池电量充足,并打开拓展板上电源开关。
电机
电机控制指令列表
序号 | 指令解析 |
---|---|
1 | robotbit.motor(index,speed,time) 功能简介:设置连接在robotbit上指定位置电机以指定速度转动指定时长。 参数介绍: index:电机编号,1代表M1A、2代表M1B、3代表M2A、4代表M2B。 speed;电机速度,范围为0-255,数值越大转动速度越快。 time;转动时间,当为0时,会以设定的速度一直旋转;当不为零时,代表转动的时长,单位为毫秒,到达设定的时间后停止转动 |
2 | robotbit.stopMotor(index) 功能简介:设置连接在robotbit上指定位置电机停止转动。 参数介绍: index:电机编号,1代表M1A、2代表M1B、3代表M2A、4代表M2B。 |
3 | robotbit.motorStopAll() 功能简介:设置连接在robotbit上的所有电机停止转动。 |
电机注意事项
- 控制电机时需要提前打开robotbit拓展板电源,保证电池电量充足。
- 需要先实例化robotbit才能运行电机设置相关指令。
电机控制控制示例**
设置连接在M1A上的电机先以100的速度旋转2秒,然后以255的速度旋转3秒,最后停止。
#导入robotbit库中的Robotbit类
from robotbit import RobotBit
#实例化Robotbit类
robotbit = RobotBit()
robotbit.motor(1, 100, 2000)
robotbit.motor(1, 255, 3000)
robotbit.stopMotor(1)
步进电机
步进电机控制指令列表
序号 | 指令解析 |
---|---|
1 | robotbit.stepperDual(angleM1,angleM2) 功能简介:设置连接在robotbit上M1、M2端口的步进电机的转动角度。 参数介绍: angleM1:连接在M1端口上步进电机的转动角度。 angleM2:连接在M2端口上步进电机的转动角度。 |
2 | robotbit.stepperDegree(index,angle) 功能简介:设置连接在robotbit上指定位置步进电机的转动角度。 参数介绍: index:步进电机编号,1代表M1端口,2代表M2端口。 angle:设置步进电机转动的角度,单位为度。 |
步进电机注意事项
- 步进电机在达到设定角度的运转时间内,程序会卡死在这里。
- 步进电机的角度是相对当前位置的角度,转动设定的角度后会自动锁定该角度。
- 提前打开robotbit拓展板电源,确保电池电量充足。
- 需要先实例化robotbit才能运行电机设置相关指令。
步进电机示例**
连接在M1上的步进电机转动90°停止3秒后再次转动180度,停止3秒后再次转动90度回到原位。
#导入robotbit库中的Robotbit类
from robotbit import RobotBit
#实例化Robotbit类
robotbit = RobotBit()
robotbit.stepperDegree(1, 90)
sleep(3)
robotbit.stepperDegree(1, 180)
sleep(3)
robotbit.stepperDegree(1, 90)
舵机
舵机控制指令列表
序号 | 指令解析 |
---|---|
1 | robotbit.geekServo9g(index,angle) 功能简介:设置连接在robotbit上指定位置的9g小舵机转动到指定角度。 参数介绍: index:舵机接口编号,可以设置为1-8,其中1-8分别对应S1-S8。 angle;舵机角度值,数值范围为-45°到224°,注意该值仅能为整数。 |
2 | robotbit.geekServo2kg(index,angle) 功能简介:设置连接在robotbit上指定位置的2kg小舵机转动到指定角度,注意如果要连续设置不同角度,要在两次设置之间等待一小段时间。 参数介绍: index:舵机接口编号,可以设置为1-8,其中1-8分别对应S1-S8。 angle;舵机角度值,数值范围为0°到360°,注意该值仅能为整数。 |
舵机编程注意事项
- 如果要连续设置不同角度,要在两次设置之间等待一小段时间。
- 使用时最好先打开拓展板上电源开关,并保证电池电量充足。
- 需要先实例化robotbit才能运行电机设置相关指令。
舵机控制控制示例
将9g小舵机连接到S1端口,让其从0°开始依次转动到90°、180°。
#导入robotbit库中的Robotbit类
from robotbit import RobotBit
#导入time库中的sleep类
from time import sleep
#实例化Robotbit类
robotbit = RobotBit()
robotbit.geekServo9g(1, 0)
sleep(1)
robotbit.geekServo9g(1, 90)
sleep(1)
robotbit.geekServo9g(1, 180)
超声波
MeowUltrasonic(PIN).distance()
功能简介:获取连接在robotbit上指定引脚3线超声波传感器检测到的距离值,单位为厘米,精确到小数点后一位。
参数介绍:
PIN:超声波传感器连接的端口,为字符串,可以填写”P0”、”P1”、”P2”、”P8”、”P12”、”P13”、”P14”、”P15”中任意一个,其中使用P0时需要先关闭拓展板上的蜂鸣器开关。
超声波示例
每隔5秒使用超声波传感器检测一次距离,并将检测的距离值显示在喵比特屏幕上。
from meowbit import *
from meowbit import Ultrasonic as MeowUltrasonic
from time import sleep
while True:
display.scroll(str(MeowUltrasonic('P1').distance()))
sleep(5)
RGB灯
RGB灯控制指令列表
序号 | 指令解析 |
---|---|
1 | neopix=NeoPixel(PIN, number) 功能简介:设置灯带连接的引脚及该灯带的灯珠数量,实例化灯带对象。 参数介绍: PIN:灯带连接的端口,为字符串,可以填写”P0”、”P1”、”P2”、”P8”、”P12”、”P13”、”P14”、”P16”中任意一个,其中使用P0时需要先关闭拓展板上的蜂鸣器开关,Robotbit自带的四个RGB彩灯其实是连接在P16上有四个灯珠的灯带。 number;灯带灯珠数量。 |
2 | neopix.setColor(index, (red,green,blue)) 功能简介:设置灯带上指定位置灯珠的颜色。 参数介绍: index:灯珠编号,从0开始计算,最大编号值比灯带长度小1。 red:灯珠颜色由红绿蓝三种颜色混合而成,red代表红色灯光亮度数值范围0-255,数值越大越亮。 green:代表绿色灯光亮度数值范围0-255,数值越大越亮。 blue:代表蓝色灯光亮度数值范围0-255,数值越大越亮。 |
3 | neopix.setColorALL((red,green,blue)) 功能简介:设置灯带所有灯珠的颜色。 参数介绍: red:灯珠颜色由红绿蓝三种颜色混合而成,red代表红色灯光亮度数值范围0-255,数值越大越亮。 green:代表绿色灯光亮度数值范围0-255,数值越大越亮。 blue:代表蓝色灯光亮度数值范围0-255,数值越大越亮。 |
4 | neopix.date() 功能简介:更新灯带的亮度、颜色为最新设置的值。 |
RGB灯注意事项
- 每次修改灯带颜色、亮度等数据后及时使用
neopix.update()
指令更新灯带显示状态。 - 如果要让灯带切换颜色,在两次切换之间要加一端时间延时,否则只能看到最后一次颜色设置。
- 注意需要先实例化灯带才能设置其相关颜色、亮度等。
RGB灯示例
设置robotbit自带的四个LED灯逐一点亮,每个亮1秒。
from meowbit import *
from time import sleep
#实例化灯带对象为实例neopix
neopix=NeoPixel("P16", 4)
neopix.setColor(0, (255,0,0))
neopix.update()
sleep(1)
neopix.setColorAll((0,0,0))
neopix.setColor(1, (0,255,0))
neopix.update()
sleep(1)
neopix.setColorAll((0,0,0))
neopix.setColor(2, (0,0,255))
neopix.update()
sleep(1)
neopix.setColorAll((0,0,0))
neopix.setColor(3, (255,255,255))
neopix.update()
sleep(1)
neopix.setColorAll((0,0,0))
neopix.update()
应用SD卡(高级应用)
Meowbit使用SD必须在MicroPython模式下
该模式下接通USB后喵比特会自检,看是否有SD卡,若没有则将文件系统设置为内部Flash,为检测到匹配到SD卡则将文件系统设置为该SD卡,并且可见原本应该出现的PYBFLASH盘符变为SD卡的盘符
SD卡的选型要求
- 由于SPI总线速率比较高,所以一般的普通SD卡没法适配,需要高速卡。
(比如一些4G以上的C10高速卡才能适配,但也并不是所有高速卡都适合,同一个品牌的不同的规格卡可能有不同的结果,测试通过的是OV 16G的C10 MicroSD卡 - 大卡和小卡均可用,但小Micro SD卡需要一个大卡套转接使用
- 由于SPI总线速率比较高,所以一般的普通SD卡没法适配,需要高速卡。
将卡插在喵比特上,然后 再给喵比特上电(请勿热拔插)
这是我的SD卡名字
- 开始编程
首先要明确,喵比特如果没有什么特殊的设置,上电即跑main.py。由此可知,我们只需要在SD盘符内存放一个main.py程序即可。(当为检测到SD卡,喵比特的PYBFLASH盘符实际用的是内部Flash仅2M,插了外部Flash后则扩展了空间,能放更多东西
◆按照如下步骤进行测试吧:
a. 首先在盘符内新建一个main.py文件(注意.py是文件后缀)
b. 用文本编辑器(建议Vscode)打开main.py,写一段让喵比特显示一排欢迎字符的程序,并保存
from meowbit import *
txt = 'welcome Meowbit'
screen.text(txt, ((160/2)-(len(txt)*8/2)), (128/2-8/2), 1, (168,33,168))
# 第2和3个参数是做了一个字符居中的处理,由屏幕尺寸160x128px,一个英文字号尺寸1为8px得出
c. 程序保存后,按一下喵比特右侧的RESET(复位按键),让喵比特重新重置,并重新检测一轮文件系统,这样做才能让你新修改的程序运行
d. 一起来验收一下程序结果吧
文件系统操作
MicroPython支持标准的Python的文件模块,即可使用如open()这类原生函数
- 基本的对文件操作
a. 创建1个文件
将下面的代码覆盖到main.py文件内并保存,注意此时我们需要2次复位操作,第一次复位为了让main.py运行,而main.py运行完的结果是创建了一个名为’myFile’的txt文本并且填入hello world!的内容,但是由于喵比特只有在复位(无论是软复位还是硬件复位)的一开始才会检测一次文件系统更改,而后如果有任何改变只有在下一次复位才能刷新,所以第二次复位操作就是为了查看文件是否创建成功
"""
在当前路径下创建名为myFile的txt文件
'w'为只写模式,既如果不存在该名称文件便创建,若存在则覆盖。想要不覆盖的只写,可选模式为'a'
模式不填的话默认为r,即只读
"""
f = open('myFile.txt', 'w')
f.write('hello world!')
f.close() # close()相当于关闭文件并保存文件,如果没有close(),写入的内容可能会存在缓冲区中,相当于你的操作就是失败的
不出意外,我们可以看到盘符内结果如下
b. 查看文件内容
将下面的代码复制替换掉main.py的内容,保存文件并复位喵比特
from meowbit import *
f = open('myFile.txt') # 默认不填模式为'r' (只读
readStr = f.read()
f.close()
screen.text(readStr, 20, 20)
可以看到屏幕上显示的字符正是我们myFile.txt里的内容
c. 更高级的文件/目录处理模块——os
基本的目录操作API
import os
os.getcwd() # 查看当前所在目录
os.listdir() # 查看当前目录内的所有文件
os.mkdir('dir') # dir为你想创建的目录名
os.chdir('dir') # dir为当前目录的相对目录,必须要存在的。若os.chdir('..')则表示退回上级目录
os.remove('xx') # xx为当前目录内存在的文件,需要带后缀格式如.txt
os.rmdir('dir') # 可删除一个空目录,若非空则会抛出异常
进阶用法——删除非空目录
import os
def delDir(name):
os.chdir(name)
for i in os.listdir():
os.remove(i)
os.chdir('..')
os.rmdir(name)
os.sync()
更新摘要
2020-11-24
- 完成喵比特单板完整API
2020-12-10
- 完成喵比特扩展板Robotbit完整API