183|0

132

帖子

2

TA的资源

一粒金砂(中级)

BeagleY-AI 05 驱动 OLED 液晶屏显示文字 [复制链接]

BeagleY-AI 05 驱动 OLED 液晶屏显示文字
背景
管脚
硬件连接
I2C 设备扫描
安装库并运行示例
创建 python 虚拟环境
安装 Luma OLED Python 库
克隆 luma.examples 仓库
运行 welcome.py
重写 eeworld_welcome.py
 
 
背景
BeagleY-AI 默认有5个I2C接口,但是其中有3路被 CSI/DSI 以及 OLDI 占用,只有另外2路接到 40-Pin 接口;所有的 I2C 接口都有外部上拉。
  • MCU_I2C0 作为主要的外部 I2C 接口,连接到 HAT3/HAT5;
  • WKUP_I2C0 同样连接到 40-Pin 接口,连接到 HAT27/HAT28。但是这路I2C与板子上的很多器件共用了,例如 PMIC,Board ID EEPROM 以及 RTC。通常不建议使用这个I2C接口。
wd_001217w9xyobhb7o33mpuo.png
 
 
管脚
 
 
wd_001217yt9j2yq9xx21tza6.png
 
 
硬件连接
购买了一个野火 0.96 英寸 OLED 模块,接口为 I2C ,单色屏。
BeagleY-AI 板卡 0.96英寸 OLED 模块 说明
HAT-1, 3.3V VCC 电源
HAT-6, GND GND
HAT-5, SCL SCL I2C 时钟
HAT-3, SDA SDA I2C 数据

 

 

wd_001217fi5ur6dei93ur3ru.png
 
I2C 设备扫描
先安装 i2c-tools 工具
sudo apt install i2c-tools
 
输入以下命令扫描I2C1设备总线上的设备,扫描到 0x3c 地址的设备
sudo i2cdetect -y -r 1
wd_001217zq39n4wid13q3pwu.png
 
安装库并运行示例
此处使用 luma.oled 库来驱动 OLED,非常方便。
 
创建 python 虚拟环境
在当前项目目录创建一个名为 venv 的虚拟环境,输入以下命令
python3 -m venv venv
输入以下命令激活这个虚拟环境
source venv/bin/active
 
安装 Luma OLED Python 库
在当前虚拟环境中输入以下命令安装 luma.oled 库
python -m pip install --upgrade luma.oled
wd_001217f3iz3mdmwh9b33pd.png
因为我已经安装过,所以不用重新下载。
 
克隆 luma.examples 仓库
在项目目录输入以下命令:
git clone https://github.com/rm-hull/luma.examples.git
我已经克隆过,直接看下目录结构
wd_001217ep3dj6pdgp26hpph.png
 
运行 welcome.py
这个示例是在 OLED 屏幕上动态显示多国语言的 welcome
代码如下:
python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2014-2023 Richard Hull and contributors
# See LICENSE.rst for details.
# PYTHON_ARGCOMPLETE_OK

"""
Unicode font rendering & scrolling.
"""

import random
from pathlib import Path
from demo_opts import get_device
from luma.core.virtual import viewport, snapshot, range_overlap
from luma.core.sprite_system import framerate_regulator
from PIL import ImageFont

welcome = [
u"Бзиала шәаабеит",
u"Къеблагъ",
u"Welkom",
u"Bienvenue",
u"Maayong pag-abot",
u"Mayad-ayad nga pad-abot",
u"Mir se vjên",
u"እንኳን ደህና መጣህ።",
u"Willkumme",
u"أهلاً و سهل",
u"مرحابة",
u"Bienvenius",
u"Բարի գալուստ!",
u"আদৰণি",
u'欢迎光临',
u"歡迎光臨",
u"ᑕᑕᐊᐧᐤ",
u"Woé zɔ",
u"Bula",
u"Vælkomin",
u"Buiti achüluruni",
u"પધારો",
u"ברוך הבא",
u"Üdvözlet",
u"ಸುಸ್ವಾಗತ",
u"Приємаєме"
u"Xoş gəlmişsiniz!",
u"Salamat datang",
u"Сәләм бирем!",
u"Ongi etorri",
u"Menjuah-juah!",
u"স্বাগতম",
u"Добре дошли",
u"வாருங்கள்",
u"Kíimak 'oolal",
u"Märr-ŋamathirri",
u"Benvinguts",
u"Марша дагIийла шу",
u"歡迎",
u"Velkommen",
u"Welcome",
u"Wäljkiimen",
u"კეთილი იყოს თქვენი",
u"Καλώς Όρισες",
u"Eguahé porá",
u"Sannu da zuwa",
u"Aloha",
u"सवागत हैं",
u"Selamat datang",
u"Fáilte",
u"ようこそ",
u"Ирхитн эрҗәнәвидн",
u"Witôj",
u"សូម​ស្វាគមន៍",
u"환영합니다",
u"ຍິນດີຕ້ອນຮັບ",
u"Swagatam",
u"Haere mai",
u"Тавтай морилогтун",
u"خوش آمدید",
u"Witam Cię",
u"ਜੀ ਆਇਆ ਨੂੰ।",
u"Bon vinuti",
u"ยินดีต้อนรับ",
u"Hoş geldiniz",
u"Croeso",
u"Bonvenon",
u"Vitajte"
]

colors = [
"lightpink", "pink", "crimson", "lavenderblush", "palevioletred", "hotpink",
"deeppink", "mediumvioletred", "orchid", "thistle", "plum", "violet",
"magenta", "fuchsia", "darkmagenta", "purple", "mediumorchid", "darkviolet",
"darkorchid", "indigo", "blueviolet", "mediumpurple", "mediumslateblue",
"slateblue", "darkslateblue", "lavender", "ghostwhite", "blue", "mediumblue",
"midnightblue", "darkblue", "navy", "royalblue", "cornflowerblue",
"lightsteelblue", "lightslategray", "slategray", "dodgerblue", "aliceblue",
"steelblue", "lightskyblue", "skyblue", "deepskyblue", "lightblue",
"powderblue", "cadetblue", "azure", "lightcyan", "paleturquoise", "cyan",
"aqua", "darkturquoise", "darkslategray", "darkcyan", "teal",
"mediumturquoise", "lightseagreen", "turquoise", "aquamarine",
"mediumaquamarine", "mediumspringgreen", "mintcream", "springgreen",
"mediumseagreen", "seagreen", "honeydew", "lightgreen", "palegreen",
"darkseagreen", "limegreen", "lime", "forestgreen", "green", "darkgreen",
"chartreuse", "lawngreen", "greenyellow", "darkolivegreen", "yellowgreen",
"olivedrab", "beige", "lightgoldenrodyellow", "ivory", "lightyellow",
"yellow", "olive", "darkkhaki", "lemonchiffon", "palegoldenrod", "khaki",
"gold", "cornsilk", "goldenrod", "darkgoldenrod", "floralwhite", "oldlace",
"wheat", "moccasin", "orange", "papayawhip", "blanchedalmond", "navajowhite",
"antiquewhite", "tan", "burlywood", "bisque", "darkorange", "linen", "peru",
"peachpuff", "sandybrown", "chocolate", "saddlebrown", "seashell", "sienna",
"lightsalmon", "coral", "orangered", "darksalmon", "tomato", "mistyrose",
"salmon", "snow", "lightcoral", "rosybrown", "indianred", "red", "brown",
"firebrick", "darkred", "maroon", "white", "whitesmoke", "gainsboro",
"lightgrey", "silver", "darkgray", "gray", "dimgray", "black"
]

def make_font(name, size):
font_path = str(Path(__file__).resolve().parent.joinpath('fonts', name))
return ImageFont.truetype(font_path, size)

def lerp_1d(start, end, n):
delta = float(end - start) / float(n)
for i in range(n):
yield int(round(start + (i * delta)))
yield end

def lerp_2d(start, end, n):
x = lerp_1d(start[0], end[0], n)
y = lerp_1d(start[1], end[1], n)

try:
while True:
yield next(x), next(y)
except StopIteration:
pass

def pairs(generator):
try:
last = next(generator)
while True:
curr = next(generator)
yield last, curr
last = curr
except StopIteration:
pass

def infinite_shuffle(arr):
copy = list(arr)
while True:
random.shuffle(copy)
for elem in copy:
yield elem

def make_snapshot(width, height, text, fonts, color="white"):

def render(draw, width, height):
t = text

# measure text
for font in fonts:
left, top, right, bottom = draw.multiline_textbbox((0, 0), t, font)
size = right - left, bottom - top
if size[0] > width:
t = text.replace(" ", "\n")
left, top, right, bottom = draw.multiline_textbbox((0, 0), t, font)
size = right - left, bottom - top
else:
break

# draw text
left = (width - size[0]) // 2
top = (height - size[1]) // 2
draw.multiline_text((left, top), text=t, font=font, fill=color,
align="center", spacing=-2)

return snapshot(width, height, render, interval=10)

def random_point(maxx, maxy):
return random.randint(0, maxx), random.randint(0, maxy)

def overlapping(pt_a, pt_b, w, h):
la, ta = pt_a
ra, ba = la + w, ta + h
lb, tb = pt_b
rb, bb = lb + w, tb + h
return range_overlap(la, ra, lb, rb) and range_overlap(ta, ba, tb, bb)

def main():
regulator = framerate_regulator(fps=30)
fonts = [make_font("code2000.ttf", sz) for sz in range(24, 8, -2)]
sq = device.width * 2
virtual = viewport(device, sq, sq)

color_gen = pairs(infinite_shuffle(colors))

for welcome_a, welcome_b in pairs(infinite_shuffle(welcome)):
color_a, color_b = next(color_gen)
widget_a = make_snapshot(device.width, device.height, welcome_a, fonts, color_a)
widget_b = make_snapshot(device.width, device.height, welcome_b, fonts, color_b)

while True:
posn_a = random_point(virtual.width - device.width, virtual.height - device.height)
posn_b = random_point(virtual.width - device.width, virtual.height - device.height)
if not overlapping(posn_a, posn_b, device.width, device.height):
break

virtual.add_hotspot(widget_a, posn_a)
virtual.add_hotspot(widget_b, posn_b)

for _ in range(30):
with regulator:
virtual.set_position(posn_a)

for posn in lerp_2d(posn_a, posn_b, device.width // 4):
with regulator:
virtual.set_position(posn)

virtual.remove_hotspot(widget_a, posn_a)
virtual.remove_hotspot(widget_b, posn_b)

if __name__ == "__main__":
try:
device = get_device()
main()
except KeyboardInterrupt:
pass

 

 

wd_001219th7fpf77jz0bfs00.gif
 
 
重写 eeworld_welcome.py
参考上面的 welcome.py 代码,我重写了一个显示 EEWORLD & DigiKey 的代码
python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2014-2022 Richard Hull and contributors
# See LICENSE.rst for details.
# PYTHON_ARGCOMPLETE_OK

"""
Simple println capabilities.
"""

import time
from pathlib import Path
from demo_opts import get_device
from luma.core.virtual import terminal
from PIL import ImageFont

def make_font(name, size):
font_path = str(Path(__file__).resolve().parent.joinpath('fonts', name))
return ImageFont.truetype(font_path, size)

def main():
"""
可以接受的字体:
("ProggyTiny.ttf", 16), ("miscfs_.ttf", 12), ("FreePixel.ttf", 12), ('ChiKareGo.ttf', 16)
"""

for fontname, size in [('ChiKareGo.ttf', 16)]:
font = make_font(fontname, size) if fontname else None
term = terminal(device, font)

term.println("EEWORLD & DigiKey")
term.println("------------------")
term.println(" by CoderX9527")
term.puts(" 20250415")
term.flush()
time.sleep(2)

while True:
pass

if __name__ == "__main__":
try:
device = get_device()
main()
except KeyboardInterrupt:
pass
wd_001220mhwl2dwkj1wjv8kv.gif
 
wd_001220m2prjwpsqtpqp8hp.png

此帖出自边缘AI论坛
个人签名

点个灯吧


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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
Proteus经典例子

Proteus经典例子软件等级: ★★★ CadenceIC设计(全FPGA-CPLD开发简明教vhdl语言例程集锦.PROTELDXP培训教材proteldxp ...

基于脉冲频率调制的光电测量传输电路的设计

基于脉冲频率调制的光电测量传输电路的设计

家庭电子 教您一招

1.电热水器应勤换镁棒 市售在1000元以下的电热水器的内胆一般采用镀锌铁板卷制而成,其焊缝与管 接头部分虽经涂敷处理,但在长 ...

涛行便携式MP3开发板及MP3语音播放模块资料大放送

涛行便携式MP3开发板是一款为便携功能度身定制的MP3专用学习板,可用3-4节电池供电,整机仅为名片大小.浓缩了涛行电子多年MP3相关 ...

旋转编码器解码

随着电子技术的发展,旋转编码器的应用越来越广泛。下面我们谈谈对旋转编码器的解码。 旋转编码器是用来测量转速的装置 ...

工程师遇到电子技术难题怎么办?MPSNow让难题无所遁形

工程师们,常常以攻克电子技术难题为己任,遇到问题,不解决完,绝不罢休! 但是,英雄也有辛酸泪,遇到疑难杂症,往往求 ...

大佬们,求教一下什么是DFX设计呀

什么是DFX设计

【行空板 Python编程学习主控板】八:试用总结

本帖最后由 数码小叶 于 2022-12-13 22:17 编辑 通过这几周的行空板试用,虽然没有体验完行空板的全部功能,只是选择了几方面 ...

技术人容易陷入哪些误区?

本帖最后由 Nubility 于 2024-6-14 23:22 编辑 技术人最容易陷入哪些误区? 1. 认为做产品赚钱一定是需要很高的技术 ...

【 AI挑战营(进阶)】5.模型部署 1 rknn推理测试

本帖最后由 iexplore123 于 2025-1-12 04:26 编辑 【AI挑战营(进阶)】在RV1106部署InsightFace算法的多人实时人脸识别实战5 ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表