このサイトはMacを使って Arduino Uno の動作や活用法を学びます。

31 Arduino モールス通信練習機 3 設定値記憶 [EEPROM]

この記事では、モールス練習器のトーン周波数を変更したらArduinoボードの電源を切っても記憶されるスケッチを作成します。

はEEPROMデータを読み書きするプログラムが追加されます。

電源ON直後に setup関数内でEEPROMデータを読み込み、 frequency変数にセットします。前回のスケッチに追加したパラメータ変更機能での変更結果は、変更後すぐEEPROMに保管します。

 

使用する部品は、圧電スピーカーと縦振れ電鍵で、以下のピンに接続しています。

 

 

スケッチの内容

スケッチの 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 のシリアルモニターを起動してください。シリアルモニター画面が開いたら以下の手順で操作します。

  1. 通信速度を 115200 に設定する。
  2. ArduinoボードのリセットSWを押す。
  3. 使用できるコマンドがシリアルモニターに表示される。
  4. シリアルモニター上部送信欄に「1」を入力しする。
  5. 送信ボタンを押す。
  6. 画面上に周波数変更の確認が表示される。
  7. 電顕を叩いて周波数が変更されたことを確認する。

 

  1. ArduinoボードのリセットSWを押す。(電源OFFしても良い)
  2. コマンドリストが再び表示され、その下に記憶されている周波数も表示される。

 


 

次回は、電鍵操作を客観的に見直せるように、電鍵のON時間、OFF時間を測定しシリアルモニターに表示するスケッチ記事を予定します。