目次
前
次
エレキー処理スケッチ
モールス符号を打つ場合、短点(・)、長点(−)を
2つのパドルに分けてしまうエレキーを利用すること
があります。
パドルを2つにした場合、短点(・)、長点(−)の
長さを可変抵抗器の出力電圧で自由に変更できるよう
にするエレキーがあります。
可変抵抗器の出力電圧を取得するには、A/D変換器を
使います。
パドルがどちらの符号を出力するのかを、プッシュスイッチ
で指定できるようにしてみます。
実際の無線機に接続する接点処理まで含めた回路は、以下。
可変抵抗器、プッシュスイッチを実装すると
次の写真のようになります。
スケッチを作成するので、利用するポートのビット位置を
決めます。
- PORTC.5 (接続なし)
- PORTC.4 外部接点制御
- PORTC.3 (接続なし)
- PORTC.2 長点プッシュスイッチ
- PORTC.1 短点プッシュスイッチ
- PORTC.0 可変抵抗器
接続デバイスがわかれば、初期化処理は単純。
/* 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);
}
目次
前
次