工作項(xiàng)目中,有一個(gè)3x8段數(shù)碼管顯示的需求,無意中從網(wǎng)上有看到有大牛改裝電子胸牌的帖子。
因而對電子胸牌的原理做了仔細(xì)的了解。選擇的是淘寶上買的 ”樂閃優(yōu) 五字電子胸牌“。
廠家不提供通訊接口,但提供PC上位機(jī)改字軟件,本來想通過bus hound直接抓取USB通訊數(shù)據(jù)協(xié)議。
這樣主機(jī)(Android) 可以直接把電子胸牌做數(shù)碼管顯示。結(jié)果,協(xié)議破解還相對容易,只是每次改字軟件每次更新顯示內(nèi)容時(shí),胸牌上都會固定的顯示 “M1-8 ”,用來提示。故不能直接使用??磥碇荒苤貙懝碳a了;1,胸牌上電前,按下靠近胸牌的按鍵,胸牌會進(jìn)入DFU模式,但自己寫的代碼燒進(jìn)去后,總是無法運(yùn)行,每次都提示option bytes未擦除,這條路沒走通。
2,找到芯片上的Jtag引腳,將PA13 PA14引腳接到J-link, j-link采用SWD 模式 可以調(diào)試代碼了。
但是因驅(qū)動(dòng)GPIO中有用到PA13, PA14引腳,故中途調(diào)試時(shí),調(diào)試一次后,就沒辦法再調(diào)試了,SWD引腳指向GPIO功能了。3,最后想到用廠家的ISP串口下載功能。PCB板上Pin44 BOOT0腳強(qiáng)行接到了GND,但進(jìn)入ISP需要BOOT0接VCC,故將芯片Pin44腳翹起,通過一個(gè)按鍵開關(guān),來選擇是接GND,還是接VCC,
順便把Pin7 Reset引腳也接了出來,通過按鍵可以進(jìn)行復(fù)位。PCB上預(yù)留了串口接BT模塊的接口,故PCB上有USART1的接口焊盤,方便了不少。PA14->Usart1.TX PA15->Usart1.RX.
(二) 胸牌點(diǎn)亮邏輯圖
通過萬用表測量,胸牌共11行,55列,GPIO點(diǎn)亮邏輯圖如下:
從輯邏圖中可以看出,每二列由一個(gè)GPIO控制。
所以驅(qū)動(dòng)時(shí)序如下1,先將要點(diǎn)亮的列GPIO設(shè)置為Push_Pull 輸出高,其它輸出低。2,對選中列的11行進(jìn)行掃描,每次掃描輸出一行中二個(gè)燈的狀態(tài)。主要點(diǎn)亮函數(shù)代碼附上:
void LED_Open(uint8_t x, uint8_t y)
{
if(x >= LED_COL || y >= LED_ROW)return;
Clear_All_LED();
Write_One_LED_Pin(Led_GPIO_Port_Arrange[x / 2], Led_GPIO_Pin_Arrange[x / 2], 1); //áD??í¨
if (y <= 4){?
if(x % 2 == 0)
{
if(x <= 4 * y ) ? ? ? ? Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 1], Led_GPIO_Pin_Arrange[y * 2 + 1], 0);
else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2], Led_GPIO_Pin_Arrange[y * 2], 0);
}else{
if(x <= 4 * y + 3) ? ? ? ? Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 2], Led_GPIO_Pin_Arrange[y * 2 + 2], 0);
else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 1], Led_GPIO_Pin_Arrange[y * 2 + 1], 0);
}
}else{
if(x % 2 == 0)
{
if(x <= 6 * y - 10) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 3 - 4], Led_GPIO_Pin_Arrange[y * 3 - 4], 0);
else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 3 - 5], Led_GPIO_Pin_Arrange[y * 3 - 5], 0);
}else{
if(x <= 6 * y - 7) ? ? ? ? Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 3 - 2], Led_GPIO_Pin_Arrange[y * 3 - 2], 0);
else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 3 - 4], Led_GPIO_Pin_Arrange[y * 3 - 4], 0);
}
}
}
現(xiàn)在胸牌屏改為了串口通訊接口,就做了一下串口的上位機(jī)軟件,可以手動(dòng)點(diǎn)亮屏。
項(xiàng)目中,要將游戲中的運(yùn)動(dòng)人物的時(shí)間,速度,個(gè)數(shù)顯示到屏,在Excel中弄一些顯示模板,對協(xié)議也做了包裝,上面只要發(fā)送 目標(biāo)值(小數(shù)字)及即時(shí)值(大數(shù)字)就可以實(shí)現(xiàn)顯示功能了。
這樣游戲和硬件中都不需要含字庫了。具體軟件Android游戲的同事正在調(diào)試使用,等樣機(jī)出來后,我會上圖,敬請大家期待哈~~~
(顯示屏外套上濾光片后,顯示效果就好很多,先上個(gè)裸照)
最終的效果圖出來了,實(shí)際的顯示效果比拍出來的效果好。
拍出來的圖片紅暈太明顯了,實(shí)際顯示沒有紅暈。
要做樣機(jī),后續(xù)又買了兩個(gè),居然發(fā)現(xiàn)版本號不一樣了,MCU換成了MM的單片機(jī)~~~~~~
找電話給淘寶店主,一是不給換,二要再買之前GD的版本,店主也愛理不理,態(tài)度不好。
可能是我沒能如他希望的那樣,沒有下個(gè)大單給他吧~~~
下載了MM的下載軟件,同樣把BOOT0拉到高,用MM32ISP下載工具,然而怎么樣都連不上,無法用ISP。
懷疑有二點(diǎn):1,MM單片機(jī)ISP串口不知是不是PA14,PA15,從MM資料中沒有找到這方法的介紹。
2,網(wǎng)絡(luò)上說MM單片機(jī)有些是沒有ISP功能的。搞的我也很懷疑了。官方資料上,對ISP好像也很排斥一樣,一點(diǎn)介紹都沒有。最后只能用終級一招了,換MCU。從嘉立創(chuàng)上買來GD單片機(jī)換掉它。
最終搞定!
-
pcb
+關(guān)注
關(guān)注
4320文章
23113瀏覽量
398381 -
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1882瀏覽量
91202 -
ISP
+關(guān)注
關(guān)注
6文章
477瀏覽量
51873
原文標(biāo)題:胸牌DIY改裝記錄
文章出處:【微信號:weixin21ic,微信公眾號:21ic電子網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論