電子工作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)