Micropython学习交流群 学习QQ群:786510434 提供多种固件下载和学习交流。
Micropython-扇贝物联 QQ群:31324057 扇贝物联是一个让你与智能设备沟通更方便的物联网云平台
Micropython学习交流群 学习QQ群:468985481 学习交流ESP8266、ESP32、ESP8285、wifi模块开发交流、物联网。
Micropython老哥俩的IT农场分享QQ群:929132891 为喜欢科创制作的小白们分享一些自制的计算机软硬件免费公益课程,由两位多年从事IT研发的中年大叔发起。
micropython 实现手表抬手亮屏以及mpu6050中断
最近很久没更新技术文章了,因为一直忙,本职工作也忙,单子也多,特别是前一阵子接了同一所大学的N个毕设(没有人能抗拒返现的诱惑),耗费比较多精力(主要是后期解答调试很耽误精力,看来我以后得做个截止时限),之后又连着做了两个商单,没闲着。
今天讲的也是商单引出的,有哥们托我写个摩尔斯电码的手表,商用的要求,不到毕设的预算,纯粹出于对这个项目的兴趣,我还是接下了。
这里重点研究了mpu6050,作为毕设最摆烂的六轴感应模块,以前我只知道输出原始数据没有深究,这次商用需要就对着手册好好撸了一遍,发现还是有很多东西可以深究的。
首先是mpy库,往上能找到一堆,但是我认为最专业的还是这个:
github mpu6050 https://github.com/micropython-IMU/micropython-mpu9x50
一看就比其他的专业,一是种类全,把mpu9150 9250也都涵盖进去了,另外还带了简单的数据分析,这个是很可贵的,不然原始数据还是太糙,说明不了什么问题。本次需要解决的问题有两个:
一、mpu6050怎么实现中断
都看见有个Int引脚,具体咋用,资料还真是贼少,最后终于在CSDN另一位大佬那里找到了,看这里:
另一位大佬的mpu6050中断机制详解
参照这个就省事多了,说白了就是寄存器写入,下面是我的代码,实现了简单的加速度中断:
#mpu6050加速度中断演示 by jd3096 vx jd3096 20220525 from imu import MPU6050 from machine import I2C,Pin import time i2c = I2C(sda=Pin(17), scl=Pin(16)) print(i2c.scan()) imu = MPU6050(i2c) int_irq=Pin(26,Pin.IN,Pin.PULL_UP) def fun(a): print('加速度中断') int_irq.irq(fun,Pin.IRQ_FALLING) ''' I2C_Write(GYRO_ADDRESS,MOT_THR,0x25); //设置加速度阈值为74mg I2C_Write(GYRO_ADDRESS,MOT_DUR,0x14); //设置加速度检测时间20ms I2C_Write(GYRO_ADDRESS,CONFIG,0x04); //配置外部引脚采样和DLPF数字低通滤波器 I2C_Write(GYRO_ADDRESS,ACCEL_CONFIG,0x1C); //加速度传感器量程和高通滤波器配置 I2C_Write(GYRO_ADDRESS,INT_PIN_CFG,0X1C); //INT引脚低电平平时 I2C_Write(GYRO_ADDRESS,INT_ENABLE,0x40); //中断使能寄存器 ''' imu._write(0x25,0x1f,imu.mpu_addr) imu._write(0x14,0x20,imu.mpu_addr) imu._write(0x04,0x1a,imu.mpu_addr) imu._write(0x1c,0x1c,imu.mpu_addr) imu._write(0x1c,0x37,imu.mpu_addr) imu._write(0x40,0x38,imu.mpu_addr) #print(imu.accel.xyz) # print(imu.gyro.xyz) # print(imu.temperature) # print(imu.accel.z)1234567891011121314151617181920212223242526272829303132
有人会问要中断有啥用,直接拿数据多好,我个人理解是中断是简单可靠的方式,最重要的是省电,esp32如果一直去检测状态判断,会浪费资源,再有就是功耗的问题了,有了中断平时就可以一直睡眠了,超级省电,做手表肯定需要这个逻辑啊,上面代码亲测好使,用力晃会引发上升沿中断,Nice!
第二个问题,如何实现抬手亮
这个我在往上找了一下,找到了思路:先检测运动,再检测是否水平,然后如果这俩间距小于一定时间,就视为抬手逻辑,有了思路咱就啥都不怕了,撸代码!
#mpu6050抬手亮逻辑演示 by jd3096 vx jd3096 20220525 from imu import MPU6050 from machine import I2C,Pin import time i2c = I2C(sda=Pin(17), scl=Pin(16)) print(i2c.scan()) imu = MPU6050(i2c) while 1: time.sleep_ms(100) print(imu.gyro.xyz) if abs(imu.gyro.x)>100 or abs(imu.gyro.y)>100 or abs(imu.gyro.z)>100: print('运动检测') s=time.ticks_ms() check=0 while time.ticks_ms()-s<200: if abs(imu.accel.x)<0.1 and abs(imu.accel.y)<0.1: check=1 if check==1: print('----------------------------') print('抬手亮')1234567891011121314151617181920212223
上面代码亲测可用,动的时候会显示运动检测,并在200ms内检测是否水平,只有200ms内同时达到两个逻辑才是抬手,亲测真的挺好用,阈值也可以自己调节。
手表的逻辑是既要省电又要抬手亮,两一结合完事儿,中断先唤醒,然后看是不是水平,是的话亮屏进入逻辑,不是的话继续睡,当然我想的这个不一定是最优解,有想法欢迎评论区探讨一下子。
Copyright © 2014 ESP56.com All Rights Reserved
执行时间: 0.0095579624176025 seconds