最后更新于2020-11-24
更新摘要


01 Micropython API

『进入了Micropython的世界,这一节将为你提供丰富的接口,帮助你用喵家编程硬件做更多的事情』

导入meowbit库

只有导入了meowbit库,才能使用完整的功能API噢😶

  1. # Micropython中的导包缩写形式,可以少些一些代码
  2. from meowbit import *
  3. screen.text('hello world')

按键

喵比特上有6个可编程按键,布局贴合游戏机

sensor.btnValue(btn)
返回按键状态值,数字信号。参数:

  • btn: 取值 ‘a’、’b’、’up’、’down’、’left’、’right’,分别代表6个按键

sensor.btnTrig[btn] = fn
按键的中断事件,可以给按键按下绑定一个执行函数。参数:

  • fn:中断时要执行的函数 :::warning 这个自定义中断函数内不要做

  • 延时太长或执行内容太多的工作

  • 带有内存分配的操作,比如新建一个变量 :::

示例程序📋:

  1. # 按键A控制LED1开关
  2. from meowbit import *
  3. while 1:
  4. if(sensor.btnValue('a')):
  5. led1.on()
  6. else:
  7. led1.off()
  1. # 按键A的中断事件控制LED1亮灭
  2. from meowbit import *
  3. import time
  4. def fn():
  5. led1.toggle()
  6. time.sleep_ms(500) # delay(ms)/消除机械抖动
  7. sensor.btnTrig['a'] = fn
  8. sensor.startSchedule() # 不管开了几个中断线程,这条只需一次

LED

喵比特右上角有2颗LED,分别是绿色led1和红色led2

led1.on() / led1.off()
开关控制

led1.toggle()
状态切换,根据当前该灯的状态去另一个状态

led1.intensity(brightness)

更改LED灯的亮度

  • brightness:0~255(暗~亮,默认255,建议50)

示例程序📋:

  1. # 开关_开机绿灯闪烁5次
  2. from meowbit import *
  3. from time import sleep
  4. for i in range(5):
  5. led1.on()
  6. sleep(1)
  7. led1.off()
  8. sleep(1)
  1. # 状态切换_开机红灯闪烁5次
  2. from meowbit import *
  3. from time import sleep
  4. for i in range(5): # 红色灯不太明显,可能需要拨开套子看
  5. led2.toggle()
  6. sleep(1)
  1. # 状态切换_从暗到亮再到灭
  2. from meowbit import *
  3. import time
  4. for i in range(256):
  5. led1.intensity(i)
  6. time.sleep_ms(10)
  7. for i in range(255, 0, -1):
  8. led1.intensity(i)
  9. 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()
蜂鸣器停止播放,可以放置于按键中断里强行中断播放旋律,也可以和持续播放旋律配合使用制作按下发声抬起收声的效果

示例程序📋:

  1. # 展示所有蜂鸣器函数效果,按键A能中断播放
  2. from meowbit import *
  3. def stopBuzzer():
  4. buzzer.stop()
  5. sensor.btnTrig['a'] = stopBuzzer # 绑定中断函数
  6. sensor.startSchedule() # 打开中断线程
  7. buzzer.tone(262, 1)
  8. buzzer.rest(1)
  9. buzzer.note(60, 1)
  10. buzzer.rest(1)
  11. buzzer.melody("d r d4:4")
  12. buzzer.rest(1)
  13. buzzer.melody(CORRECT) # 当播放这段旋律的时候,按下案件A,执行停止蜂鸣器操作,声音停止
  1. # 按键A按下蜂鸣器响起,松开蜂鸣器收声
  2. from meowbit import *
  3. while 1:
  4. if sensor.btnValue('a'):
  5. buzzer.tone(240, -1)
  6. else:
  7. buzzer.stop()

温度传感器

sensor.getTemp()
获取温度数值,单位是摄氏度

示例程序📋:

  1. from meowbit import *
  2. screen.sync = 0 # 0为关闭同步刷新,默认为1(打开)则每次screen单条函数都会调用一次tft.show(fb),会造成闪屏
  3. while 1:
  4. screen.fill(1)
  5. tempValue = sensor.getTemp()
  6. screen.text('Temperature:' + str(tempValue), 20, 50)
  7. screen.refresh()

光线传感器

sensor.getLight()
亮度传感器检测环境明暗程度,返回值为模拟量0~4096,随着光线越强数值越大

示例程序📋:

  1. from meowbit import *
  2. screen.sync = 0 # 0为关闭同步刷新,默认为1(打开)则每次screen单条函数都会调用一次tft.show(fb),会造成闪屏
  3. while 1:
  4. screen.fill(0)
  5. lightValue = sensor.getLight()
  6. screen.text('brightness' + str(lightValue), 20, 50)
  7. screen.refresh()

陀螺仪

sensor.acc轴()
返回x,y,z三轴各自当加速度值,单位为g(m/s)。参数:

  • 轴:X、Y、Z 需要大写

sensor.gyro轴()
返回x,y,z三轴各自的轴转向加速度,单位为g(角度/s)。参数:

  • 轴:X、Y、Z 需要大写


:::warning 加速度轴和转向加速的方向如下图所示,箭头所指的方向为对应轴速度的正方向(屏幕朝向的方式
喵比特加速度.png :::

sensor.roll()
横滚,返回单位为角度,如图所示
喵比特 - API - 图2

sensor.pitch()
旋转,返回单位为角度,如图所示
喵比特 - API - 图3

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修饰 :::

示例程序📋:

  1. # 测试所有相关返回值,打印到屏幕上
  2. from meowbit import *
  3. screen.sync = 0
  4. while 1:
  5. screen.fill(0) #清屏操作
  6. screen.textCh('轴加速度:x/y/z', 20, 10, 1, (168, 233, 74))
  7. screen.text(round(sensor.accX(), 2), 10, 30)
  8. screen.text(round(sensor.accY(), 2), 60, 30)
  9. screen.text(round(sensor.accZ(), 2), 110, 30)
  10. screen.textCh('转向加速度:x/y/z', 10, 50, 1, (74, 233, 168))
  11. screen.text(round(sensor.gyroX(), 2), 10, 70)
  12. screen.text(round(sensor.gyroY(), 2), 60, 70)
  13. screen.text(round(sensor.gyroZ(), 2), 110, 70)
  14. screen.textCh('横滚:' + str(round(sensor.roll())), 20, 90, 1,(233, 74, 168))
  15. screen.textCh('旋转:' + str(round(sensor.pitch())), 20, 110, 1, (233, 168, 74))
  16. screen.textCh('屏幕朝上', 100, 95, 1, (74, 168, 233))
  17. screen.text(sensor.gesture('face_up'), 105, 110)
  18. 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 :::

  1. from meowbit import *
  2. import time
  3. 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]
  4. 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]
  5. 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]
  6. 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]
  7. 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]
  8. 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]
  9. 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]
  10. 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]
  11. 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]
  12. 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]
  13. 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]
  14. 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]
  15. 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]
  16. 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]
  17. 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]
  18. 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]
  19. 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]
  20. 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]
  21. 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]
  22. 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]
  23. 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]
  24. 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]
  25. 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]
  26. 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]
  27. 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]
  28. 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]
  29. 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]
  30. 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]
  31. display.show(HEART) # 显示爱心
  32. time.sleep(1)
  33. display.show(HEART_SMALL) # 显示爱心
  34. time.sleep(1)
  35. display.show(YES) # 显示爱心
  36. time.sleep(1)
  37. display.show(NO) # 显示爱心
  38. time.sleep(1)
  39. display.show(HAPPY) # 显示爱心
  40. time.sleep(1)
  41. display.show(SAD) # 显示爱心
  42. time.sleep(1)
  43. display.show(CONFUSED) # 显示爱心
  44. time.sleep(1)
  45. display.show(ANGRY) # 显示爱心
  46. time.sleep(1)
  47. display.show(ASLEEP) # 显示爱心
  48. time.sleep(1)
  49. display.show(SURPRISED) # 显示爱心
  50. time.sleep(1)
  51. display.show(SILLY) # 显示爱心
  52. time.sleep(1)
  53. display.show(FABULOUS) # 显示爱心
  54. time.sleep(1)
  55. display.show(MEH) # 显示爱心
  56. time.sleep(1)
  57. display.show(TSHIRT) # 显示爱心
  58. time.sleep(1)
  59. display.show(ROLLERSKATE) # 显示爱心
  60. time.sleep(1)
  61. display.show(STICKFIGURE) # 显示爱心
  62. time.sleep(1)
  63. display.show(GHOST) # 显示爱心
  64. time.sleep(1)
  65. display.show(SWORD) # 显示爱心
  66. time.sleep(1)
  67. display.show(GIRAFFE) # 显示爱心
  68. time.sleep(1)
  69. display.show(SKULL) # 显示爱心
  70. time.sleep(1)
  71. display.show(UMBRELLA) # 显示爱心
  72. time.sleep(1)
  73. display.show(SNAKE) # 显示爱心
  74. time.sleep(1)
  75. display.show(RABBIT) # 显示爱心
  76. time.sleep(1)
  77. display.show(COW) # 显示爱心
  78. time.sleep(1)
  79. 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如图所示 👀
资源 1.png :::

:::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()

  1. `screen.loadBmp(path, x=0, y=0)`<br />在屏幕上显示一张bmp格式的图片,仅支持24/32位的bmp。参数:<br />pathbmp的相对位置,一般直接将图片放在PYBFLASH盘符和main.py同目录,此时path='name.bmp'<br />坐标:不填默认图片左上角(0, 0)
  2. 📥 测试图片资源
  3. ```python
  4. # 显示bmp
  5. from meowbit import *
  6. screen.loadBmp('haimian.bmp')
  7. # 内存问题不支持使用gif

screen.loadgif由于内存空间问题,显示gif图的API已取消了

引脚控制

喵比特 - API - 图5

p1 = MeowPin(pin, mode)
实例化引脚,设置某个引脚位特定模式。参数:

  • pin:字符串类型,如’P1’
  • mode:
    • IN:数字输入,默认已上拉
    • OUT:数字输出
    • ANALOG:模拟输入
    • PWM:模拟输出

getDigital()
设置为数字输入模式(mode = IN)时可用,返回值为高低电平0 / 1

  1. '''
  2. 数字读
  3. 当P1接通GND时蜂鸣器响,否则停止
  4. '''
  5. from meowbit import *
  6. p1 = MeowPin('P1',IN)
  7. while 1:
  8. if p1.getDigital() == 0:
  9. buzzer.tone(240,-1)
  10. else:
  11. buzzer.stop()

getAnalog()
设置为模拟输入模式(mode = ANALOG)时可用,由于时12位ADC,所以返回值为0~4095

  1. '''
  2. 模拟读
  3. 范围:12位(0~4096)
  4. 只支持P0、P1、P2、P3、P4、P8、P10、P12
  5. '''
  6. from meowbit import *
  7. import time
  8. screen.sync = 0
  9. p1 = MeowPin('P1',ANALOG)
  10. while 1:
  11. screen.fill(0)
  12. screen.text('Analog value: %s' %(p1.getAnalog()))
  13. screen.refresh()

setDigital(val)
设置为数字输出模式(mode = OUT)时可用,输出引脚高低电平0V / 3.3V。参数:

  • val
    • 0:电压0V
    • 1:电压3.3V
      1. '''
      2. 数字写
      3. 使用P1脚控制LED灯,高电平点亮
      4. '''
      5. from meowbit import *
      6. import time
      7. p1 = MeowPin('P1',OUT)
      8. while 1:
      9. p1.setDigital(1)
      10. time.sleep(1)
      11. p1.setDigital(0)
      12. 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)

  1. `irq(trigger=ExtInt.IRQ_FALLING, handler=None, pull=Pin.PULL_UP)`<br />引脚的外部中断,可设置中断函数,档中断条件触发后执行。参数:
  2. - trigger:触发条件
  3. - ExtInt.IRQ_FALLING 下降沿触发(默认)
  4. - ExtInt.IRQ_RISING 上升沿触发
  5. - ExtInt.IRQ_RISING_FALLING 上升沿和下降沿都触发
  6. - handler:中断触发后跳入执行的函数,需要自定义
  7. - pull
  8. - Pin.PULL_UP 开启该引脚上拉(默认,且常用)
  9. - PULL_DOWN 开启该引脚下拉
  10. - PULL_NONE 不开启该引脚的上拉和下拉(少用)
  11. ```python
  12. '''
  13. 外部中断
  14. 只支持P1、P3、P8、P13、P14、P16
  15. '''
  16. from meowbit import *
  17. import time
  18. x = 0
  19. def on_p1_irq_falling(_):
  20. global x
  21. x += 1
  22. time.sleep(0.1)
  23. P1 = MeowPin('P1', IN)
  24. P1.irq(trigger=ExtInt.IRQ_FALLING,pull=Pin.PULL_UP,handler=on_p1_irq_falling)
  25. while 1:
  26. screen.fill(0)
  27. screen.text(x)
  28. 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秒,最后停止。

  1. #导入robotbit库中的Robotbit类
  2. from robotbit import RobotBit
  3. #实例化Robotbit类
  4. robotbit = RobotBit()
  5. robotbit.motor(1, 100, 2000)
  6. robotbit.motor(1, 255, 3000)
  7. 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度回到原位。

  1. #导入robotbit库中的Robotbit类
  2. from robotbit import RobotBit
  3. #实例化Robotbit类
  4. robotbit = RobotBit()
  5. robotbit.stepperDegree(1, 90)
  6. sleep(3)
  7. robotbit.stepperDegree(1, 180)
  8. sleep(3)
  9. 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°。

  1. #导入robotbit库中的Robotbit类
  2. from robotbit import RobotBit
  3. #导入time库中的sleep类
  4. from time import sleep
  5. #实例化Robotbit类
  6. robotbit = RobotBit()
  7. robotbit.geekServo9g(1, 0)
  8. sleep(1)
  9. robotbit.geekServo9g(1, 90)
  10. sleep(1)
  11. robotbit.geekServo9g(1, 180)

超声波

MeowUltrasonic(PIN).distance()
功能简介:获取连接在robotbit上指定引脚3线超声波传感器检测到的距离值,单位为厘米,精确到小数点后一位。
参数介绍
PIN:超声波传感器连接的端口,为字符串,可以填写”P0”、”P1”、”P2”、”P8”、”P12”、”P13”、”P14”、”P15”中任意一个,其中使用P0时需要先关闭拓展板上的蜂鸣器开关。

超声波示例
每隔5秒使用超声波传感器检测一次距离,并将检测的距离值显示在喵比特屏幕上。

  1. from meowbit import *
  2. from meowbit import Ultrasonic as MeowUltrasonic
  3. from time import sleep
  4. while True:
  5. display.scroll(str(MeowUltrasonic('P1').distance()))
  6. 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秒。

  1. from meowbit import *
  2. from time import sleep
  3. #实例化灯带对象为实例neopix
  4. neopix=NeoPixel("P16", 4)
  5. neopix.setColor(0, (255,0,0))
  6. neopix.update()
  7. sleep(1)
  8. neopix.setColorAll((0,0,0))
  9. neopix.setColor(1, (0,255,0))
  10. neopix.update()
  11. sleep(1)
  12. neopix.setColorAll((0,0,0))
  13. neopix.setColor(2, (0,0,255))
  14. neopix.update()
  15. sleep(1)
  16. neopix.setColorAll((0,0,0))
  17. neopix.setColor(3, (255,255,255))
  18. neopix.update()
  19. sleep(1)
  20. neopix.setColorAll((0,0,0))
  21. neopix.update()

应用SD卡(高级应用)

Meowbit使用SD必须在MicroPython模式下
该模式下接通USB后喵比特会自检,看是否有SD卡,若没有则将文件系统设置为内部Flash,为检测到匹配到SD卡则将文件系统设置为该SD卡,并且可见原本应该出现的PYBFLASH盘符变为SD卡的盘符

  1. SD卡的选型要求

    • 由于SPI总线速率比较高,所以一般的普通SD卡没法适配,需要高速卡。
      (比如一些4G以上的C10高速卡才能适配,但也并不是所有高速卡都适合,同一个品牌的不同的规格卡可能有不同的结果,测试通过的是OV 16G的C10 MicroSD卡
    • 大卡和小卡均可用,但小Micro SD卡需要一个大卡套转接使用
  2. 将卡插在喵比特上,然后 再给喵比特上电(请勿热拔插)

这是我的SD卡名字
image.png

  1. 开始编程

首先要明确,喵比特如果没有什么特殊的设置,上电即跑main.py。由此可知,我们只需要在SD盘符内存放一个main.py程序即可。(当为检测到SD卡,喵比特的PYBFLASH盘符实际用的是内部Flash仅2M,插了外部Flash后则扩展了空间,能放更多东西

◆按照如下步骤进行测试吧:

a. 首先在盘符内新建一个main.py文件(注意.py是文件后缀)
image.png

b. 用文本编辑器(建议Vscode)打开main.py,写一段让喵比特显示一排欢迎字符的程序,并保存

  1. from meowbit import *
  2. txt = 'welcome Meowbit'
  3. screen.text(txt, ((160/2)-(len(txt)*8/2)), (128/2-8/2), 1, (168,33,168))
  4. # 第2和3个参数是做了一个字符居中的处理,由屏幕尺寸160x128px,一个英文字号尺寸1为8px得出

c. 程序保存后,按一下喵比特右侧的RESET(复位按键),让喵比特重新重置,并重新检测一轮文件系统,这样做才能让你新修改的程序运行
meowSD3.jpg

d. 一起来验收一下程序结果吧
meowSD34jpg.jpg

文件系统操作

MicroPython支持标准的Python的文件模块,即可使用如open()这类原生函数

  1. 基本的对文件操作

a. 创建1个文件
将下面的代码覆盖到main.py文件内并保存,注意此时我们需要2次复位操作,第一次复位为了让main.py运行,而main.py运行完的结果是创建了一个名为’myFile’的txt文本并且填入hello world!的内容,但是由于喵比特只有在复位(无论是软复位还是硬件复位)的一开始才会检测一次文件系统更改,而后如果有任何改变只有在下一次复位才能刷新,所以第二次复位操作就是为了查看文件是否创建成功

  1. """
  2. 在当前路径下创建名为myFile的txt文件
  3. 'w'为只写模式,既如果不存在该名称文件便创建,若存在则覆盖。想要不覆盖的只写,可选模式为'a'
  4. 模式不填的话默认为r,即只读
  5. """
  6. f = open('myFile.txt', 'w')
  7. f.write('hello world!')
  8. f.close() # close()相当于关闭文件并保存文件,如果没有close(),写入的内容可能会存在缓冲区中,相当于你的操作就是失败的

不出意外,我们可以看到盘符内结果如下
image.png

b. 查看文件内容
将下面的代码复制替换掉main.py的内容,保存文件并复位喵比特

  1. from meowbit import *
  2. f = open('myFile.txt') # 默认不填模式为'r' (只读
  3. readStr = f.read()
  4. f.close()
  5. screen.text(readStr, 20, 20)

可以看到屏幕上显示的字符正是我们myFile.txt里的内容
meowSD5jpg.jpg

c. 更高级的文件/目录处理模块——os
基本的目录操作API

  1. import os
  2. os.getcwd() # 查看当前所在目录
  3. os.listdir() # 查看当前目录内的所有文件
  4. os.mkdir('dir') # dir为你想创建的目录名
  5. os.chdir('dir') # dir为当前目录的相对目录,必须要存在的。若os.chdir('..')则表示退回上级目录
  6. os.remove('xx') # xx为当前目录内存在的文件,需要带后缀格式如.txt
  7. os.rmdir('dir') # 可删除一个空目录,若非空则会抛出异常

进阶用法——删除非空目录

  1. import os
  2. def delDir(name):
  3. os.chdir(name)
  4. for i in os.listdir():
  5. os.remove(i)
  6. os.chdir('..')
  7. os.rmdir(name)
  8. os.sync()

更新摘要

2020-11-24

  • 完成喵比特单板完整API

2020-12-10

  • 完成喵比特扩展板Robotbit完整API