【雕爷学编程】MicroPython动手做(14)——掌控板之OLED屏幕

知识点:什么是掌控板?
掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED显示屏、RGB灯、加速度计、麦克风、光线传感器、蜂鸣器、按键开关、触摸开关、金手指外部拓展接口,支持图形化及MicroPython代码编程,可实现智能机器人、创客智造作品等智能控制类应用。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

掌控板硬件特性:
ESP-32主控
处理器:Tensilica LX6双核处理器(一核处理高速连接;一核独立应用开发)
主频:高达240MHz的时钟频率
SRAM:520KB
Flash:8MB
Wi-Fi标准:FCC/CE/TELEC/KCC
Wi-Fi协议:802.11 b/g/n/d/e/i/k/r (802.11n,速度高达150 Mbps),A-MPDU和A-MSDU聚合,支持0.4us防护间隔
频率范围:2.4~2.5 GHz
蓝牙协议:符合蓝牙v4.2 BR/EDR和BLE标准
蓝牙音频:CVSD和SBC音频低功耗:10uA
供电方式:Micro USB供电
工作电压:3.3V
最大工作电流:200mA
最大负载电流:1000mA
掌控板载
三轴加速度计MSA300,测量范围:±2/4/8/16G
地磁传感器MMC5983MA,测量范围:±8 Gauss;精度0.4mGz,电子罗盘误差±0.5°
光线传感器
麦克风
3 颗全彩ws2812灯珠
1.3英寸OLED显示屏,支持16*16字符显示,分辨率128x64
无源蜂鸣器
支持2个物理按键(A/B)、6个触摸按键
支持1路鳄鱼夹接口,可方便接入各种阻性传感器
拓展接口
20通道数字I/O, (其中支持12路PWM,6路触摸输入)
5通道12bit模拟输入ADC,P0~P4
1路的外部输入鳄鱼夹接口:EXT/GND
支持I2C、UART、SPI通讯协议

在这里插入图片描述
在这里插入图片描述
1、OLED显示模块
有机发光二极管(Organic Light-Emitting Diode, UIV OLED)又称为有机电激光显示、有机发光半导体(Organic Electroluminesence Display, UIV OLED)。与液晶显示(Liquid Crystal Display, LCD)是不同类型的发光原理。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低耗电、极高反应速度等优点。 OLED显示模块为OLED显示屏+PCB+铁框构成,便于安装,广泛应用于工业现场,军工等行业。

主要特点:OLED为自发光材料,不需用到背光板,同时视角广、画质均匀、反应速度快、较易彩色化、用简单驱动电路即可达到发光、制程简单、可制作成挠曲式面板,符合轻薄短小的原则,应用范围属于中小尺寸面板。
显示方面:主动发光、视角范围大;响应速度快,图像稳定;亮度高、色彩丰富、分辨率高。
工作条件:驱动电压低、能耗低,可与太阳能电池、集成电路等相匹配。
适应性广:采用玻璃衬底可实现大面积平板显示;如用柔性材料做衬底,能制成可折叠的显示器。由于OLED是全固态、非真空器件,具有抗震荡、耐低温(-40℃)等特性,在军事方面也有十分重要的应用,如用作坦克、飞机等现代化武器的显示终端。

在这里插入图片描述
2、OLED屏工作原理
OLED的基本结构是由一薄而透明具半导体特性之铟锡氧化物(ITO),与电力之正极相连,再加上另一个金属阴极,包成如三明治的结构。整个结构层中包括了:空穴传输层(HTL)、发光层(EL)与电子传输层(ETL)。当电力供应至适当电压时,正极空穴与阴极电荷就会在发光层中结合,产生光亮,依其配方不同产生红、绿和蓝RGB三原色,构成基本色彩。OLED的特性是自己发光,不像TFT LCD需要背光,因此可视度和亮度均高,其次是电压需求低且省电效率高,加上反应快、重量轻、厚度薄,构造简单,成本低等,被视为 21世纪最具前途的产品之一。

有机发光二极体的发光原理和无机发光二极体相似。当元件受到直流电(Direct Current;DC)所衍生的顺向偏压时,外加之电压能量将驱动电子(Electron)与空穴(Hole)分别由阴极与阳极注入元件,当两者在传导中相遇、结合,即形成所谓的电子-空穴复合(Electron-Hole Capture)。而当化学分子受到外来能量激发后,若电子自旋(Electron Spin)和基态电子成对,则为单重态(Singlet),其所释放的光为所谓的荧光(Fluorescence);反之,若激发态电子和基态电子自旋不成对且平行,则称为三重态(Triplet),其所释放的光为所谓的磷光(Phosphorescence)。

在这里插入图片描述

3、掌控板板载1.3英寸OLED显示屏,分辨率128x64。采用Google Noto Sans CJK 16x16字体,支持简体中文,繁体中文,英文、日文和韩文语言。

在这里插入图片描述

4、OLED屏的坐标体系
掌控板OLED显示屏的分辨率是128x64,其意思是水平方向含有128个像素,垂直方向含有64个像素。屏幕上一共有128x64个像素点。

在这里插入图片描述

坐标X、Y值即对应屏幕横向、纵向位置。其实这样的X、Y在屏幕上就构成了一个直角坐标系。当X、Y值对应为0、0的时候,文字显示在屏幕的左上角;当Y值不变、X的值增加,文字垂直高度不变,水平向右移动;当X值不变、Y的值增加,文字水平位置不变,垂直向下移动。文字移动的这两个方向即构成了如下图所示的X、Y直角坐标系。水平方向用X轴表示,垂直方向用Y轴表示。

在数学中,是这样定义直角坐标系的:在平面内画两条互相垂直,并且有公共原点的数轴,其中横轴为X轴,纵轴为Y轴,这样我们就说在平面上建立了平面直角坐标系,简称直角坐标系。

掌控板屏幕分辨率为128x64,所以X轴的数值为0-127,Y轴的数值为0-63。

在这里插入图片描述

5、画直线(三横三竖)

from mpython import *

import time
while True:
    oled.fill(0)
    oled.show()
    time.sleep(1)
    oled.hline(0, 16, 128, 1)
    oled.show()
    time.sleep(1)
    oled.hline(0, 32, 128, 1)
    oled.show()
    time.sleep(1)
    oled.hline(0, 48, 128, 1)
    oled.show()
    time.sleep(1)
    oled.fill(0)
    oled.show()
    time.sleep(1)
    oled.vline(33, 0, 64, 1)
    oled.show()
    time.sleep(1)
    oled.vline(66, 0, 64, 1)
    oled.show()
    time.sleep(1)
    oled.vline(99, 0, 64, 1)
    oled.show()
    time.sleep(1)

mPthon 图形编程

在这里插入图片描述
在这里插入图片描述
6、画圆、三角形和矩形

from mpython import *
import time

while True:
    oled.fill(0)
    oled.DispChar("Hello, world!", 0, 16, 1)
    oled.show()
    time.sleep(1)
    oled.fill(0)
    oled.circle(64, 32, 30, 1)
    oled.fill_triangle(0, 0, 20, 40, 90, 63, 1)
    oled.RoundRect(40, 20, 50, 30, 30, 1)
    oled.rect(60, 20, 20, 50, 1)
    oled.show()
    time.sleep(1)

mPythonX 图形编程

在这里插入图片描述
在这里插入图片描述
7、动态曲线图形

from mpython import *
import time

def testdrawline():
    for i in range(0,64):
        oled.line(0,0,i*2,63,1)
        oled.show()
    for i in range(0,32):
        oled.line(0,0,127,i*2,1)
        oled.show()
    time.sleep_ms(250)
    oled.fill(0)
    oled.show()
    for i in range(0,32):
        oled.line(0,63,i*4,0,1)
        oled.show()
    for i in range(0,16):
        oled.line(0,63,127,(64-4*i)-1,1)
        oled.show()
    time.sleep_ms(250)
    oled.fill(0)
    oled.show()
    for i in range(1,32):
        oled.rect(2*i,2*i,(128-4*i)-1,(64-2*i)-1,1)
        oled.show()

testdrawline()

在这里插入图片描述

8、oled对象
oled对象为framebuf的衍生类,继承framebuf的方法。

oled.poweron()

开启显示屏电源。

oled.poweroff()

关闭显示器电源。

oled.contrast(brightness)

设置显示屏亮度。
brightness 亮度,范围0~255

oled.invert(n)

翻转像素点。当n=1时,未填充像素点点亮,填充像素点灭。当n=0时,则反。默认启动是填充像素点点亮。

oled.DispChar(s, x, y, mode=TextMode.normal)

oled屏显示文本。采用 Google Noto Sans CJK 开源无衬线字体字体。字体高度16像素点,支持英文,简体中文繁体中文,日文和韩文语言。 当显示字符串超出显示屏宽度可自动换行。
返回(字符总像素点宽度,续接显示的x,y坐标)的二元组。

s -需要显示的文本。
x 、y -文本的左上角作为起点坐标。
mode - 设置文本模式,默认为TextMode.normal

TextMode.normal - 等于1 。普通模式,文本显示白色,背景为黑色。
TextMode.rev - 等于2 。反转模式,文本显示黑色,背景为白色。
TextMode.trans - 等于3 。透明模式,透明文本意味着文本被写在显示中已经可见的内容之上。不同之处在于,以前屏幕上的内容仍然可以看到,而对于normal,背景将被当前选择的背景颜色所替代。
TextMode.xor - 等于4 。XOR模式,如果背景是黑色的,效果与默认模式(normal模式)相同。如果背景为白色,则反转文本。

oled.show()

将frame缓存发送至oled显示。

oled.fill(c)

用指定的颜色填充整个帧缓存。 c 为1时,像素点亮;c 为0时,像素点灭。

oled.circle(x, y, radius, c)

绘制圆
x 、y -左上角作为起点坐标。
radius -圆半径大小
c -为1时,像素点亮;c 为0时,像素点灭。

oled.fill_circle(x, y, radius, c)

绘制实心圆
x 、y -左上角作为起点坐标。
radius -圆半径大小
c -为1时,像素点亮;c 为0时,像素点灭。

oled.triangle(x0, y0, x1, y1, x2, y2, c)

绘制三角形
x0 、y0 -三角形上顶点坐标 。
x1 、y1 -三角形左顶点坐标 。
x2 、y2 -三角形左顶点坐标 。
c -为1时,像素点亮;c 为0时,像素点灭。

oled.fill_triangle(x0, y0, x1, y1, x2, y2, c)

绘制实心三角形
x0 、y0 -三角形上顶点坐标 。
x1 、y1 -三角形左顶点坐标 。
x2 、y2 -三角形左顶点坐标 。
c -为1时,像素点亮;c 为0时,像素点灭。

oled.bitmap(x, y, bitmap, w, h, c)

绘制bitmap图案
x 、y -左上角作为起点坐标
bitmap -图案bitmap 的btyearray字节数组
w -图案宽度
h -图案高度
c -为1时,像素点亮;

oled.RoundRect(x, y, w, h, r, c)

绘制弧角矩形
x 、y -左上角作为起点坐标
w -图案宽度
h -图案高度
r -圆弧角半径
c -为1时,像素点亮;c 为0时,像素点灭。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本实验使用esp32开发OLED显示屏,通过I2C通信协议连接MPU6050传感器,实时读取MPU6050的三轴加速度和三轴角速度数据,并通过OLED显示在屏幕上。 硬件连接: - SDA引脚连接到esp32的GPIO21引脚 - SCL引脚连接到esp32的GPIO22引脚 - VCC引脚连接到esp32的3.3V电源引脚 - GND引脚连接到esp32的GND引脚 代码实现: 首先需要导入必要的库文件,包括I2C和SSD1306 OLED驱动库。 ```python from machine import I2C, Pin import ssd1306 import time ``` 然后定义I2C和OLED驱动器的引脚和地址。 ```python i2c = I2C(scl=Pin(22), sda=Pin(21)) oled = ssd1306.SSD1306_I2C(128, 64, i2c, 0x3c) ``` 接下来初始化MPU6050传感器,设置采样率和滤波器等参数。 ```python def init_mpu6050(): i2c.writeto_mem(0x68, 0x6B, b'\x00') # 唤醒MPU6050 i2c.writeto_mem(0x68, 0x1B, b'\x18') # 设置陀螺仪量程为±2000°/s i2c.writeto_mem(0x68, 0x1C, b'\x08') # 设置加速度传感器量程为±4g i2c.writeto_mem(0x68, 0x1A, b'\x03') # 设置数字低通滤波器为42Hz ``` 读取MPU6050的三轴加速度和三轴角速度数据。 ```python def read_mpu6050(): data = i2c.readfrom_mem(0x68, 0x3B, 14) ax = (data[0] << 8) | data[1] ay = (data[2] << 8) | data[3] az = (data[4] << 8) | data[5] gx = (data[8] << 8) | data[9] gy = (data[10] << 8) | data[11] gz = (data[12] << 8) | data[13] ax = twos_comp(ax) / 16384.0 ay = twos_comp(ay) / 16384.0 az = twos_comp(az) / 16384.0 gx = twos_comp(gx) / 131.0 gy = twos_comp(gy) / 131.0 gz = twos_comp(gz) / 131.0 return ax, ay, az, gx, gy, gz ``` 将读取到的数据显示在OLED屏幕上。 ```python while True: oled.fill(0) ax, ay, az, gx, gy, gz = read_mpu6050() oled.text("Acc: %.2f, %.2f, %.2f" % (ax, ay, az), 0, 0) oled.text("Gyr: %.2f, %.2f, %.2f" % (gx, gy, gz), 0, 15) oled.show() time.sleep(0.1) ``` 完整代码: ```python from machine import I2C, Pin import ssd1306 import time i2c = I2C(scl=Pin(22), sda=Pin(21)) oled = ssd1306.SSD1306_I2C(128, 64, i2c, 0x3c) def twos_comp(val): if val & (1 << 15): val = val - (1 << 16) return val def init_mpu6050(): i2c.writeto_mem(0x68, 0x6B, b'\x00') # 唤醒MPU6050 i2c.writeto_mem(0x68, 0x1B, b'\x18') # 设置陀螺仪量程为±2000°/s i2c.writeto_mem(0x68, 0x1C, b'\x08') # 设置加速度传感器量程为±4g i2c.writeto_mem(0x68, 0x1A, b'\x03') # 设置数字低通滤波器为42Hz def read_mpu6050(): data = i2c.readfrom_mem(0x68, 0x3B, 14) ax = (data[0] << 8) | data[1] ay = (data[2] << 8) | data[3] az = (data[4] << 8) | data[5] gx = (data[8] << 8) | data[9] gy = (data[10] << 8) | data[11] gz = (data[12] << 8) | data[13] ax = twos_comp(ax) / 16384.0 ay = twos_comp(ay) / 16384.0 az = twos_comp(az) / 16384.0 gx = twos_comp(gx) / 131.0 gy = twos_comp(gy) / 131.0 gz = twos_comp(gz) / 131.0 return ax, ay, az, gx, gy, gz init_mpu6050() while True: oled.fill(0) ax, ay, az, gx, gy, gz = read_mpu6050() oled.text("Acc: %.2f, %.2f, %.2f" % (ax, ay, az), 0, 0) oled.text("Gyr: %.2f, %.2f, %.2f" % (gx, gy, gz), 0, 15) oled.show() time.sleep(0.1) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值