|
【行空板 Python编程学习主控板】使用屏幕色卡控制WS2812B灯环的控制器
[复制链接]
本帖最后由 HonestQiao 于 2022-11-17 23:02 编辑
行空板自带屏幕,而系统自带的Python,还预装了专用开发库unihiker和硬件控制库pinpong,可以让使用者非常方便的控制屏幕,以及快捷的和外部设备交互。
使用pinpong,在行空板上点亮WS2812B炫彩灯环,那是非常简单的事情。更进一步,如果能够通过屏幕操作,控制WS2812B,那就再好不过了。
经过一番研究,在行空板上,实现了通过屏幕显示色卡选色,然后控制WS2812B灯环,先分享给大家。
目录:
1. 硬件材料
2. 原理图
3. 实物连线
4. 逻辑设计
5. 代码编写
6. 使用步骤
7. 实际效果
8. 总结
一、硬件材料
在该作品中,使用到的硬件材料如下:
- 行空板
- WS2812B灯环:24灯珠
- Iot Power电源:用于为WS2812B提供电源
- 杜邦线:若干;注意行空板的接口为ph2.0
二、原理图
三、实物连线
上图中,使用了一块独立的IoT电源,专门给WS2812B灯环供电供电。同时,其电源输出的-,需要与行空板的GND连接共地。另外,此处应使用3.3V供电。
因为一颗WS2812B为三个LED,每个LED点亮需要20ma电流,显示为白色需要三个点亮,共60ma,24颗一起点亮的话,理论上,需要24颗*60ma/颗=1440ma电流,这远超行空板板载接口的输出电流限制。
所以,如果仅仅只点亮几颗的话,可以不用外接电源;如果有可能点亮多颗,甚至全部点亮,那务必要使用外部电源为WS2812B灯环供电。
四、逻辑设计
五、代码编写
根据设计,实际使用到的库如下:
1. pinpong库中的Board、Pin、NeoPixel类
2. unihiker库中的GUI类
3. PIL库中的Image类
4. time库中的sleep调用
处理的核心逻辑,为根据屏幕点击在坐标,取色卡图片中对应位置的颜色值,然后更新WS2812B灯环
# -*- coding: UTF-8 -*-
import time
from pinpong.board import Board,Pin,NeoPixel #导入neopixel类
from unihiker import GUI
from PIL import Image
# 屏幕鼠标移动回调
def mouse_move(x, y):
global move_time, mouse_status, color_chart_image, mouse_color
# 显示坐标值
pos_text.config(x=0,text="坐标:({},{})".format(x, y))
# 判断是否在色卡图片上移动
if y>=30 and y < 30+240:
# 在色卡图片中取色
mouse_color = color_chart_image.getpixel((x, y-30))
else:
# 超出则使用(0,0,0)
mouse_color = (0,0,0)
# 显示颜色之
color_text.config(x=100,text="颜色:({},{},{})".format(mouse_color[0],mouse_color[1],mouse_color[2]))
# 更新预览图片颜色
color_img.config(color=mouse_color)
# 更新当前移动时间
move_time = time.time()
# 设置移动状态
mouse_status = 1
# 打开色卡图片
color_chart_image_default = Image.open("imgs/color_chart.png")
# 调整色卡图片大小
color_chart_image = color_chart_image_default.resize((240,240)).convert('RGB')
# 关闭默认打开的色卡图片
color_chart_image_default.close()
# 初始化屏幕
gui = GUI()
gui.clear()
# 初始化屏幕标称文本
gui.draw_text(x=50, y=0, text="WS2812B色卡", font_size=13)
gui.draw_image(x=0,y=30,w=240,h=240,image=color_chart_image)
pos_text = gui.draw_text(x=40, y=300, text='鼠标坐标', font_size=10)
color_text = gui.draw_text(x=150, y=300, text='颜色', font_size=10)
# 初始化颜色预览色块
color_img = gui.fill_round_rect(x=224, y=304, w=14, h=14, r=2, color=(255,255,255))
# 初始化板子通讯
Board("UNIHIKER").begin()
# 初始化NEOPIXEL的引脚
NEOPIXEL_PIN = Pin(Pin.D24)
PIXELS_NUM = 24 #灯数
# 初始化NeoPixel
np = NeoPixel(NEOPIXEL_PIN,PIXELS_NUM)
np.clear()
time.sleep(1)
# 默认熄灭
np.range_color(0,PIXELS_NUM-1, 0x000000)
time.sleep(1)
# 设定中间量初始值
move_time = 0
mouse_status = 0
mouse_color = (0,0,0)
# 屏幕鼠标移动回调绑定
gui.on_mouse_move(mouse_move)
# 循环
while True:
# 检测是否松开触摸
if mouse_status == 1 and time.time()-move_time > 0.3:
mouse_status = 0
# 计算颜色值,更新WS2812B
color_hex = (mouse_color[0]<<16) + (mouse_color[1]<<8) + mouse_color[2]
np.range_color(0,PIXELS_NUM-1, color_hex)
print("鼠标松开,当前颜色:",mouse_color, color_hex)
time.sleep(1)
重点代码说明:
- 使用PIL.Image打开图片,并调整大小,使得宽度与屏幕宽度相同:
-
# 打开色卡图片
color_chart_image_default = Image.open("imgs/color_chart.png")
# 调整色卡图片大小
color_chart_image = color_chart_image_default.resize((240,240)).convert('RGB')
# 关闭默认打开的色卡图片
color_chart_image_default.close()
-
- 取图片指定位置对应的颜色:
-
mouse_color = color_chart_image.getpixel((x, y-30))
- 显示预览颜色色块:
-
color_img = gui.fill_round_rect(x=224, y=304, w=14, h=14, r=2, color=(255,255,255))
- 设置屏幕移动鼠标回调:
-
# 屏幕鼠标移动回调
def mouse_move(x, y):
global move_time, mouse_status, color_chart_image, mouse_color
# 显示坐标值
pos_text.config(x=0,text="坐标:({},{})".format(x, y))
# 判断是否在色卡图片上移动
if y>=30 and y < 30+240:
# 在色卡图片中取色
mouse_color = color_chart_image.getpixel((x, y-30))
else:
# 超出则使用(0,0,0)
mouse_color = (0,0,0)
# 显示颜色之
color_text.config(x=100,text="颜色:({},{},{})".format(mouse_color[0],mouse_color[1],mouse_color[2]))
# 更新预览图片颜色
color_img.config(color=mouse_color)
# 更新当前移动时间
move_time = time.time()
# 设置移动状态
mouse_status = 1
gui.on_mouse_move(mouse_move)
- 使用pinpong硬件库的NeoPixel控制WS2812B
-
#导入neopixel类
from pinpong.board import Board,Pin,NeoPixel
# 初始化板子通讯
Board("UNIHIKER").begin()
# 初始化NEOPIXEL的引脚
NEOPIXEL_PIN = Pin(Pin.D24)
PIXELS_NUM = 24 #灯数
# 初始化NeoPixel
np = NeoPixel(NEOPIXEL_PIN,PIXELS_NUM)
np.clear()
time.sleep(1)
# 默认熄灭
np.range_color(0,PIXELS_NUM-1, 0x000000)
time.sleep(1)
- np.range_color()的第三个参数,为RGB的16进制转换来的16进制数,即 RRGGBB
- 判断触摸结束:触摸移动的时候,可以实时取得坐标值,以及对应的颜色值,但是不能实时的控制WS2812B,因为可能会太密集。因此添加了一个判断是否松开0.3秒的判断。
六、使用步骤
1. 将代码保存到如下路径:
2. 操作屏幕菜单,使用 切换运行程序
3. 进入保存文件所在目录,并选中执行:
4. 在屏幕上触摸色卡对应的位置
七、实际效果
触摸色卡对应的颜色区块,然后松开,WS2812B就会被对应的颜色(相近)点亮:
八、总结
在设计开发本作品的过程中,行空板提供的GUI调用,以及pinpong硬件控制库方便的硬件控制能力,为开发提供了很大的方便,使得开发过程中,能够专心于具体逻辑的实现,而不用操心硬件底层的处理。
另外,在开发的过程中,遇到过时序问题,导致灯环颜色显示错乱的问题。这个灯环,我在其他开发板上也使用过,根据说明,使用外接5V电源供电,在行空板上,也自然认为应该要用5V供电。结果,就是这个5V,导致出现问题。在李亮大佬的指点下,改为3.3V一切正常。这可能与行空板是外挂了硬件处理模块的原因,待李亮大佬进一步排查问题原因。
|
|