電子工作etc (ストレッチ用タイマー)

2013/05/03


◆ 製作の動機

ブログにもたびたび書いているが、自分は若いころから腰痛に悩まされ続けています。

最近も激しい腰痛が発症しまともに歩けるようになるまで数ヶ月を要しました。

老人になった時に発症したら、後は死ぬまで歩けなくなるんじゃないかと思い、恐ろしくなったのでストレッチをやるようにしています。

ストレッチでは一定の動作を 20秒 ~ 30 秒の間保持するため頭の中でカウントするのですが、自分で数えると結構手面倒くさく、簡単なタイマーを使いたいと思い製作することにしました。


◆ ハードウェア

ストレッチを行うときは、ジャージやトレーナーなど動きやすい服装となるのですが、ちょうど良いポケットが無いので、なるべく軽く、小さく、でも使いやすい大きさが必要になります。 そこでチョイスしたのがフリスクケースです。 フリスクケースは加工のしやすさ、高さ、大きさがちょうど良いので製作に愛用している人も多く見受けられます。

自分は病院付属のジムでストレッチをする為、他の人の迷惑になってはいけないのでイヤホンを使用した音声でカウントをします。

電源は CR2032 等 3V のボタン電池。 カウンタのスタートのためのタクトスイッチ。 制御用のマイコン。 後は付随するもの。

種別 定格・品番 個数 備考
制御用マイコン ATtiny13A 1  
イヤホン   1 100均で購入
電池ソケット CR2032用 1 基板取付用、ケースに入るもの
タクトスイッチ 無くても可 1  
抵抗 適当に手持ち品から選ぶ 1 音量調整用
以下はおまけ機能用
LED   3  
抵抗   3 LEDの電流制限用

ほとんど思いつきで作り始めたので回路図とかも書いてません。 面倒だったので LEDの電流制限抵抗も入れてません。 切れたら作りかえます。

ATtiny13A はソケットを使用せず直接ハンダ付けしています。 プログラムは別に書き込んで、ソケットにチップを差し込んだ方が ISP端子の分スペースが空きます。

ATtiny13A は 3V で駆動させ、内部発振で使用しました。 ヒューズビットは購入時のままです。

耳にイヤホンを突っ込んでそのままぶら下げてもほとんど落ちることはありません。 ストレッチ中はだいたい横になっているので落ちません。

ストレッチは 30分程度でやめるのでスリープさせますが、電源は入れっぱなしです。 ラーメンを作るのに 3分計りたい場合でも 30分間放置してスリープさせます。


◆ ソフトウェア

動作は、1秒毎に、ピッと動作オンを発生させ、瞬間的に LED を点灯させる。
10秒経過したら、プッと音で知らせる。
20秒経過したら、ププッと音で知らせる。
30秒経過したら、プーッと音で知らせる。
~繰り返し~
30分経過したらスリープモードに入る。 リセットボタンで再起動。

おまけ機能として、以下の機能を追加しました。

3分経過したら LED3 を点灯する。
4分経過したら LED3 を消灯させ LED2 を点灯する。
5分経過したら LED2 と LED3 を両方点灯する。
7分経過したら LED2 と LED3 を消灯する。

ちゃんとタイマー割込みで秒数をカウントする方が良いと思うのですが、ストレッチの間隔やラーメンの待機時間が10秒ずれていようが関係無いので、delay や wait 関数で秒をカウントしています。

プログラムは Bascom-AVR で以下のように作りました。

'
' ストレッチ・タイマー&ラーメン・タイマー
'

$regfile = "ATtiny13.DAT"      ' マイコンの宣言
$crystal = 1200000             ' 動作周波数の設定
                               ' 実際の周波数と違うが

$hwstack = 32
$swstack = 8
$framesize = 8

Dim Time0 As Byte              ' 1秒毎のカウンタ変数
Dim Timeoff As Word            ' スリープ用カウンタ変数

Led1 Alias Portb.0             ' ポート名の定義(LED1)
Led2 Alias Portb.1             ' ポート名の定義(LED2)
Led3 Alias Portb.2             ' ポート名の定義(LED3)
T_sw Alias Portb.3             ' ポート名の定義(タクトスイッチ)※未使用
Sp_out Alias Portb.4           ' ポート名の定義(イヤホン)

Config Led1 = Output           ' ポートを出力に設定(LED1)
Config Led2 = Output           ' ポートを出力に設定(LED2)
Config Led3 = Output           ' ポートを出力に設定(LED3)
Config Sp_out = Output         ' ポートを出力に設定(イヤホン)

Config Aci = Off               ' アナログ・コンバータをオフ

Config Timer0 = Timer , Prescale = 1024 , Clear Timer = 1
Ocr0a = 114 - 1
                               ' タイマーの設定

Reset Led1                     ' LED1 をオフ
Reset Led2                     ' LED2 をオフ
Reset Sp_out                   ' イヤホンをオフ

Set Led1                       ' 動作確認のため 1つずつLEDを点灯させる。
Waitms 500
Set Led2
Waitms 500
Reset Led1
Waitms 500
Set Led3
Waitms 500
Reset Led2
Waitms 500
Reset Led3

Time0 = 0                      ' 秒カウンタをリセット
Timeoff = 0                    ' スリープカウンタをリセット
Wait 1
Do                             ' ここからループ
  Time0 = Time0 + 1            ' 秒カウンタを加算

  Select Case Time0
    Case 10:                   ' 10秒経過時の処理
      Set Led3                 ' LED 3 を点灯
      Sound Sp_out , 20 , 100  ' 音を鳴らす
      Reset Led3               ' LED 3 を消灯
      Waitms 980               ' 1秒になるように待機
    Case 20:                   ' 20秒経過時の処理
      Set Led3
      Sound Sp_out , 20 , 100
      Waitms 20
      Sound Sp_out , 20 , 100
      Reset Led3
      Waitms 940
    Case 30:                   ' 30秒経過時の処理
      Set Led3
      Sound Sp_out , 100 , 100
      Reset Led3
      Time0 = 0                ' 30秒で秒カウンタをリセット
      Timeoff = Timeoff + 30   ' スリープ用カウンタを加算
      If Timeoff > 180 Then Set Led1  ' 3分経過時の処理
      If Timeoff > 240 Then           ' 4分経過時の処理
        Set Led2
        Reset Led1
      End If
      If Timeoff > 300 Then Set Led1  ' 5分経過時の処理
      If Timeoff > 480 Then           ' 7分経過時の処理
        Reset Led1
        Reset Led2
      End If
      Waitms 900
    Case Else:                 ' 毎秒の処理
      Set Led3
      Sound Sp_out , 20 , 50
      Reset Led3
      Waitms 980
  End Select

Loop Until Timeoff >= 1800     ' スリープカウンタが 1800秒でループから脱する。

Power Powerdown                ' スリープへ移行する。
End

写真のLEDの番号とプログラム内のLED名が一致してませんが、まぁ解るでしょ。