Vol.853 30.Sep.2022

ワード・一太郎で数式入力 (N-10)分岐機能付き自動運転

F ワード・エクセルや一太郎で数式を入力する

by fjk

 ワードや一太郎で以下の方法で数式を入力することができます。

1.ワード。エクセルの場合
@ 数式を入力したい位置にカーソルを移動
A メニューから[挿入/記号][特殊文字][数式]を選択
B [テンプレート]か[新しい数式の入力]等を選択
C 数式入力モードとなり、メニューバーが「数式モード」に変わる。
D 使いたい記号・数式をメニューバーから選択
E ボックスの中に数式を入力
F「¥」から始まるユニコードコマンドで入力し、スペースキーで確定(例:\sqr(2)_)
  (ユニコードの詳細はunicode.orgなどを参照)
G 確定のためのスペースは1または2個必要
 
また、ショートカットキー( [Alt]+[Shift]+[=])を押すと、新しい数式の入力モードとなる。
・元の戻るには、数式以外の場所をクリック。
・数式を再編集するには、数式をクリックする。
 
2.一太郎の場合
@ 数式を挿入したい位置にカーソルを移動
A [挿入-オブジェクト枠-作成][新規作成]を選択
B[オブジェクトの種類]から、「JS数式作成ツール」を選択し、[OK]をクリック。
C JS数式作成ツールが起動。
D 使いたい記号・数式をメニューバーから選択
E 表示された赤枠内に数式を入力
F「数式作成ツールの終了」で元に戻る
・数式を再編集するには、数式をWクリック
・作成した数式のサイズや場所を変更するには
 @一太郎上で数式をクリックして、まわりに■マークが表示された状態にする。
 A■マークをドラッグして大きさを変える。
 

Wordでの数式入力例

一太郎で数式入力を選ぶ

一太郎での数式入力例


N Nゲージ列車のデジタル運転(10) 〜分岐機能付き自動運転

by fjk

 abc851で自動運転を実現したが、今回追加した機能は、最大26個のポイント(分岐器)の切替と、最大9編成の走行列車の選択である。ポイントの制御は、drcに‘A'〜'Z'または‘a'〜'z'を指定し。大文字/小文字の違いで分岐の方向を指定する。また、走行させる列車の選択は、drcに'1'〜'9'を指定することで、最大9編成の列車を選択できる。どちらの設定も列車が停止中の状態の時のみ指定できる。
 ポイント切替、運転列車を変更する場合、列車に電圧が印加されないように、pwm = 0(常点灯もOFF)にしている。また、変更が安定するまでの時間として、stmには最低でも10(1秒)以上を設定すること。
・drcの変更は列車の停止時にのみ行われ、
   drc=0(0x00、停止)、1(0x01、前進)、2(0x02、後退)
   drc= '1' (0x31)〜'9' (0x39)の最大9種類の車両。
   drc= 'A' (0x41)/'a'(0x61)〜'Z'(0x5A)/'z'(0x7A)の最大26カ所のポイント。
 
 列車の徐行速度と常点灯停止速度を定数としていたが、複数の列車に対応するため、spdに2000以上を指定すると、その時選択されている列車のパラメータを以下のように利用することにした。
・spd≧2000の場合、走行パラメータは列車パラメータを利用
   spd=2000 rsL(常時点灯)停車を指定
   spd=2001 slw徐行[停止準備](走行下限速度)を指定
   spd=2002 slw+(upL−slw)×1/4速度(低速)を指定
   spd=2003 slw+(upL−slw)×1/2速度(中速)を指定
   spd=2004 slw+(upL−slw)×3/4速度(準高速)を指定
   spd=2005 upL高速(走行上限速度)指定
 
 今回使用したPICは20ピンのPIC16F18346で、センサとポイントの合計で最大11(PA0/1も使用)まで使える。また、14ピンのPIC16F18325/18326も同じピン配置で、今回の例ではRC6-7、PB4-6は使用していないので、そのままソケットに差し込んで使用可能で、この場合は最大5となる。なお、ピン配置は異なるが28ピンのPIC16F18857を使うと最大18となる。
 なお、テスト時、5V電源はUSB供給としたので、5Vの3端子レギュレーターは外している(12V電源端子のそばに装着可)。


ポイント制御付きパワーパック回路

PIC16F18346を使った試作回路
(ポイント制御ドライバーは個々に必要)

 【MCCの設定】 MCCの設定はabc850とほぼ同じ(ADCは使用しない)で、再掲載すると

【SyatemModule】
	Oscilater	Select = HFINTOSC
	HF internal Clock = 32_MHz
	Clock Divider = 1
【TMR2】
	Check "Enable Timer"
  	<Timer Clock>
		Postcaler = 1:1
		Prescaler = 1:1
	<Timer Period>
		Timer Period = 32us
【PWM5】
	Check “Enable PWM"
	Select a Timer = Timer2
	<Duty Cycle>
		Duty Cycle = 0.0%
	<PWM Parameters>
		PWM Polarity = active_hi
【FVR】
	Check “Enable FVR"”
	FVR_buffer1 Gain = off
	FVR_buffer2 Gain=1x
【DAC1】
	Check “Enable DAC"”
	Positiv Reference = FVR_buf2
	Negativ Reference = VSS
【CMP1】
	Chek “Enable Comparator"
	Positiv Input =DAC
	Negativ Input =CIN2-
	Output Polarity = not inverted

【CWG1】
	Check “Enable CWG"
	Input Source = PWM5_OUT
	Output Mode = Stearing mode
	Clock Source = FOSC
  
	<Events>
		Rasing Counts = 0
		Falling Counts = 0
	<Output Pin Config>
	(CWGA)
		Check “Enable Stearing"
		Stearing data = high
		Polarity = inverted
	(CWGC)
		Check “Enable Stearing"
		Stearing data = high
		Polarity = inverted
	<AutoShutdown>
		CWGA&CWGC Shutdown State =logic1
		Check “Comparator1 Output”
【MSSP】
	Check “Interupt Driven"
	<Hardware Setting>
	 	SerialProtocol = I2C
		Mode = “Master"
		I2C Clock Frequency = 100000
	<Interupt Setting>”
		Check "Enable I2C Interrupt"
【Pin Module】
	Regster/PinModule:Check "Interrupt Enables”
	RA0(Itr_A0):(reserved)、(ICSPデータ)
	RA1(Itr_A1):(reserved)、(ICSPクロック)
	RA2(Itr_A2):input/degital、IOC=positiv
	RA3(Psw_A3):input ・・・スイッチ
	RA4(Itr_A4):input/degital、IOC = positive
	RA5(Led_A5):output ・・・赤LED
	RC0(MCL1):(I2Cクロック)
	RC1(MDA1):(I2Cデータ)
	RC2(CIN2-):input(CWG shutdown入力)
	RC3(CWG1C):output(PWM出力)、WUP
	RC4(CWG1A):output(PWM出力)、WUP
	RC5(Pt_C5):output(ポイント出力)

PinModule設定画面

Interrupt Vector

CWG設定

【プログラムの補足説明】

【列車走行のレイアウトと走行テスト】


C140とミニポイントを使ったレイアウト

走行風景(5VはUSBから供給)

走行時のパワーパック表示例

pin_manager.c 内で IrFlg の外部宣言と割込処理を追加する(赤字部)
/*=========================
 * 	pin_manager.c 
 *========================*/
extern uint8_t IrFlg;
 ・・・
void IOCAF2_ISR(void) {
  IrFlg |= 0x01;
   ・・・
}
 ・・・
void IOCAF4_ISR(void) {
  IrFlg |= 0x02;
   ・・・
}
 
/*========================
 *  train.h  (train_h.zip)
 *=======================*/
#include "mcc_generated_files/mcc.h"
#include "mcc_generated_files/examples/i2c1_master_example.h"
#include <stdio.h>
#include "i2cLCD_AQM0802A.h"

#define _XTAL_FREQ  32000000
#define PWM_OUT(x)  (PWM5_LoadDutyValue(x))
#define SWITCH_IN   Sw_A3_PORT
#define WAIT_CHAT() __dealay_ms(20)

enum {
    BREAK = 0,
    LOWLM,
    SLWSP,
    CNTSP,
    ACCEL,
    DECEL,
    UPRLM,
    RAEDY,
    TRABL,
    POINT,
    TRAIN
}Drv_Stat;

struct train_p{
    uint8_t   acf;    // 加速係数
    uint8_t   dcf;    // 減速係数
    uint16_t  rsL;    // 走行停止PWMパルス幅
    uint16_t  upL;    // 走行上限PWMパルス幅
    uint16_t  slw;    // 徐行時PWMパルス幅(停止準備)
};	

struct drv_val{
    uint8_t   nxt;    // 次ステップ番号
    uint16_t  spd;    // 指令走行PWMパルス幅
    uint8_t   drc;    // 指令走行方向
    uint16_t  stm;    // 停止時間 (100ms単位)
 
/*=======================
 *  main.c  (main_c.zip)
 *=======================*/
#include "train.h"

/*--- Drive Sequence array ---*/
struct drv_val s[] = {     // (最大99ステップ)
    { 1,   0, 'A', 20},    // ポイント−>直側、2秒待つ
    { 2,   0, '1', 30},    // 列車1を指定、3秒待つ
    { 3, 400,  1,   0},    // 速度(400)で進行
    { 4, 500,  1,   0},    // 速度(500)で進行
    { 5, 400,  1,   0},    // 速度(400)で進行
    { 6, 300,  1,   0},    // 速度(300)で徐行[停止準備]
    { 7, 100,  1,  50},    // 常点灯で5秒停止(方向維持)
    { 8,   0,  0,  20},    // PWM出力停止、2秒待
    { 9,   0, 'a', 20},    // ポイント→分岐側、2秒待つ
    {10,   0, '2', 30},    // 列車2を指定、3秒待つ
    {11,2002,  2,   0},    // 逆方向へ1/4速度(400)で進行
    {12,2003,  2,   0},    // 逆方向へ1/2速度(500)で進行
    {13,2002,  2,   0},    // 逆方向へ1/4速度(400)で進行
    {14,2001,  2,   0},    // 速度(300)で徐行[停止準備]
    {15,2000,  2,  50},    // 常点灯で5秒停止(方向維持)
    { 0,   0,  0,  20}};   // PWM出力停止、2秒待つ

/*---  Train Parameter ---*/
struct train_p t[] =[       // (最大9列車まで)
    {0, 0, 100, 700, 300}   // 列車1パラメータ
    {0, 0, 100, 700, 300}}; // 列車2パラメータ

/*--- Global Work Variables ---*/
struct drv_val	*a;        // 列車走行データ構造体用ポインタ
struct train_p	*b;        // 列車パラメータ構造体用ポインタ

    uint8_t   TMd = 0;     // 走行モード(reserved)
    uint8_t   Sts = 0;     // 走行ステータス
    uint8_t   Snm = 0;     // ステップ番号
    uint16_t  Spd = 0;     // 現在走行PWMパルス幅
    uint8_t   Drc = 0;     // 現在進行方向
    uint8_t   Vct = 0;     // 加減速用カウンタ
    uint16_t  Tmc = 0;     // 停止時間カウンタ
    uint8_t   IrFlg = 0;   // 状態割り込みフラグ
    char      sBuf[10];    // 文字列関数作業用
    uint16_t  tSp;         // 目標走行PWMパルス幅


/*--- LCD Functions ---*/
void dsp_sts(uint8_t n){
    Sts = n;			// ステータス番号セット
    LCD_cursor(0,0);
    switch(n){
        case 0:  LCD_str("Brak!");  break;
        case 1:  LCD_str("LowLm");  break;
        case 2:  LCD_str("SlwSp");  break;
        case 3:  LCD_str("CntSp");  break;
        case 4:  LCD_str("Acccl");  break;
        case 5:  LCD_str("Decel");  break;
        case 6:  LCD_str("UppLm");  break;
        case 7:  LCD_str("Raedy");  break;
        case 8:  LCD_str("Trbl!");  break;
        case 9:  LCD_str("Point");  break;
        case 10: LCD_str("Train");  break;
    }
}

void dsp_pwm(uint8_t x, uint16_t n){
    sprintf(sBuf,"%4d",n);
    LCD_cursor(x,1);
    LCD_str(sBuf);    
}

void dsp_stp(uint8_t n){
    sprintf(sBuf,"%2d",n);
    LCD_cursor(6,0);   
    LCD_str(sBuf);
}

/*--- Speed up/down functions ---*/
void speed_up(){
    if(Vct == 0){
        Spd++;
        Vct = b->acf;
    }else{
        Vct--;
    }
}

void speed_dwn(){
    if(Vct == 0){
        Spd--;
        Vct = b->dcf;
    }else{
        Vct--;
    }
}

/*--- CWG controle function --*/
void set_CWG(uint8_t x){
    LCD_cursor(5,0);
    switch(x){
        case 0: PWM_OUT(0);  Spd = 0;
                CWG1STR = 0xF5; LCD_dat('*');  break;  // ブレーキ
        case 1: CWG1STR = 0xF1; LCD_dat(0x7E); break;  // 前進 
        case 2: CWG1STR = 0xF4; LCD_dat(0x7F); break;  // 後進 
    }
}

/*--- Set Speed from Train Parameter ---*/
uint16_t set_sp_trp(uint16_t w){
    uint8_t d;
    uint16_t r;
    d = b->upL - b->slw;
    switch(w){
        case 2000:  r = b->rsL;        break;  // 常点灯停止
        case 2001:  r = b->slw;        break;  // 徐行[停止準備]  
        case 2002:  r = b->slw + d/4;  break;  // 低速
        case 2003:  r = b->slw + d/2;  break;  // 中速
        case 2004:  r = b->upL - d/4;  break;  // 準高速
        case 2005:  r = b->upL;        break;  // 高速
    }
    return r;
}	

/*---- Set Train Number---*/
void set_train(uint8_t n){        // 走行させる列車を指定
    set_CWG(0);)
    dsp_sts(TRAIN);)
    if((n > 0x30)&&(n < 0x33)){   // 列車数(〜0x3A)
        b = &t[n - 0x31];         // 列車番号配列ポインタ 
        LCD_Cursor(5,0);
        LCD_dat(n);
    }
}

/*---- Switch Point ---*/
void swh_point(uint8_t x){        // ポイント切替(最大26)
    set_CWG(0);)
    dsp_sts(POINT);
    LCD_cursor(5,0);
    LCD_dat(x);
    switch(x){
        case 'A':  Pt_C5_SetLow();    break;
        case 'a':  Pt_C5_SetLHigh();  break;
    }
}

/*--- Breaking & Pause ---*/
void bk_pause(uint8_t x){
    set_CWG(0);                // PWM出力停止(ブレーキ)
    dsp_sts(x);
    dsp_pwm(0, Spd);
    dsp_pwm(4, tSp);
    dsp_stp(Snm);
    if(x == BREAK){
        WAIT_CHAT();            // チャタリング待ち
        while(SWITCH_IN == 0);  // スイッチが離れるまで
    }
    do{
        Led_A5_SetHigh();       // 0.5秒間隔で赤LED点滅
        __delay_ms(250);
        Led_A5_SetLow();
        __delay_ms(250);
    }while(SWITCH_IN > 0);      // スイッチが押されるまで
    WAIT_CHAT();                // チャタリング待ち
    while(SWITCH_IN == 0);      // スイッチが離れるまで
    WAIT_CHAT();                // チャタリング待ち
    set_CWG(Drc);
}


/*==== Main application =====*/
void main(void){
    uint8_t  d;

    SYSTEM_Initialize();
    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();
    LCD_init();
    DACCON1 = 0x03;              // 過電流閾値セット(DAC)

    bk_pause(RAEDY);             // スイッチが押されるまで待つ

    //----- main loop ------
    do{
        dsp_stp(Snm);            // 現在ステップ値を表示
        a = &s[Snm];             // 走行データ配列ポインタセット
        Tmc = a->stm;
        if(a->spd == 0){         // 指令速度が0なら
            set_CWG(0);          // PWM出力停止
            tSp = 0;
            dsp_sts(BREAK);
        }else if(a->spd < 1024){  // 指令速度が1024未満なら
            if(a->spd > b->upL){  // 指令PWM>最大値
                tSp = b->upL;
            }else{                // 最大値以下
                tSp = a->spd;     // 指令値=設定値
            }
        }else{                        // 指令値>1023
            tSp = set_sp_trp(a->spd); // 列車パラメータ使用
        }
        if(Spd <= b->rsL){            // 列車が停止中なら	
            d = a->drc;
            if(d < 3){                // drc = 0〜2なら
                Drc = d;              // 進行方向セット
                set_CWG(Drc);
            }else if((d > 0x30)&&(d < 0x3A)){  // '1'-'9'?
                set_train(d);                  // 列車選択
            }else if((d > 0x40)&&(d < 0x7B)){  // 'A'-''z'?
                swh_point(d);                  // ポイント制御
            }
        }
        dsp_pwm(4,tSp);
    //--- Sequency loop ----
        do{
            if(CWG1AS0bits.CWG1SHUTDOWN){
                dsp_sts(TRABL);       // 過電流エラー
                dsp_pwm(0, 0);        // PWM出力無し
                Led_A5_SetHigh();     // 赤LED点灯し
                exit(1);              // 異常終了
            }
            if(Sw_A4_PORT == 0){      // スイッチがON
                bk_pause(BREAK);      // なら緊急停止
            }	
            if(Tmc > 0){              // 停止中タイマー処理
                __delay_ms(100);
                Tmc--;
                dsp_pwm(4,Tmc);
                if(Tmc == 0){         // タイマー=0なら
                    break;            // ループ脱出
                }
            }else{
                if(Spd < tSp){
                    dsp_sts(ACCEL);          // 加速中
                    speed_up();
                }else if(Spd > tSp){
                    dsp_sts(DECEL);          // 減速中
                    speed_dwn();
                }else{
                    if(Spd == b->slw){
                        dsp_sts(SLWSP);      // 徐行中
                    }else if(Spd == b->upL){
                        dsp_sts(UPRLM);      // 最速走行中 
                    }else{
                        dsp_sts(CNTSP);      // 定速走行中 
                    }
                }
            }
            PWM_OUT(Spd);
            dsp_pwm(0, Spd);
        }while((IrFlg == 0)||(Tmc > 0));	
         // センサ入力無し又はタイマー残ならループ継続

        if(Sts == SLWSP){        // 徐行中にセンサ入力があれば
            Spd = b->rsL;
            PWM_OUT(Spd);            // 走行停止(常点灯)
            dsp_pwm(0, Spd);
            dsp_sts(LOWLM);
        }
        __delay_ms(100);             // センサ誤入力動作対策
        IrFlg = 0;                   // 割り込みフラグをクリア
        Snm = a->nxt;                // 次ステップへ
    }while(Snm < 100);	
        // ステップ値が100以上ならプログラム終了

    set_CWG(0);                      // PWM出力停止
    LCD_cursor(0,0);
    LCD_str("-End-");
    exit(0);                         // 正常終了
}
  	/*---  End of File ---*/

★★★ トラブル ★★★ ・・MCCのEasySetUpで再設定や変更しても反映されないことあり!!

1.PIC書き込み時に”Target Device ID (0x0) is an Invalid Device ID”エラー(PIC書込不可)
−【配線不良】ICSPの配線チェック、特にブレッドボードでは接触不良に注意
−>MCLR端子の配線で接触不良(Pickit読み取り値でDeviceID=0ならこの可能性大)。
2.I2Cが動作しない(I2C接続LCDに文字が全く表示されない。I2C信号が出力されていない)
−【MCCバグ】MCCでRC0、RC1のWPUをチェックするも正しくセットされていない。
−>PIN_MANAGER Initialeze()でWPUC=0x00となっていた。WPUC = 0x03に変更。
3.IOピン状態変化割り込みが実行されない(磁気センサ入力が無視される)
−【MCCバグ】MCCでRA2とRA4のIOCをpositiveにするも、IO状態変化割込み許可の記述がない
−>PIN_MANAGER Initialeze()の最終行に PIE0bits.IOCIE = 1; の記述を追加。


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


ワード・一太郎で数式入力 (N-10)分岐機能付き自動運転