- 2024-01-17
-
加入了学习《门廊灯的控制展示》,观看 门廊灯的视频效果
-
上传了资料:
控制中心代码
-
上传了资料:
门廊灯 原理图
- 2024-01-16
-
发表了主题帖:
【DigiKey创意大赛】门廊灯的实现-作品提交
作品名称:门廊灯的实现
作者:你家吃的
一 作品介绍
本作品作为一个自制智慧控制模块中心的实现。主要使用stm32mp1 作为控制中心,作为开发板集成度很好,网络模块很全面,使用开发板的有线网络,创建tcp服务端,实现100客户端位置,便于以后的控制模块扩展。
控制中心发送控制指令,来控制门廊灯的灯效。
设计的被控制模块为门廊灯模块,模块采用esp32芯片,除了基本的灯效控制,还利用了该模块的无线功能,创建tcp客户端,连接控制中心,接受控制中心的控制指令。
目前灯效实现了数字的显示。以后使用过程中根据喜好继续扩展灯效。
二、系统框图
门廊灯控制芯片和门廊灯灯集成在一块模块上,实现主要的功能。创建客户端后时刻监控服务器发送过来的控制指令,并实现相应的灯效。
控制中心创建服务器后,接收用户输入的指令,目前使用控制台输入控制指令,并把指令发送到第一个客户端句柄。
如下是 门廊灯的模块图,主要有一个esp32芯片和一个4*5灯盘。灯使用了ws2812b灯珠,使用一根线可控制所有的灯。设计了一个mos管,可实现灯的开启关闭。不过测试过程中,没调试出来,所以临时短接了mos管,删除了灯盘的开关功能。
三、各部分功能说明
3.1 控制中心
采用了STM32MP157开发板,STM32MP157是一款双核主处理器+实时协处理器的soc,主处理器采用ARM Cortex-A7,频率可达650MHz, 实时协处理器采用Cortex-M4,频率可达209Mhz。最大支持1GByte的DDR3/3L, 具有千兆以太网。除了Cortex-A7 以及Cortex-M4之外的部件被称为核外外设或片上外设。 如GPIO、USART(串口)、I2C、SPI等都叫做片上外设.
将上图的主要功能可以归类为: Cortex A7内核、Cortex M4核的协处理器、总线、易失性存储、 可持久性存储、时钟、定时器、电源管理、高速通信、低速通信、网络、多媒体、 模拟信号处理、LCD控制器、安全和IO输入输出等。
3.2 esp32
门廊灯模块采用ESP32WROVERE模组。ESP32-WROVER通用型 Wi-Fi + Bluetooth + Bluetooth LE MCU 模组,功能强大,用途广泛,可以用于低功耗传感器网络和要求极高的任务,例如语音编码、音频流和 MP3 解码等。采用 PCB 板载天线。CPU 时钟频率的调节范围为 80 MHz 到 240 MHz。用户可以关闭 CPU 的电源,利用低功耗协处理器监测外设的状态变化或某些模拟量是否超出阈值。ESP32 还集成了丰富的外设,包括电容式触摸传感器、SD 卡接口、以太网接口、高速 SPI、UART、I2S 和 I2C 等。Wi-Fi 支持极大范围的通信连接,也支持通过路由器直接连接互联网;而蓝牙可以让用户连接手机或者广播 Bluetooth LE Beacon 以便于信号检测。ESP32 芯片的睡眠电流小于 5 µA,使其适用于电池供电的可穿戴电子设备。模组支持的数据传输速率高达 150 Mbps,天线输出功率达到 20 dBm,可实现最大范围的无线通信。因此,这款模组具有行业领先的技术规格,在高集成度、无线传输距离、功耗以及网络联通等方面性能极佳,模组框图如下。
esp32的设计框图如下,实现一个最小系统。
设计的灯珠数量为4*9矩阵的灯盘,目前使用了4*5实现数字的显示,框图如下图。
电源部分设计如下,使用typec接口的电源,并使用ams1117-3.3芯片,得到3.3伏电压,用来给esp32 供电。
四、作品源码
嵌入式软件源码:
上位机软件源码:
门廊灯硬件原理图
创建tcp服务器
int createTcpSvr()
{
logINO("ql_socket_service_create--");
int ql_socket_id = 0;
char ret = 0;
int sk_port = 1111;
/**************creat socket handle**********/
if((ql_socket_id = socket(AF_INET,SOCK_STREAM,0)) < 0){
perror("socket");
return -1;
}
/**********************set socket addr reuse**********************/
int reuseaddr = 1;
if(setsockopt(ql_socket_id, SOL_SOCKET, SO_REUSEADDR,(const void *)&reuseaddr,(socklen_t)sizeof(int)) == -1){
perror("setsockopt\n");
logRED("setsockopt----errno[%d]",errno);
return -1;
}else{
printf("setsockopt\n");
}
/********************set socket property*************************/
struct sockaddr_in service_addr;
bzero(&service_addr,sizeof(service_addr));
service_addr.sin_family=AF_INET;
service_addr.sin_port=htons(sk_port);
service_addr.sin_addr.s_addr = htonl(INADDR_ANY);
/**********************bind socket addr and port**********************/
if (bind(ql_socket_id,(struct sockaddr *)&service_addr,sizeof(struct sockaddr)) == -1){
perror("bind");
return -1;
}else{
logGRE("bind success--sk_port[%d]",sk_port);
}
if(listen(ql_socket_id, PENDING_QUEUE) == -1){
perror("listen");
return -1;
}else{
logGRE("listen success");
}
return ql_socket_id;
}
实现控制指令的下发
void ParsrPorchLightMode(char* inputStr)
{
logWHI("ParsrPorchLightMode [%s]",inputStr);
if(netInfo[1][1]){
send(netInfo[1][0],inputStr,1,0);
}
}
实现循环检测客户端的断连
while(1){
tempo_tv = dl_tv;
FdsTempR = client_rset;
FdsTempW = client_wset;
fdsFlag = select(maxFd+1,&FdsTempR,&FdsTempW,NULL,&tempo_tv);
memset(data_buffer,0,DATA_BUF);
switch(fdsFlag)
{
case -1:
logPURP("error data len[%d]",fdsFlag);
return -1;
case 0:
logPURP("time out ");
break;
default:
if(FD_ISSET(netInfo[0][0],&FdsTempR)){
logPURP(" there one client connected");
new_sk = accept(netInfo[0][0] ,(struct sockaddr*)&CliInfo,&CLiLen);
inet_ntop(AF_INET,&CliInfo.sin_addr,(char*)MyIP,IP_LEN);
MyPort = ntohs(CliInfo.sin_port);
logPURP(" there is a new client,fd[%d][%s][%d]",new_sk,MyIP,MyPort);
for(int i = 0;i < FD_CNT;i++){
if(netInfo[i][1] == 0){
netInfo[i][0] = new_sk;
netInfo[i][1] = 1;
maxFd = new_sk > maxFd?new_sk:maxFd;
FD_SET(new_sk, &client_rset);
FD_SET(new_sk, &client_wset);
break;
}
}
}else{
for(int i = 1;i < FD_CNT && netInfo[i][1];i++){
if(FD_ISSET(netInfo[i][0],&FdsTempR)){
rec_len = recv(netInfo[i][0],data_buffer,DATA_BUF,0);
switch (rec_len)
{
case -1:
logPURP(" error[%s]errno[%d]",strerror(errno),errno);
return -1;
case 0:
netInfo[i][1] = 0;
FD_CLR(netInfo[i][0], &FdsTempR);
FD_CLR(netInfo[i][0], &FdsTempW);
logPURP("client socket diconnect!!!sk[%d]",netInfo[i][0]);
break;
default:
logPURP("rec_len [%d]data_buffer[%s]",rec_len,data_buffer);
break;
}
}
}
}
}
}
获取键盘输入,并发送数据到第一个客户端
void server_operate_cmd(void* buff)
{
logWHI("server_operate_cmd");
char inputStr[64] = {0};
while(1){
scanf("%s", inputStr);
logWHI("inputStr [%s]",inputStr);
ParsrPorchLightMode(data_buffer);
}
}
五、作品功能演示视频
[localvideo]67357caa1af1d3bc0fa653af388c2e44[/localvideo]
六、项目总结
本次 活动很棒,不过对于我来说确实时间有点太着急了,刚好时间卡在一次出差中间,耽误很多时间,出差回来,着急忙慌得开始写代码,实现硬件焊接和代码调试,以及控制中心的实现。尤其是esp32的烧录,消耗了好几天时间,最终发现是我的串口版故障,真是个很简单又弱智的故障。有一说一,esp32的无线模块实现的真好,可以很简单的快速实现网络。
本项目结构比较简单,实现的门廊灯的代码,控制中心就相对容易很多了,只需要把控制指令发送出去。对于控制协议,没有设计,直接明文发送。
后续稍加修改,可以实现手机控制门廊灯。回家之前一键开启门廊灯,方便快捷。
报告的最后非常感谢DigiKey和EEWORLD,组织了这场活动,为众多电子爱好者和专业人士提供平台,帮助广大电子er实现自己的idea。
- 2023-11-30
-
回复了主题帖:
【DigiKey创意大赛】板子开发硬件了解
lugl4313820 发表于 2023-11-30 08:15
这款开发板选得有水平,可以尽情发挥大佬的技术。期待优秀作品呀!
板子为主,设计不重要
-
回复了主题帖:
【DigiKey创意大赛】板子开发硬件了解
wangerxian 发表于 2023-11-30 16:52
准备RGB灯阵列?
应该差不多意思
-
回复了主题帖:
【DigiKey创意大赛】板子开发硬件了解
Bymyself 发表于 2023-11-30 09:11
这个板子不带屏吗?
还有屏?
- 2023-11-29
-
发表了主题帖:
【DigiKey创意大赛】板子开发硬件了解
本帖最后由 你家吃的 于 2023-11-29 23:10 编辑
1 板子信息
板子使用STM32MP157芯片,该芯片基于 双核arm a7,还有一个m4的mpu。使用内存是4g的ddr3。支持千兆有线网络。usb接口支持otg模式,并最高支持速度是hs。
另外板子提供了四个led,用于测试程序。两个用户按钮和一个重启按钮,和一个唤醒按钮。
需要外接5v/3a的外接点源。
视频接口方面有两种接口,mipi、hdmi。
可以插入一个sd卡。板载有一个stlingk 调试器,并同时模拟一个窗口,用于输出日志。
关于无线接口,支持 低功耗4.1蓝牙, 802.11b/g/n wifi。
2 项目介绍
本次活动设计的产品是家庭门户门廊灯,主要依靠板子的网络支持 和 gpio脚。网络支持可以实现手机远程控制门廊灯,或者开家门之前一旦手机连接家里WiFi,实现自动点亮门廊灯。
gpio脚用于控制led的灯效。本产品选择ws2816b灯珠,一根gpio脚,就能实现千万灯效。
3 板子相关硬件介绍
主要是gpio脚,可以看到有一个双排20脚的公排,用于咱们的控制led的引脚。
很可惜,看起来无线模块没有焊接。
至于产品的控制部分,只能退而求其次用有线网络来控制了。
用户编程按键和led
3 外设模块的设计
原理图如下,设计4*10 灯阵,用于主要灯盘,实现各种灯效。
实际pcb效果如下: