無線鼠標(biāo)使用很方便,但是電池不太耐用,即使是充電電池,也需要充電。很多鼠標(biāo)帶有電源開關(guān),可以關(guān)閉電源節(jié)省電池能量,但是使用后也會(huì)容易忘記關(guān)閉開關(guān),造成浪費(fèi)。
雖說大部分鼠標(biāo)都有自動(dòng)休眠功能,但是看起來休眠的效果并不理想,試過多個(gè)2.4G無線、藍(lán)牙鼠標(biāo),都經(jīng)常被電池問題困擾,沒有找到一個(gè)合適的,于是就想自己改造一下。
理想情況下,拿起鼠標(biāo)就可以使用,放下鼠標(biāo)一段時(shí)間后,就自動(dòng)切換電源,這樣無論鼠標(biāo)的低功耗功能是否足夠好,都不會(huì)損耗電池了,使用起來比較省心。正好有一個(gè)閑置的藍(lán)牙鼠標(biāo),就動(dòng)手進(jìn)行了改造了一番。

這個(gè)鼠標(biāo)是最常見的公模鼠標(biāo)了,它使用1節(jié)14550鋰電池供電,可能是電池容量小,加上通常沒有關(guān)閉電源開關(guān),所以一般情況下,充電一次可以使用7-15天(與使用頻率有關(guān))。

鼠標(biāo)很容易拆,將電池取下后,就可以看到固定螺絲。這個(gè)鼠標(biāo)只用1個(gè)螺絲固定,在鼠標(biāo)腳墊下沒有螺絲(有些鼠標(biāo)可能有,后面兩個(gè)鼠標(biāo)腳墊處有螺絲柱)。取下螺絲后,就很容易將鼠標(biāo)上蓋和底部分離,看到里面的主板了。
要實(shí)現(xiàn)前面的想法,其實(shí)不難,只需要一個(gè)低功耗單片機(jī)(現(xiàn)在大部分單片機(jī)都可以),一個(gè)觸摸按鍵芯片,一個(gè)P-MOS管就可以。使用觸摸按鍵芯片檢測手接觸鼠標(biāo),當(dāng)接觸鼠標(biāo)后就會(huì)輸出信號,單片機(jī)檢測到這個(gè)信號后,就控制MOS管導(dǎo)通,給鼠標(biāo)供電;當(dāng)信號消失(手離開),延時(shí)一段時(shí)間后切斷電源,就可以自動(dòng)節(jié)省電池能量。有的單片機(jī)支持大電流輸出引腳(輸出電流不小于50mA),那么MOS也可以省掉。
確定了基本方案,下一步就是選擇合適的元件了。一節(jié)鋰電池的電壓范圍在2.7-4.2V,因此需要選擇一個(gè)支持2.7-5V的單片機(jī),否則還需要增加一個(gè)LDO防止電壓超出范圍。MOS和觸摸芯片也是如此,需要選擇合適電壓范圍的。這些元件還是比較容易找到的,相信大家都有一些自己熟悉的。不過DIY的樂趣在于盡量使用少的成本和現(xiàn)有的東西,而不是花很多錢去買一個(gè)現(xiàn)成的,因此到雜物箱中找了找,找出了下面幾個(gè)元件,正好可以滿足要求:

ATTiny13V是8引腳的單片機(jī),最大10M主頻,1KB flash,64B ram和64B eeprom。休眠時(shí)功耗大約是5uA(看門狗使能)。
?
TTP223是一個(gè)SOT23-6封裝的芯片,支持多種方式輸出和自校正。為了讓程序簡單,這里使用了直接輸出方式,低電平有效。因此需要將TOG接地,而AHLB接VCC。

SI2301就是一個(gè)普通MOS,其它類似型號都可以使用。

AVR單片機(jī)好幾年沒有用過了,順便把編程器找出來,這還是以前DIY的,使用了AVRUSB方式。為此還把安裝了XP的舊計(jì)算機(jī)找出來,因?yàn)閣in7以后的系統(tǒng)都不能直接使用AVRUSB。
?

因?yàn)闆]有(也不需要)仿真器,因此程序就使用了proteus,可以在proteus中仿真、編寫代碼、模擬運(yùn)行、設(shè)置斷點(diǎn),模擬運(yùn)行結(jié)果正常,一般就沒有大問題了。

好長時(shí)間不用AVR,一些用法都忘記了。好在有以前寫的通用驅(qū)動(dòng)層,不看手冊也很快就完成了功能。使用一個(gè)IO做觸摸檢測,一個(gè)IO做MOS控制。單片機(jī)平時(shí)休眠,通過WDG定時(shí)喚醒,休眠時(shí)功耗應(yīng)該低于20uA。以前還體會(huì)不深,現(xiàn)在就越來越感到一個(gè)好的HAL是非常重要的。
#define F_CPU? ?4800000L
#include
#include
#include
#include
#include
#include "uhd.h"
#define V_OUT??B, 3
#define T_IN1??B, 4
void init()
{
? ? IO_dir(V_OUT, IO_OUTPUT);
? ? IO_set(V_OUT);
? ? //IO_pullup(T_IN1, PULLUP_ENABLE);
? ? IO_dir(T_IN1, IO_INPUT);
? ? WDT_sleep(40);
}
uint8_t cnt = 0;
uint8_t mode = 0;
int main()
{
? ? init();
? ? while (1)
? ? {
? ?? ???WDT_sleep(8);
? ?? ???if(IO_in(T_IN1) == 0)
? ?? ???{
? ?? ?? ?? ?IO_clr(V_OUT);
? ?? ?? ?? ?mode = 1;
? ?? ?? ?? ?cnt = 60;
? ?? ???}
? ?? ???else
? ?? ???{
? ?? ?? ?? ?if(mode)
? ?? ?? ?? ?{
? ?? ?? ?? ?? ? cnt--;
? ?? ?? ?? ?? ? if(cnt == 0)
? ?? ?? ?? ?? ? {
? ?? ?? ?? ?? ?? ???mode = 0;
? ?? ?? ?? ?? ?? ???IO_set(V_OUT);
? ?? ?? ?? ?? ? }
? ?? ?? ?? ?}
? ?? ???}
? ? }
? ? return 0;
}
將程序先下載到單片機(jī),然后將信號線焊接上去,就完成了。使用了一個(gè)長導(dǎo)線作為觸摸感應(yīng),并將它固定到上蓋下方位置。
?
推薦閱讀





