7639|5

330

帖子

5

TA的资源

纯净的硅(中级)

楼主
 

【行空板 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一切正常。这可能与行空板是外挂了硬件处理模块的原因,待李亮大佬进一步排查问题原因。

最新回复

太亮啦,我有个无线充电的,老亮了,我嫌弃晚上睡觉晃~  详情 回复 发表于 2023-1-3 22:59
点赞 关注

回复
举报

1704

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 

屏幕显示色卡选色,再控制WS2812B灯环

颜色显示错乱,应该是供电的问题

 

点评

是的,这个已经确认了  详情 回复 发表于 2022-11-18 09:04
 
 

回复

1万

帖子

25

TA的资源

版主

板凳
 

这个demo效果不错

 
 
 

回复

330

帖子

5

TA的资源

纯净的硅(中级)

4
 
火辣西米秀 发表于 2022-11-18 07:45 屏幕显示色卡选色,再控制WS2812B灯环 颜色显示错乱,应该是供电的问题  

是的,这个已经确认了

 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

5
 

屏幕显示色卡选色,再控制WS2812B灯环

颜色显示错乱,应该是供电的问题

 

 
 
 

回复

4942

帖子

12

TA的资源

版主

6
 
太亮啦,我有个无线充电的,老亮了,我嫌弃晚上睡觉晃~
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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