2013年08月14日

Arduino でエレキー

Arduino でエレキー

Arduino UNO R3 を使ったエレキーの記事をまとめました。
エレキープロジェクト第16ステージです。

【概要】

基本機能のみ実装してみました。
仕様は本ブログで公開している他のエレキーと同様です。

タイマ割込みは「MsTimer2」ライブラリを使用しました。
このタイマは、標準関数の tone() でも使用しているようで、同時使用はできないようでした。
したがって、ブザー出力はタイマ割り込みでポートのOn/Offを行っています。

その他使用した機能はA/Dコンバータ
 ADCData = analogRead(PortSpeedIn);
ポートのプルアップ機能
 pinMode(PortDashIn, INPUT_PULLUP);
などです。

なお、エレキーとして実用的なスケッチは下記のようなサイトで公開されているので参考にされてはいかがでしょうか。
http://blog.radioartisan.com/arduino-cw-keyer/


【回路】

Arduino でエレキー

【動作の様子】



【スケッチ】

//───────────────────────────────────
// Include files
//───────────────────────────────────
#include  "Arduino.h"
#include <MsTimer2.h>

//───────────────────────────────────
// Define Port
//───────────────────────────────────
#define PortSpeedIn A0
#define PortToneIn  A1

#define PortPttOut   7
#define PortKeyOut   8
#define PortBuzzOut 11
#define PortLedOut  13

#define PortDashIn   9
#define PortDotIn   10

//───────────────────────────────────
// Define Parameter Value
//───────────────────────────────────
typedef enum
{
  PARA_ALL_OFF,
  PARA_DOT_ON,
  PARA_DOT_OFF,
  PARA_DASH_ON,
  PARA_DASH_OFF,
  PARA_MAX
PARA;

#define LIMIT_VALUE 1
#define MAX_SPEED    15

//───────────────────────────────────
// Define User Memory
//───────────────────────────────────
static unsigned char FlagBuzz = false;
static unsigned int ParaTime = 0x0000;
static unsigned int ADCData = MAX_SPEED;

static PARA             ParaCode = PARA_ALL_OFF;
static unsigned char CntDotOn = 0x00;
static unsigned char CntDashOn = 0x00;

//───────────────────────────────────
// Get Speed VR Value
//───────────────────────────────────
void GetSpeed( void )
{
  ADCData = analogRead(PortSpeedIn);
  ADCData >>= 3;
  ADCData += MAX_SPEED;
}

//───────────────────────────────────
// Check Dot port
//───────────────────────────────────
boolean ChkDotPort( void )
{
  if( digitalRead(PortDotIn) == LOW )
  {
    return true;
  }
  else
  {
    return false;
  }
}

//───────────────────────────────────
// Check Dash port
//───────────────────────────────────
boolean ChkDashPort( void )
{
  if( digitalRead(PortDashIn) == LOW )
  {
    return true;
  }
  else
  {
    return false;
  }
}

//───────────────────────────────────
// Set Output port
//───────────────────────────────────
void SetOutput( void )
{
  if( (ParaCode == PARA_DASH_ON) || (ParaCode == PARA_DOT_ON) )
  {
    digitalWrite(PortKeyOut, HIGH);
    digitalWrite(PortLedOut, HIGH);
    FlagBuzz = true;
    //tone(PortBuzzOut,330);
  }
  else
  {
    digitalWrite(PortKeyOut, LOW);
    digitalWrite(PortLedOut, LOW);
    FlagBuzz = false;
    //noTone(PortBuzzOut);
  }
}

//───────────────────────────────────
// Check Input ports
//───────────────────────────────────
void ChkInputPort( void )
{
  // for Dot
  if( ParaCode != PARA_DOT_ON )
  {
    if( ParaCode == PARA_DOT_OFF && ParaTime >= (ADCData >>3) )
    {
      CntDotOn = 0;
    }
    else if( ParaCode == PARA_DASH_ON && ParaTime >= ADCData )
    {
      CntDotOn = 0;
    }
    else if( CntDotOn < LIMIT_VALUE )
    {
      if( ChkDotPort() )
        CntDotOn ++;
      else
        CntDotOn = 0;
    }
  }

  // for Dash
  if( ParaCode != PARA_DASH_ON )
  {
    if( ParaCode == PARA_DASH_OFF && ParaTime >= ADCData>>3 )
    {
      CntDashOn = 0;
    }
    else if( ParaCode == PARA_DOT_ON && ParaTime >= (ADCData >>1) )
    {
      CntDashOn = 0;
    }
    else if( CntDashOn < LIMIT_VALUE )
    {
      if( ChkDashPort() )
        CntDashOn ++;
      else
        CntDashOn = 0;
    }
  }
}

//───────────────────────────────────
// Set Parameter Dash
//───────────────────────────────────
char SetParaDash( void )
{
  if( CntDashOn >= LIMIT_VALUE )
  {
    GetSpeed();
    CntDashOn = 0;
    ParaCode = PARA_DASH_ON;
    ParaTime = (ADCData * 3);
    return true;
  }
  return false;
}

//───────────────────────────────────
// Set Parameter Dot
//───────────────────────────────────
char SetParaDot( void )
{
  if( CntDotOn >= LIMIT_VALUE )
  {
    GetSpeed();
    CntDotOn = 0;
    ParaCode = PARA_DOT_ON;
    ParaTime = ADCData;
    return true;
  }
  return false;
}


//───────────────────────────────────
// Elekey process
//───────────────────────────────────
void Elekey_Procs( void )
{
  ChkInputPort();

  if( ParaTime != 0 )
  {
    ParaTime --;
  }
  else
  {
    if( ParaCode == PARA_DOT_ON )
    {
      ParaCode = PARA_DOT_OFF;
      ParaTime = ADCData;
    }
    else if( ParaCode == PARA_DASH_ON )
    {
      ParaCode = PARA_DASH_OFF;
      ParaTime = ADCData;
    }
    else if( ParaCode == PARA_DOT_OFF )
    {
      if( !SetParaDash() )
      {
        if( !SetParaDot() )
        {
          ParaCode = PARA_ALL_OFF;
        }
      }
    }
    else
    {
      if( !SetParaDot() )
      {
        if( !SetParaDash() )
        {
          ParaCode = PARA_ALL_OFF;
        }
      }
    }
  }
  SetOutput();
}

//───────────────────────────────────
// Buzzer 1msec
//───────────────────────────────────
void buzz_1msec( void )
{
  static boolean sts = LOW;
  
  if( FlagBuzz )
  {
    sts = !sts;
    digitalWrite(PortBuzzOut, sts);
  }
  else
  {
    digitalWrite(PortBuzzOut, LOW);
  }
}

//───────────────────────────────────
// Here be interrupt function
//───────────────────────────────────
void interrupt_1msec( void )
{
  Elekey_Procs();
  buzz_1msec();
}

//───────────────────────────────────
// Setup
//───────────────────────────────────
void setup()
{
  MsTimer2::set(1, interrupt_1msec); // 1ms period
  MsTimer2::start();

  pinMode(PortLedOut, OUTPUT);
  pinMode(PortBuzzOut, OUTPUT);
  pinMode(PortKeyOut, OUTPUT);
  pinMode(PortPttOut, OUTPUT);

  pinMode(PortDashIn, INPUT_PULLUP);
  pinMode(PortDotIn, INPUT_PULLUP);
}

//───────────────────────────────────
// Main loop
//───────────────────────────────────
void loop()
{
}





世界的に普及している高機能なエレキーは下記サイトで公開されています。
 http://blog.radioartisan.com/arduino-cw-keyer/

回路図
Arduino でエレキー

このエレキー用に専用基板を作ってみました。
Arduino でエレキー
記事がまとまり次第公開予定です。





同じカテゴリー(マイコン開発)の記事
Fusion PCBでエレキー
Fusion PCBでエレキー(2020-04-01 19:00)


上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

削除
Arduino でエレキー
    コメント(0)