31 Arduino モールス通信練習機 3 設定値記憶 [EEPROM]
この記事では、モールス練習器のトーン周波数を変更したらArduinoボードの電源を切っても記憶されるスケッチを作成します。
- 第1回 モールス通信練習機 基本スケッチ
- 第2回 モールス通信練習機 周波数変更
- 第3回 モールス通信練習機 設定値記憶
- 第4回 モールス通信練習機 On/Off時間測定
- 第5回 モールス通信練習機 完成
はEEPROMデータを読み書きするプログラムが追加されます。
電源ON直後に setup関数内でEEPROMデータを読み込み、 frequency変数にセットします。前回のスケッチに追加したパラメータ変更機能での変更結果は、変更後すぐEEPROMに保管します。
使用する部品は、圧電スピーカーと縦振れ電鍵で、以下のピンに接続しています。
- pin 2 -> 電鍵
- pin 8 -> 圧電スピーカー
スケッチの内容
スケッチの serup関数内でEEPROMのデータを読み込みます。
実際には ckEEPROMdata関数でEEPROM 1 番地のデータを読み込み、有効な値(1-3)であれば周波数に変換します。もし無効な値であればデフォルトとして'3'を使用して周波数を求めます。
シリアル通信で有効な周波数変更コードを受信すると、そのコードをEEPROM 1 番地に上書きします。
// KeyOsc_3
// EEPROM 7-9
#include <eeprom.h>
int frequency;
int keyPin = 2; // 電顕は pin 2
int spkPin = 8; // 圧電スピーカーは pin 8
int ledPin = 13; // 内蔵LEDは pin 13
String sFreq1 = "1 -> Frequency 1000 Hz";
String sFreq2 = "2 -> Frequency 800 Hz";
String sFreq3 = "3 -> Frequency 600 Hz";
String sSel = " Sellected";
void setup() {
Serial.begin(115200); // シリアル通信の設定
pinMode(keyPin, INPUT_PULLUP); // 出力に設定
pinMode(ledPin, OUTPUT); // 出力に設定
// コマンド説明
Serial.println("++++++++++++++++++++++");
Serial.println("Select Tone Frequency.");
Serial.println(sFreq1);
Serial.println(sFreq2);
Serial.println(sFreq3);
Serial.println();
// EEPROM 読み込み
ckEEPROMdata(); // EEPROMデータ取得
}
void loop() {
if(!digitalRead(keyPin)){ // keyが押されたら
digitalWrite(ledPin, HIGH); // LEDをオン
tone(spkPin,frequency); // サイドトーン ON
}else{ // keyが離れていれば
digitalWrite(ledPin, LOW); // LEDをオフ
noTone(spkPin); // サイドトーン OFF
}
if(Serial.available()){ // 受信してるなら
int val = Serial.read(); // 一文字入力し
setPara(val); // setPara関数へ
if((val>='1')&(val<='3')){ // 有効データなら
EEPROM.write(1, val); // EEPROMに上書き
delay(5); // 書き込み時間の確保
}
}
}
// 周波数データの有効性確認と周波数への変換
// 1番地;周波数コード('1','2','3')
// 無効データは '3'に読み替える
void ckEEPROMdata(){
int val = EEPROM.read(1);
if((val<'1')|(val>'3'))val='3';
setPara(val);
}
// データを解釈し処理する
void setPara(int val){
switch(val){
case '1': // 1000Hz 周波数変更 -----------
frequency = 1000;
Serial.println(sFreq1 + sSel);
break;
case '2': // 800Hz 周波数変更 -----------
frequency = 800;
Serial.println(sFreq2 + sSel);
break;
case '3': // 600Hz 周波数変更 -----------
frequency = 600;
Serial.println(sFreq3 + sSel);
break;
}
}
動作の確認
スケッチを Arduino に書き込みプログラムがスタートしたら、Arduino IDE のシリアルモニターを起動してください。シリアルモニター画面が開いたら以下の手順で操作します。
- 通信速度を 115200 に設定する。
- ArduinoボードのリセットSWを押す。
- 使用できるコマンドがシリアルモニターに表示される。
- シリアルモニター上部送信欄に「1」を入力しする。
- 送信ボタンを押す。
- 画面上に周波数変更の確認が表示される。
- 電顕を叩いて周波数が変更されたことを確認する。
- ArduinoボードのリセットSWを押す。(電源OFFしても良い)
- コマンドリストが再び表示され、その下に記憶されている周波数も表示される。
次回は、電鍵操作を客観的に見直せるように、電鍵のON時間、OFF時間を測定しシリアルモニターに表示するスケッチ記事を予定します。