Arduinoでモールス符号をLチカ(完成)

久々に使う Arduino Uno R3 の使い方を思い出してみる(後編)

という事で前回までに、ほぼ作業は完了していたコレ。 実際に、モールス符号の定義を確認、だいたいの書き方の確認まで終わっていた。あと五分から十分あったら完成ってところで時間切れ。

ほんと、学生の頃の自由な時間が欲しい。

完成したスケッチ

アイデアで書いたものをコピペして、 Arduino Uno に転送。 実際にLEDを光らせてみる。

/*
  Morse Blink
*/

int morseCode[26][4] = { // DOT=1 , DASH=2 , BLANK=0
    {1,2,0,0}, {2,1,1,1}, {2,1,2,1}, {2,1,1,0}, {1,0,0,0}, // A,B,C,D,E
    {1,1,2,1}, {2,2,1,0}, {1,1,1,1}, {1,1,0,0}, {1,2,2,2}, // F,G,H,I,J
    {2,1,2,0}, {1,2,1,1}, {2,2,0,0}, {2,1,0,0}, {2,2,2,0}, // K,L,N,M,O
    {1,2,2,1}, {2,2,1,2}, {1,2,1,0}, {1,1,1,0}, {2,0,0,0}, // P,Q,R,S,T
    {1,1,2,0}, {1,1,1,2}, {1,2,2,0}, {2,1,1,2}, {2,1,2,2}, // U,V,W,X,Y
    {2,2,1,1} }; // Z

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void keying (String Text, int wpm) {
  int i, j;
  int KeyingSpeed = (60 / (50 * (double)wpm)) * 1000;
  for ( i=0; i<Text.length(); i++) {
    for ( j=0; j<4; j++) {
      switch (morseCode[(int)Text.charAt(i)-65][j]){
        case 1: // DOT
          digitalWrite(LED_BUILTIN, HIGH);
          delay(KeyingSpeed);
          digitalWrite(LED_BUILTIN, LOW);
          delay(KeyingSpeed);
          break;
        case 2: // DASH
          digitalWrite(LED_BUILTIN, HIGH);
          delay(KeyingSpeed*3);
          digitalWrite(LED_BUILTIN, LOW);
          delay(KeyingSpeed);
          break;
        default: // BLANK
          break;
      }
      delay(KeyingSpeed*2);
    }
  delay(KeyingSpeed*4); 
  }
}

// the loop function runs over and over again forever
void loop() {
  keying("MUDAMUDA", 12);
}

これでおおむね予定通りの完成。

まぁ、LEDで動作確認できたし。 と目の前を見ると、秋月で買った圧電スピーカー。 これ、12番とGNDにつないで、ついでだから音を鳴らしてみよう。 変更点と言えば、出力ピンの定義

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

こんな感じでとりあえず追加。

int SPEAKER = 12;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(SPEAKER, OUTPUT);
}

あとは

          digitalWrite(LED_BUILTIN, HIGH);
          delay(KeyingSpeed);

こんな感じだった部分に出力を追加。

          digitalWrite(LED_BUILTIN, HIGH);
          tone(SPEAKER, Tone, KeyingSpeed);
          delay(KeyingSpeed);

これで、コードを流してみる。 うん、Arduinoって簡単ですなぁ。 完成版はこんな感じ。

/*
  Morse Blink
*/
 
int morseCode[26][4] = { // DOT=1 , DASH=2 , BLANK=0
    {1,2,0,0}, {2,1,1,1}, {2,1,2,1}, {2,1,1,0}, {1,0,0,0}, // A,B,C,D,E
    {1,1,2,1}, {2,2,1,0}, {1,1,1,1}, {1,1,0,0}, {1,2,2,2}, // F,G,H,I,J
    {2,1,2,0}, {1,2,1,1}, {2,2,0,0}, {2,1,0,0}, {2,2,2,0}, // K,L,N,M,O
    {1,2,2,1}, {2,2,1,2}, {1,2,1,0}, {1,1,1,0}, {2,0,0,0}, // P,Q,R,S,T
    {1,1,2,0}, {1,1,1,2}, {1,2,2,0}, {2,1,1,2}, {2,1,2,2}, // U,V,W,X,Y
    {2,2,1,1} }; // Z
 
int SPEAKER = 12;
 
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(SPEAKER, OUTPUT);
}
 
void keying (String Text, int wpm) {
  int i, j;
  int Tone = 400;
  int KeyingSpeed = (60 / (50 * (double)wpm)) * 1000;
  for ( i=0; i<Text.length(); i++) {
    for ( j=0; j<4; j++) {
      switch (morseCode[(int)Text.charAt(i)-65][j]){
        case 1: // DOT
          digitalWrite(LED_BUILTIN, HIGH);
          tone(SPEAKER, Tone, KeyingSpeed);
          delay(KeyingSpeed);
          digitalWrite(LED_BUILTIN, LOW);
          delay(KeyingSpeed);
          break;
        case 2: // DASH
          digitalWrite(LED_BUILTIN, HIGH);
          tone(SPEAKER, Tone, KeyingSpeed*3);
          delay(KeyingSpeed*3);
          digitalWrite(LED_BUILTIN, LOW);
          delay(KeyingSpeed);
          break;
        default: // BLANK
          break;
      }
      delay(KeyingSpeed*2);
    }
  delay(KeyingSpeed*4); 
  }
}
 
// the loop function runs over and over again forever
void loop() {
  keying("PARIS", 12);
}

コメント