メニュー
▼ アクセス(地図)
▼ Windowsアプリ開発 ▼ マイコン開発 ▼ CGI・PHP制作 |
▼ サイトマップ(全投稿記事)
▼ タイトル(画像一覧) ▼ 事業内容 |
お問い合わせメールフォームが開きます。
2013年08月14日
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/
【回路】
【動作の様子】
【スケッチ】
//───────────────────────────────────
// 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/
回路図
このエレキー用に専用基板を作ってみました。
記事がまとまり次第公開予定です。