【得捷电子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
|