目次

電鍵トレーナ

 電鍵は、モールス符号を打ち出すときに利用されます。
 「.」「-」の組み合わせで、符号を構成するので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);
}


目次

inserted by FC2 system