985|6

281

帖子

7

TA的资源

一粒金砂(高级)

楼主
 

【得捷电子Follow me第1期】005:简易水平仪 [复制链接]

 

上一帖介绍GPS定位数据获取并把数据显示在OLED上。这一贴介绍利用3轴数字加速度计做一个简易水平仪。参考GitHub上的文档和代码,我的试验过程如下。

GROVE 3-AXIS DIGITAL ACCEL LIS3D模块简介:Seeed Studio Grove 3轴数字加速度计(LIS3DHTR)基于LIS3DHTR芯片,具有多个量程和接口选择。这个三轴加速度计支持I (2)C、SPI和ADC GPIO接口。这允许在连接开发板时进行选择。这个加速计还可以监测周围的温度。我之所以选择这个模块,主要是因为这个3轴数字加速度计模块是得捷上面最便宜的一款了,其他的价格都超范围了。

图1、加速度计模块

LIS3D模块连接接非常简单,只需要将I2C接口连接到Grove底板的I2C0上即可,线缆是附带的。

LIS3DH加速计是很常用的一款器件,数据读取程序早有大佬们给做好了,先克隆GitHub上的库:

链接已隐藏,如需查看请登录或者注册

借用前人的成果,只需在例程里面改一下I2C的IO配置,很容易就实现了数据的读取,可以通过REPL窗口打印输出。

为了更直观的体现加速度计的可用性,我参考掌控板水平球的例程,设计了一个建议水平仪。其中MicroPython的framebuf库不支持画圆,自己写得画圆代码效率太低,我只好将圆球改成方块了,不过实际效果还可以,不是很难看。

整个程序如下,我对掌控板水平球的例程进行了一些修改,主要取其核心的算法。

from machine import Pin,I2C
from ssd1306 import SSD1306_I2C
import math
import time
from micropython_lis3dh import lis3dh

def numberMap(x, in_min, in_max, out_min, out_max):
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

led = machine.Pin('LED', machine.Pin.OUT)

i2c0 = machine.I2C(0,sda=machine.Pin("GP8"), scl=machine.Pin("GP9"), freq=400000)
lis = lis3dh.LIS3DH(i2c0)
i2c1=machine.I2C(1, sda=machine.Pin("GP6"), scl=machine.Pin("GP7"), freq=400000)
oled = SSD1306_I2C(128, 64, i2c1)

oled.fill(0)
oled.show()
oled.text("hello eeworld",5,10)
oled.show()
time.sleep(0.1)
oled.fill(0)

Center_x=63           #设定中心点(原点)x的坐标
Center_y=31           #设定中心点(原点)y的坐标
offsetX = 0
offsetY = 0

oled.rect(20,25,8,8,1)   #绘制起始坐标(60, 25),宽30,高25的矩形
oled.fill_rect(80,25,4,4,1)   #绘制起始坐标(100, 25),宽20,高25填充满颜色的矩形
oled.show()
 
lis.data_rate = lis3dh.DATARATE_200
while True:
    accx,accy,accz = lis.acceleration
    x=accx      #获取X轴的加速度
    y=accy      #获取Y轴的加速度

    if y<=10 and y>=-10:
        offsetX =int(numberMap(y,10,-10,-64,64))   #映射Y轴偏移值
    if x<=10 and x>=-10:
        offsetY =int(numberMap(x,10,-10,32,-32))   #映射X轴偏移值
    move_x=Center_x + offsetX                 #水平球在X坐标上的移动
    move_y=Center_y + offsetY                 #水平球在Y坐标上的移动
    '''
    print("X: ", x)
    print("offsetX: ", offsetX)
    print("Y: ", y)
    print("offsetY: ", offsetY)
    print("----------")
    '''
    oled.rect(Center_x-2,Center_y-2,8,8,1)  #画中心固定圆:空心
    oled.fill_rect(move_x,move_y,4,4,1)     #画移动的水平球:实心
    oled.text("%0.1f,%0.1f" %(x,y),0,0)    #显示水平球在X、Y轴的加速度值

    if offsetX==0 and offsetY==0:
        led.on()         #水平球在中心位置亮绿灯,亮度为10
    else:
        led.off()           #水平球不在中心位置灭灯

    oled.show()
    time.sleep(0.1)
    oled.fill(0)

代码1、水平仪程序

运行代码,结果如下视频。操作起来还挺好玩的。

001

 

视频1、水平仪演示

参考资料:

https://mpython.readthedocs.io/zh/master/tutorials/basics/accelerometer.html

最新回复

挺好的idea。   详情 回复 发表于 2023-6-5 21:58
点赞 关注
 
 

回复
举报

4919

帖子

12

TA的资源

版主

沙发
 
这个我就想问怎么校准啊~可以用手机自带的的校准吗?

点评

这个加校准程序也挺简单,就是还得加能存储参数之类的部分。 实际体验不用校准,这个传感器挺准的,平齐的时候肉眼看着很水平  详情 回复 发表于 2023-6-3 09:48
 
 
 

回复

281

帖子

7

TA的资源

一粒金砂(高级)

板凳
 
吾妻思萌 发表于 2023-6-3 09:41 这个我就想问怎么校准啊~可以用手机自带的的校准吗?

这个加校准程序也挺简单,就是还得加能存储参数之类的部分。

实际体验不用校准,这个传感器挺准的,平齐的时候肉眼看着很水平

 
 
 

回复

6968

帖子

11

TA的资源

版主

4
 
这个创意好呀,赶快去落地,说不定明天有人投一个亿给你。

点评

地主家的余粮没这么好骗的  详情 回复 发表于 2023-6-3 19:26
 
 
 

回复

281

帖子

7

TA的资源

一粒金砂(高级)

5
 
lugl4313820 发表于 2023-6-3 11:45 这个创意好呀,赶快去落地,说不定明天有人投一个亿给你。

地主家的余粮没这么好骗的

点评

要有想法才是呀,财富自由不是梦,最近那个华为天才少年,几百个亿到手。  详情 回复 发表于 2023-6-3 21:06
 
 
 

回复

6968

帖子

11

TA的资源

版主

6
 
sipower 发表于 2023-6-3 19:26 地主家的余粮没这么好骗的

要有想法才是呀,财富自由不是梦,最近那个华为天才少年,几百个亿到手。

 
 
 

回复

175

帖子

0

TA的资源

一粒金砂(中级)

7
 

挺好的idea。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表