Arduino誕生日リマインダー:単一コイン電池で50年動作する超低消費電力デバイス
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino Nano R3(ATmega168P-AU搭載クローン) | 1 | 中国製クローンで安価入手可能。ATmega168P必須(ピコパワー機能付き) |
| Intersil ISL1208 RTC(I2C接続) | 1 | 超低消費電力、月・日アラーム機能搭載、VBAT動作400nA |
| Renata CR2450N コインセル | 1 | 公称540mAh、自己放電<1%/年、動作温度-40〜+85℃ |
| CP2102 USB-シリアル変換モジュール | 1 | 時刻設定・デバッグ用。本体からは切り離し可能 |
| USBasp プログラマー | 1 | ヒューズビット変更・ブートローダーなし書き込み用 |
| 32.768kHz 水晶発振子 | 1 | RTC用 |
| SPSTスライドスイッチ | 1 | 時刻設定モード切替用 |
| SMD LED(赤) | 1 | 誕生日点滅表示用。最適化後は1個に削減 |
| クリアLEDドーム | 1 | 光拡散用 |
| 4×4インチ スイッチボックス | 1 | 筐体用。3Dプリント筐体でも可 |
| ユニバーサル基板 | 1 | |
| ベルグコネクタ(オス・メス) | 適量 | 電池・スイッチ・LED接続用 |
| 抵抗 4.75kΩ | 3 | I2Cプルアップ(2本)、割り込みピンプルアップ(1本) |
| 抵抗 10kΩ | 2 | プルアップ用 |
必要な工具
- はんだごて、ハンダ、フラックス
- Dremel等の旋盤工具(筐体加工用)
- USBaspプログラマー、10pin→6pin変換アダプター
使用するソフトウェア
- ProgISP - ヒューズビット書き換え・HEX書き込み用
- Arduino IDE 1.8.5+ - スケッチ開発・HEX出力用
プロジェクト概要
単一のCR2450Nコインセル(540mAh)で50年以上動作し、設定した誕生日にLED点滅とシリアルメッセージで祝福する超低消費電力デバイスです。ATmega168Pのディープスリープモード(SLEEP_MODE_PWR_DOWN)とISL1208 RTCのVBAT単独動作(400nA)を組み合わせ、平均消費電流1.22µA(自己放電込み)を実現。理論上CR2032で29年、CR2450Nで50年、CR2477Nで64年動作可能です。
時刻と誕生日はUSB-シリアル経由でコマンド設定可能。設定後はスリープし、RTCアラーム割り込みで年1回のみ起動します。設定スイッチONでいつでも時刻確認・変更可能。Hackaday Coin Cell Challenge出品作品。
主な特徴
- 平均消費電流 1.22µAh(自己放電込み)/ 608nA(自己放電除く、実測値)
- CR2032(225mAh)で>29年、CR2450N(540mAh)で>50年、CR2477N(950mAh)で>64年動作
- シリアルモニタから簡単コマンドで時刻・誕生日設定・確認可能
- 専用スイッチでいつでも設定モード突入可能
- オープンソース:設計ファイル・コード全公開(MITライセンス)
製作手順
ステップ1: Arduino Nanoの改造
オンボードの不要部品を除去し、コインセル直駆動(3V、レギュレーターなし)可能にします:
- CH340G USB-シリアルICを除去
- USB 5Vラインのショットキーダイオードを除去
- CH340GのTX/RXプルアップ抵抗(1kΩ×2)を除去
- RX/TX/PWR LED(SMD)を除去
- AMS1117 5Vレギュレーターを除去し、そのパッドをショート(基板パターン上必要)
- ピン13のLEDはデバッグ・誕生日点滅用として残す
- MCU水晶発振子はヒューズ変更完了まで残す
ステップ2: ATmega168Pヒューズビット変更
USBasp + ProgISPで以下設定に変更:
- 内部発振器8MHz + 8分周 → 1MHz動作(低クロックで省電力)
- BOD(ブラウンアウト検出)無効化
- WDT(ウォッチドッグタイマー)無効化
- ピコパワー機能付きATmega168P/328P必須(ノンP版不可)
ヒューズ値(参考):Low=0x62, High=0xDF, Extended=0xF9
ステップ3: Arduino IDEボード定義追加とスケッチ書き込み
boards.txt(Arduinoインストールフォルダ/hardware/arduino/avr/)に以下を追加:## Arduino Pro or Pro Mini (3.3V, 1 MHz) w/ ATmega168 pro.menu.cpu.1MHzatmega168=ATmega168 (3.3V, 1 MHz) pro.menu.cpu.1MHzatmega168.upload.maximum_size=14336 pro.menu.cpu.1MHzatmega168.upload.maximum_data_size=1024 pro.menu.cpu.1MHzatmega168.upload.speed=19200 pro.menu.cpu.1MHzatmega168.bootloader.low_fuses=0x62 pro.menu.cpu.1MHzatmega168.bootloader.high_fuses=0xDF pro.menu.cpu.1MHzatmega168.bootloader.extended_fuses=0xF9 pro.menu.cpu.1MHzatmega168.bootloader.file=atmega/ATmegaBOOT_168_pro_8MHz.hex pro.menu.cpu.1MHzatmega168.build.mcu=atmega168 pro.menu.cpu.1MHzatmega168.build.f_cpu=1000000L- IDE再起動後、「ツール」→「ボード」→「Arduino Pro or Pro Mini」→「プロセッサー」で「ATmega168 (3.3V, 1 MHz)」を選択
- スケッチを「スケッチ」→「コンパイル済みバイナリを出力(Ctrl+Alt+S)」でHEX生成
- ProgISPでHEX(ブートローダーなし版)をロードし、Autoで書き込み
ステップ4: ISL1208 RTCブレークアウト基板製作
SMD版ISL1208をDIP化する小型ブレークアウト基板を自作。32.768kHz水晶、VBAT用コインセルホルダー、I2Cピンヘッダーを実装。最適化版ではVDDピンをジャンパーで切り離し可能にし、VBAT単独動作(400nA)を実現しています。
ステップ5: 回路図と配線
- I2Cプルアップ: SDA/SCL - VCC間に4.7kΩ×2
- RTC割り込み出力(IRQ) → Arduino D2 (INT0) - 10kΩプルアップ
- 設定スイッチ → Arduino D3 (INT1) - GND側、10kΩプルアップ
- LED → Arduino D13(オンボードLED共用)
- CP2102: RX↔TX, TX↔RX, GND↔GND接続。**CP2102の5V出力をメインVCCに接続しないこと**
- コインセル: VCCラインに直結(レギュレーターなし)
ステップ6: 動作原理と操作方法
初回起動・設定手順:
- 設定スイッチON(D3をGNDに落とす)
- USB-シリアル接続し、シリアルモニタ(9600bps)開く
Serial Established. Ready to update time.表示を確認- 時刻設定コマンド送信:
TYYMMDDhhmmssp#- 例: 2018年1月5日 08:35:12 AM →
T1801050835120#
- 例: 2018年1月5日 08:35:12 AM →
- 成功時:
Time update received = T1801050835120 Date and Time is 8:35:12 AM, 5-1-18 - 誕生日アラーム設定コマンド:
AMMDDhhmmssp#(年不要)- 例: 8月24日 08:00:00 AM →
A08240800000#
- 例: 8月24日 08:00:00 AM →
Everything's set. Please disable the time set pin now.表示後、設定スイッチOFFWell done! Sleeping in 6 seconds..でディープスリープ突入
通常動作:
- 誕生日到来時、RTCが250msローパルス割り込み → MCU起動
Tada! It's your birthday! Happy B'Day :) See you on your next birthday! TC. Bye! Sleeping in 6 seconds..表示- LED(D13)が特定パターンで点滅(約19秒)
- 再度スリープ、翌年同じ日に起動
時刻確認・変更時:設定スイッチONで起動、tで現在時刻表示、aでアラーム時刻表示、cでキャンセル・スリープ復帰。
ステップ7: ソフトウェア構成(主要関数)
setup(): I/O初期化、ISL1208レジスタ設定、割り込み設定loop(): 設定スイッチ状態監視、シリアルコマンド処理、スリープ呼び出しsleepNow(): ADC/タイマー等ペリフェラル無効化、割り込み有効化、sleep_mode()でPWR_DOWNalarmInterrupt()/timeUpdateInterrupt(): ISR、フラグ設定のみfetchTime()/printTime()/printAlarmTime(): RTCレジスタ読み出し・BCD変換・表示bcdToDec()/decToBcd(): BCD⇔10進変換blinkLED(): 誕生日点滅パターン生成establishSerial()/endSerial(): USB-シリアル通信制御
ステップ8: 消費電流測定と最適化の軌跡
| 段階 | MCUスリープ | RTC | 平均電流 | CR2450N理論寿命 |
|---|---|---|---|---|
| 初期実装 | 0.2µA | 1.2µA (VDD=VBAT, LPMOD=1) | 1.63µA | 37.7年 |
| 最適化後 | 0.2µA | 0.4µA (VDD=0, VBATのみ, LPMOD=0) | 0.61µA | 101年 |
| 自己放電込み実測 | 0.2µA | 0.4µA | 1.22µA | 50年131日 |
最適化のポイント:
- LEDを2個→1個に削減(動作時3mA→1.5mA)
- RTCのVDDをVBATから切り離し、VBAT単独動作化(1.2µA→400nA)
※I2C通信時のみジャンパーでVDD接続 - 動作時間短縮: 設定2分→1分、誕生日点滅19秒、スリープ前6秒 = 合計85秒/年
ステップ9: 実用上の考慮事項
- コインセルの寿命はメーカー保証10年(シェルフライフ)だが、物理的に劣化しなければそれ以降も使用可能
- 自己放電は初期容量の1%/年(5.4mAh/年 = 616nA相当)で電圧も低下するが、ATmega168P/ISL1208は1.8Vまで動作保証
- 長期信頼性確保のため:
- 基板にコンフォーマルコーティング
- シリカゲル同梱で防湿
- 気密性の高い筐体で温度変化緩和
- 物理的衝撃から保護
ステップ10: 筐体製作と仕上げ
4×4インチスイッチボックスにスイッチ・USB・LEDドーム用穴を開け、銀色スプレーで塗装。ステッカーや色紙、グリッター等でデコレーションすればプレゼント映えします。
ステップ11: 今後の改善アイデア
- Nokia 5110 LCD(バックライトなし)搭載でメッセージ表示
- PC用時刻自動同期ソフト(Processing等で開発)
- 年齢表示機能(誕生日回数カウントで点滅パターン変化)
- 専用PCB設計(Eagle/KiCad)
- オプトカプラ経由でACアラーム・照明・音楽プレーヤー等を制御
完全なソースコード
GitHubリポジトリで公開中(MITライセンス):
https://github.com/vishnumaiea/Birthday-Alarm/
参考資料
- 個人プロジェクトページ: 詳細ドキュメント
- AVRスリープモード解説: AVR Freaks
- ElectroDroidアプリ(電池寿命計算用)
製造プロセス
- ベアリングのコールドマウント:安全・確実な取り付けのエキスパート tips
- インダストリー4.0とIoT:今後2年を形作る主要市場トレンド
- COVID-19がサイバー犯罪を加速させ続ける:リモートワーク、ワクチンサプライチェーン、スパイ活動
- 発電機アップグレードが必要な7つの重要サイン
- モーター巻き替えが必要な3つの危険信号
- 完璧なPCB実装を実現するための重要プラクティス
- 工場から研究室へ:産業用ロボットの多彩な力
- NVIDIA Jetson Nano:メイカーと企業を支える5W、472 GFLOPSのAIコンピューター
- Kontron、過酷環境向けラギッド40GbEスイッチ「CP6940」発表
- アプリケーションに最適なスイッチを選定するための10の重要ポイント
- 超薄ナノコーティング:20nm以下の厚さ制御による精密カラーコントロール