最近は外出の回数を減らすために、買い物に行くときには一度に色々な物を買うことが多くなりました。その際に買いたい物を忘れないように買い物リストを作って持っていくのですが、いつもProMicroでPCから印刷できるようにしたポケコン用サーマルプリンタでリストを印字して持っていってます。
これで特に不満はないのですが、ときどきスマホ片手に買い物をしている人(たぶん買い物リストを見ていると思う)を見ると、もっと小さくて手のひらに隠れるくらいのデバイスにリストを表示できたら手軽に使えていいなと思うようになりました。
作れたら意外に使えそうなガジェットになりそうなので、さっそく試作してみることにしました。
持ち歩ける小型のデバイスをつくるならATtiny13AとかATtiny85を使うのが良さそうですが、表示デバイスとの接続や買い物リストを収納することを考えるとI2C接続ができてメモリの多いATtiny85がいいでしょう。また、手のひらに収まるサイズにするなら電源は3Vのコイン電池になりますね。
となると作成する回路もなるべく電池を消耗させない省エネなものにする必要があります。また、電源スイッチでオンオフする回路だと、うっかり電源OFFを忘れたときにどんどん電池を消耗させるので、一定時間たったら電源が落ちるような仕組みも必要です。
どうすればいいのか調べて見たところ、スリープモードとウォッチドッグタイマーの組み合わせが良さそうでした。
AVRをスリープモードにすると設定にもよりますが、不必要な機能は全て停止し消費電力を最低限まで抑えることが出来ます。スリープモードから復帰するのには外部割り込みが必要なのですが、ピンの電圧の変化で割り込みをかけることが出来るのでピンに接続したスイッチなどでスリープモード直前の状態に戻すことも可能です。
ウォッチドッグタイマーは昔キッチンタイマーを作ったときにも利用しましたが、AVR本体から独立した発振器のクロックを元に割り込みをかけることが出来るので、スリープモードのときでも動作するタイマーとして利用できます。
実は今回作成するデバイスには、買い物リスト以外に現在時刻を表示する機能も欲しいと考えていました。買い物中に時間を気にすることもありますからね。
でも、リアルタイムクロックをつけて余計な電力を消費するのは嫌なので、ウォッチドッグタイマーを利用してみようと思った訳です。割り込みタイミングの精度は高くないのですが、買い物の間の数時間だけなら時計として使えそうです。また、スリープモードに切り替わる時間やボタンの長押し時間などの計測にも利用できます。
大体の方針は決まったので、まずはブレッドボードに回路を組んでみます。AVRにはATtiny85を使い、画面表示にはArduino等でお馴染みのI2C接続でSSD1306の128×32ドットOLEDを使います。OLED表示ライブラリにはTiny4kOLEDという使いやすいライブラリを利用します。また、時計の表示に大きなフォントを使うのでTinyOLED-Fontsという上記ライブラリで利用できるオプションフォントも使います。どちらもArduinoIDEのライブラリマネージャからインストールできます。
I2Cにピンを2つ使うので、残りの3ピンにはタクトスイッチをつなげました。具体的な配線は以下のようになります。
0ピン − OLED SDA
1ピン − タクトスイッチ1
2ピン − OLED SCL
3ピン − タクトスイッチ2
4ピン − タクトスイッチ3
スケッチですが割り込み処理を多重に利用しているので結構バグが出てしまいました。試行錯誤の結果完成したスケッチはこちらになります。
ATtiny85Watch.ino
コンパイルにはATTinyCoreを使います。設定は以下のようにしました。
動作周波数は1MHzにしましたので、念の為ArduinoIDEで"ブートローダーを書き込む"を実行してヒューズビットの書き換えを行ってみました。
買い物リストの収納方法ですが、ATtiny85内臓のEEPROMを使うことにしました。512バイトあるので、1つのリストに16文字(バイト)使うと32個のリストを収納できます。万が一電池が切れても買い物リストは消えずに残るので安心です。
出荷時の状態ではEEPROMの値は全てFFになっているようなので、起動時にEEPROMをチェックして各リスト16バイトの先頭がFFだったら、0を書き込んでデータが書き込まれていないという印をつけています。若干手抜きの処理なので以前にEEPROMを使用したことがある場合は、リスト表示のときにゴミが表示されるかもしれません。
コイン電池をつなげて通電すると、最初はスリープ状態で起動しますので画面には何も表示されません。ここでタクトスイッチ1を押すとスリープから復帰して時計表示になります。再度タクトスイッチ1を押すとリスト表示に切り替わります。時計表示中にタクトスイッチ1を長押し(3秒以上)したときは時計の設定画面に移ります。
また、リスト表示のときにタクトスイッチ1を押すと時計表示に戻り、長押したときはリスト入力画面に移ります。
図に表すとこんな感じです。
各画面での操作は以下の通りです。
●時刻表示
この画面では時・分のみ表示されます。時刻はウォッチドッグタイマーで1秒ごとに割り込みを発生させて計測していますが、割り込み間隔の精度が低いので1秒を正確に計れません。動作電圧などによって変わってくるのですが、3Vコイン電池で計測すると1秒間で57回ほどの割り込みが発生していました。つまり1分あたり3秒ほど遅れます。(きっちり3秒ではありませんが)そのため57回の割り込みで1分としているので秒の表示は行いませんでした。
時刻表示中になんの操作もしなければ20秒ほどでスリープモードに移ります。スリープモード中はOLEDの画面もオフになります。タクトスイッチ1を押すとスリープモードから抜け、時刻表示画面に戻ります。
また、時刻表示中のときにタクトスイッチ1を3秒以上長押しすると時刻設定画面に移ります。
●時刻設定
時刻設定画面に移ると以下のような表示になります。
タクトスイッチ2を押すと時間が昇順で増えていき23を超えると0に戻ります。
タクトスイッチ3を押すと分が昇順で増えていき59を超えると0に戻ります。
タクトスイッチ1を押すと時刻を設定して時刻表示の画面に戻ります。
時刻は1時間で何秒かずれるので、利用する前は時刻設定を行ったほうがいいでしょう。
●リスト表示
リスト表示画面ではNo.0〜No.31までのリストを見ることが出来ます。2行の表示のうち上段に選択中のリストのNOが、下段にリストの内容が表示されます。リストに何も入力されていなければ2行目は空白です。
タクトスイッチ2を押すと次のNOのリスト内容が表示されます。スイッチを押し続けると次々とリスト内容が表示されていきます。No.31まで表示されたらNo.0に戻ります。
タクトスイッチ3を押すとタクトスイッチ2と逆に前のNOのリスト内容が表示されます。押し続けると前のNOのリストを表示し続けることが出来ます。No.0まで表示されたらNo.31に移ります。
タクトスイッチ2とタクトスイッチ3を同時に押すとNO表示の右にチェックをつけることが出来ます。再度タクトスイッチ2と3を同時に押すとチェックを消すことが出来ます。
リスト表示中になんの操作もしなければ20秒ほどでスリープモードに移ります。スリープモード中はOLEDの画面もオフになります。タクトスイッチ1を押すとスリープモードから抜け、元のリスト表示画面に復帰します。
また、リスト表示中のときにタクトスイッチ1を3秒以上長押しするとリスト入力画面に移り、選択中のNOのリストを入力することが出来るようになります。
●リスト入力
ここでは選択中のNOのリストを入力することが出来ます。入力できる文字はアルファベット・数字・記号の一部です。
タクトスイッチ2を押し続けると入力文字が昇順に、タクトスイッチ3で降順に切り替わっていきます。文字を選んだらタクトスイッチ1で確定して、文字入力位置が次に移ります。入力できる文字数は画面一行分の16文字です。
表示される文字のうちアルファベット小文字のbaeは文字ではなく入力操作を表す記号です。
bはバックスペースの意味で選択すると入力位置が1つ前の文字位置に戻ります。
aは一行全体を消去します。
eを選択すると入力されたデータをEEPROM書き込んでリスト表示画面に戻ります。
使用方法は以上です。
ここまで長くなったのでスケッチの説明は次回に。
最新の画像[もっと見る]
-
マイコン向けのロールプレイングゲームを作ってみた 2ヶ月前
-
マイコン向けのロールプレイングゲームを作ってみた 2ヶ月前
-
マイコン向けのロールプレイングゲームを作ってみた 2ヶ月前
-
マイコン向けのロールプレイングゲームを作ってみた 2ヶ月前
-
マイコン向けのロールプレイングゲームを作ってみた 2ヶ月前
-
マイコン向けのロールプレイングゲームを作ってみた 2ヶ月前
-
USBホスト機能を試してみる 5ヶ月前
-
USBホスト機能を試してみる 5ヶ月前
-
USBホスト機能を試してみる 5ヶ月前
-
Linino OneのDisk spaceを増やしてsambaを動かす 5ヶ月前
※コメント投稿者のブログIDはブログ作成者のみに通知されます