電子工作97 - 「良く噛めヘルパー」の実用機の製作 - 音声、ブザー音、LED点滅、カウンター表示、6段階に動作速度を変れる
Electronics Project 97 –
Good Chewing Helper with Counter Display and 6-speed Light & Audio Rhythm
概要 Introduction
今回の実用機では、前述の電子工作95「良く噛めヘルパー」の最終改良バージョンでの噛む速度を2段階から6段階にした。この目的のためには12F629ではI/Oピンの数が足りないので、14ピンの16F688を導入した。以上が改良点で、他は同じである。これでかなり実用的な装置になったと思う。
回路図 Circuit Diagram
下図のように、電子工作95の最終バージョンに比べ、12F629の代わりに16F688が、噛む速度SWの代わりにロータリーSWが新たに導入されている。これでI/Oピンの数にも余裕が出来、噛む速度も前の2段階から、0から5までの6段階を選択出来るようになった。回路の他の部分は前のものと変わらない。
製作した装置
写真は今回製作した実用機で、カウンターの下に赤いロータリーSWが見える。右の写真で分かるように、プラスチックボックスの左側(カウンターの下に当たる部分)に穴を開け、カウンタリセットモードSWの先端(青色)を出している。それを奥に押すとEverytimeモード(電源が入る毎に液晶表示が0にリセットされる)に、引くとCumulativeモード(電源が入る毎には液晶表示が0にリセットされず、前の値に積算されるモード)に変わる。
実用機 Practical model
実験中 Under experiment
今回使ったロータリーSWの写真: 原則、0−9までの10個のポジションがシャフトを回転させて選べる。本目的には多すぎるので、0―5までの6個のポジションが選べるようにした。従って、全部で4本ある取り出しピンの内の3本のピンからのみ信号を取り出した(赤い線)。各線は500Kの抵抗を介してプルアップしてある。
ロータリーSWの裏面: 全部で6本のピンには1、2、4、8、C、Cと刻印があり、1、2、4、8の4本をI/Oピンに接続するとSWの全10ポジションが使えるが、今回はその内の1、2、4をI/Oピンに接続して6ポジションを使う。なお、2本あるピンCはGNDである。
ロータリーSWの論理表: この表の中で、鉛筆で囲んだ部分(横:0、1、2、3、4、5、縦:1、2、4)のみを使う。例えば、SWのシャフトの位置を1にすると、ピン1:2:4=H:L:Lの出力になる(ここで、Hは電源電圧、LはGND)。また、シャフトの位置を5にすると、ピン1:2:4=H:L:Hの出力になる。
カウントする速度の測定
ロータリーSWの位置とカウンターに表示されカウント数の関係
--------------------------------------------
ロータリーSWの位置 カウント速度
(カウント数/分)
--------------------------------------------
0 61
1 68
2 77
3 88
4 102
5 121
--------------------------------------------
基本的使い方
1) 本装置は食べ物を噛む時に、自分で録音した音声、ブザー音、LED発光でリズムを取って貰い、更に、カウンター表示でどれくらい噛んだかを知る目的に使う。
2) プラスチックボックスを立てると、マイクロスイッチがONになり電源が入って動作を開始する。音声、ブザー音とLED発光の繰返しの速度はロータリーSWで好みの速度を選択する。
3) ボックスの左側面のカウンタリセットモードSWは奥に押すとEverytimeモード、引くとCumulativeモードに変わる。普通はCumulativeモードで使い、カウンターのリセットボタンを押して表示を0にし、ボックスを立て使用開始、カウンターが計測を続ける。途中で噛むのを休みたくなったらボックスを倒して電源を切り使用停止。また、噛むのを再開する時はボックスを立て計数を開始。この時カウンターに残っていた数値に新たに計数された数値が加算されていく。
4) Everytimeモードを選択すると、ボックスを立て使用開始する毎にカウンターの表示が0にリセットされる。
5) 装置が動作中にロータリーSWの位置を変えることが出来る。
結果&コメント
1)
正常に動作することが確認された。
2) 音声の録音(最大10秒間)は音声録音再生モジュールの「REC」を押しながらマイクに向かって行い、また、録音した音声は「PLAY」を押すと再生される。
3) プラスチックボックスの蓋の下部を1−2cmほど開けて動作させると、ちょうど良い音量で録音した音声やブザー音が聞こえる。
4) 費用は大体1500円ほど。1番高かったのは音声録音再生モジュールで¥450(aitendo)。
5) スイッチ入力の数を増やすためにロータリーSWを導入したが、その使い方を復習する意味もあった。
6) 動作中にロータリーSWの位置を変えることが出来るようにするのがキーポイントだった。
プログラム Program
ロータリーSWを導入し、噛む速度を6段階に変えられるようにしたのでプログラムも少し長くなった。どのロータリーSWの位置でも、50回カウントする毎に録音した音声を発生するようにさせること、それに動作中でもロータリーSWの位置を変えられるようにするロジックの作成がちょっと難しかった。
'***********************************************
'ChewingAVHelperCntRSWa.bas 2017.4.14 Works OK!
'16F688 with Internal Clock 4MHz used
'Compiled by PICBasic Pro V2.50A
'Rotary SW (0-9) used for selecting chewing rate
'***** Pin Connection *******
'Pin 1 - Vdd (+4.5V)
'Pin 14 - GND
'Pin 2 (RA5) - Everytime or Cumulative (Counter Reset Mode)
'Pin 3 (RA4) - Counter's Count-up via Photo Mos relay (1)
'Pin 4 - MCLR (Reset)
'Pin 10 (RC0) - RotSWP1 -> R1SW1
'Pin 9 (RC1) - RotSWP2 -> R1SW2
'Pin 8 (RC2) - RotSW4 -> R1SW3
'Pin 11 (RA2) - Counter's Reset via Photo Mos relay (2)
'Pin 12 (RA1) - Buzzer and LED
'Pin 13 (RA0) - Sound Recorder Module via Photo Mos relay (3)
'***** Program *******
CMCON0=7 'Comparator off
ANSEL=0
ADCON0=0 'ADC disable
TRISA=%101000
TRISC=%000111
BuzzerLED var PORTA.1
SoundON var PORTA.0
CounterReset var PORTA.2
CounterCntUp var PORTA.4 'Counter count-up
CounterRstMode var PORTA.5 'Counter Reset Mode
R1SW1 var PORTC.0 'Rotary SW Pin 1
R2SW2 var PORTC.1 'Rotary SW Pin 2
R4SW3 var PORTC.2 'Rotary SW Pin 4
m var Word
n var byte
d var byte 'ここまでが初期設定
For n=1 to 5 'Turning on Buzzer and LED 5 times ここでブザーとLEDを5回動作させる
High BuzzerLED
Pause 200
Low BuzzerLED
Pause 200
Next n
Pause 200
High SoundON 'Turning on SW-speak of Sound Recorder Module ここで音声を1回出す
Pause 200
Low SoundON
If CounterRstMode=1 Then Goto EverytimeM 'Go to EverytimeM or CumulativeM ? カウンタリセットモードSWの位置によってEverytimeM かCumulativeMに飛ばす
Low BuzzerLED 'Resetting Counter
Goto CumulativeM
EverytimeM: 'Start of Counter Reset Mode
Low BuzzerLED 'Resetting Counter 電源ONでカウンターをリセットさせる
High CounterReset
Pause 100 '100 ms
Low CounterReset
Jump:
d=0
RSWPCheck: 'Checking Rotary SW Position – 6 positions as shown below, 以下の6行のIfラインでロータリーSW位置をチェック
IF (R1SW1=0) AND (R2SW2=0) AND (R4SW3=0) Then RotSWP0 'If yes, jump to RotSWP0, but if not, check the next If xxx line,
IF (R1SW1=1) AND (R2SW2=0) AND (R4SW3=0) Then RotSWP1
IF (R1SW1=0) AND (R2SW2=1) AND (R4SW3=0) Then RotSWP2
IF (R1SW1=1) AND (R2SW2=1) AND (R4SW3=0) Then RotSWP3
IF (R1SW1=0) AND (R2SW2=0) AND (R4SW3=1) Then RotSWP4
IF (R1SW1=1) AND (R2SW2=0) AND (R4SW3=1) Then RotSWP5
RotSWP0: 'Rotary SW Position 0 ロータリーSW位置が0の時にここに飛ぶ
Gosub BuzzerLEDRou 'Jump to BuzzerLEDRou subroutine
Gosub CounterCntUpRou 'Jump to CounterCntUpRou subroutine
Pause 900 '900ms this is the interval between two counting actions (slowest). この値900msがカウンテングのインターバルになる(最も遅い)
d=d+1
If d>=50 Then 'If d>=50, go to High SoundON (once every 50 counts) , but if not, jump to Goto RSWPCheck (for increasing d=d+1) 50回毎に音声を出力するルーチン
High SoundON
Pause 200
Low SoundON
Goto Jump 'If d>=50, go to Jump for starting counting again.
Else
Goto RSWPCheck 'If d<50, go to RSWPCheck for checking Rotary SW position. これで50回カウンテング中のロータリーSW位置の変化をチェック
Endif
Goto Jump
RotSWP1:
Gosub BuzzerLEDRou
Gosub CounterCntUpRou
Pause 800 '800ms
d=d+1
If d>=50 Then
High SoundON
Pause 200
Low SoundON
Goto Jump
Else
Goto RSWPCheck
Endif
Goto Jump
RotSWP2:
Gosub BuzzerLEDRou
Gosub CounterCntUpRou
Pause 700 '700ms
d=d+1
If d>=50 Then
High SoundON
Pause 200
Low SoundON
Goto Jump
Else
Goto RSWPCheck
Endif
Goto Jump
RotSWP3:
Gosub BuzzerLEDRou
Gosub CounterCntUpRou
Pause 600 '600ms
d=d+1
If d>=50 Then
High SoundON
Pause 200
Low SoundON
Goto Jump
Else
Goto RSWPCheck
Endif
Goto Jump
RotSWP4:
Gosub BuzzerLEDRou
Gosub CounterCntUpRou
Pause 500 '500ms
d=d+1
If d>=50 Then
High SoundON
Pause 200
Low SoundON
Goto Jump
Else
Goto RSWPCheck
Endif
Goto Jump
RotSWP5:
Gosub BuzzerLEDRou
Gosub CounterCntUpRou
Pause 400 '400ms this is the interval between two counting actions (fastest). この値400msがカウンテングのインターバルになる (最も速い)
d=d+1
If d>=50 Then
High SoundON
Pause 200
Low SoundON
Goto Jump
Else
Goto RSWPCheck
Endif
Goto Jump
Jump1:
d=0
CumulativeM: 'Note there is no CounterReset statement under this CumulativeM label unlike EverytimeM label. ここでは電源ONでもカウンターをリセットさせない
RSWPCheck1:
IF (R1SW1=0) AND (R2SW2=0) AND (R4SW3=0) Then RotSWP0C
IF (R1SW1=1) AND (R2SW2=0) AND (R4SW3=0) Then RotSWP1C
IF (R1SW1=0) AND (R2SW2=1) AND (R4SW3=0) Then RotSWP2C
IF (R1SW1=1) AND (R2SW2=1) AND (R4SW3=0) Then RotSWP3C
IF (R1SW1=0) AND (R2SW2=0) AND (R4SW3=1) Then RotSWP4C
IF (R1SW1=1) AND (R2SW2=0) AND (R4SW3=1) Then RotSWP5C
RotSWP0C:
Gosub BuzzerLEDRou
Gosub CounterCntUpRou
Pause 900 '900ms
d=d+1
If d>=50 Then
High SoundON
Pause 200
Low SoundON
Goto Jump1
Else
Goto RSWPCheck1
Endif
Goto Jump1
RotSWP1C:
Gosub BuzzerLEDRou
Gosub CounterCntUpRou
Pause 800 '800ms
d=d+1
If d>=50 Then
High SoundON
Pause 200
Low SoundON
Goto Jump1
Else
Goto RSWPCheck1
Endif
Goto Jump1
RotSWP2C:
Gosub BuzzerLEDRou
Gosub CounterCntUpRou
Pause 700 '700ms
d=d+1
If d>=50 Then
High SoundON
Pause 200
Low SoundON
Goto Jump1
Else
Goto RSWPCheck1
Endif
Goto Jump1
RotSWP3C:
Gosub BuzzerLEDRou
Gosub CounterCntUpRou
Pause 600 '600ms
d=d+1
If d>=50 Then
High SoundON
Pause 200
Low SoundON
Goto Jump1
Else
Goto RSWPCheck1
Endif
Goto Jump1
RotSWP4C:
Gosub BuzzerLEDRou
Gosub CounterCntUpRou
Pause 500 '500ms
d=d+1
If d>=50 Then
High SoundON
Pause 200
Low SoundON
Goto Jump1
Else
Goto RSWPCheck1
Endif
Goto Jump1
RotSWP5C:
Gosub BuzzerLEDRou
Gosub CounterCntUpRou
Pause 400 '400ms
d=d+1
If d>=50 Then
High SoundON
Pause 200
Low SoundON
Goto Jump1
Else
Goto RSWPCheck1
Endif
Goto Jump1
BuzzerLEDRou: 'Buzzer & LED drive subroutine このサブルーチンではブサーとLEDを50ms動作させる
High BuzzerLED
Pause 50 '50ms
Low BuzzerLED
Return
CounterCntUpRou: 'Counter count-up subroutine このサブルーチンではカウンターを1つ積算させる
High CounterCntUp
Pause 50 '50 ms
Low CounterCntUp
Return
End
'*****End of Program******
'Note:
'melabs U2 Programmer's configurations for 16F688:
'Oscillator - INTOSC, WDTE - Enable, PWRTE - Disable, MCLR - Reset, Brown-out Reset - Enable,
'Internal External SW Over - Enable, Fail-Safe Clock Monitor - Enable, Code - Not Protected,
'Data EEPROM - Not Protected
'***********************************************
Menu Pageへ戻る (Return to Menu Page)
Topへ戻る
(Return to Top of Page)