MicroPython ESP32ssd1306驱动0.96“I2C屏幕+mpu6050图形控制

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MicroPython ESP32ssd1306驱动0.96“I2C屏幕+mpu6050图形控制相关的知识,希望对你有一定的参考价值。

【MicroPython ESP32】ssd1306驱动0.96“I2C屏幕+mpu6050图形控制


  • 效果演示

随着mpu6050模块的移动,oled屏幕矩形线框内的小方块也随对应的方向移动。

所需引入的模块

  • ssd1306.py模块
中文下载站:https://www.cnpython.com/pypi/micropython-ssd1306/download
官方下载站:https://pypi.org/project/micropython-ssd1306/
  • mpu6050.py模块
import machine


class accel():
    def __init__(self, i2c, gr,addr=0x68):
        self.iic = i2c
        self.addr = addr
        # 陀螺仪量程设置:
        # 寄存器地址   写入数据    量程
        # 0x1b          0x00      ±250°/s
        # 0x1b          0x08      ±500°/s
        # 0x1b          0x10      ±1000°/s
        # 0x1b          0x18      ±2000°/s   
        # 加速度计量程设置:
        # 寄存器地址   写入数据    量程
        # 0x1c          0x00      ±2G
        # 0x1c          0x08      ±4G
        # 0x1c          0x10      ±8G
        # 0x1c          0x18      ±16G
        #设置加速度倍率
        self.temp = bytearray(2)
        self.temp[0]=0x1C
        self.temp[1]=8*gr
        self.iic.writeto(self.addr, self.temp)        
        #a = self.iic.readfrom_mem(self.addr, 0x1C, 1)
        #print(a)
        
        #向0x6B寄存器写入0
        #表示开始数据传输
        self.temp[0] = 0x6B  # Co=1, D/C#=0
        self.temp[1] = 0
        self.iic.writeto(self.addr, self.temp)

    def get_raw_values(self):
        a = self.iic.readfrom_mem(self.addr, 0x3B, 14)
        return a

    def get_ints(self):
        b = self.get_raw_values()
        c = []
        for i in b:
            c.append(i)
        return c

    def bytes_toint(self, firstbyte, secondbyte):
        if not firstbyte & 0x80:
            return firstbyte << 8 | secondbyte
        return - (((firstbyte ^ 255) << 8) | (secondbyte ^ 255) + 1)

    def get_values(self):
        raw_ints = self.get_raw_values()
        vals = 
        vals["AcX"] = self.bytes_toint(raw_ints[0], raw_ints[1])
        vals["AcY"] = self.bytes_toint(raw_ints[2], raw_ints[3])
        vals["AcZ"] = self.bytes_toint(raw_ints[4], raw_ints[5])
        vals["Tmp"] = self.bytes_toint(raw_ints[6], raw_ints[7]) / 340.00 + 36.53
        vals["GyX"] = self.bytes_toint(raw_ints[8], raw_ints[9])
        vals["GyY"] = self.bytes_toint(raw_ints[10], raw_ints[11])
        vals["GyZ"] = self.bytes_toint(raw_ints[12], raw_ints[13])
        return vals  # returned in range of Int16
        # -32768 to 32767

    def val_test(self):  # ONLY FOR TESTING! Also, fast reading sometimes crashes IIC
        from time import sleep
        while 1:
            print(self.get_values())
            sleep(0.05)


实例代码

运行主代码前,需要先将ssd1306.pympu6050.py模块导入到MicroPython设备上,在运行。否则会报错,找不到对应的模块。

from machine import Pin
import machine
from utime import sleep 
from ssd1306 import SSD1306_I2C
from mpu6050 import accel

#初始化I2C0,服务于OLED屏幕
sda=Pin(25)
scl=Pin(26)
i2c=machine.I2C(0,sda=sda,scl=scl,freq=400000)
oled=SSD1306_I2C(128,64,i2c)

#初始化I2C1,服务于MPU6050
sda=Pin(27)
scl=Pin(14)
i2c1=machine.I2C(1,sda=sda,scl=scl,freq=40000)

#第二个参数为加速度最大量程
#0 ±2G   1  ±4G
#2 ±8G   3  ±16G
cgq=accel(i2c1,0)

BLOCK_SIZE=6
AREA_SIZE=48
AREA_X=80
AREA_Y=8
MOVE_SPAN = AREA_SIZE-BLOCK_SIZE

while True:
    v=cgq.get_values()
    acX=v['AcX']/16384.0
    acY=v['AcY']/16384.0
    acZ=v['AcZ']/16384.0
    coorY=int((acX+1)*0.5*MOVE_SPAN)
    coorX=int((acY+1)*0.5*MOVE_SPAN)
    #清空屏幕
    oled.fill(0)
    oled.text("acX:"+str(acX)[0:4]+"g",0,5)
    oled.text("acY:"+str(acY)[0:4]+"g",0,20)
    oled.text("acZ:"+str(acZ)[0:4]+"g",0,35)
    oled.rect(80,8,48,48,1)
    oled.fill_rect(AREA_X+coorX,AREA_Y+coorY,BLOCK_SIZE,BLOCK_SIZE,1)
    oled.show()
    sleep(0.05)
 

以上是关于MicroPython ESP32ssd1306驱动0.96“I2C屏幕+mpu6050图形控制的主要内容,如果未能解决你的问题,请参考以下文章

MicroPython ESP32ssd1306 0.96“OLED+气象数据中文显示

MicroPython ESP32ssd1306驱动0.96“I2C屏幕汉字显示示例

MicroPython ESP32ssd1306驱动0.96“I2C屏幕+mpu6050图形控制

MicroPython ESP32ssd1306模块基于GB2312字库驱动0.96“I2C屏幕汉字显示示例

ESP32 MicroPython开发之旅 设备篇⑦ —— dht11 OLED ssd1306,简单上手

MicroPython ESP32ssd1306驱动0.96“I2C屏幕cube3D图形显示