【XR806开发板试用】简单点灯-- 基于SPI控制W2812矩阵幻彩动图和字幕显示系统

1.效果展示

1.gif 动图展示

在这里插入图片描述

2.字幕展示

在这里插入图片描述

2.软件开发流程

2.1 全志XR806 基本开发流程

使用指南
自己踩过的坑
在这里插入图片描述

必须app开头
鸿蒙hb 依赖python 环境。建议使用conda虚拟环境
在这里插入图片描述

下载开启硬件校验和烧录重启

2.2 W2812 简单介绍

不是科普文,自行百度
`/*WS2812B Timing sequence
________
| | T0L |
0 code |<------>|<-------------->|
| T0H |________________|

    ___________|		   |	   T1L	  |

1 code |<--------->|<--------- -->|
| T1H |______________|

RET code
| Treset |
|<------------------------->|
|___________________________|

Data transefer time:
T0H 0 code ,high voltage time 0.4us ±150ns
T1H 1 code ,high voltage time 0.8us ±150ns
T0L 0 code , low voltage time 0.85us ±150ns
T1L 1 code ,low voltage time 0.45us ±150ns
RES low voltage time Above 50us

*/`

硬件驱动

供电 5V
驱动电平 gpio口3.3v 需要加一些简单的转换电路到5v
驱动时序 这里使用SPI 驱动 支持DMA搬运
在这里插入图片描述

PB04 SPIO_MOSI 引脚
在这里插入图片描述

2.3 软件框架

2.3.1 UDP

1.联网获取IP
使用 wlan_demo 中 例子 wifi_device_connect_test
2.绑定端口
void udp_echoserver_init(void) { struct udp_pcb *upcb; err_t err; /* Create a new UDP control block */ upcb = udp_new(); if (upcb) { /* Bind the upcb to the UDP_PORT port */ /* Using IP_ADDR_ANY allow the upcb to be used by any local interface */ err = udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT); if (err == ERR_OK) { /* Set a receive callback for the upcb */ udp_recv(upcb, udp_server_receive_callback, NULL); printf("led udp bind OK \r\n"); }else printf("led udp bind error \r\n"); } }
3.注册接收回调
void udp_server_receive_callback(void *arg, struct udp_pcb *upcb,struct pbuf *p, const ip_addr_t *addr, u16_t port) { printf(" 11 udp receive_callback \r\n"); /* Connect to the remote client */ udp_connect(upcb, addr, port); /* Tell the client that we have accepted it */ udp_send(upcb, p); memset(udp_recv_date,0x00,UDP_RECV_DATE_MAX); uint32_t buf_len = pbuf_copy_partial(p, udp_recv_date, p->len, 42); uint32_t cur_pos; if(UDP_RECV_LED_BUFF_LEN==buf_len){ #if 1 for(u32_t i = 0;i < buf_len;){ if(i%48==0)printf("\r\n"); printf("%x-%x-%x ",udp_recv_date[i],udp_recv_date[i+1],udp_recv_date[i+2]); if(udp_recv_date[i]!=0)cur_pos = i; i+=3; } printf("\r\n recv data %d,pos=%d %d,%d\r\n",buf_len,cur_pos,cur_pos/48,(cur_pos%48)/3); #endif led_spi_update(udp_recv_date); //led_spi_update_test(); } /* free the UDP connection, so we can accept new clients */ udp_disconnect(upcb); /* Free the p buffer */ pbuf_free(p); }
4.提取UDP数据
pbuf_copy_partial(p, udp_recv_date, p->len, 42);
这里偏移了42。包含了一些UDP通信的信息。

2.3.2 SPI 驱动

1.SPI初始化 这里使用6M的速率
`void led_spi_init(void)
{
printf(“led_spi_init\r\n”);
IoTGpioInit(GPIO_ID_PA21); //(3)
IoTGpioSetDir(GPIO_ID_PA21, IOT_GPIO_DIR_OUT); //(4)

uint16_t i = 0;
uint16_t loop_color = 0;
SPI_Global_Config spi_param;spi_param.cs_level = DEMO_SPI_CS_LEVEL;
spi_param.mclk = DEMO_SPI_MCLK;HAL_SPI_Init(DEMO_SPI_PORT, &spi_param);SPI_Config spi_Config;
HAL_Status ret = HAL_OK;spi_Config.firstBit = SPI_TCTRL_FBS_MSB;
spi_Config.mode = SPI_CTRL_MODE_MASTER;
spi_Config.opMode = SPI_OPERATION_MODE_DMA;
spi_Config.sclk = DEMO_SPI_MCLK;
spi_Config.sclkMode = SPI_SCLK_Mode1;printf("spi open...\n");
ret = HAL_SPI_Open(DEMO_SPI_PORT, DEMO_SPI_CS, &spi_Config, 5000);
if (ret != HAL_OK) {printf("spi open failed");return ret;
}
HAL_SPI_Config(DEMO_SPI_PORT, SPI_ATTRIBUTION_IO_MODE, SPI_IO_MODE_NORMAL);
printf("led_spi_init ok.\n");

}
2.数据发送HAL_SPI_Transmit`
这里有坑:SPI驱动第一次数据第一个自己前2位。波形离谱。这里通过多发一个字节0x00.避免过去。

点阵屏

点阵屏灯排布

在这里插入图片描述

这里需要根据自己的走向修改程序。
`void broad_ws2812_set_position(uint8_t w,uint8_t h,uint8_t r,uint8_t g,uint8_t b)
{
uint16_t pos = 0;
pos = wBROAD_WS2812_STRIP_LED_H;
if(w%20){
pos +=h;
}
else{
pos +=(BROAD_WS2812_STRIP_LED_H-h-1);
}
if(r
g&&r==b)
{
led_spi_buff[pos
3+0] = 0; //
led_spi_buff[pos3+1] = 0;
led_spi_buff[pos
3+2] = 0;
}
else{
led_spi_buff[pos3+0] = b/2; //
led_spi_buff[pos
3+1] = r/2;
led_spi_buff[pos*3+2] = g/2;
}

}`

把2812控制数据变化成SPI数据

`static void led_data_to_ws2812(uint8_t val, uint8_t* dst)
{
int i = 7;

for (i = 7; i >= 0; i--)
{if ((val >> i) & 0x01){*(dst++) = 0xfc;}else{*(dst++) = 0xc0;}
}

}`

系统简介

本系统实现了,使用python 控制 wifi蓝牙 2812点阵板子控制。可以实现大数据传输,实时仿真控制,暂时很好效果。

开源 百度网盘大家自行下载测试

在这里插入图片描述

链接:https://pan.baidu.com/s/1b3u0MtCrWUPOOnkjKskyQw
提取码:6666

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/587787.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Pytorch+昇腾NPU部署baichuan2-7B大模型

一、模型介绍 Baichuan 2 是百川智能推出的新一代开源大语言模型&#xff0c;采用 2.6 万亿 Tokens 的高质量语料训练。Baichuan 2 在多个权威的中文、英文和多语言的通用、领域 benchmark 上取得同尺寸最佳的效果。 它基于 Transformer 结构&#xff0c;在大约1.2万亿 tokens…

etcdctl配置

下载etcdctl压缩文件 wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gztar -xvf etcd-v3.5.0-linux-amd64.tar.gzsudo mv ./etcd-v3.5.0-linux-amd64/etcdctl /usr/local/bin/ chmod x /usr/local/bin/etcdctl 配置etcdctl 配…

Visual Studio安装下载进度为零已解决

因为在安装pytorch3d0.3.0时遇到问题&#xff0c;提示没有cl.exe&#xff0c;VS的C编译组件&#xff0c;可以添加组件也可以重装VS。查了下2019版比2022问题少&#xff0c;选择了安装2019版&#xff0c;下面是下载安装时遇到的问题记录&#xff0c;关于下载进度为零网上有三类解…

自贡市第一人民医院:超融合与 SKS 承载 HIS 等核心业务应用,加速国产化与云原生转型

自贡市第一人民医院始建于 1908 年&#xff0c;现已发展成为集医疗、科研、教学、预防、公共卫生应急处置为一体的三级甲等综合公立医院。医院建有“全国综合医院中医药工作示范单位”等 8 个国家级基地&#xff0c;建成高级卒中中心、胸痛中心等 6 个国家级中心。医院日门诊量…

【C++】二分查找算法(模板)

重点 只需要记住两点&#xff1a; 1.left right 时&#xff0c;一定就是最终结果&#xff08;包括找不到目标值&#xff09;&#xff0c;无需再次判断&#xff0c;如果判断就会死循环 2.求中点如果是求左端点 mid left (right - left)/2 如果是求右端点 mid left (right -…

游戏引擎之高级动画技术

一、动画混合 当我们拥有各类动画素材&#xff08;clips&#xff09;时&#xff0c;要将它们融合起来成为一套完整的动画。 最经典的例子就是从走的动画自然的过渡到跑的动画。 1.1 线性插值 不同于上节课的LERP&#xff08;同一个clip内不同pose之间&#xff09;&#xff…

Qt5.15以上版本在线安装步骤,可选择更多早期版本

以ubuntu系统为例&#xff1a; 1、先去下载在线安装程序&#xff1a; https://download.qt.io/official_releases/online_installers/ 选择合适的版本&#xff0c;这里是在x64机器的ubuntu虚拟机里安装QT&#xff0c;所以选择如下版本&#xff1a; 或者直接在终端执行如下命令…

蓝桥杯刷题-四平方和

四平方和 代码&#xff1a; from copy import deepcopy n int(input()) maxn int(5e6) 10 dic dict() for a in range(maxn):if a * a > n:breakfor b in range(a,maxn):if a * a b * b > n:breakif dic.get(a*ab*b) is None:dic[a*ab*b] (a,b) ans [maxn for _ …

Android Studio学习7——常用控件view

Android控件 双击shift键——>搜索想要找的文件 Ctrlshift回车——>补全“&#xff1b;”号 CtrlX——>删除一行&#xff0c;只需把鼠标放在那一行 windows自带字体

qt通过setProperty设置样式表笔记

在一个pushbutton里面嵌套两个label即可&#xff0c;左侧放置图片label&#xff0c;右侧放置文字label&#xff0c;就如上图所示&#xff1b; 但是这时的hover&#xff0c;press的伪状态是没有办法“传递”给里面的控件的&#xff0c;对btn的伪状态样式表的设置&#xff0c;是不…

【软考】-函数依赖与无损分解

1、保持函数依赖 分解出的多个关系模式&#xff0c;仍可以保持原来的依赖集&#xff0c;并且消除传递依赖 如 R(A,B,C) F(A->B, B->C) 分解R1(A,B)&#xff0c;R2(A,C) 从R1、R2 可以假设 A->B &#xff0c;B->A , A->C 。所以保持函数依赖 2、无损分解 …

Excel列匹配VLookUp功能使用

生活中很多关于excel多列数据进行匹配计算等场景,其中最常用的一个函数就是VLookUp了,下面直接上图: 得到结果如下: 得到结果如下: 注意: 1.在需要把计算完的数据粘贴到另一列或者另个sheet时,复制后,不要直接ctrlv粘贴,这样会把计算公式粘贴到对应的列.正确做法是:右键粘贴,选…