Vol.868 21.Apr.2023

ワード・一太郎の拡張書式 (R-7)パソコンからの制御 生物はウィルスが進化させた テラタームのテンキー入力

E ワード・一太郎の拡張書式  〜組文字・縦中横など

by fjk

 ワープロで一部の文字を回転させたり、複数の文字を一文字等にしたい時は、拡張書式が使える。
 
1.縦中横 (縦書き、横書きのどちらでも使用可)
 半角や数値、英字の文字列を90度回転する。
【ワード】 文字列を選択後、
「ホーム」「段落」「拡張書式」から「縦中横」を選ぶ
【一太郎】 文字列を選択後、
「書式」「文字割付」「縦中横」を使うと、横書きにできる。
2.組文字
 文字列を上下2段に区切って1文字として表示する。
【ワード】 文字列を選択後、
「ホーム」「段落」「拡張書式」から「組文字」を選ぶ
(組文字のフォントサイズを指定できる)
【一太郎】 挿入したい場所で、
「挿入」「記号/リーダ/スペース」「組文字」で、組文字列を入力(修正は選択後F2)。
(サイズを10〜100%で指定すること。組文字の大きさは基本文字サイズで固定)
3.割 注
 内容や説明などの語句の注釈を上下2段の文字列として括弧でくくる。
【ワード】 文字列を選択後、
「ホーム/段落/拡張書式」から「割注」を選ぶ
【一太郎】 挿入したい場所で、
「挿入」「脚注/割注/注釈」、機能で「割注」、文字列を入力。(修正は選択後F3)
4.重ね文字
 2文字を重ねて一つの文字に(図形で文字列を囲む場合は別)。
【ワード】 挿入したい場所で、(「EQフィールド」の「\O」スイッチ)
{EQ \O(文字1,文字2)}
  ・・・文字1と文字2を重ねる(文字数の制限無し)
※ EQフィールドの使い方
 @ Ctrl+F9 ・・・{}と表示される
 A 中括弧の中に例えば {EQ \O(□,印)} と記述
 B 囲みフォントを少し大きく(標準10.5ptの場合18pt程度)し
  さらに、フォントの詳細設定で位置を3ptほど下げる
 C Shift+F9 で元に(修正もShift+F9)
【一太郎】 挿入したい場所で、
「挿入」「記号/リーダ/スペース」「重ね文字」を選び、
外の文字(囲み文字)を選択し、中の文字を入力。

 


R 赤外線リモコン(7)  〜パソコンからの制御

by fjk

 USB機能付きPICでパソコンとの通信はabc837などで、またEUSARTとUSB変換モジュールを使ってパソコンへのデータ通信についてはabc764abc856で紹介したが、C99バージョンでのシリアル送受信について、もう一度確認しておく。
 なおPICはPIC16F18424、USB変換モジュールはFT234X(秋月電子)を用いた。回路およびソフトはabc859をベースに、モード付き4x3キー機能をそのまま残し、シリアル通信機能を追加した。


通信機能付き赤外線リモコン回路
(PIC16F18424)

配線したブレッドボード
(4x3キーを外した状態)

 PICをUSB接続後、テラタームでシリアル接続を設定し、パソコンの「1」〜「9」「a」〜「c」キー等を押すと、PICリモコンから1〜12チャンネルを出力(テレビのチャンネルも変わった)し、さらにPICは受信文字と出力リモコンコードをパソコンに返信している。また4x3キー入力時にも、出力リモコンコードをパソコンに送信している。


SystemModule

PinModule

TMR2(Time=26.312us)

PWM6(38kHz)

CLC1
(入力は全てpwm6)

DSM
(High=PWM6、Low=LC1_out)

NCO
(31.25kHzを使用、1kHz)

EUSART1
(115200bps、割込許可、useStdio)

リモコン動作中
(パソコン、4x3キー共に使用可)

テラターム画面(115200bps)
(受信文字無しは4x3キー入力)

★★ トラブル ★★
 パソコンのテラタームで、USB接続したPICがCOMポートとして認識されていなかった。
 ハードの問題か?、ソフトの問題か?、といろいろ調べてみるが、どちらも問題なさそうである(PICはシリアル接続動作以外は正常に動作することを確認)。
 そこで、以前にシリアル接続が正常に動作していたabc856のリモコン解析器をUSB接続したところ、やはりパソコンで認識されなかった。
 そういえば、USBケーブルを新しいものに交換していることを思い出し、以前使っていたUSBケーブルに変更したところ、無事パソコンに認識された(どちらのケーブルもデータ通信対応)。
 abc867では新しいケーブルでPIC(USBインターフェース、K-06656)がちゃんと認識されていたが、今回のPIC(USBモジュールFT234X、M-08461)は認識されなかった。
 パソコンのUSB接続でPICが認識されない場合はUSBケーブルも疑って見る必要がありそう。

【プログラム】 abc868-18424.c(zip)
/*=== Ir Remote controler for IO-Data  (abc868-18424) ===*/

#include "mcc_generated_files/mcc.h"

#define MARK()      __delay_us(562)
#define SPACE_1()   __delay_us(1686)
#define SPACE_0()   __delay_us(562)
#define READER_1()  __delay_us(8992)
#define READER_0()  __delay_us(4496)
#define GYAP_0()    __delay_ms(43)

#define DSM_1()     (MD1CON0bits.MD1BIT = 1)
#define DSM_0()     (MD1CON0bits.MD1BIT = 0)

#define IO_CUSTOM   0xE880

#define SCN_DELAY() __delay_ms(30)
#define KEY_DELAY() __delay_ms(500)

uint8_t IO[][8] ={{0x80,0xE8,0x84,0x7B,0x80,0xE8,0x10,0xCF},
                  {0x80,0xE8,0x84,0x7B,0x80,0xE8,0x20,0xCF},
                  {0x80,0xE8,0x84,0x7B,0x80,0xE8,0x30,0xCF}};
			
uint16_t IO2[]  = { 
        0x1084,0x4084,0x7084,0x7024,    // 1, 4, 7,DG [Md=0]
        0x2084,0x5084,0x8084,0xB084,    // 2, 5, 8,11
       	0x3084,0x6084,0x9084,0x0094,    // 3, 6, 9,BS 
        0x3014,0x4024,0x0014,0x1014,    // Mn,Lf,C+,C-[Md=1] 
        0x2024,0x4014,0x3024,0xD084,    // Up,Cr,Dw,Rt
        0x2014,0x5024,0xE004,0xF004,    // Sl,Rt,V+,V-
        0xE014,0x0094,0x0000,0xA024,    // Vd,BS,  ,Ps[Md=2]
        0x9024,0x0000,0x8014,0xA014,    // HD,  ,Cd,In
        0xD014,0x7024,0x0000,0x9014,    // PC,DG,  ,So
        0xC014,0xF024,0xE024,0xE084,    // Dp,Pr,Dc,Sb[Md=3] 
        0x1024,0xC024,0xD024,0x5014,    // Md,Wp,Nw,Sa
        0x6014,0x0084,0xF084,0x7014,    // Sz,Nx,pC,Tm
        0xD004,0xA084,0xC084};          // power,10,12

uint16_t nco[] = {0xFFFF,0x0043,0x0086,0x010c}; // 1ms,1s,2s,4s

uint8_t  sft;
uint16_t wsft;
uint16_t keyM;
uint8_t  keyP;
uint8_t  IrMd = 0;
 
/*---- IOdata Leader ---*/
void IO_Leader(){
    DSM_1();                // "Leader" Start
    READER_1();
    DSM_0();
    READER_0();
}

/*---- IOdata stop ---*/
void IO_Stop(){
    DSM_1();
    MARK();                 // "Stop"
    DSM_0();
}

/*--- Send strings of IRcode -----*/
void Ir_Send(uint8_t *dt,uint8_t x){
    for (int j = 0; j < x; j++){
      sft = 0x01;
      for(int i = 0; i < 8; i++){
        DSM_1();
        MARK();
        DSM_0();
        if(dt[j] & sft){
          SPACE_1();
        }else{
          SPACE_0();
        }
        sft <<= 1;
      }
    }
}

/*------- Send IOdata code -------*/
void IO_DATA(uint8_t c){
    IO_Leader();                // "Leader" Start
    Ir_Send(&IO[c][0],4);       // Send "Data1"
    IO_Stop();                  // "Stop"
    GYAP_0();                   // Gyap time
    IO_Leader();                // "Leader" Start
    Ir_Send(&IO[c][4],4);       // Send "Datae2"
    IO_Stop();                  // Stop
}

/*-------- Send word of IRcode ------*/
void Ir_Send2(uint16_t wd){
    wsft = 0x0001;
    for(int i = 0; i < 16; i++){
      DSM_1();
      MARK();
      DSM_0();
      if(wd & wsft){
        SPACE_1();
      }else{
        SPACE_0();
      }
      wsft <<= 1;
    }
}

/*-------- Send IOdata2 IRcode  ----*/
void IO_DATA2(uint8_t c){
    uint16_t w = IO2[c];
    uint16_t wLo=(w&0x00FF) | ((~w << 8)&0xFF00);
    uint16_t wHi=((w >> 8)&0x00FF) | (~w&0xFF00);
    IO_Leader();                    // "Leader" Start
    Ir_Send2(IO_CUSTOM);            // Send "Custom" 
    Ir_Send2(wLo);                  // Send "Data1"
    IO_Stop();                      // stop
    GYAP_0();                       // Gyap time
    IO_Leader();                    // "Leader" Start
    Ir_Send2(IO_CUSTOM);            // Send "Custom" 
    Ir_Send2(wHi);                  // Send "Data2"
    IO_Stop();                      // stop
    printf(" %04X\n\r",w);          // serial print
}

uint16_t keyScan(){
    uint8_t k;
    uint16_t ky;
    X_A0_SetLow();
    SCN_DELAY();
    ky = ~PORTC & 0x0F;
    X_A0_SetHigh();    

    Y_A1_SetLow();
    SCN_DELAY();
    k = ~PORTC & 0x0F;
    ky |= ((uint16_t)k << 4);
    Y_A1_SetHigh();    

    Z_A2_SetLow();     
    SCN_DELAY();
    k = ~PORTC & 0x0F;
    ky |= ((uint16_t)k << 8);
    Z_A2_SetHigh();    
    return ky; 
}

uint8_t bitCount(uint16_t w){
    uint16_t wsft = 1;
    uint8_t i;
    for (i = 0; i < 12; i++){
        if(w & wsft)   return (i);
        wsft <<= 1;
    }
    return 0;
}

void Power_Mode(){
    uint8_t i;
    __delay_ms(10);
    if(PORTAbits.RA3) return;
    for(i = 0; i < 20; i++){
      __delay_ms(100);
      if(PORTAbits.RA3){
        IrMd = (IrMd + 1) % 4;
        NCO1CON  = 0x00;                //NCO stop();
        NCO1INCH = (nco[IrMd] >> 8) & 0xFF;
        NCO1INCL =  nco[IrMd] & 0xFF;
        NCO1CON  = 0x80;                //NCO start
        return;
      }
    }
    IO_DATA2(48);                       // Power
    while(!PORTAbits.RA3) ;
}

/* =====  Main application ====== */

void main(void)
{
    char  chr;

    SYSTEM_Initialize();
    INTERRUPT_PeripheralInterruptEnable();
    INTERRUPT_GlobalInterruptEnable();

    X_A0_SetHigh();
    Y_A1_SetHigh();
    Z_A2_SetHigh();

    puts("Hellow\n\r");

    while (1){
      if(!PORTAbits.RA3) Power_Mode();
      keyM = keyScan();
      if(keyM){
        keyP = bitCount(keyM) + (IrMd * 12); 
        IO_DATA2(keyP);
        KEY_DELAY();
      }
      if(EUSART1_is_rx_ready()){
        chr = getch();
        putch(chr);
        switch(chr){
          case '1':  IO_DATA2(0);   break;  // ch1
          case '2':  IO_DATA2(4);   break;  // ch2
          case '3':  IO_DATA2(8);   break;  // ch3
          case '4':  IO_DATA2(1);   break;  // ch4
          case '5':  IO_DATA2(5);   break;  // ch5
          case '6':  IO_DATA2(9);   break;  // ch6
          case '7':  IO_DATA2(2);   break;  // ch7
          case '8':  IO_DATA2(6);   break;  // ch8
          case '9':  IO_DATA2(10);  break;  // ch9
          case 'a':  IO_DATA2(49);  break;  // ch10
          case 'b':  IO_DATA2(7);   break;  // ch11
          case 'c':  IO_DATA2(50);  break;  // ch12
          case 'v':  IO_DATA2(22);  break;  // Vol+
          case 'l':  IO_DATA2(23);  break;  // vol-
          case 's':  IO_DATA2(25);  break;  // BS
          case 'g':  IO_DATA2(33);  break;  // DG
        }
      }
    }
}
/* ===== End of File ===== */
※ プログラムでは Ir_Send()と IO_DATA()関数は使用していないが、とりあえず残した。


V 「生物はウィルスが進化させた」を読んで

by fjk

 最近、新型コロナのニュースが少なくなってきました。それでも相変わらずウィルスは怖いと思うのですが、見出しの本を読んで、ウィルスは我々にとって無くてはならないものであることを認識した。
 ウィルスは細胞に侵入し、DNAの改変や組み込みをおこなうこと等により、より早い遺伝的進化が進み、我々人類まで成長することが出来たようだ。また、ウィルスではないが、ミトコンドリアは他の生物(ウィルス?、細菌?)を細胞内にそのまま取り込んだものらしい。
 一部のウイルスは自分のDNAの複製を作る折りに、膜で覆われたウィルス工場を作るらしく、この工場が細胞核の原型になったという論文もある。
 さらに、同じ竹村正春氏の「新しいウィルス入門」も読んでみると、ウィルスは我々に病気をもたらすが、ウィルスを無毒化し、正常なDNAを体内に送り込むベクターとして使えるという。難治な遺伝病などの治療方法として期待されている。
 ウィルスは生物ではないと言われているが、細胞に感染した状態のウィルスが本来の姿であるとも云われており、生物の定義の見直しが必要かもしれない。
 ※「生物はウィルスが進化させた」(竹村正春著、講談社:BlueBacks、税込1,100円)
 ※「新しいウィルス入門」(竹村正春著、講談社:BlueBacks、税込1,100円)


T テラタームのテンキー入力(追記) 〜VT100モードの解除

by fjk

 テラタームはデフォルトでVT100エミュレートモード(アプリケーションキーパッドモード)になっていて、テンキーなどを押すとVT100の制御シーケンスが入力文字列として送信される。このモードをキャンセルするには、「設定/キーボードの設定」で無効化できるはずだが、何故かうまくいかなかった。
 そこで、第2の方法として、テラタームをインストールしたフォルダーにあるKEYBOARD.CNFで、テンキーの設定をoffにする(元設定は;で残した)と、エミュレートモードが解除され、テンキーのトップ文字とおりに入力することが出来た。なお、数値テンキーは変更せずともそのままの数値で送信された。

  ・・・
[VT numeric keypad]
;Num pad 0 key
Num0=82
  ・・・
;Num pad '+' key
NumComma=off;78
;Num pad '.' key
NumPeriod=off;83
;Num pad Enter key
NumEnter=284
;Num pad NumLock key
PF1=off;325
;Num pad '/' key
PF2=off;309
;Num pad '*' key
PF3=off;55
;Num pad '-' key
PF4=off;74
  ・・・

キーボード設定で無効化できるはずだが?

 キーボードモードを変更し、前述の赤外線リモコンのプログラムを下記のように変更したところ、テンキーの記号キーを使ってリモコンコードを指示することが出来た。

	・・・
  case 'v':	IO_DATA2(22); 	break; 	// Vol+
  case 'l':	IO_DATA2(23); 	break; 	// Vol-
  case 's':	IO_DATA2(25); 	break; 	// BS
  case 'g':	IO_DATA2(33); 	break; 	// DG
	・・・
  case '+':	IO_DATA2(22); 	break; 	// Vol+
  case '-':	IO_DATA2(23); 	break; 	// Vol-
  case '*':	IO_DATA2(25); 	break; 	// BS
  case '/':	IO_DATA2(33); 	break; 	// DG

 なお、カーソルキーやファンクションキー等も同様にエミュレーションを無効にすることが出来る。

★テラタームの起動時の設定を変える
テラタームは起動時に、ユーザのマイドキュメントにTERATERM.INIファイルがあればこれを読み込んで、起動時の環境を設定している。もしマイドキュメントにTERATERM.INIファイルがない場合は、実行ファイルであるttermpro.exeファイルと同じフォルダーにあるTERATERM.INIを読み込む(デフォルト)。
そこで、マイドキュメントにTERATERM.INIをコピー後、修正しておくと、独自の環境設定で起動できる。詳細はテラタームのヘルプを参照。
	・・・
;	Serial port parameters
;	  Port number
ComPort=1
;	  Baud rate
BaudRate=115200;9600
;	  Parity (even/odd/none/mark/space)
Parity=none
	・・・


※ 本レポートの参考・利用は、あくまでも自己責任でお願いします。


ワード・一太郎の拡張書式 (R-7)パソコンからの制御 生物はウィルスが進化させた テラタームのテンキー入力