/**************************************************************/ /* Morse Beacon */ /* */ /* Base sketch by Mark VandeWettering(K6HX) */ /* http://brainwagon.org/ */ /* */ /* Author: Hiroshi Shirahara(7J3AOZ) */ /* Date: 2014/02/25 */ /* */ /* This code is in the public domain. */ /* */ /**************************************************************/ #define CHAR_MAX 45 // モールス符号数 #define SPEED 20 // 符号送出速度(WPM) #define DOTLEN 1200 / SPEED // 短点の長さ(ms) #define DASHLEN 3 * DOTLEN // 長点の長さ(ms) #define CHAR_SPACE 3 * DOTLEN // 文字間スペース(ms) #define WORD_SPACE 7 * DOTLEN // 単語間スペース(ms) #define INTERVAL 3000 // ビーコン送出間隔(ms) #define BEACON_ON 1 // ビーコン動作中 #define BEACON_OFF 0 // ビーコン停止中 const char msg[] = "DE 7J3AOZ"; // 送出文字列 const char cw_char[CHAR_MAX] = { // 符号パターン検索用配列 '.',',','?','/','@','-','!','(',')', 'A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', '1','2','3','4','5','6','7','8','9','0' }; const char cw_pat[CHAR_MAX] = { // 符号パターン配列 B01101010, // .(ピリオド) B01110011, // ,(カンマ) B01001100, // ?(クエッション) B00101001, // /(スラッシュ) B01010110, // @(アットマーク) B01100001, // -(ハイフン) B01110101, // !(感嘆符) B00101101, // ((左カッコ) B01101101, // )(右カッコ) B00000110, // A B00010001, // B B00010101, // C B00001001, // D B00000010, // E B00010100, // F B00001011, // G B00010000, // H B00000100, // I B00011110, // J B00001101, // K B00010010, // L B00000111, // M B00000101, // N B00001111, // O B00010110, // P B00011011, // Q B00001010, // R B00001000, // S B00000011, // T B00001100, // U B00011000, // V B00001110, // W B00011001, // X B00011101, // Y B00010011, // Z B00111110, // 1 B00111100, // 2 B00111000, // 3 B00110000, // 4 B00100000, // 5 B00100001, // 6 B00100011, // 7 B00100111, // 8 B00101111, // 9 B00111111 // 0 } ; volatile int state = BEACON_OFF; // 動作ステータス // ------- 長点送出 void dash() { digitalWrite(13, HIGH); // 長点出力開始 delay(DASHLEN); // 長点の長さ待つ digitalWrite(13, LOW); // 長点出力終了 delay(DOTLEN); // 短点1つ分待つ } // ------- 短点送出 void dit() { digitalWrite(13, HIGH); // 短点出力開始 delay(DOTLEN); // 短点の長さを待つ digitalWrite(13, LOW); // 短点出力終了 delay(DOTLEN); // 短点1つ分待つ } // ------- モールス符号送出 void send(char c) { int i ; unsigned char p; // 文字がスペースの場合 if (c == ' ') { delay(WORD_SPACE); return; } // モールス符号パターンを検索し、パターンに従って送出する for (i = 0; i < CHAR_MAX - 1; i = i + 1) { if (cw_char[i] == c) { // 検索用配列にマッチしたか? p = cw_pat[i]; // 符号パターンを取得 while (p != 1) { // 符号パターンが数値の1になるまで繰り返す if ((p & B00000001) == B00000001) { dash(); // ビット0が1なら長点 } else { dit(); // ビット0が0なら短点 } p = p / 2; // 1ビット右にシフトする } delay(CHAR_SPACE); // 文字間スペース分待つ break; } } } // ------- スイッチ押下割り込み void button_in() { if (state == BEACON_ON) { // stateが動作中か? state = BEACON_OFF; // 動作中なら停止中に切り替え } else { state = BEACON_ON; // 停止中なら動作中に切り替え } } // ------ 初期化 void setup() { pinMode(13, OUTPUT) ; // 13番ピンを出力に設定 pinMode(2, INPUT_PULLUP); // 2番ピンを入力(内部プルアップ)に設定 attachInterrupt(0,button_in,FALLING); // 2番ピンの入力割り込みを設定 } // ------ メインループ void loop() { int cnt; // 文字カウンタ用変数を定義 if (state == BEACON_ON) { // ステータスが動作中か? cnt = 0; // 文字カウンタを初期化 while (msg[cnt] != 0x00) { // 文字列の終端までループ if (state == BEACON_OFF) break; // ステータスが動作中でなければループを中断 send(msg[cnt]); // cntで示される文字を送出 cnt = cnt + 1; // 文字カウンタを+1 } delay(INTERVAL); // 送信時間待ち } }