> 文档中心 > 【MM32F5270开发板试用】定制MicroPython及读取MPU6050数据到OLED1306

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


本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:HonestQiao

前言

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

硬件

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

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

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

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

需要注意的是,有的OLED1306是3.3V和5V通用的,但有的版本只支持3.3V,上5V会烧。所以,一般用开发板电源开关旁边的3.3V即可(黄色底座的)。

千万别粗心挂到舵机电源输出上:

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Yz8mS0X-1666318825833)(https://pic4.zhimg.com/80/v2-04116367d66f55a277b1eb2369005fcb_1440w.webp)]

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

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

软件

  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_mm32docker 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/mm32f5echo '#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/mm32f5sed -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/mm32f5make cross=1

编译完成后,会成功生成build-plus-f5270/firmware.elfbuild-plus-f5270/firmware.hex

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

把这两个文件拷贝出来备用。

使用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对应的目录即可:

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

  1. 打开Ozone,开启一个新的项目引导:

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

将会出现找到CMSID-DAP的提醒:

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

后续也会多次出现,一律点ACCEPT即可,然后NEXT即可。
如果不用V3.24b版本,则不会出现该提示,后续操作就不能正常进行。

  1. 在Device中,搜索MM32F5,并选择MM32F5277E9PV,其他默认即可:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gWn5JLxd-1666318825835)(https://pic1.zhimg.com/80/v2-6d4ccf4d055fec993ad1f92b3da4da68_1440w.webp)]

如果没有做JLink Pack配置文件的拷贝,这里就找到不这个型号。

  1. 然后选择Target Interface为SWD,以及选中列表中出现的USB CMSIS-DAP:

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

如果不用V3.24b版本,这里的列表中就可能没有正确找到USB CMSIS-DAP设备。找不到设备,就无法下载烧录了。

  1. 在下一个界面中,选择之前编译成功的固件文件:firmware.elf

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

firmware.elf【注意,该文件需要放在全英文目录,否则可能读取错误。】

  1. 再Finish,就完成了配置,可以准备烧录了:

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

  1. 然后,点击绿色下箭头中的Download,就能开始烧录了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCVDqSbk-1666318825835)(https://pic3.zhimg.com/80/v2-f46641439cbdc40fb19ca3f0563082aa_1440w.webp)]

  1. 下一步会提示没有License,直接Yes通过无视即可:

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

  1. 等待下载完成即可:

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

使用Power Writer烧录

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

  1. 从Power Writer官方下载:https://docs.powerwriter.com/en/docs/powerwriter_for_arm/software/install并安装
  2. 在界面上,选择接口方式和PCU型号即可:

首次打开,可能会提示升级,按照提示升级即可。
设置完成后,右边信息窗口,会有对应的提示。

  1. 然后进入Program Memery界面,所有的操作都在这里了:

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

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

  1. 要烧录新的固件,需要先添加固件firmware.hex:

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DGNR7iBY-1666318825837)(https://pic1.zhimg.com/80/v2-cd42190cd5fe5a4aa165eaf6f0bc5170_1440w.webp)]

  1. 然后按照下面步骤操作一遍,即可下载:

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

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

MicroPython连接

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

  • MPU6050.py:https://github.com/adamjezek98/MPU6050-ESP8266-MicroPython/blob/master/mpu6050.py
  • ssd1306.py:https://github.com/micropython/micropython/blob/master/drivers/display/ssd1306.py

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

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

从 mobaxterm官方下载免费版本:https://mobaxterm.mobatek.net/download-home-edition.html
打开后,从会话中开启新的串口连接,选择好端口和速率115200:

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

连接成功后,回车,会显示>>,表示连接成功,可以操作了:

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

MPU6050数据读取

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

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

上述操作,将会显示当前连接的I2C设备:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JHox7c5T-1666318825838)(https://pic1.zhimg.com/80/v2-107b85121ef70d6b06deef22bd509514_1440w.webp)]

60对应0x30,一般为SSD1306
80对应0x50,为板载EEPROM
104对应0x68:为板载MPU6050

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

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

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

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

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

OLED1306驱动

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d4DKzFJv-1666318825839)(https://pic3.zhimg.com/80/v2-f386acc7ade746d8094d97c46cacb3d2_1440w.webp)]

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

读取MPU6050数据呈现到OLED1306

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

from machine import SoftI2C, Pinfrom ssd1306 import SSD1306_I2Cimport mpu6050import timeoled_width = 128oled_height = 64scl = 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)

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

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

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

视频效果如下:

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

总结+后续

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