2012年12月 4日

はてなブックマークに追加   <114>mbed CWデコーダ ~和文欧文解読 その6~

mbedプログラミング
○[ホレ]や(による切り替えだけではうまく和文に切り替わらない場合があります。そこで、アエオキコロなどの欧文符号と重ならない和文符号を受信した場合、強制的に和文に切り替える機能を追加します。他に符号を追加することができます。

         if(GENGO_MODE==AUTO && (cw_sum==HORE || cw_sum==58 ||cw_sum==28 || cw_sum==33 || cw_sum==36
                                      || cw_sum==30 ||cw_sum==25) ){// hore a e o ki ko ro
            lcd_scprintf('[');lcd_scprintf(0xce);lcd_scprintf( 0xda);lcd_scprintf(']');//ho re
            if(c1=='C' && c2=='Q'){// CQ hore oubun keep
              //
            }

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

  http://mbed.org/users/takeuchi/code/2ck0706_mbed-CWd_Ver1/

■■mbedソース・リスト
// CW13 = CWd Ver1.0
// BT AR taiou
// Wabun
// SW tuika
// hore taiou
// wabun (OUBUN) wabun
// CQ hore 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
#define OUBUN 1
#define WABUN 0
#define AUTO 1
#define MANUAL 0
#define KN 44
#define AS 33
#define CT 52
#define BT 48
#define AR 41
#define HH 255
#define VA 103
#define HORE 120
#define RATA 39

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;
int gengo,wabun_temp;

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{
    min_ms=70;
    max_ms=210;
    lcd.locate(5,0);
    lcd.printf("L");
  }
}

void lcd_manual(){
  lcd.locate(6,0);
  lcd.printf("M");
}

void lcd_auto(){
  lcd.locate(6,0);
  lcd.printf("A");
}  

void lcd_alpha(){
  lcd.locate(7,0);
  lcd.printf("A");
}
void lcd_kana(){
  lcd.locate(7,0);
  lcd.printf("%c",0xb6);                
}

void set_gengo(){
  if(GENGO_MODE==MANUAL){// Gengo Manual mode
    lcd_manual();
    if(GENGO_SELECT==OUBUN){// manual wabun
      gengo=OUBUN;
    }
    else if(GENGO_SELECT==WABUN){// manual oubun
      gengo=WABUN;
      wabun_temp=WABUN;
    }
  }
  else if(GENGO_MODE==AUTO){// Gengo Auto mode
    lcd_auto();
  }
}     
     
int main() {     
 
  int i,j,k;
  int code[8];
  int scount;
  char mj[115],mjj[121],c1,c2;
  int cw_sum,tan_sum,tanten,cpm;
  char cw_class;
 
  // Alphabet
  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]='+';
 
  // Kanamoji
  for(i=0;i<121;i++){
    mjj[i]=' ';
  }
  mjj[58]=0xb1;mjj[5]=0xb2;mjj[11]=0xb3;mjj[60]=0xb4;mjj[33]=0xb5;//a
  mjj[17]=0xb6;mjj[36]=0xb7;mjj[23]=0xb8;mjj[28]=0xb9;mjj[30]=0xba;//ka
  mjj[52]=0xbb;mjj[42]=0xbc;mjj[54]=0xbd;mjj[45]=0xbe;mjj[22]=0xbf;//sa
  mjj[4]=0xc0;mjj[19]=0xc1;mjj[21]=0xc2;mjj[57]=0xc3;mjj[35]=0xc4;//ta
  mjj[9]=0xc5;mjj[20]=0xc6;mjj[15]=0xc7;mjj[26]=0xc8;mjj[27]=0xc9;//na
  mjj[16]=0xca;mjj[50]=0xcb;mjj[18]=0xcc;mjj[1]=0xcd;mjj[8]=0xce;//ha
  mjj[24]=0xcf;mjj[51]=0xd0;mjj[2]=0xd1;mjj[48]=0xd2;mjj[40]=0xd3;//ma
  mjj[13]=0xd4;mjj[56]=0xd5;mjj[6]=0xd6;//ya
  mjj[7]=0xd7;mjj[10]=0xd8;mjj[44]=0xd9;mjj[14]=0xda;mjj[25]=0xdb;//ra
  mjj[12]=0xdc;mjj[49]=0xb2;mjj[37]=0xb4;mjj[29]=0xa6;mjj[41]=0xdd;//wa
  mjj[53]=0xb0;mjj[43]=0xdf;mjj[105]=',';
  mjj[3]=0xde;mjj[73]=0xa3;
  mjj[108]='(';mjj[81]=')';
  mjj[61]='1';mjj[59]='2';mjj[55]='3';mjj[47]='4';mjj[31]='5';
  mjj[32]='6';mjj[34]='7';mjj[38]='8';mjj[46]='9';mjj[62]='0';
  
  lcd.cls();
  lcd.printf("*CWd  ");
 
  for(i=0;i<8;i++){
    code[i]=0;
  }

  i=0;
  tan_sum=0;
  set_speed();
  c1=' ',c2=' ';
 
  set_gengo();
 
  while( i<5 ){// System initialize
    lcd.locate(8,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;
  k=0;
  tan_sum=0;
  gyou=1,retu=0;
  gengo=OUBUN;
  wabun_temp=OUBUN;
  while(1){
        set_speed();// speed Hi/LO
        set_gengo();
        while(CW==XLOW){// signal Low wait
        }      
       
        scount=0; 
        mled1=ON;
        while(CW==XHI){// ._ count
          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(8,0);// moji kousei status
        lcd.printf("%2d",k);
                
        scount=0;
        while(CW==XLOW){
          wait_ms(1);
          scount++;
          if(scount > tanten*10){
            break;
          }
        }
       
        if(k>8){// moji kousei over flow
          k=0;
          lcd_scprintf('*');
          for(i=0;i<=7;i++){
            code[i]=0;
          }
        }

        if(gengo==OUBUN &&  scount > tanten*2.0){// Oubun shori
          lcd_alpha();
          cw_sum=0;
          for(i=0;i<=7;i++){
              cw_sum=cw_sum+code[i]*int(pow(2.0,i));
          }         
         
          if(GENGO_MODE==AUTO && (cw_sum==HORE || cw_sum==58 ||cw_sum==28 || cw_sum==33 || cw_sum==36
                                      || cw_sum==30 ||cw_sum==25) ){// hore a e o ki ko ro
            lcd_scprintf('[');lcd_scprintf(0xce);lcd_scprintf( 0xda);lcd_scprintf(']');//ho re
            if(c1=='C' && c2=='Q'){// CQ hore oubun keep
              //
            }
            else{
              gengo=WABUN;
              wabun_temp=WABUN;
              cw_sum=0;
            }
          }// if gengo auto
          else 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 if(cw_sum > 115){
            lcd_scprintf('*');
            cw_sum=0;
          }
          else {
            lcd_scprintf(mj[cw_sum]);
            c1=c2;// CQ hore taiou
            c2=mj[cw_sum];
          }
          k=0;
          for(i=0;i<=7;i++){
            code[i]=0;
          }
        }//if oubun       
       
       if(gengo==WABUN && scount > tanten*2.0){// Wabun shori
          lcd_kana();
          cw_sum=0;
          for(i=0;i<=7;i++){
              cw_sum=cw_sum+code[i]*int(pow(2.0,i));
          }

          if(GENGO_MODE==AUTO && cw_sum==RATA){// ra ta
            lcd_scprintf('[');lcd_scprintf(0xd7);lcd_scprintf(0xc0);lcd_scprintf(']');//ra ta
            gengo=OUBUN;
            wabun_temp=OUBUN;
          }  
          if(cw_sum==81){// )
            wabun_temp=WABUN;
            lcd_kana();
           }
          else if(cw_sum > 121){
            cw_sum=0;
            lcd_scprintf(' ');
          }
         
          if(wabun_temp==WABUN){  
            lcd_scprintf(mjj[cw_sum]);
            c1=c2;//CQ hore taiou
            c2=mjj[cw_sum];
          }
          else if(wabun_temp==OUBUN){
            lcd_scprintf(mj[cw_sum]);
            c1=c2;//CQ hore taiou
            c2=mj[cw_sum];
          }
         
          if(cw_sum==108){// (
            wabun_temp=OUBUN;
            lcd_alpha();
          }

          k=0;
          for(i=0;i<=7;i++){
            code[i]=0;
          }
        }//if wabun
       
        if(scount > tanten*7){// tango kan space
          lcd_scprintf(' ');
        }
       
        if(j==10){// ._ nagasa heikin keisan
          tanten=tan_sum/10;
          cpm=60000/(tanten*57)*5;
          tan_sum=0;
          j=0;
          if(cpm > 100){// Professional
            cw_class='P';
          }
          else if(cpm > 90){ // Special
            cw_class='S';
          }
          else if(cpm > 65){// 1ama
            cw_class='1';
          }
          else if(cpm > 40){// 2ama
            cw_class='2';
          }
          else if(cpm > 30){//3 ama
            cw_class='3';
          }
          lcd.locate(11,0);
          lcd.printf("%3dc(%c)",cpm,cw_class);// cw class hantei
          //lcd.printf("%3dc,%3dm",cpm,tanten);
        }
  }//while 1
}//main


完成!
 以上でmbed CWデコーダは CWd Ver1.0として完成します。
 
36_P1050309.jpg CW通信を楽しむための補助アイテムとして活用していただければ幸いです。
 
37_P1050310.jpg解読の様子
 FT-817に接続して、7MHz CWを解読しましました。通信内容の秘密の保持義務があるので、一部のみ掲載します。
 
40_P1050317.jpg CWQSO CUAGN=SeeYouAgain、73、などが解読されています。
 
41_P1050327.jpg R599、JCC1106、QSLなどが解読されています。
 
42_P1050329.jpg コールサイン、JCCナンバ、[AR]などが解読されています。
 
43_P1050330.jpg 和文通信の解読例です。
 
44_P1050332.jpg
長野県飯田工業高校 竹内浩一


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

アエオキコロ・・・他にも、タチツナニヌネハフヘホマムメモヤヨラリルレワヲンなどがあります。

CWd・・・ここまで改良を続けたmbed CWデコーダはCW13をもって、CWd
Ver1.0として、ひとまず完成とします。欲しい機能の追加にぜひ挑戦してください。


 

2012年11月26日

はてなブックマークに追加   <113>mbed CWデコーダ ~和文欧文解読 その5~

  [ホレ]は欧文=>和文切り替え通信記号ですが、CQ CQ [ホレ] JR0PSTのようにCQ の直後の[ホレ]は”和文でQSOをしましょう”の意味を持っています。そこで、直前受信文字列がCQの場合のみ、[ホレ]を受信しても和文に切り替えない機能を搭載しましょう。

○欧文受信時に受信中の文字をc2に、一つ前の文字をc1に格納します。

          else {
            lcd_scprintf(mj[cw_sum]);
            c1=c2;
            c2=mj[cw_sum];
          }

○自動受信中に”ホレ”を受信した場合、c1=’C’、c2=’Q’でない場合のみ、和文に切り替えます。

          if(GENGO_MODE==AUTO && cw_sum==HORE ){// hore
            lcd_scprintf('[');lcd_scprintf(0xce);lcd_scprintf( 0xda);lcd_scprintf(']');//ho re
            if(c1=='C' && c2=='Q'){
              //
            }
            else{
              gengo=WABUN;
              wabun_temp=WABUN;
              cw_sum=0;
            }
          }

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

  http://mbed.org/users/takeuchi/code/2ck0705_mbed-CW12/

more- "<113>mbed CWデコーダ ~和文欧文解読 その5~" »

2012年11月16日

はてなブックマークに追加   <112>mbed CWデコーダ ~和文欧文解読 その4~

mbedプログラミング

 和文受信中に”(”を受信後、欧文に、”)”を受信後、和文に切り替えることに対応します。

        if(cw_sum==81){// ) 欧文=>和文切り替え
            wabun_temp=WABUN;
            lcd_kana();
           }
          else if(cw_sum > 121){
            cw_sum=0;
            lcd_scprintf(' ');
          }
          
          if(wabun_temp==WABUN){  
            lcd_scprintf(mjj[cw_sum]);//和文解読
            c1=c2;
            c2=mjj[cw_sum];
          }
          else if(wabun_temp==OUBUN){
            lcd_scprintf(mj[cw_sum]);//欧文解読
            c1=c2;
            c2=mj[cw_sum];
          }
         
          if(cw_sum==108){// ( 和文=>欧文切り替え
            wabun_temp=OUBUN;
            lcd_alpha();
          }

■■Publish

 下記のURLにてPublishしています。

  http://mbed.org/users/takeuchi/code/2ck0705_mbed-CW11/

more- "<112>mbed CWデコーダ ~和文欧文解読 その4~" »

2012年11月13日

はてなブックマークに追加   <111>mbed CWデコーダ ~和文欧文解読 その3~

 モールス符号を使ったCW通信には欧文と和文を切り替える約束がいくつかあります。その一つが欧文交信中に”ホレ”を送信して和文に、和文送信中に”ラタ”を送信して欧文に切り替える方法です。
今回は和文と欧文を自動で切り替える自動モードとスイッチで切り替える手動モードを搭載し、自動モード時には”ホレ・ラタ”による自動切り替えを装備します。

mbedプログラミング
○GENGO_MODEには自動手動モード切り替えトグル・スイッチが接続されています。このスイッチの状態を読み取り、自動手動にモードを設定します。

       if(GENGO_MODE==MANUAL){// Manual mode
          lcd_manual();//6桁目:M表示(Manual)
          if(GENGO_SELECT==OUBUN){
            gengo=OUBUN;
          }
          else if(GENGO_SELECT==WABUN){
            gengo=WABUN;
            wabun_temp=WABUN;
            
          }
        }
        else if(GENGO_MODE==AUTO){// Auto mode
            lcd_auto();//6桁目:A表示(Auto)
        }

more- "<111>mbed CWデコーダ ~和文欧文解読 その3~" »

2012年10月31日

はてなブックマークに追加   <110>mbed CWデコーダ ~和文欧文解読 その2~

 スイッチ・ボードは完成しましたか? 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

more- "<110>mbed CWデコーダ ~和文欧文解読 その2~" »

2012年10月22日

はてなブックマークに追加   <109>mbed CWデコーダ ~和文欧文解読 その1~

 欧文モールス符号は解読できるようになりましたか? 続けて和文の解読ができる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切り替えスイッチの動作を確認・・・残り二つのスイッチは今後の課題で確認します。



2012年10月18日

はてなブックマークに追加   マイコン・カーを製作してみよう(22)

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表示


more- "マイコン・カーを製作してみよう(22)" »

2012年10月17日

はてなブックマークに追加   <108>mbed CWデコーダ ~欧文解読 その7~

 モールス符号を使った通信には英数字・記号のほかに通信記号があります。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などのようです。

 

2012年10月11日

はてなブックマークに追加   マイコン・カーを製作してみよう(21)

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 マイコン・カー制御配線図

more- "マイコン・カーを製作してみよう(21)" »

2012年10月10日

はてなブックマークに追加   <107>mbed CWデコーダ ~欧文解読 その6~

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);
        }

more- "<107>mbed CWデコーダ ~欧文解読 その6~" »

2012年10月 9日

はてなブックマークに追加   <106>mbed CWデコーダ ~欧文解読 その5~

 最初に符号を受信すると、送信速度はわかりませんが、耳で聞いて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/

more- "<106>mbed CWデコーダ ~欧文解読 その5~" »

2012年10月 5日

はてなブックマークに追加   マイコン・カーを製作してみよう(20)


 それでは、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 カメラ留め精密ネジ


more- "マイコン・カーを製作してみよう(20)" »

2012年10月 3日

はてなブックマークに追加   <105>mbed CWデコーダ ~欧文解読 その4~

 ・-を文字単位で表示することができましたか? この課題では符号を欧文に解読します。
 モールス符号にはアルファベット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;
          }
        }

more- "<105>mbed CWデコーダ ~欧文解読 その4~" »

2012年10月 2日

はてなブックマークに追加   <104>mbed CWデコーダ ~欧文解読 その3~

 ・- の判別はできるようになりましたか? 符号の区切れを文字単位で判別しましょう。

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

  短点の長さ、長点の長さ/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(" ");
        }

more- "<104>mbed CWデコーダ ~欧文解読 その3~" »

2012年9月27日

はてなブックマークに追加   マイコン・カーを製作してみよう(19)

XBeeを使って無線化 2
 それでは、簡単なプログラムでXBeeが正しく動作するか確認してみましょう。
  このプログラムは二つの機能をもっています。一つはPCから送信したデータをmbedで受信し、データをmbedのLCDに表示します。もうひとつの機能は、mbedが受信した文字数をカウントし  そのデータ数をPCに送信しています。

  図8は回路図です。今回は回路を簡単にするためにXBeeの電源はmbedのVOUT端子から供給しています。

ss図8_mbed-XBee接続図.jpg
図8 mbed-XBee接続図

more- "マイコン・カーを製作してみよう(19)" »

2012年9月26日

はてなブックマークに追加   <103>mbed CWデコーダ ~欧文解読 その2~

 モールス符号を受信して、短いON=”・”、長いON=”-”で表示するプログラムを作成しましょう。

mbedプログラミング
短点の定義
 モールス符号の定義では、符号の長さが長点=短点×3と定義されています。符号間は短点と同じ長さです。
 符号を読み取る場合、困るのは短点の長さが送信速度により変化するという点です。ある速度では短点となる長さが別の速度では長点になる点がモールス符号解読のやっかいな点です。短点長50msの時、長点長は150msです。ところが、短点長150msという場合もあるのです。
 そこで、次の方法で、短点の初期長をセットします。短点の長さから1分間の送受信文字数を求めるには次の式を使います。詳細は後日説明します。

   1分間の送受信文字数=60/(短点長×10^-3*57)*5 

p6がHiかLOWをチェックします。
  短点の長さが30ms~90msであるときは、スピードをHI(175~60文字)
  短点の長さが70ms~210msであるときはスピードをLOW(75~25文字)
これらをset_speed()関数で定義します。

void set_speed(){
  if(SP_SELECT==HI){//175~60文字
    min_ms=30;
    max_ms=90;
    lcd.locate(5,0);
    lcd.printf("H");
  }
  else if(SP_SELECT==LOW){//75~25文字
    min_ms=70;
    max_ms=210;
    lcd.locate(5,0);
    lcd.printf("L");
  }
}

more- "<103>mbed CWデコーダ ~欧文解読 その2~" »








twitter ARM

twitter nxpfan


おすすめ書籍

カテゴリ

カレンダ

2015年11月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

最近のコメント

shimada on mbedベースボード BlackOne活用(6): プログラム中のNTPClientライブラリーは、下記のライブラリーに

Okumura on mbed NXP LPC1768用ベースボードStarBoard Orange<1>: StarBoardOrengeにGPSをつないで,実験をしています.

takeuchi on <10> ビュートローバーARM入門 ~LPC Xpressoのインストール その2~: ぎっちゃんさん、こんにちは。コメントを頂き、ありがとうございます。

ぎっちゃん on <10> ビュートローバーARM入門 ~LPC Xpressoのインストール その2~: VSTONEのビューとローバーを買ったがLPCXpressをダウンロ

nesuke on mbedで初めてのマイコン開発 LCDを極める! <2/5>: 今のライブラリだとR/Wピンも指定しないといけないようになったみたい


会社案内
情報セキュリティおよび個人情報の取り扱いについて

コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。
コメントはそれぞれ投稿した人のものです。