目次

エレキー処理スケッチ

 モールス符号を打つ場合、短点(・)、長点(−)を
 2つのパドルに分けてしまうエレキーを利用すること
 があります。



 パドルを2つにした場合、短点(・)、長点(−)の
 長さを可変抵抗器の出力電圧で自由に変更できるよう
 にするエレキーがあります。

 可変抵抗器の出力電圧を取得するには、A/D変換器を
 使います。

 パドルがどちらの符号を出力するのかを、プッシュスイッチ
 で指定できるようにしてみます。

 実際の無線機に接続する接点処理まで含めた回路は、以下。



 可変抵抗器、プッシュスイッチを実装すると
 次の写真のようになります。



 スケッチを作成するので、利用するポートのビット位置を
 決めます。

 接続デバイスがわかれば、初期化処理は単純。

  /* port values */
  PORTC = 0x0f ;
  /* port directions */
  DDRC = 0xf0 ; /* upper output , lower input */

 A/D変換器で電圧を取得するには、analogReadを利用。
 関数でまとめます。

  byte get_adv()
  {
    word tmp ;
    /* get */
    tmp = analogRead(0);
    /* convert */
    return(tmp / 100);
  }

 短点、長点の処理は、loopの中で処理すればよいでしょう。

  #define CW_BIT 4

  #define OFF 0
  #define ON  OFF+1

  #define MASK_SW   0x06
  #define DOT_CODE  0x01
  #define DASH_CODE 0x02

  byte swx ;
  byte dot ;
  byte dash ;

  void loop()
  {
    /* get state */
    swx = PINC & MASK_SW ;
    /* shift */
    swx >>= 1 ;
    /* get dot and dash */
    dot  = swx & DOT_CODE ;
    dash = swx & DASH_CODE ;
    /* judge */
    if ( dot == OFF ) {
      /* enable */
      PORTC |= (1 << CW_BIT);
      /* delay */
      /* disable */
      PORTC &= ~(1 << CW_BIT);
    }
    if ( dash == OFF ) {
      /* enable */
      PORTC |= (1 << CW_BIT);
      /* delay */
      /* disable */
      PORTC &= ~(1 << CW_BIT);
    }
  }

 外部接点をオン、オフする処理は、専用関数を
 定義して使います。

  void send_cw(boolean x)
  {
    if ( x ) { PORTC |=  (1 << CW_BIT); }
    else     { PORTC &= ~(1 << CW_BIT); }
  }

 短点、長点の持続時間は、A/D変換値より計算して
 専用関数に与えるようにすればよいでしょう。
 長点の持続時間は、短点の3倍と規定があります。

  #define CW_BIT 4

  #define OFF 0
  #define ON  OFF+1

  #define MASK_SW   0x06
  #define DOT_CODE  0x01
  #define DASH_CODE 0x02

  byte swx ;
  byte dot ;
  byte dash ;
  byte dot_delay ;
  byte dash_delay ;

  void loop()
  {
    /* get A/D */
    dot_delay = get_adv();
    /* calculate */
    dash_delay = 3 * dot_delay ;
    /* get state */
    swx = PINC & MASK_SW ;
    /* shift */
    swx >>= 1 ;
    /* get dot and dash */
    dot  = swx & DOT_CODE ;
    dash = swx & DASH_CODE ;
    /* judge */
    if ( dot == OFF ) {
      /* enable */
      send_cw(ON);
      /* delay */
      send_delay_cnt( dot_delay );
      /* disable */
      send_cw(OFF);
    }
    if ( dash == OFF ) {
      /* enable */
      send_cw(ON);
      /* delay */
      send_delay_cnt( dash_delay );
      /* disable */
      send_cw(OFF);
    }
  }

 持続時間を担当する関数は、以下。

  void send_delay_cnt(byte x)
  {
    byte ii ;
    byte last ;
    /* copy */
    last = x ;
    /* loop */
    for ( ii = 0 ; ii < last ; ii++ ) {
      delay(300);
    }
  }

 まとめると、以下。

#define OFF 0
#define ON  OFF+1

#define CW_BIT 4

#define MASK_SW   0x06
#define DOT_CODE  0x01
#define DASH_CODE 0x02

byte swx ;
byte dot ;
byte dash ;
byte dot_delay ;
byte dash_delay ;

byte get_adv()
{
  word tmp ;
  /* get */
  tmp = analogRead(0);
  /* convert */
  return(tmp / 100);
}

void send_cw(boolean x)
{
  if ( x ) { PORTC |=  (1 << CW_BIT); }
  else     { PORTC &= ~(1 << CW_BIT); }
}

void send_delay_cnt(byte x)
{
  byte ii ;
  byte last ;
  /* copy */
  last = x ;
  /* loop */
  for ( ii = 0 ; ii < last ; i++ ) {
    delay(300);
  }
}

void setup()
{
  /* port values */
  PORTC = 0x0f ;
  /* port directions */
  DDRC = 0xf0 ; /* upper output , lower input */
  /* clear */
  swx = 0 ;
  dot = 0 ;
  dash = 0 ;
  dot_delay = 0 ;
  dash_delay = 0 ;
}

void loop()
{
  /* get A/D */
  dot_delay = get_adv();
  /* calculate */
  dash_delay = 3 * dot_delay ;
  /* get state */
  swx = PINC & MASK_SW ;
  /* shift */
  swx >>= 1 ;
  /* get dot and dash */
  dot  = swx & DOT_CODE ;
  dash = swx & DASH_CODE ;
  /* judge dot */
  if ( dot == OFF ) {
    /* enable */
    send_cw(ON);
    /* delay */
    send_delay_cnt( dot_delay );
    /* disable */
    send_cw(OFF);
  }
  /* judge dash */
  if ( dash == OFF ) {
    /* enable */
    send_cw(ON);
    /* delay */
    send_delay_cnt( dash_delay );
    /* disable */
    send_cw(OFF);
  }
}

 音として聞きたい場合、圧電スピーカをトランジスタの
 出力に接続します。



 関数toneを利用してスピーカに音を出すことでも
 実現できます。この場合、delayによる時間差を
 考えなくてよくなります。

  /* judge dot */
  if ( dot == OFF ) {
    /* enable */
    send_cw(ON);
    /* delay */
    tone(19,800,dot_delay*300);
    /* disable */
    send_cw(OFF);
  }
  /* judge dash */
  if ( dash == OFF ) {
    /* enable */
    send_cw(ON);
    /* delay */
    tone(19,800,dash_delay*900);
    /* disable */
    send_cw(OFF);
  }


目次

inserted by FC2 system