2012年10月アーカイブ

 スイッチ・ボードは完成しましたか? mbed CWデコーダを和文に対応します。
 和文のモールス符号は細部が異なるタイプがいくつかあるようです。今回は下表のア~ン、記号、通信記号を用いています。数字は欧文符号と同じです。

文字 符号 1 2 4 8 26 32 64 128 合計 LCD 配列
--・-- 2 2 1 2 2 58 B1 mjj[58]=0xb1;
・- 1 2 5 B2 mjj[5]=0xb2;
・・- 1 1 2 11 B3 mjj[11]=0xb3
-・--- 2 1 2 2 2 60 B4 mjj[28]=0xb4
・-・・・ 1 2 1 1 1 33 B5 mjj[33]=0xb5
・-・・ 1 2 1 1 17 B6 mjj[17]=0xb6
-・-・・ 2 1 2 1 1 36 B7 mjj[36]=0xb7;
・・・- 1 1 1 2 23 B8 mjj[23]=0xb8
-・-- 2 1 2 2 28 B9 mjj[28]=0xb9
---- 2 2 2 2 30 BA mjj[30]=0xba
-・-・- 2 1 2 1 2 52 BB mjj[52]=0xbb;
--・-・ 2 2 1 2 1 42 BC mjj[42]=0xbc;
---・- 2 2 2 1 2 54 BD mjj[54]=0xbd;
・---・ 1 2 2 2 1 45 BE mjj[45]=0xbe;
---・ 2 2 2 1 22 BF mjj[22]=0xbf
-・ 2 1 4 C0 mjj[4]=0xc0
・・-・ 1 1 2 1 19 C1 mjj[19]=0xc1;
・--・ 1 2 2 1 21 C2 mjj[21]=0xc2
・-・-- 1 2 1 2 2 57 C3 mjj[57]=0xc3;
・・-・・ 1 1 2 1 1 35 C4 mjj[35]=0xc4;
・-・ 1 2 1 9 C5 mjj[9]=0xc5
-・-・ 2 1 2 1 20 C6 mjj[20]=0xc6;
・・・・ 1 1 1 1 15 C7 mjj[15]=0xc7;
--・- 2 2 1 2 26 C8 mjj[26]=0xc8
・・-- 1 1 2 2 27 C9 mjj[27]=0xc9
-・・・ 2 1 1 1 16 CA mjj[16]=0xca;
--・・- 2 2 1 1 2 50 CB mjj[50]=0xcb;
--・・ 2 2 1 1 18 CC mjj[18]=0xcc
1 1 CD mjj[1]=0xcd;
-・・ 2 1 1 8 CE mjj[8]=0xce;
-・・- 2 1 1 2 24 CF mjj[24]=0xcf
・・-・- 1 1 2 1 2 51 D0 mjj[51]=0xd0;
- 2 2 D1 mjj[2]=0xd1;
-・・・- 2 1 1 1 2 48 D2 mjj[48]=0xd2;
-・・-・ 2 1 1 2 1 40 D3 mjj[40]=0xd3;
・-- 1 2 2 13 D4 mjj[13]=0xd4
-・・-- 2 1 1 2 2 56 D5 mjj[56]=0xd5;
-- 2 2 6 D6 mjj[6]=0xd6;
・・・ 1 1 1 7 D7 mjj[7]=0xd7;
--・ 2 2 1 10 D8 mjj[10]=0xd8;
-・--・ 2 1 2 2 1 44 D9 mjj[44]=0xd9;
--- 2 2 2 14 DA mjj[14]=0xda
・-・- 1 2 1 2 25 DB mjj[25]=0xdb;
-・- 2 1 2 12 DC mjj[12]=0xdc;
・-・・- 1 2 1 1 2 49 B2 mjj[49]=0xb2;
・--・・ 1 2 2 1 1 37 B4 mjj[37]=0xb4;
・--- 1 2 2 2 29 A6 mjj[29]=0xa6;
・-・-・ 1 2 1 2 1 41 DD mjj[41]=0xdd;
- ・--・- 1 2 2 1 2 53 B0 mjj[53]=0xb0;
・・--・ 1 1 2 2 1 43 DF mjj[43]=0xdf;
・-・-・- 1 2 1 2 1 2 105 mjj[105]=','
濁点 ・・ 1 1 3 DE mjj[3]=0xde;
段落」 ・-・-・・ 1 2 1 2 1 1 73 mjj[73]=0xa3;
本文 -・・--- 2 1 1 2 2 2 120 ホレ
終了 ・・・-・ 1 1 1 2 1 39 ラタ
( -・--・- 2 1 2 2 1 2 108
) ・-・・-・ 1 2 1 1 2 1 81
 欧文モールス符号は解読できるようになりましたか? 続けて和文の解読ができるmbedプログラムを楽しみましょう。和文解読では解読モードや欧文・和文解読切り替えスイッチを増設すると操作が楽になります。そこで、三つのスイッチを搭載したスイッチ基板を製作します。

 CWデコーダ スイッチ基板のPCB基板パターンはこちらよりダウンロードできます。
  2ck0704_cw_switch.zip


39_AS000613.GIF 基板は手彫法により製作します。完成した基板に10kΩ抵抗とスイッチを搭載しました。スイッチは好みでスライド・スイッチ、トグル・スイッチなどを選んで取り付けてください。

 
20_P1050268.jpg 基板面よりピン・コネクタを取り付けて、ブレッドボードに挿すことができるようにします。

 
21_P1050270.jpg ブレッドボードに搭載し、mbedと接続しました。奥の3ピンはp6・p7・p8に挿し込みます。
スイッチの用途は左から、

   左:速度切替 H:HI、L:LOW
   中:解読モード A:自動、M:手動
   右:言語選択 A:欧文、カ:和文

 
22_P1050274.jpg スイッチ・ボードを搭載したmbed CWデコーダ・システムの全体です。前回完成したCW08を動かせば、HI、LOW切り替えスイッチの動作を確認することができます。

 
23_P1050261.jpg
長野県飯田工業高校 竹内浩一


========<コラム>=====================

手彫り法・・・プリント基板を自作する方法の一つです。カッターとアクリル・カッターでパターンを彫り込みます。腐食性が高いエッチング液などを用いないエコな手法です。

基板面よりピンコネクタを取り付け・・・黒いプラスティックのパーツを取り外して、ピンを基板に差し込んではんだ付けします。取り付け後、黒パーツを元通り組み立てます。

HI、LOW切り替えスイッチの動作を確認・・・残り二つのスイッチは今後の課題で確認します。



4.動作確認

 それではマイコン・カーを動かしてみましょう。
 まずマイコン・カーの電源を2個ともONにしてください。
 図12のようにLCDに Camera init[NG] と表示され、mbedに内蔵されている4個のLEDが点滅したら、一度カメラの電源の配線を抜き刺ししてカメラを初期化します。
 そのあともう一度mbedのリセット・ボタンを押して再起動してみてください。LCDに Camera init [OK] 続けて Camera Sync [OK] と表示されれば、マイコン・カー側の準備は完了です。

s図12_マイコンカー起動時のL.jpg
図12 マイコン・カー起動時のLCD表示


 モールス符号を使った通信には英数字・記号のほかに通信記号があります。BTやKNなどの連続送信記号です。今回は通信記号に対応しましょう。

mbedプログラミング
○通信記号の定義
 lcd_scprintf()関数が1文字表示ということもあり、通信記号は例外処理で対応します。KN・BTなどの通信記号を#defineで定義します。数値は以前に示したモールス符号表を参考にしてください。

#define KN 44
#define AS 33
#define CT 52
#define BT 48
#define AR 41
#define HH 255
#define VA 103

○通信記号の表示
 符号を受信し、計算します。BT・KNなどの通信記号とマッチした場合、[ ]をつけて、1文字ずつ、lcd_scprintf()関数で表示します。

       if(scount > tanten*2.0){      
          cw_sum=0;
          for(i=0;i<=7;i++){
              cw_sum=cw_sum+code[i]*int(pow(2.0,i));
          }
          if(cw_sum==BT){
            lcd_scprintf('[');lcd_scprintf('B');lcd_scprintf('T');lcd_scprintf(']');
          }
          else if(cw_sum==KN){
            lcd_scprintf('[');lcd_scprintf('K');lcd_scprintf('N');lcd_scprintf(']');
          }
          else if(cw_sum==AR){
            lcd_scprintf('[');lcd_scprintf('A');lcd_scprintf('R');lcd_scprintf(']');
          }
          else if(cw_sum==HH){
            lcd_scprintf('[');lcd_scprintf('H');lcd_scprintf('H');lcd_scprintf(']');
          }
          else if(cw_sum==AS){
            lcd_scprintf('[');lcd_scprintf('A');lcd_scprintf('S');lcd_scprintf(']');
          }
          else if(cw_sum==CT){
            lcd_scprintf('[');lcd_scprintf('C');lcd_scprintf('T');lcd_scprintf(']');
          }
          else if(cw_sum==VA){
            lcd_scprintf('[');lcd_scprintf('V');lcd_scprintf('A');lcd_scprintf(']');
          }
 
          else {
            lcd_scprintf(mj[cw_sum]);
          }
 ■■Publish
 下記URLでPublishしています。

  http://mbed.org/users/takeuchi/code/2ck0626_mbed-CW08/

■■mbedソース・リスト
// CW08
// BT AR taiou
#include "mbed.h"
#include "TextLCD0420.h"

#define ON 1
#define OFF 0
#define XON 0
#define XOFF 1
#define XHI 0
#define XLOW 1
#define HI 1
#define LOW 0
#define OUBUN 1
#define WABUN 0
#define KN 44
#define AS 33
#define CT 52
#define BT 48
#define AR 41
#define HH 255
#define VA 103

DigitalOut mled1(LED1);
DigitalOut mled2(LED2);
DigitalOut mled3(LED3);
DigitalOut mled4(LED4);
DigitalIn CW(p5);
DigitalIn SP_SELECT(p6);
DigitalIn GENGO_MODE(p7);
DigitalIn GENGO_SELECT(p8);

TextLCD lcd(p24, p25, p26, p27, p28, p29, p30,20,4); // rs, rw, e, d0, d1, d2, d3

int retu,gyou;
char g2[20],g3[20];
int init_flag=ON;
int min_ms,max_ms;

void lcd_scprintf(char pdata){
  int i;
 
  if(init_flag==ON){
    if(gyou==1){
      lcd.locate(retu,1);
      lcd.printf("%c",pdata);
      retu++;
      if(retu==20){
        gyou=2;
        retu=0;
      }
    }
    else if(gyou==2){
      lcd.locate(retu,2);
      lcd.printf("%c",pdata);
      g2[retu]=pdata;
      retu++;
      if(retu==20){
        retu=0;
        gyou=3;
      }
    }
    else if(gyou==3){
      lcd.locate(retu,3);
      lcd.printf("%c",pdata);
      g3[retu]=pdata;
      retu++;
      if(retu==20){
        retu=0;
        gyou=1;
        for(i=0;i<20;i++){
          lcd.locate(i,1);
          lcd.printf("%c",g2[i]);
        }
        for(i=0;i<20;i++){
          lcd.locate(i,2);
          lcd.printf("%c",g3[i]);
          g2[i]=g3[i];
        }
        lcd.locate(0,3);
        lcd.printf("                    ");       
        init_flag=OFF;
      }
    }
  }
  if(init_flag==OFF){
      gyou=3;
      lcd.locate(retu,3);
      lcd.printf("%c",pdata);
      g3[retu]=pdata;
      retu++;    
      if(retu==20){
        for(i=0;i<20;i++){
          lcd.locate(i,1);
          lcd.printf("%c",g2[i]);
          lcd.locate(i,2);
          lcd.printf("%c",g3[i]);
          g2[i]=g3[i];
        }
        lcd.locate(0,3);
        lcd.printf("                    ");
        retu=0;
      }
  }
}

void set_speed(){
  if(SP_SELECT==HI){
    min_ms=30;
    max_ms=90;
    lcd.locate(5,0);
    lcd.printf("H");
  }
  else if(SP_SELECT==LOW){
    min_ms=70;
    max_ms=210;
    lcd.locate(5,0);
    lcd.printf("L");
  }


int main() {     
 
  int i,j,k;
  int code[8];
  int scount;
  char mj[115];
  int cw_sum,tan_sum,tanten,cpm;
  int gengo,gengo_auto;
  char cw_class;
 
  for(i=0;i<115;i++){
    mj[i]=' ';
  }
  mj[5]='A';mj[16]='B';mj[20]='C';mj[8]='D';mj[1]='E';
  mj[19]='F';mj[10]='G';mj[15]='H';mj[3]='I';mj[29]='J';
  mj[12]='K';mj[17]='L';mj[6]='M';mj[4]='N';mj[14]='O';
  mj[21]='P';mj[26]='Q';mj[9]='R';mj[7]='S';mj[2]='T';
  mj[11]='U';mj[23]='V';mj[13]='W';mj[24]='X';mj[28]='Y';
  mj[18]='Z';
  mj[61]='1';mj[59]='2';mj[55]='3';mj[47]='4';mj[31]='5';
  mj[32]='6';mj[34]='7';mj[38]='8';mj[46]='9';mj[62]='0';
  mj[105]='.';mj[114]=',';mj[75]='?';mj[48]='=';mj[96]='-';
  mj[70]=':';mj[93]='\'';mj[44]='(';mj[108]=')';mj[40]='/';
  mj[85]='@';
  //mj[41]='+';
  
  lcd.cls();
  lcd.printf("*CW08 ");
 
  for(i=0;i<8;i++){
    code[i]=0;
  }

  i=0;
  tan_sum=0;
  set_speed();
 
  while( i<5 ){
    lcd.locate(7,0);
    lcd.printf("%2d",5-i);
    scount=0;
    while(CW==XLOW){
    }
    mled1=ON;
    while(CW==XHI){
      scount++;
      wait_ms(1);
    }
    mled1=OFF;
    if(min_ms < scount && scount < max_ms){
      tan_sum=tan_sum+scount;
      i++;
    }
   
  }//while i 
 
  tanten=tan_sum/5;   
 
  j=0;
  tan_sum=0;
  k=0;
  gyou=1,retu=0;
  while(1){
        set_speed();
        while(CW==XLOW){
        }      
        scount=0; 
        mled1=ON;
        while(CW==XHI){
          wait_ms(1);
          scount++;
        }
        mled1=OFF;
       
        if(min_ms < scount && scount < max_ms){
          //lcd.printf(".");
          code[k]=1;
          k++;
          tan_sum=tan_sum+scount;
          j++;
        }

        else if ( scount > tanten*2.0){
          //lcd.printf("_");
          code[k]=2;
          k++;
          tan_sum=tan_sum+scount/3;
          j++;
        }
       
        lcd.locate(7,0);
        lcd.printf("%2d",k);
                
        scount=0;
        while(CW==XLOW){
          wait_ms(1);
          scount++;
          if(scount > tanten*10){
            break;
          }
        }
       
        if(k>8){
          k=0;
          lcd_scprintf('*');
          for(i=0;i<=7;i++){
            code[i]=0;
          }
        }
       
        if(scount > tanten*2.0){     
          cw_sum=0;
          for(i=0;i<=7;i++){
              cw_sum=cw_sum+code[i]*int(pow(2.0,i));
          }
          if(cw_sum==BT){
            lcd_scprintf('[');lcd_scprintf('B');lcd_scprintf('T');lcd_scprintf(']');
          }
          else if(cw_sum==KN){
            lcd_scprintf('[');lcd_scprintf('K');lcd_scprintf('N');lcd_scprintf(']');
          }
          else if(cw_sum==AR){
            lcd_scprintf('[');lcd_scprintf('A');lcd_scprintf('R');lcd_scprintf(']');
          }
          else if(cw_sum==HH){
            lcd_scprintf('[');lcd_scprintf('H');lcd_scprintf('H');lcd_scprintf(']');
          }
          else if(cw_sum==AS){
            lcd_scprintf('[');lcd_scprintf('A');lcd_scprintf('S');lcd_scprintf(']');
          }
          else if(cw_sum==CT){
            lcd_scprintf('[');lcd_scprintf('C');lcd_scprintf('T');lcd_scprintf(']');
          }
          else if(cw_sum==VA){
            lcd_scprintf('[');lcd_scprintf('V');lcd_scprintf('A');lcd_scprintf(']');
          }
 
          else {
            lcd_scprintf(mj[cw_sum]);
          }
          k=0;
          for(i=0;i<=7;i++){
            code[i]=0;
          }
        }//if
       
        if(scount > tanten*7){
          lcd_scprintf(' ');
        }
       
        if(j==10){
          tanten=tan_sum/10;
          cpm=60000/(tanten*57)*5;
          tan_sum=0;
          j=0;
          if(cpm > 100){
            cw_class='P';
          }
          else if(cpm > 90){
            cw_class='S';
          }
          else if(cpm > 65){
            cw_class='1';
          }
          else if(cpm > 40){
            cw_class='2';
          }
          else if(cpm > 30){
            cw_class='3';
          }
          lcd.locate(10,0);
          lcd.printf("%3dc(%c)",cpm,cw_class);
          //lcd.printf("%3dc,%3dm",cpm,tanten);
        }
  }//while 1
}//main


完成!
 CWTW-Proより送信します。通信記号は[BT]のように[ ]で括ります。
 
19_1_AS000604.GIF CWTW-Proより送信した通信記号がきちんと表示されれば成功です。
 
16_P1050257.jpg 次回より和文解読に挑戦します。

長野県飯田工業高校 竹内浩一


========<コラム>=====================

連続送信記号・・・略号とも呼ばれます。単語の上にアップバーをつけて表現します。
実際の交信で出現頻度が高いのは、BT・VAなどのようです。

 

2.マイコン・カー制御回路の製作

 次にマイコン・カーを制御するための回路を製作します。以前マイコン・カーを赤外線リモコンで制御する際に製作した記事(http://www.eleki-jack.com/arm/2012/06/12.html)をベースにマイコン・カーを制御する回路を製作します。
 今回製作する回路は以前製作したマイコン・カー制御回路に、シリアル・カメラ、XBee,そしてこれらの動作に必要な 3.3[V]電源を加えたものです。図8が回路図そして図9が実体配線図です。

s図8_マイコンカー制御回路図.jpg
図8 マイコン・カー制御回路図


s図9_マイコンカー制御配線図.jpg
図9 マイコン・カー制御配線図

PARIS方式
 モールス符号は短点・長点・空白の組み合わせで文字を送受信する方式です。符号の数と長さが文字によって違うために送受信文字数だけでは単純に通信速度を計算することができません。そこで、よく用いられるのが”PARIS方式”です。
 PARISをモールス符号にすると、・--・ ・- ・-・ ・・ ・・・ となります。短点を1、長点を短点×3として数えると50短点です。この方式では50短点を5文字を1単語として計算します。
 1分間に45文字の送受信する場合、45/5=9単語です。単語と単語の間には7短点分のスペースが入るので、1単語送るのに50+7=57短点必要です。9単語分では57×9=513短点です。1分間に513短点送るに短点長は60/513=117msになります。したがって、短点長117msで送受信すれば1分間で45文字送受信していることになります。単語と単語間の7短点分スペースを考慮しなければ、下記式の57=>50になるので、見かけの送信文字数は45文字=>50文字と少し多くなります。

・短点長は1分間の送受信文字数から次の式で計算できます。
  60/(文字数/5*57)=短点長
  45文字の場合、
  60/(45/5*57)=117ms

・1分間の送受信文字数を短点長から求めるには次の式を使います。
  1分間の送受信文字数=60/(短点長×10^-3*57)*5 
  上記で説明した計算は、短点長が117msであれば、次のようになります。
  60/(117×10^-3*57)×5=45文字

 短点長を計測すれば、PARIS法による通信速度の目安を表示することができます。以前はアマチュア無線の試験時に送受信試験があり、1~3級(もっと前は1・2級、電信級)の級別に通信速度が決まっていました。この値を参考にして、下表のように短点長によるレベルを筆者が決めました。
      レベル文字/分単語/分短点/分短点長(ms)旧ランク
          25 5 285 211 3アマ
      3 30  6 342 175
      2 45 9 513 117 2アマ
      1 60 12 684 88 1アマ
      S 90 18 1026 58
      P 100 20 1140 53

mbedプログラミング
 短点・長点を10個受信する毎に短点長に換算した平均値を求めて、1分間の文字数に換算し、レベルを表示します。
 
      if(j==10){
          tanten=tan_sum/10;
          cpm=60000/(tanten*57)*5;//短点長より1分間の文字数を算出
          tan_sum=0;
          j=0;
          if(cpm > 100){//レベル表示
            cw_class='P';
          }
          else if(cpm > 90){
            cw_class='S';
          }
          else if(cpm > 65){
            cw_class='1';
          }
          else if(cpm > 40){
            cw_class='2';
          }
          else if(cpm > 30){
            cw_class='3';
          }
          lcd.locate(10,0);
          lcd.printf("%3dc(%c)",cpm,cw_class);
          //lcd.printf("%3dc,%3dm",cpm,tanten);
        }
 最初に符号を受信すると、送信速度はわかりませんが、耳で聞いてHI、LOW位の区別はできると思います。
 そこで、HI、LOWを手動で決定し、短点長を仮決定します。この長さから、起動時に5符号を受信し、平均を求めて初期速度とします。完全自動でスピードを決めるのはなかなか難しいのですが、このような半自動であれば、比較的簡単に実現することができます。また、初期速度も比較的早く決めることができ、システム・スタートを迅速にすることができます。

mbedプログラミング
○最初に短点と定義した符号を五つ受信し、短点長の平均を求め、短点長さの初期値とします。初期値を求めている間、進行状態を0行目7桁目に0~5で表示します。0になるとシステム・スタートです。
この方法は、遅い通信速度では符号五つの受信にもそれなりに時間がかかります。仮に短点長が210msであれば、3短点2長点の5符号の場合、
  210×3+210×3×2=1890ms=2秒弱
かかることになります。

 while( i<5 ){
    lcd.locate(7,0);
    lcd.printf("%2d",5-i);
    scount=0;
    while(CW==XLOW){
    }
    mled1=ON;
    while(CW==XHI){
      scount++;
      wait_ms(1);
    }
    mled1=OFF;
    if(min_ms < scount && scount < max_ms){
      tan_sum=tan_sum+scount;
      i++;
    }

■■Publish
 下記URLでPublishしています。

  http://mbed.org/users/takeuchi/code/2ck0625_mbed-CW05/

 それでは、XBeeの設定が完了しましたので、いよいよマイコン・カーにシリアル・カメラとXBeeを載せたいと思います。

(2) マイコン・カーにシリアル・カメラを取り付ける

1.カメラ取付用の加工

 まず最初にカメラをマイコン・カーに搭載するために少しだけ工作をします。
 図1はマイコン・カーにカメラを取り付けるための部品例です。カメラのネジ穴はM1.4の精密ネジが使えましたので、適当に持ち合わせの部品を使って取り付けてください。手持ちがない場合は、図2のような精密ネジがホームセンタで販売されています。Bセットはさまざま長さのM1.4のネジがセットになっており、DセットはM1.2からM2.6までの精密用ナットがセットになっています。
 部品リストにあるタミヤ製のユニバーサルアームセットは、このセットに含まれるパーツの中のL型アームしか使用していません。もし、適当なL型ジョイント金具があればそちらをご利用ください。

s図1_部品リスト例.jpg
図1 部品リスト例


s図2_カメラ留め精密ネジ.jpg
図2 カメラ留め精密ネジ


 ・-を文字単位で表示することができましたか? この課題では符号を欧文に解読します。
 モールス符号にはアルファベット26文字、数字10文字、記号、BT・ARなどの通信記号があります。これらをここでは”欧文”と呼ぶことにします。モールス符号は英字に1~4符号、数字に5符号、記号・通信記号に6符号が使われます。HH=・・・・・・・・のみ例外で、8符号使います。

 受信符号用配列code[0~5]を用意します。受信したのが”・”であれば1、”-”であれば2を順番に配列に格納します。短点×2以上のスペースを受信すると1文字分の符号を受信したと判断し、1・2・4・8・16・32の重みをつけて、合計を出します。この合計と等しい添え字の配列を解読文字として表示します。
 KN~DOまでの通信記号は今回は対応しません。

1 2 4 8 16 32 64 128 合計
A ・- 1 2 5
B -・・・ 2 1 1 1 16
C -・-・ 2 1 2 1 20
D -・・ 2 1 1 8
E 1 1
F ・・-・ 1 1 2 1 19
G --・ 2 2 1 10
H ・・・・ 1 1 1 1 15
I ・・ 1 1 3
J ・--- 1 2 2 2 29
K -・- 2 1 2 12
L ・-・・ 1 2 1 1 17
M -- 2 2 6
N -・ 2 1 4
O --- 2 2 2 14
P ・--・ 1 2 2 1 21
Q --・- 2 2 1 2 26
R ・-・ 1 2 1 9
S ・・・ 1 1 1 7
T - 2 2
U ・・- 1 1 2 11
V ・・・- 1 1 1 2 23
W ・-- 1 2 2 13
X -・・- 2 1 1 2 24
Y -・-- 2 1 2 2 28
Z --・・ 2 2 1 1 18
1 ・--- 1 2 2 2 2 61
2 ・・--- 1 1 2 2 2 59
3 ・・・-- 1 1 1 2 2 55
4 ・・・・- 1 1 1 1 2 47
5 ・・・・・ 1 1 1 1 1 31
6 -・・・・ 2 1 1 1 1 32
7 --・・・ 2 2 1 1 1 34
8 ---・・ 2 2 2 1 1 38
9 ----・ 2 2 2 2 1 46
0 ----- 2 2 2 2 2 62
・-・-・- 1 2 1 2 1 2 105
--・・-- 2 2 1 1 2 2 114
・・--・・ 1 1 2 2 1 1 75
- -・・・・- 2 1 1 1 1 2 96
---・・・ 2 2 2 1 1 1 70
・----・ 1 2 2 2 2 1 93
/ -・・-・ 2 1 1 2 1 40
@ ・--・-・ 1 2 2 1 2 1 85
( -・--・ 2 1 2 2 1 44
) -・--・- 2 1 2 2 1 2 108
+ ・-・-・ 1 2 1 2 1 41
KN -・--・ 2 1 2 2 1 44
AS ・-・・・ 1 2 1 1 1 33
CT -・-・- 2 1 2 1 2 52
BT -・・・- 2 1 1 1 2 48
AR ・-・-・ 1 2 1 2 1 41
HH ・・・・・・・・ 1 1 1 1 1 1 1 1 255
VA ・・・-・- 1 1 1 2 1 2 103
DO -・・--- 2 1 1 2 2 2 120
 
mbedプログラミング
○用意したすべての配列に文字が格納されるわけではないので、最初に’ ’(スペース)を入れて初期化します。

  char mj[115]; for(i=0;i<115;i++){
    mj[i]=' ';
  }

○配列mj[ ]に次のように文字列を格納します。添え字は重み合計を示します。
  mj[5]='A';mj[16]='B';mj[20]='C';mj[8]='D';mj[1]='E';
  mj[19]='F';mj[10]='G';mj[15]='H';mj[3]='I';mj[29]='J';
  mj[12]='K';mj[17]='L';mj[6]='M';mj[4]='N';mj[14]='O';
  mj[21]='P';mj[26]='Q';mj[9]='R';mj[7]='S';mj[2]='T';
  mj[11]='U';mj[23]='V';mj[13]='W';mj[24]='X';mj[28]='Y';
  mj[18]='Z';
  mj[61]='1';mj[59]='2';mj[55]='3';mj[47]='4';mj[31]='5';
  mj[32]='6';mj[34]='7';mj[38]='8';mj[46]='9';mj[62]='0';
  mj[105]='.';mj[114]=',';mj[75]='?';mj[48]='=';mj[96]='-';
  mj[70]=':';mj[93]='\'';mj[44]='(';mj[108]=')';mj[41]='+';
  mj[81]='"';

    ○受信した・-が、
・ ならばcode[k]に1を入れます。
- ならばcode[k]に2を入れます。

        if(min_ms < scount && scount < max_ms){
          //lcd.printf(".");
          code[k]=1;
          k++;
          tan_sum=tan_sum+scount;
          j++;
        }

        else if ( scount > tanten*2.0){
          //lcd.printf("_");
          code[k]=2;
          k++;
          tan_sum=tan_sum+scount/3;
          j++;
        }

  ○kの変化幅は0~5です。6以上は誤受信なので、*を表示します。
       if(k>=6){
          k=0;
          lcd.printf("*");
          for(i=0;i<6;i++){
            code[i]=0;
          }
        }
 ・- の判別はできるようになりましたか? 符号の区切れを文字単位で判別しましょう。

短点長さの平均
 モールス符号では文字と文字の間は短点と同じ長さのスペースです。通信ごとに短点の長さは変化します。そこで、

  短点の長さ、長点の長さ/3

を10個ずつ平均し、新たな短点の長さとします。こうすることで通信速度が変化しても自動追従します。
        
        if(min_ms < scount && scount < max_ms){
          lcd.printf(".");
          tan_sum=tan_sum+scount;
          j++;
        }
        else if ( scount > tanten*2.0){
          lcd.printf("_");
          tan_sum=tan_sum+scount/3;
          j++;
        }       if(j==10){
          tanten=tan_sum/10;
          lcd.printf(" %3d ",tanten);
          tan_sum=0;
          j=0;

  ○文字間スペース符号間のスペースが短点の長さ×2倍より大きければ、文字間スペースとみなします。

        if(scount > tanten*2){
          lcd.printf(" ");
        }





カテゴリ


Copyright (C) 2006-2015 CQ Publishing Co.,Ltd. All Rights Reserved.