Arduino, 改良那八個按鍵的特製遙控器


 

http://wp.me/ph3BR-1QB

 

I have a pen I have an apple, 據說是某小孩突然著迷的口水歌, 他要把人生裡面遇到這個讓其驚喜的 YOUTUBE 片段與人分享, 多數長輩看過, 一般都認為是很無聊的洗腦歌, 然後某爸爸很感冒, 因為小孩看了又看播了又播. 不過回頭看, 人生不是很多時候很多人都是做自己很得意但是外人看來很無聊的事情嗎 !? 自我感覺良好就可以了, 不太干擾他人的話, 其實也不需要太多干涉. 成長過程大都有這樣得行為.

同樣因為自認為有需求, 搞了一個只有八個按鍵的特製遙控器, 用的是 Arduino Uno 的板子, 不是因為愛用, 是因為快速和現成山寨, 容易上手就用了, 半天就趕製了一個 [很好用] 的遙控器, 一鍵開機, 是同時開電視機, 機上盒, 音響等等, 自動轉到預定的電視節頻道, 自動打開電視盒轉台到預定的電視節目, 自動接通對應的音響設備, 日後想要怎樣改良都可, 換了其他機器也不怕, 就這三個自動的行為, 外面付錢也買不到, 量少也太專門了, 沒商家會大量生產.

不過有個問題, 就是費電池, 用筆電的壞電池閘拆除來的一個18650電池, 大約半年需要給充電池一次, 因為初步設計匆忙只用了RC延時斷電 (原理參考這篇), 停止後是完全不漏電的, 這個設計已經在很多台沒有自動關機功能的DMM, 成功改機並使用多年的結果得到證實. 20M 電阻加上 100uF 電容, 好像15分鐘才自動斷電, 把電容換成47uF, 大概也要7分鐘, 還有是要先按 [上電], 再按 [開機], 兩個按鈕動作, 給MCU供電, 然後再按 [開機] 鍵執行程序, 也是這個原因所以必須設計用了 8個按鍵, 不然7個就好. 就這兩點已經不夠人性化或便利性, 比對一般的紅外線遙控器, 用者都是隨用隨按任意按鍵, 起碼一年不用換電池的. 費電池的原因是, Arduino Uno 的板子除了 CPU 在運作, 還有其他IC和LED, 沒有按鍵動作也在耗電, 整體運作大約要 26 mA, 算是第一版的設計, 總體來說比拿著5個不同廠牌的遙控器還要記住個別的開機程序, 這個特製遙控器是真的很好了.

為了更好, 實驗, 修改設計, 用 MCU的一個腳控制 N-MOSFET 斷電, 按鍵處理完畢馬上由MCU指令斷電, 因此立刻沒有了26mA耗電, 比第一版的設計改良很多了, 可是, 故事並非那麼簡單. 實驗完畢, 必須確認成果, MCU 雖然控制斷電成功, 但是依然耗電 0.5mA, 一直到電池沒電, 長期來看, 這個第二版的設計其實很糟糕, 因為 N-MOSFET 必須安裝在 LOW-SIDE 作為電源開關, 所以怎樣改變零件的參數都會有漏電, 沒有 P-MOSFET, 不想花錢買, 也沒有用 PNP 做 HIGH-SIDE 控制, 原因是, 必然會成功僅僅解決上面提到的兩個問題的其中一點, 不夠好. 這個第二版的設計並沒有實際使用.

第一版或第二版的設計, 整體的硬件並沒有改變, 純粹是接線多了一根或缺少一根. 樣子就這樣醜醜的, 不過堪用也實用.

Arduino IR transceiver upgrade
Arduino IR transceiver upgrade

 

 

繼續為了更好, 參考別人的建議, 這次實驗, 直接讓 MCU 睡覺, 按鍵就醒來做點事情, 完畢後繼續睡覺, 這樣一來, 就會很省電, 也不再需要8個按鍵的那個 [上電] 的動作了, 同時廢掉 Arduino 那些用不上的 LED 或 IC 等等, 整個系統就只有 MCU 本身和必要的按鍵. 沒有插麵包板的 DIP, 所以用不了 ATmega328, 退而求其次, 用了一個 ATmega8, 實驗睡覺功能, 還有耗電流的測試. 比對人家的測試結果, 用一個很陽春的砲灰表, 測電流, 居然很準確, MCU 睡覺是僅僅耗電大約 0.6uA, 比對第二版的設計實驗那個 0.5mA, 降低了約 1000 倍.

實驗的電路, 結果都說明這個方法可行,

ATmega8-sleep-wakeup
ATmega8-sleep-wakeup
ATmega8-sleep-wakeup
ATmega8-sleep-wakeup

 

源嗎是抄來的, 修改了一些, 配合 Arduino Uno 的 D13 的 LED


/* ATmega8 with internal 8Mhz clock (6cycle + 64ms) */
// lfuse = 0xd4
// ref : https://gist.github.com/mkleemann/1712180
// if need to bootload Arduino, lfuse = 0xdf, set to external 16MHz xtal
// 2016-DEC-23, xiaolaba

#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <util/delay.h>

int main(void)
{
//   DDRC |= (1 << PC2) | (1 << PC1);     // leds for testing
// arduino Uno, LED = D13, m328p pin 19, PB5
// uses Mega8 MCU, the same, pin 19, PB5
DDRB |= (1 << PB5); // LED for testing

DDRD &= ~(1 << PD2);    // INT0: input...
PORTD |= (1 << PD2);    // ...with pullup.

// level interrupt INT0 (low level)
MCUCR &= ~((1 << ISC01) | (1 << ISC00));

// infinite main loop
while (1)
{
// trigger leds for testing
blinkLED();
blinkLED();
blinkLED();
blinkLED();

// enable external interrupt
GICR |= (1 << INT0);

// set sleep mode
set_sleep_mode(SLEEP_MODE_PWR_DOWN);

// sleep_mode() has a possible race condition
sleep_enable();
sei();
sleep_cpu();
sleep_disable();

// waking up...
// disable external interrupt here, in case the external low pulse is too long
GICR &= ~(1 << INT0);

// disable all interrupts
cli();
}
}

void blinkLED(void)
{
PORTB ^= (1 << PB5);
_delay_ms(500);
PORTB ^= (1 << PB5);
_delay_ms(500);
}

ISR(INT0_vect)
{
// ISR might be empty, but is necessary nonetheless
//   PORTC ^= (1 << PC2);    // debugging
}

 


:1000000012C034C018C017C016C015C014C013C029
:1000100012C011C010C00FC00EC00DC00CC00BC06C
:100020000AC009C008C011241FBECFE5D4E0DEBF5E
:10003000CDBF26D043C0E4CF98B380E2982798BBC9
:100040002FEF39E698E1215030409040E1F700C0B1
:10005000000098B3892788BB2FEF39E688E121504B
:1000600030408040E1F700C0000008951F920F92D9
:100070000FB60F9211240F900FBE0F901F9018957E
:10008000BD9A8A98929A85B78C7F85BFD5DFD4DFD9
:10009000D3DFD2DF8BB780648BBF85B78F78806268
:1000A00085BF85B7806885BF7894889585B78F7739
:1000B00085BF8BB78F7B8BBFF894E8CFF894FFCFC9
:00000001FF

 

最後看看實際的運作, 這個砲灰表真的很給力, 跟人家用 HP 34401A 6位半電表量測結果 0.40uA 其實沒差多少, 當然只針對這個用途還有0.5mA降低1000倍的目標而已. 耶誕大餐早早結束, 實驗很快也做完, 紅色LED閃亮4次, MCU就睡覺了, 耗電00.6uA.

h_ttps://youtu.be/dwfQcKLv00E

 

 

下一步, 整合這些新的設計到韌體, 在自己做個比 Arduino Uno 更簡潔的硬體, 省電是最大的目標.

廣告

One thought on “Arduino, 改良那八個按鍵的特製遙控器

  1. 原來可以這樣省電啊!
    我常常都是做了專案而為了電源耐久而煩惱~

    感謝好文分享!

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s