48

HonestQiao · 2022年09月05日 · 北京市朝阳区

【MM32F5270开发板试用】定制MicroPython及读取MPU6050数据到OLED1306

前言

这次有幸获得MM32F5270开发板的试用,非常幸运。
收到板子后,眼前一亮,这块板子,做工精良,板子上附带的周边非常丰富,能有好多玩法,其中就有我较为熟悉的MPU6050。
查看官方提供的各项开发资料,发现苏勇大佬已经提供了micropython的移植,我对micropython也比较熟悉,于是玩起了micropython,并顺利读取MPU6050的数据,呈现到OLED1306液晶屏上。

硬件

  1. MM32F5270开发板
  2. MPU6050:开发板板载
  3. OLED1306:I2C接口
  4. MicroSD卡
  5. PWLink2
  6. Type-C数据线

查阅官方提供的原理图,了解到MPU6050的接线:
image.png

其接口对应于I2C1,PC6为SCL、PC7为SDA
image.png

我手头的OLED1306为I2C接口的,可以直接接到I2C的PC6、PC7。因为一个I2C接口,可以挂多个Slave设备。
image.png

需要注意的是,有的OLED1306是3.3V和5V通用的,但有的版本只支持3.3V,上5V会烧。所以,一般用开发板电源开关旁边的3.3V即可(黄色底座的)。
image.png
千万别粗心挂到舵机电源输出上:
image.png

因为涉及到micropython固件的烧录,所以需要用到PWLink2。
其接口,参考大佬们提供的即可。
image.png

Type-C的数据线,用于连接电脑访问MicroPython的交互环境REPL,将其连接到开发板RESET按钮旁的USB UART即可。
image.png

软件

  1. 烧录软件1:Power Writer2,PWLink2官方创新工坊提供
  2. Ozone:Segger官方提供
  3. micropython-mm32F5移植版本:苏勇大佬提供
  4. mpu6050.py:MPU6.50的mpy封装,Adam Ježek大佬提供
  5. ssd1306.py:micropython官方提供
  6. oled_mpu6050.py:自己参考写的
  7. MobaXterm:终端工具,可以连接连接到MicroPython的交互环境REPL

完整的实例代码,可以从以下地址查看:https://gitee.com/honestqiao/mm32f5_micropytho_demo

定制MicroPython

苏勇大佬提供了micropython的MM32F5移植,代码库地址为:https://gitee.com/suyong_yq/micropython-su
Medivh大佬提供了一个开箱即用的Docker环境,启动就能编译,非常的方便:https://aijishu.com/a/1060000000344894

docker pull verdureorange/micropython_mm32
docker run -it --name mp_mm32 -v $(pwd)/root:/root verdureorange/micropython_mm32

其中包含了苏勇大佬提供的移植版本,位于:/micropython-su-master

需要注意的,这个移植的版本,非常精简,默认没有启动一些非常有用的扩展。
例如要驱动SSD1306,需要使用framebuf,默认的版本没有。
如果调用,会出现错误:OSError: 116
因此,可以根据需要,参考micropython官方的资料,进行一些定制。
要开启framebuf,需要在对应port的mpconfigport.h中,添加MICROPY_PY_FRAMEBUF的定义。
上面这个Docker环境也比较精简,vi也没有,于是通过下面的方式来处理:

cd /micropython-su-master/micropython-1.16/ports/mm32f5
echo '#define MICROPY_PY_FRAMEBUF                    (1)' >> mpconfigport.h

启用MICROPY_PY_FRAMEBUF,当需要有一个头文件的依赖,这个文件可以从micropython官方下载:https://github.com/micropython/micropython/blob/master/extmod/modframebuf.c ,下载后,放置到 /micropython-su-master/micropython-1.16/extmod/目录即可。
然后对源文件做一下处理:(不处理,会出现modframebuf.c调用错误)

cd /micropython-su-master/micropython-1.16/ports/mm32f5
sed -i -e 's#ports/stm32/font_petme128_8x8.h#extmod/font_petme128_8x8.h#' ../../extmod/modframebuf.c

处理完后,即可进行编译:

cd /micropython-su-master/micropython-1.16/ports/mm32f5
make cross=1

编译完成后,会成功生成 build-plus-f5270/firmware.elfbuild-plus-f5270/firmware.hex
image.png
把这两个文件拷贝出来备用。

使用Ozone和Power Write烧录

因为我的工作电脑是mbp,macOS环境的,所以想用找一个直接在macOS下面烧录的工具。不过试了JFlash和Ozone,没有成功,后续再测试一下openocd如何。

在Windows下面,也想用简单一点的工具烧录。
经过了解和实际测试,确定有两款工具可以使用。

  1. Ozone:一定要使用3.24b版本才行;用最新版本的就和在macOS上面一样,找不到PWLink2的USB设备。使用3.24b版本,也需要将MM32官方提供的JLink Pack中的定制内容拷贝过来才行。
  2. Power Writer:创新工坊提供的,PWLink2配合完美,下载最新版本即可使用,不需要任何额外的处理。

下面分别说明两种烧录方式:

Ozone烧录

  1. 从SEGGER官方下载v3.24b版本:https://www.segger.com/products/development-tools/ozone-j-link-debugger/#download-installation 并安装
  2. 从灵动官方下载JLink Pack:https://www.mindmotion.com.cn/support/software/jlink_pack/
  3. 将JLink Pack解压后,将其中的JLinkDevices.xml和Devices/MindMotion拷贝到Ozone对应的目录即可:
    image.png
  4. 打开Ozone,开启一个新的项目引导:
    image.png
    将会出现找到CMSID-DAP的提醒:
    image.png
    后续也会多次出现,一律点ACCEPT即可,然后NEXT即可。
    如果不用V3.24b版本,则不会出现该提示,后续操作就不能正常进行。
  5. 在Device中,搜索MM32F5,并选择MM32F5277E9PV,其他默认即可:
    image.png
    如果没有做JLink Pack配置文件的拷贝,这里就找到不这个型号。
  6. 然后选择Target Interface为SWD,以及选中列表中出现的USB CMSIS-DAP:
    image.png
    如果不用V3.24b版本,这里的列表中就可能没有正确找到USB CMSIS-DAP设备。找不到设备,就无法下载烧录了。
  7. 在下一个界面中,选择之前编译成功的固件文件:firmware.elf
    image.png
    firmware.elf【注意,该文件需要放在全英文目录,否则可能读取错误。】
  8. 再Finish,就完成了配置,可以准备烧录了:
    image.png
  9. 然后,点击绿色下箭头中的Download,就能开始烧录了:
    image.png
  10. 下一步会提示没有License,直接Yes通过无视即可:
    image.png
  11. 等待下载完成即可:
    image.png

使用Power Writer烧录

如果使用Power Writer进行烧录,就没有这么多麻烦的步骤了,简单快捷。

  1. 从Power Writer官方下载:https://docs.powerwriter.com/en/docs/powerwriter_for_arm/software/install 并安装
  2. 在界面上,选择接口方式和PCU型号即可:
    image.png
    首次打开,可能会提示升级,按照提示升级即可。
    设置完成后,右边信息窗口,会有对应的提示。
  3. 然后进入Program Memery界面,所有的操作都在这里了:
    image.png
    image.png
  4. 要烧录新的固件,需要先添加固件firmware.hex:
    image.png
    image.png
    image.png
    image.png
  5. 然后按照下面步骤操作一遍,即可下载:
    image.png
    image.png

MicroPython连接

烧录成功之后,就可以使用工具连接micropython的REPL界面。
需要注意的是,苏勇大佬提供的这个移植版本,需要插入一张SD卡,可以在卡上存储需要执行的py文件或者调用库,也可以读写该SD卡来存储文件,非常方便。另外,这张卡需要是FAT32格式的。
因为后面需要从MPU6050读取数据,以及驱动OLED1306,所以我们将各自的文件,先拷贝到SD卡的根目录备用。

image.png

然后,将SD卡插入到开发板RESET按键旁边的插口即可准备使用。
重新上电后,就能通过Type-C连接USB UART口,来连到micropython了。

从 mobaxterm官方下载免费版本:https://mobaxterm.mobatek.net/download-home-edition.html
打开后,从会话中开启新的串口连接,选择好端口和速率115200:
image.png
连接成功后,回车,会显示>>,表示连接成功,可以操作了:
image.png

MPU6050数据读取

因为之前,我们已经把MPU6050的调用库mpu6050.py拷贝到SD卡上了,所以现在可以直接调用。
因为SCL对应PC6,SDA对应了PC7,所以现需要进行一些I2C初始化和设备扫描测试:

from machine import SoftI2C, Pin
scl = Pin('PC6')
sda = Pin('PC7')
i2c = SoftI2C(scl, sda)
print("I2C Devices: %s" % ",".join(["%s" % i for i in i2c.scan()]))

上述操作,将会显示当前连接的I2C设备:
image.png
60对应0x30,一般为SSD1306
80对应0x50,为板载EEPROM
104对应0x68:为板载MPU6050

然后,我们再试一下,能否读取MPU6050的数据。

import mpu6050
accelerometer = mpu6050.accel(i2c)
accelerometer.get_values()

执行后,就能显示读取出数据。第一次读取,一般都返回0,后续就正常了。
image.png

现在,读取MPU6050数据正常了。

OLED1306驱动

类似MPU6050,SSD1306的驱动已经拷贝到了SD卡上,也可以直接调用了。
在上一步的基础上,进一步执行指令:

from ssd1306 import SSD1306_I2C
i2c.scan()
oled = SSD1306_I2C(128, 64, i2c)
oled.fill(0)
oled.text('MPU6050',40,20)
oled.show()

image.png

现在,SSD1306也可以正常调用了。
如果没有显示,注意连线是否正确。连线正确的话,i2c.scan()会输出带有60的信息。连线不正确则没有。

读取MPU6050数据呈现到OLED1306

基于以上的实验,可以将代码进行结合,实现读取MPU6050的数据,并呈现到OLED1306上:

from machine import SoftI2C, Pin
from ssd1306 import SSD1306_I2C
import mpu6050
import time

oled_width = 128
oled_height = 64

scl = Pin('PC6')
sda = Pin('PC7')

def draw_bg():
    oled.fill(0)
    oled.line(0, 0, oled_width-1, 0, 1)
    oled.line(0, 0, 0, oled_height-1, 1)
    oled.line(oled_width-1, 0, oled_width-1, oled_height-1, 1)
    oled.line(0, oled_height-1, oled_width-1, oled_height-1, 1)

i2c = SoftI2C(scl, sda)
print("I2C Devices: %s" % ",".join(["%s" % i for i in i2c.scan()]))

oled = SSD1306_I2C(oled_width, oled_height, i2c)
draw_bg()
oled.text('MPU6050',40,20)
oled.show()
time.sleep(3)

for i in range(0,100):
    accelerometer = mpu6050.accel(i2c)
    vals = accelerometer.get_values()
    draw_bg()
    acx = vals["AcX"]
    acy = vals["AcY"]
    acz = vals["AcZ"]
    tmp = vals["Tmp"]
    gyx = vals["GyX"]
    gyy = vals["GyY"]
    gyz = vals["GyZ"]
    print(vals)

    # 0-127
    # 63-127
    draw_bg()
    oled.text('MPU6050',40,5)
    oled.text('AX:%03d' % acx,2,20)
    oled.text('AY:%03d' % acy,2,30)
    oled.text('AZ:%03d' % acz,2,40)

    oled.text('GX:%03d' % gyx,70,20)
    oled.text('GY:%03d' % gyy,70,30)
    oled.text('GZ:%03d' % gyz,70,40)
    
    oled.text('Temp:%02.1f' % tmp,25,55)    
    oled.show()

    time.sleep(1)

运行以上代码,然后轻轻晃动开发板,就能看到数据变化了:
image.png
image.png

视频效果如下:
https://www.bilibili.com/vide...

完整的实例代码,可以从以下地址查看:https://gitee.com/honestqiao/mm32f5_micropytho_demo

总结+后续

经过初步的使用,对这块板子的感觉非常之后。一块小小的板子,内涵非常的丰富。使用上手,也非常的容易。
除了micropython,官方也提供了MindSDK等开发工具和资料,后续也会进一步研究学习。

推荐阅读
关注数
6152
内容数
276
灵动MM32 MCU相关技术知识,欢迎关注~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息