目次
前
次
電鍵トレーナ
電鍵は、モールス符号を打ち出すときに利用されます。
「.」「-」の組み合わせで、符号を構成するので2個の
スイッチを利用したパドルタイプを指2本で操作する
ことが多いです。
マイクロスイッチを2個使って、指2本で「.」「-」を
打ち出せる電鍵トレーナを構成してみたいと思います。
IchigoLatteの入力を2つ使い、「.」「-」を出力して
みます。同時に、音とLEDの光で、どちらの符号を出力
しているのかを目と耳で確認できるようにします。
音を出すには、IchigoLatte互換基板の圧電スピーカを
使います。
音を出すための関数beepを利用すれば、周波数と長さを
指定できるの、周波数は同じにして「.」「-」の時間長
を変えて対応。
モールス符号では、「-」の時間長は、「.」の3倍と
規定されているので、関数でまとめると、以下。
function put_cw(x)
{
var xlen = 500 ;
// judge
if ( x == 1 ) { xlen = xlen * 3 ; }
// sound
beep(880,xlen);
}
LEDの光で符号の長さを判断できるようにしたいので
音の出力の前と後に関数ledによる点灯、消灯を配置。
function put_cw(x)
{
var xlen = 500 ;
// judge
if ( x == 1 ) { xlen = xlen * 3 ; }
// turn on LED
led(1);
// sound
beep(880,xlen);
// turn off LED
led(0);
}
出力は、正論理として、OUT_1から論理値の'1'を印加します。
OUT_1からOUT_6を出力に設定し、論理値を印加する関数は
次のように定義して使います。
function gpout_set()
{
var ddra = 0x50018000;
// set lower 6 bits as OUTPUT
mem(ddra,mem(ddra) | 0x3f);
}
function gpout(x,v)
{
var xadr = 0x50010000;
var xdat ;
// generate logical value
xdat = 0xfff ;
if ( v == 0 ) { xdat = xdat & v ; }
// calculate address
bl = (1 << (x-1)) << 2;
if ( x == 5 ) { bl = (1 << 11); }
if ( x == 6 ) { bl = (1 << 10); }
xadr = xadr + bl ;
// set logical value
mem(xadr,xdat);
}
音の出力と同時に、論理値を印加するコードを追加します。
function put_cw(x)
{
var xlen = 500 ;
// judge
if ( x == 1 ) { xlen = xlen * 3 ; }
// turn on LED
led(1);
// send '1'
gpout(1,1);
// sound
beep(880,xlen);
// send '0'
gpout(1,0);
// turn off LED
led(0);
}
2つのプッシュボタンを利用して、「.」「-」のどちらを
指定されたのかをチェックします。
IN_1、IN_2からの入力は、関数gpinを使えば簡単。
var l ;
var s ;
l = gpin(1);
s = gpin(2);
スイッチには、チャタリングがついているので
シフトレジスタを使って、チャタリングを除去
します。
function get_sw()
{
var l ;
var s ;
var result = 0 ;
// previous
l = gpin(1);
s = gpin(2);
// delay
sleep(50);
// shift
l = l << 1 ;
s = s << 1 ;
// mask
l = l & 3 ;
s = s & 3 ;
// add
l = l | gpin(1);
s = s | gpin(2);
// judge
if ( l == 1 ) { result = 1 ; }
if ( s == 1 ) { result = 2 ; }
return result ;
}
プッシュスイッチが押されていないと0、左スイッチで1
右スイッチで2が返値されるので、その値で関数put_cwを
呼び出せばできあがり。
var c ;
while (1) {
// get switch state
c = get_sw();
// dot
if ( c == 1 ) { put_cw(0); }
// dash
if ( c == 2 ) { put_cw(1); }
// delay
sleep(1000);
}
まとめます。
function gpout_set()
{
var ddra = 0x50018000;
// set lower 6 bits as OUTPUT
mem(ddra,mem(ddra) | 0x3f);
}
function gpout(x,v)
{
var xadr = 0x50010000;
var xdat ;
// generate logical value
xdat = 0xfff ;
if ( v == 0 ) { xdat = xdat & v ; }
// calculate address
bl = (1 << (x-1)) << 2;
if ( x == 5 ) { bl = (1 << 11); }
if ( x == 6 ) { bl = (1 << 10); }
xadr = xadr + bl ;
// set logical value
mem(xadr,xdat);
}
function put_cw(x)
{
var xlen = 500 ;
// judge
if ( x == 1 ) { xlen = xlen * 3 ; }
// turn on LED
led(1);
// send '1'
gpout(1,1);
// sound
beep(880,xlen);
// send '0'
gpout(1,0);
// turn off LED
led(0);
}
function get_sw()
{
var l ;
var s ;
var result = 0 ;
// previous
l = gpin(1);
s = gpin(2);
// delay
sleep(50);
// shift
l = l << 1 ;
s = s << 1 ;
// mask
l = l & 3 ;
s = s & 3 ;
// add
l = l | gpin(1);
s = s | gpin(2);
// judge
if ( l == 1 ) { result = 1 ; }
if ( s == 1 ) { result = 2 ; }
return result ;
}
var c ;
gpout_set();
gpout(1,0);
while (1) {
// get switch state
c = get_sw();
// dot
if ( c == 1 ) { put_cw(0); }
// dash
if ( c == 2 ) { put_cw(1); }
// delay
sleep(1000);
}
目次
前
次