• 【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即可。

    软件

    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
    
    • 1
    • 2

    其中包含了苏勇大佬提供的移植版本,位于:/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
    
    • 1
    • 2

    启用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
    
    • 1
    • 2

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

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

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

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

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

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

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

    后续也会多次出现,一律点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:

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

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

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

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

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

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

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

    1. 等待下载完成即可:

    使用Power Writer烧录

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

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

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

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

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

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

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

    MicroPython连接

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

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

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

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

    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()]))
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

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

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

    import mpu6050
    accelerometer = mpu6050.accel(i2c)
    accelerometer.get_values()
    
    • 1
    • 2
    • 3

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

    现在,读取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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    现在,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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

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

    视频效果如下:

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

    总结+后续

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

  • 相关阅读:
    域名与根服务器
    数据结构之算法
    Git 分布式版本控制工具01:Git介绍+下载+安装
    R语言时间序列数据提取:使用xts包的last函数提取时间序列中最后面一个月的数据(last 1 month)
    Kubernetes 架构介绍
    proxy_arp=1与默认路由之争
    Joe 主题 Halo 移植版搭建部署教程
    Postman使用
    python sqlalchemy(ORM)- 03 更新和查询
    sql注入攻击与防护
  • 原文地址:https://blog.csdn.net/weixin_47569031/article/details/127440937