FastBond 活动之 智能可穿戴(PI PICO+ADXL345+MAX30100)
1.智能穿戴项目来源和构思介绍 2.使用PI PICO+ADXL345+MAX30100实现项目的过程
标签
嵌入式系统
Titan
更新2021-12-06
1345

.项目来源和构思  

1.项目来源--FastBond活动

FastBond是硬禾学堂联合Digi-Key发起的活动,在看了电子森林网站上苏老师对Micropython的介绍,同时在Miya的大力鼓励下,用下班后的时间肝了一周,选择智能穿戴主题,做了一个小项目。

2.项目构思--智能可穿戴

FastBond需要选择ADI和美信的芯片,这两家芯片比较熟悉的是电源和传感器,如果使用电源芯片,需要用到示波器,限于条件和时间,选用了使用两家传感器的模块(ADXL345 / MAX30100),主控的选择也花了一些时间,网络上这种主控一般选用ESP32+Arduino的组合,限于材料和编程能力,选择了Pi Pico+Micropython的组合,这种组合比较适合入门级的用户,关于Pi Pico的介绍网上已经有很多,下面主要介绍一下ADXL345和MAX30100.

ADI芯片:ADXL345简介:

ADXL345模块上使用ADXL345和一颗5V转3.3V的LDO,其中,ADXL345是ADI的一颗超低功耗3轴加速度计,模块线路如下:

FjR6dCxCzz8f2HB45lmPmHuIbUb-

ADXL345有如下一些特点:

1.小而薄:3 mm × 5 mm × 1 mm, 14引脚小型超薄塑料封装。

2.分辨率高(13位):测量范围达± 16g。数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)或I2C数字接口访问。

3.非常适合移动设备应用:ADXL345可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。其高分辨率(3.9mg/LSB),能够测量不到1.0°的倾斜角度变化。

4.多种特殊检测功能:

活动和非活动检测功能通过比较任意轴上的加速度与用户设置的阈值来检测有无运动发生。

敲击检测功能可以检测任意方向的单振和双振动作。

自由落体检测功能可以检测器件是否正在掉落。

这些功能可以独立映射到两个中断输出引脚中的一个。

5.低功耗系统:

1)片上32级先进先出(FIFO)缓冲器存储数据,可降低主机CPU负荷,从而降低整机功耗。

2)低功耗模式支持基于运动的智能电源管理,从而以极低功耗进行阈值感测和运动加速度测量。

美信芯片:MAX30100简介:

MAX30100模块上是一颗MAX30100芯片和一颗LDO,线路如下:

FvIRIpGSGs6fWlEAzFK1lSHcPWR5

MAX30100有如下一些特点:

1.设计为可穿戴用,集成血氧计和心率传感器

2.支持宽电源输入:1.8V-3.3V

3.微小封装: 微小化的5.6mm x 2.8mm x 1.2mm 光学增强片上封装

4.超低功耗:0.7uA的超低关机电流即可

5.高级功能:高信噪比,高采样率,集成了环境光抵消技术,快速数据输出功能。

这是系统功能示意图:

Fr2HhWCBVJcgKyzQRs2dX10ESMW1

.项目实现过程  

智能可穿戴项目分为:主控,传感器,电源(包含在模块中)。

以下对本次任务进行分解:

第一步:选取器件

1)选择主控,如上面所说,因为ESP32这类软件以Arduino(C/C++)为主,限于能力原因,需要选择容易上手的软件语言,查找MicroPython支持Pi Pico,正好手头有一块可以用上,另外确认Pico生态很好,可参照例程多,学习起来相对也算方便。

2)选择屏幕,这个比较容易,一般选择I2C总线的SSD1306,手上正好有一块,也找到了Micropython的库,确定使用。

3)选择传感器,这个在Miya的建议下,选择ADI和美信的传感器,在网上平台找,很多,同时确认要有MicroPython的库供参考,自己写库目前还没这个能力,综合下来,选择了ADXL345和MAX30100,这是两个比较成熟的方案。

第二步:器件硬件连接

1.主控和屏连接

屏是SSD1305(兼容SSD1306),使用I2C总线,按I2C格式和Pico进行Pin2Pin,面包板搭建即可,参考如下:

FtsWZrWgghlmvEeXCsBJcCpDRUUE

 

2.主控和传感器连接

传感器刚开始都用I2C来连接,但是发现ADXL345的MicroPython库无法正常运行,改为使用SPI连接,所以说多种总线连接,对使用者非常友好,ADXL345的模块默认I2C,如果改为SPI,需要将R4拿掉,如下示意图,另外SPI的连接示意图如下:

Fo4y4yCWjGRRYrGzfmfXIrEMSFU2

Fn9zSXPH4w5mB3f2Gvo3nXfzp6kb

第三步:实现和调试

1)硬件调试:

硬件方面调试包括面包板搭建,总线选择,如上除了ADXL345的总线选择有变动,其余部分比较正常。

2)软件调试:

软件方面使用了MicroPython,根据Pico官方建议,使用Thonny IDE,完美兼容Pico,MicroPython的使用和Arduino等类似,如果使用某个模块,需要先准备好这个模块的库(我理解为驱动),再在main.py中进行合适的调用。

我是按这个顺序来进行准备:

1.先准备好SSD1306的库(Micropython的库和Python的库不是完全通用,需要进行适配,具体部分暂时还没学会),并且利用Github上的例程,先把屏点亮,在此需要按MicroPython的语法,修改实际对应的I2C端口(此处的端口不是Pico上的Pin数,是Pico的GPIO Pin数,这点尤为重要),并且需要对应Pico的I2C的组别(I2C 0 或 I2C 1),在Pico Pin示意图中有

i2c_dev = I2C(0,scl=Pin(9),sda=Pin(8),freq=400000)  # start I2C on I2C0 (GPIO 8/9)

另外,利用oled语法来提取传感器数据,也是一个艰难的过程(对我这个软件小新来说)

比如,如下{:.1f}是代表小数点后一位,format(temp)可提取temp的str变量的数据,这种基础知识是查了好久才了解(在此感谢苏老师,某度垃圾信息特别多,花费很多无用功,看到苏老师提到B-ing,果然很有用,所搜即所得)

    oled.fill(0) # clear the display
    oled.text("Temp=", 0, 0)
    oled.text("{:.1f}".format(temp), 40, 0)
    oled.text("SPO2=", 0, 10)
    oled.text("{:.1f}".format(spo2), 40, 10)
    oled.text("X=", 0, 20)
    oled.text("{:.2f}".format(acc_x), 15, 20)
    oled.text("Y=", 0, 30)
    oled.text("{:.2f}".format(acc_y), 15, 30)
    oled.text("Z=", 0, 40)
    oled.text("{:.2f}".format(acc_z), 15, 40)
    oled.show() # show the new text and image
    oled.fill(0)

2.点屏后,逐个来点两个传感器

先载入各自的库,或者直接在main中放库内容。

参考例程在while中点MAX30100

    mx30 = max30100.MAX30100()
    mx30.refresh_temperature()
    reg = mx30.get_registers()
    mx30.enable_spo2()
    mx30.read_sensor()
    mx30.ir, mx30.red
    temp = mx30.get_temperature()
    print('TEMP=%d'%temp)
    spo2 = mx30.ir
    print('SPO2=%d'%spo2)

参考例程在while中点ADXL345

    data = reg_read(spi, cs, REG_DATAX0, 6)
    acc_x = ustruct.unpack_from("<h", data, 0)[0]
    acc_y = ustruct.unpack_from("<h", data, 2)[0]
    acc_z = ustruct.unpack_from("<h", data, 4)[0]
    acc_x = acc_x * SENSITIVITY_2G * EARTH_GRAVITY
    acc_y = acc_y * SENSITIVITY_2G * EARTH_GRAVITY
    acc_z = acc_z * SENSITIVITY_2G * EARTH_GRAVITY
    print("X=", "{:.2f}".format(acc_x), \
          ", Y=", "{:.2f}".format(acc_y), \
          ", Z=", "{:.2f}".format(acc_z))

第四步:演示效果  

如下是当上电后,屏读取并显示传感器数据,因为还在摸索调试传感器库,所以显示结果不准确。

Fo9Wv-MojAn96cE96pqyrWeMSJWy

.活动总结,一些感想

本次参加这个活动,最感谢硬禾学堂Miya,感谢苏老师,虽然时间很短,从决定开始到出结果一共不到七天,选题,买器件,搭电路,初学MicroPython,到调试显示,学习了很多,这些也多亏参加几期Funpack积累了一些经验,不然光靠下班后肝三四个小时,在以前是做不到的。

另:ADXL345的库引用了CSDN博主「袁易学」的原创文章,在此感谢

往后一如既往,继续支持电子森林,硬禾学堂!

 

 

附件下载
Code source.zip
其中MAX30100和OLED SSD1306的库可单独放置,main.py中包含了ADXL345的库和调用
团队介绍
团队成员
Titan
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号