切换到宽版
  • 14683阅读
  • 266回复

[其他]LED点阵胸牌综合改造集合(开源 重新编程) [复制链接]

上一主题 下一主题
离线2545889167
 

发帖
11618
M币
56326
专家
255
粉丝
4524
— 本帖被 香瑶 设置为精华,作者+3000M币+5专家(2018-01-10) —
最近好多某宝的商家在做免费LED点阵胸牌的活动,撸了好几个。看着只能显示文字,没啥意思,堆灰不划算,就寻思着改造改造。
整理了下手上的胸牌的款式,发现大概有三款。
本贴就一一整理这三款胸牌的重新编程并点亮改造的过程

先上成果图
涉及这三款led胸牌
从上到下,定义
最上面款为:双按键,黑色PCB,单片机为GD32F150C6
中间款为:侧按键,绿色PCB,单片机为未知打磨芯片
最下面款为:单按键,黑色PCB,单片机为GD32F150C6

三款同时点亮的效果




改造成简易时钟




楼下开始仔细说来

本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共42条打赏M币+587专家+4
lsy789 M币 +20 歡迎探討 01-18
arbol M币 +30 優秀文章 01-18
sckocn M币 +1 優秀文章 01-17
vv3639480 M币 +1 優秀文章優秀文章優秀文章優秀文章 01-17
cao57508 M币 +8 優秀文章 01-16
juncheng M币 +1 精彩回帖 01-15
troy012 M币 +30 優秀文章,这个改的好,学习下 01-15
jpx999 M币 +15 真大神也!厉害了。 01-14
hover_730 专家 +1 謝謝分享,辛苦了,这么好的教程帖。 01-13
hover_730 M币 +13 謝謝分享,辛苦了,这么好的教程帖。 01-13
关键词: 胸牌时钟开源
离线2545889167

发帖
11618
M币
56326
专家
255
粉丝
4524
只看该作者 1楼 发表于: 01-08
先折腾第一款。
单按键,黑色PCB,单片机为GD32F150C6 usb接口是mini口

就是这款

这个板子比较蛋疼,因为是黑色油墨
先拆下芯片跑走线


先找出哪些脚是LED驱动脚,那些脚是其他的功能引脚
这个比较简单
图中蓝色点标记的就是LED驱动引脚,其他脚都是功能脚或者空脚


同时可以标出设计者引出的测试点。
其中PA13/PA14用于下载程序,还引出了一个串口


接着找LED的顺序
找LED顺序的方法是通过看PCB背面的走线,可以看出有一排灯间距过孔的走线就一定是LED驱动走线。然后按照着顺序一路用万用表测量下来就能找出驱动序列的顺序(这个步骤比较浪费时间)

因为设计者使用列阵法来驱动LED,所以通过这个顺序就能恢复出LED点亮序列

后来看了坛友的一个帖子,说是github上也有一个类似工程,引脚和这款胸牌一样,我吧整理好的引脚也贴下

引脚的驱动方式是,每两列用同一个列选拉高,每一行用两个行选拉低



吧芯片焊回去,开始测试点亮

连接SWD口调试口如下,使用JLINK联机(PS:这种细硅胶线用来飞线简直不要太爽)

打开JLINK 命令行软件,可以看到找到了CORTEX M3内核的设备,说明连接线没错

经检测这个GD32被设计者上锁了读取保护。
所以需要进行解锁
注意:这款胸牌一旦解锁,就不能回到原装出厂的程序,以后只能使用DIY的程序
解锁方法:
找到jlink安装目录 打开jlinkstm32.exe 选择按照stm32f1系列方式解锁
解锁后会提示以下成功消息。此时芯片已经被擦除干净,已经没有回头路了

使用jlink进行下载的时候,因为jlink支持列表里面没有GD32,所以,选择的芯片型号应该是
STM32F103C6
如图



程序因为太复杂,就只贴一小部分核心了
具体的看附件
  1. uint32_t Led_GPIO_Port_Arrange[22] = {GPIOF, GPIOB, GPIOB, GPIOB, GPIOB,
  2.                                                                                      GPIOB, GPIOB, GPIOA, GPIOA, GPIOF,
  3.                                                                                      GPIOB, GPIOB, GPIOA, GPIOF, GPIOB,
  4.                                                                                      GPIOB, GPIOB, GPIOB, GPIOA, GPIOB,
  5.                                                                                      GPIOB, GPIOB
  6.                                                                                     };
  7.                                                                                     
  8. const uint16_t Led_GPIO_Pin_Arrange[22] = {GPIO_Pin_7, GPIO_Pin_15, GPIO_Pin_14, GPIO_Pin_11, GPIO_Pin_12,
  9.                                            GPIO_Pin_2, GPIO_Pin_1, GPIO_Pin_6, GPIO_Pin_7, GPIO_Pin_0,
  10.                                            GPIO_Pin_9, GPIO_Pin_8, GPIO_Pin_5, GPIO_Pin_1, GPIO_Pin_4,
  11.                                            GPIO_Pin_13, GPIO_Pin_10, GPIO_Pin_0, GPIO_Pin_4, GPIO_Pin_6,
  12.                                            GPIO_Pin_5, GPIO_Pin_7
  13.                                           };
  14.                         
  15. /**********************************************/
  16. /* 函数功能;清除所有led对应io为复位          */
  17. /* 入口参数:无                               */
  18. /**********************************************/
  19. void Clear_All_LED(void)
  20. {
  21.     GPIO_CTL(GPIOA) &=0xffcc00ff;//清空A GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_10
  22.     GPIO_CTL(GPIOB) &=0x000000c0;//清空除了b3
  23.     GPIO_CTL(GPIOF) &=0xffff3ff0;//清空 f0,1,7
  24.     
  25.     GPIO_OCTL(GPIOA) &=~(GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_10);//清空A GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_10
  26.     GPIO_OCTL(GPIOB) &=~(GPIO_Pin_ALL-GPIO_Pin_3);//清空除了b3
  27.     GPIO_OCTL(GPIOF) &=~(GPIO_Pin_1|GPIO_Pin_0|GPIO_Pin_7);//清空 f0,1,7
  28. }
  29. void Write_One_LED_Pin(uint32_t GPIOx, uint16_t GPIO_Pin,uint8_t pin_satae)
  30. {
  31.     uint32_t i,pins;
  32.     for(i=0;i<16;i++)
  33.     {
  34.         if((GPIO_Pin>>i)&0x01)pins=i;
  35.     }
  36.     GPIO_CTL(GPIOx) |=(uint32_t)0x00000001<<pins*2;
  37.     
  38.     if(pin_satae)GPIO_BOP(GPIOx)|=GPIO_Pin;
  39.     else GPIO_BC(GPIOx)|=GPIO_Pin;
  40. }
  41. /**********************************************/
  42. /* 函数功能;点亮对应位置的led                */
  43. /* 入口参数:xy                              */
  44. /**********************************************/
  45. void LED_Open(uint8_t x, uint8_t y)
  46. {
  47.     if(x > 43 || y > 10)return;
  48.     Clear_All_LED();
  49.     Write_One_LED_Pin(Led_GPIO_Port_Arrange[x / 2], Led_GPIO_Pin_Arrange[x / 2], 1);
  50.     if(y == 0)
  51.     {
  52.         if(x % 2 == 0)
  53.         {
  54.             Write_One_LED_Pin(GPIOA, GPIO_Pin_10, 0);
  55.         }
  56.         else
  57.         {
  58.             if(x > 1)Write_One_LED_Pin(GPIOF, GPIO_Pin_7, 0);
  59.             else Write_One_LED_Pin(GPIOB, GPIO_Pin_15, 0);
  60.         }
  61.     }
  62.     else
  63.     {
  64.                 if(y==10&&x==42)
  65.                 {    
  66.                     Write_One_LED_Pin(GPIOB,GPIO_Pin_5,0);
  67.                     return;
  68.                 }
  69.                 if(y==10&&x==43)
  70.                 {    
  71.                     Write_One_LED_Pin(GPIOB,GPIO_Pin_6,0);
  72.                     return;
  73.                 }
  74.             
  75.         if(x % 2 == 0)
  76.         {
  77.             if(x <= 4 * y - 2) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2], Led_GPIO_Pin_Arrange[y * 2], 0);
  78.             else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 - 1], Led_GPIO_Pin_Arrange[y * 2 - 1], 0);
  79.         }
  80.         else
  81.         {
  82.             if(x <= 4 * y + 2) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 1], Led_GPIO_Pin_Arrange[y * 2 + 1], 0);
  83.             else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2], Led_GPIO_Pin_Arrange[y * 2], 0);
  84.         }
  85.     }
  86. }
最后全屏点亮的效果


楼下继续。下一款
[ 此帖被2545889167在2018-01-08 20:20重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共18条打赏M币+281专家+2
wenyiqe M币 +1 優秀文章 昨天 12:53
rabbitry M币 +30 单片机大神,膜拜中。。。 前天 17:19
sonj M币 +20 謝謝分享 01-15
newnet1234 M币 +20 謝謝分享 01-14
liufabing M币 +22 優秀文章 01-13
jpdd521 M币 +30 赏格好评,不要太爽硅胶线。。。 01-11
花生仔 M币 +13 謝謝分享 01-11
huaweiwx M币 +20 謝謝分享 01-11
zzy_85569381 M币 +13 謝謝分享 01-10
benli M币 +20 謝謝分享 01-10
12
离线2545889167

发帖
11618
M币
56326
专家
255
粉丝
4524
只看该作者 2楼 发表于: 01-08
第二款:双按键,黑色PCB,单片机为GD32F150C6 usb口为mini口
就是他
注意 这款胸牌焊接质量不怎么样,建议加固usb口和开关,不然很容易坏



同样的,国际惯例,先拆芯片跑走线

跑走线的过程,发现一个真心蛋疼的问题。
这个胸牌的开发设计者应该被祖宗8辈子全部骂一遍过来。居然胆大包天敢吧SWD调试接口给使用掉了,吧调试接口给使用掉了,给使用掉了,用掉了。
你这不就是给大家找麻烦吗?

没办法,只能一边骂一边跑走线了呗~
芯片下的走线细节



图中绿色点表示的是LED驱动引脚。我只想问你用PF6和PF7去驱动LED,检测按键会死啊。居然敢丧心病狂的吧PA13和PA14都占用
还很奇葩的吧PF6和PF7接了vcc和gnd,这是几个意思啊????简直是醉了醉了


绘出板载的测试点位置
其中串口的位置在正面,又是一个奇葩。在正面,只要接了线就没法转进壳子了啊。。。。
这里注意到这个设计者,在左边的按键设计了上拉结构。这个按键接了PA15作为按键检测,同时又用一个电阻上拉到boot0.
也就是说,只要在给芯片上电前按住按键,就会加入程序下载的ISP模式,然后使用串口下载程序


下载程序的软件使用GD32官方提供的ISP工具,就是这货。
这款胸牌不能使用JLINK进行调试


不过唯一值得欣慰的是,这款胸牌的程序没有上锁,所以可以读取出原装的固件。也就是说,玩累了还能吧原装固件恢复回去
楼下附件会给出拷贝读取出来的固件。
跑出LED的线序


这款胸牌的驱动列阵比楼上那款要稍微简单一些 但同样是使用23个引脚来扫描点亮11*44的LED列阵
下图中

蓝色为行编号(此处的0,1,2为物理行LED号)
橙色为列编号(此处的0,1,2为物理列LED号)
绿色为驱动对应的需要拉的引脚(此处的0,1,2为驱动管脚顺序号,也是就上图)
黄色为驱动对应的需要拉的引脚(此处的0,1,2为驱动管脚顺序号,也是就上图)


规律性更强

  1. void LED_Open(uint8_t x, uint8_t y)
  2. {
  3.     if(x > 43 || y > 10)return;
  4.     Clear_All_LED();
  5.     Write_One_LED_Pin(Led_GPIO_Port_Arrange[x / 2], Led_GPIO_Pin_Arrange[x / 2], 1);
  6.         if(y == 0)
  7.     {
  8.         if(x % 2 == 0)
  9.         {
  10.                     if(x > 0)Write_One_LED_Pin(Led_GPIO_Port_Arrange[0], Led_GPIO_Pin_Arrange[0], 0);
  11.                     else Write_One_LED_Pin(Led_GPIO_Port_Arrange[2], Led_GPIO_Pin_Arrange[2], 0);
  12.         }
  13.         else
  14.         {
  15.             if(x == 3)Write_One_LED_Pin(Led_GPIO_Port_Arrange[2], Led_GPIO_Pin_Arrange[2], 0);
  16.             else Write_One_LED_Pin(Led_GPIO_Port_Arrange[1], Led_GPIO_Pin_Arrange[1], 0);
  17.         }
  18.     }
  19.         else
  20.     {    
  21.         if(x % 2 == 0)
  22.         {
  23.                       if(x <= 4 * y) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 1], Led_GPIO_Pin_Arrange[y * 2 + 1], 0);
  24.             else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2], Led_GPIO_Pin_Arrange[y * 2], 0);
  25.         }
  26.         else
  27.         {
  28.             if(x <= 4 * y + 4) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 2], Led_GPIO_Pin_Arrange[y * 2 + 2], 0);
  29.             else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 1], Led_GPIO_Pin_Arrange[y * 2 + 1], 0);
  30.         }
  31.         }
  32. }





完整点亮的效果
肉眼看是均匀的,只是因为相机的问题,才会有个斜的亮条,实际是不影响的


[ 此帖被2545889167在2018-01-08 20:51重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共9条打赏M币+162
sonj M币 +20 謝謝分享 01-15
newnet1234 M币 +20 謝謝分享 01-14
jpdd521 M币 +30 第一图片上有一坨。 01-11
花生仔 M币 +13 謝謝分享 01-11
zzy_85569381 M币 +13 謝謝分享 01-10
benli M币 +20 謝謝分享 01-10
moontree M币 +13 謝謝分享 01-09
挣钱买刀 M币 +20 - 01-08
萍聚 M币 +13 - 01-08
离线2545889167

发帖
11618
M币
56326
专家
255
粉丝
4524
只看该作者 3楼 发表于: 01-08
第三款 比较复杂地一款
侧按键,绿色PCB,单片机为未知打磨芯片
就是这款  侧按键 没有磁铁,只有别针




那么要想先玩起来,就得先分析这款打磨芯片是啥
我们注意到有一下三个个特征
1、引脚兼容stm32f0xxc系列芯片
2、芯片的供电直接是用4.2V锂电池供电
先分析这两个特征。锂电池4.2V直接供电。可以直接排除stm32全系列和gd32全系列。因为这两款芯片的供电电压极限都是3.6V,那么锂电池4.2V直接接上去肯定是不行的

3、我手上有一个牌上面的芯片没怎么打磨干净,那么就可以看到一些蛛丝马迹
首先用铅笔给芯片表面涂一下
可以看到两个图标 一个应该是芯片厂商的商标,另外一个是ARM



那么,想象+联想,再天马行空一下,再来点灵感
duang!!!
像不像?就问你们像不像?哈哈~



本来绿油是不想要拆芯片跑走线的。但是因为测试条件不方便施展开来,为了方便分析芯片,还是拆下来了

上stm32系列48脚通用转接板测试

使用jlink的命令行工具联机
可以看到CORTEX M0内核


你们上芯片厂商官网找一圈 发现只有mm32l0xx系列符合条件(cm0内核,带usb)
范围缩小到mm32l062/072/073其中的一款

想办法确定下芯片具体型号。结果发现个蛋疼的问题。官方提供的手册居然有错(果然是国内小厂尿性)

翻开mm32l0系列的参考手册,DBG部分
可以看到swd id和dev id

结果发现,根本对于不上
手册上写swd id是0x2BA01477
实际读取值是0x0bb11477

再对照下读取dev id
发现也是根本对不上
手册上写dev id是0xCC88xxx3
实际读取值是0xcc568091

一开始我还以为是我打开方式有问题
换了好几种方法读取都是这样的。
无奈之下去下载了mm32f103系列的手册,哈哈,真相大白
手册之间互抄也不记得改改内容啊。
cm3内核和cm0内核id居然一样,贻笑大方啊



这次翻开正宗大厂 意法家的stm32f0系列的手册看看
写的明明白白,CORTEX M0 内核的swd id规定就是0x0BB01477

根本不是0x2BA01477



本来通过dev id是能确定具体的芯片型号的
比如stm32f0系列就可以这样区别出来


但是奈何国内小厂,手册瞎写,所以芯片型号根本没法确定。

anyway,反正都是mm32l0xx系列,都是兼容的,只是容量大小有点区别,不影响使用啦。
继续分析是否锁定读保护。
查看参考手册


用jlink直接读这几个位置

很遗憾,符合读保护特征,芯片被锁读保护了


测试读取 0x800000位置的数据,不能读取

那就只能擦除了呗~

注意:这款胸牌一旦解锁,就不能回到原装出厂的程序,以后只能使用DIY的程序

擦除教程:(此处就偷懒借用官方图片了)
(该文件附件提供下载)

2、打开unlock工程(附件提供下载)


添加Flash选项:




擦除完成,没回头路

开始跑走线。这里也比较蛋疼。虽然这个板子是绿油,走线很容易看清楚。但是这个板子过孔盖油盖的太严实了,只能刮开走线才能方便测量了

测试出引脚占用图
图中绿色为LED驱动脚


板子上设计者所留的测试点,蛮多的,良心


测绘出LED列阵顺序

这款胸牌除了引脚不同外,驱动方法和上面的双按键款一模一样(讲道理这三款胸牌居然LED引脚完全不一样)


焊接回去芯片


焊接swd调试下载接口


成功点亮

显示测试





[ 此帖被2545889167在2018-01-08 21:45重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共12条打赏M币+155
sonj M币 +13 謝謝分享 01-15
玛德陛下 M币 +13 謝謝分享 01-15
x3159 M币 +1 - 01-15
benten163 M币 +8 謝謝分享 01-11
zzy_85569381 M币 +13 謝謝分享 01-10
benli M币 +20 謝謝分享 01-10
wjhwpp M币 +13 謝謝分享 01-10
moontree M币 +13 謝謝分享 01-09
挣钱买刀 M币 +20 01-08
nokia5320 M币 +8 撸撸群发来贺电,楼主威武 01-08
12
离线2545889167

发帖
11618
M币
56326
专家
255
粉丝
4524
只看该作者 4楼 发表于: 01-08
改造时钟
大家比较喜闻乐见的项目哈
因为时间精力有限,不可能三款胸牌都改时钟。那选其中一款来弄。另外两款需要各位简单移植,很简单的。
选择单按键款 就是这货



@kindzhon 坛友的 两键LED点阵胸牌改造可调时钟:
http://bbs.mydigit.cn/read.php?tid=2333601

时钟芯片用ds3231。
因为是实验,就先用模块测试了,实际上是可以直接芯片飞线的。只需要飞iic的sda和scl,电源线和备用电压就行(电源线和单片机接一起,备用电源直接接在锂电池上)
这款胸牌上,设定

IIC_SDA_PIN 是 PA2
IIC_SCL_PIN 是 PA3

如图接线

效果如图



(程序见附件)

讲一下程序构架
整个程序

LED驱动部分分为三个部分
led_drv是led的底层驱动,负责驱动io(这部分每个胸牌各不相同)
led_scan负责led的扫描 (led_scan和led_drv部分一般写好了就不需要动了)
led_display负责显示内容的呈现



这里有个重要的东西 显示缓存

也就是说,所有要显示的内容,都是写到显示缓存内的。然后刷屏程序会自动读取并刷屏,具体刷屏部分不用操心。
这个显示缓存,每个uint16_t数负责一列,只取前11位


本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共23条打赏M币+291专家+3
kingsonic M币 +1 優秀文章優秀文章 01-16
sonj M币 +13 謝謝分享 01-15
无语·回忆 M币 +20 谢谢分享 01-12
qiang7260 M币 +8 膜拜大神学习折腾。谢谢分享。 01-12
路飞哥 M币 +20 謝謝分享 01-12
liposlt M币 +8 優秀文章 01-11
benten163 M币 +8 謝謝分享 01-11
深渫 M币 +22 厉害呀楼主!好有闲心!哈哈哈 01-11
zzy_85569381 专家 +1 真厉害,单片机我就会烧烧程序 01-10
zzy_85569381 M币 +13 真厉害,单片机我就会烧烧程序 01-10
离线shenhong

发帖
19129
M币
5976
专家
2
粉丝
171
只看该作者 5楼 发表于: 01-08
好想法,学习折腾。谢谢分享。
本帖最近打赏记录:共1条打赏M币+5
2545889167 M币 +5 - 01-10
离线2545889167

发帖
11618
M币
56326
专家
255
粉丝
4524
只看该作者 6楼 发表于: 01-08
此楼发开源代码

此处约法三章:

1、严禁用于商业用途
2、若以代码为基础发展的diy套件,必须开源
3、拒绝伸手党,下载附件请猛砸m币,如果没有m币的,请积极回帖。不要下载了东西,跟没来过似的~
解压密码:mydigit 2545889167


链接:https://pan.baidu.com/s/1skDByVj 密码:xubl


一摘使瓜好,再摘令瓜稀。三摘尚自可,摘绝抱蔓归。
[ 此帖被2545889167在2018-01-08 22:12重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共46条打赏M币+680专家+3
el756 M币 +8 原創內容 01-16
sonj M币 +13 謝謝分享 01-15
玛德陛下 M币 +13 謝謝分享 01-15
konglsh M币 +15 優秀文章 01-15
cknck M币 +8 優秀文章 01-14
维超 M币 +10 谢谢楼主的分享 01-13
dh1997 M币 +30 虽然只是看客,但是m币必须有! 01-13
huangyudong8 M币 +15 - 01-13
蓝昊王 M币 +8 優秀文章 01-13
zzs09 M币 +30 原創內容,不下也砸M,支持原创,支持开源。 01-13
离线hzmsn

发帖
721
M币
2537
专家
2
粉丝
9
只看该作者 7楼 发表于: 01-08
卧槽,抢楼发M币了
本帖最近打赏记录:共1条打赏M币+5
2545889167 M币 +5 - 01-10
离线zhkrid

发帖
18695
M币
73007
专家
260
粉丝
245
只看该作者 8楼 发表于: 01-08
大神又要出招了,之前一直有人在问能不能改成时钟,终于实现,我也有两块这东西
[ 此帖被zhkrid在2018-01-08 20:17重新编辑 ]
本帖最近打赏记录:共1条打赏M币+5
2545889167 M币 +5 - 01-10
离线snowman007

发帖
22968
M币
20682
专家
24
粉丝
94
只看该作者 9楼 发表于: 01-08
沙发被抢了 连地下室都被抢了
本帖最近打赏记录:共1条打赏M币+20
2545889167 M币 +20 - 01-10
快速回复
限80 字节
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
 
上一个 下一个