忍者ブログ

Fグループ電子工作講座

秋月電子SH7125ボードで始めるマイコン開発

SH7125ベースボード2つで遠隔制御

関連:シリアル通信関連記事一覧

これまでに作った機能を全部使って遠隔制御を行います。

<材料>
SH7125ベースボード2つ
5V電源2つ
RS232C クロスケーブル(オスーオス)1つ
コネクタ取付済可変抵抗 最低1個
が必要です。
RS232C クロスケーブル(オス)がほとんど使う機会が無いので意外とレアです。
売ってのが見つからなかったり、2千円以上の物しか見つからなかったら作りましょう。
材料費300円ぐらいで作れます。(作り方は今後書きます

汎用IO設定:io_setup.cio_setup.h
AD変換設定:ADConv.cADConv.h
PWM設定:intMTU.cintMTU.h
タイマ設定:intCMT.cintCMT.h
シリアル通信設定:intSCI.cintSCI.h

とりあえず全部プロジェクトに追加します。
初心に帰って最初からやってみましょう。

※画像はPWM機能を試した回の使いまわしです。

プロジェクトの準備

とりあえず付属CDのコンパイル編に従ってプロジェクトを作ります。

1)HEWを起動・新規プロジェクトワークスペースの作成


ワークスペース名:sh7125_remote_test(任意で構いません。ワークスペース名に半角カッコ()を使うと動かない事があります。
プロジェクト名:sh7125_remote_test(ワークスペース名と同じでOK)
ディレクトリ:標準設定では「C:\WorkSpace」内に作成されます。
CPU種別、ツールチェイン:SuperHって名前が入っている方。多分標準で選択されているはず。
この項はこれでOKです。

次のページ CPU:使用するCPUとC言語を機械語に変換する機能(ツールチェイン)を選択します。

ツールチェインバージョン:標準選択で構いません。インストールしたHEWのバージョンで多少違います。
CPUシリーズ:SH-2
CPUタイプ:SH7125
以降は標準選択を使用するので完了ボタンでもOKです

オプション:よく分かりません。標準選択で構いません。
生成ファイル:よく分かりません。標準選択で構いません。
標準ライブラリ:多分使用したいライブラリの選択です。標準選択で構いません。
スタック領域:多分メモリ関係の設定です。標準選択で構いません。
ベクタテーブル:よく分かりません。標準選択で構いません。
デバッガ:シミュレータデバッガ関連の様ですがよく分かりません。標準選択で構いません。
生成ファイル名:自動生成されるファイル一覧が表示されます。とくに選択する要素はありません。

2)ファイルの追加

一旦HEWは置いておいてプロジェクトを作成したフォルダを開きます。
今回の設定では C:\WorkSpace\sh7125_remote_test です。
sh7125_remote_testフォルダの中にsh7125_remote_testフォルダがあるので開きます。
ここにダウンロードしたファイル10個を入れます。

3)ファイルの登録

HEWに戻って操作します。
メニューよりプロジェクト→ファイルの追加


作成(ダウンロード)したファイル10個を登録します。

1つづつ登録しても、10個まとめて登録してもどちらでも構いません。

4)ファイルの編集1:割り込み機能の有効化

ファイルが追加できたところで、割り込み関数を登録します。
左側の一覧の「C source file」よりresetprg.cを開いて編集します。
36行目付近
#define SR_Init    0x000000F0

#define SR_Init    0x00000000
へ変更します。

5)ファイルの編集2:割り込み関数の登録

ファイルが追加できたところで、割り込み関数を登録します。
左側の一覧の「C source file」よりintprg.cを開いて編集します。

PWM設定
195行目付近
void INT_MTU2_0_TCIV0(void){/* sleep(); */}

void INT_MTU2_0_TCIV0(void){MTU20_INT_OVF();}

タイマ設定
379行目付近
void INT_CMT0_CMI0(void){/* sleep(); */}

void INT_CMT0_CMI0(void){CMT0_INT_CMI();}

387行目付近
void INT_CMT1_CMI1(void){/* sleep(); */}

void INT_CMT1_CMI1(void){CMT1_INT_CMI();}

シリアル通信設定
451行目付近
453行目付近
455行目付近
void INT_SCI1_ERI1(void){/* sleep(); */}
void INT_SCI1_RXI1(void){/* sleep(); */}
void INT_SCI1_TXI1(void){/* sleep(); */}
をそれぞれ
void INT_SCI1_ERI1(void){SCI1_INT_ERI1();}
void INT_SCI1_RXI1(void){SCI1_INT_RXI1();}
void INT_SCI1_TXI1(void){SCI1_INT_TXI1();}
へ変更

これで準備ができました。

メインプログラム作成

sh7125_remote_test.cを編集します。
取り合えず中身を全部消します。

必要なファイルをインクルードしてからメイン関数
<設定>
#include "iodefine.h"
#include <stdio.h>
#include "io_setup.h"
#include "ADConv.h"
#include "intMTU.h"
#include "intCMT.h"
#include "intSCI.h"

void main(void){
    //変数定義
    short ad_vale[8];    //AD変換値の格納
    short pwm_out[8];    //PWM出力値の格納
    short trans_data[10];    //送信データ格納用
    short recive_data[10];    //受信データ格納用
    unsigned long timer;    //ループ制御用タイマー
    int i;

    //各機能の初期化
    hardware_setup();    //汎用IOの初期化
    init_ADC();            //AD変換の初期化
    init_MTU();            //PWMの初期化
    init_CMT0(1);        //タイマーの初期化
    init_SCI1();        //シリアル通信の初期化

    timer=getsystime();    //現在時刻の取得(intCMT)

    while(1){    //無限ループ開始
        check_ai();            //AD変換の実行
        analysys_sci(1);    //シリアル通信受信処理

        if(timer<getsystime()){        //タイマー設定時刻を経過
            timer=getsystime()+50;    //50ms後に設定

            for(i=0;i<8;i++){
                ad_vale[i]=get_ai(i);    //AD変換値を取得0-1023
            }

            recv_data_sci1(ID_OPE,10,recive_data);    //受信データを取得

            set_pwm(PWM_PE0,recive_data[2]*4);    //0-255を0-1023に変換して出力
            set_pwm(PWM_PE1,recive_data[3]*4);    //0-255を0-1023に変換して出力
            set_pwm(PWM_PE8,recive_data[4]*4);    //0-255を0-1023に変換して出力
            set_pwm(PWM_PE9,recive_data[5]*4);    //0-255を0-1023に変換して出力
            set_pwm(PWM_PE10,recive_data[6]*4);    //0-255を0-1023に変換して出力
            set_pwm(PWM_PE11,recive_data[7]*4);    //0-255を0-1023に変換して出力
            set_pwm(PWM_PE12,recive_data[8]*4);    //0-255を0-1023に変換して出力
            set_pwm(PWM_PE13,recive_data[9]*4);    //0-255を0-1023に変換して出力

            //送信用データを組み立て
            trans_data[0]=0;            //送信データ0内部状態
            trans_data[1]=get_sw1();    //送信データ1スイッチ入力
            trans_data[2]=ad_vale[0]/4;    //送信データ1AD変換値0、0-1023を0-255へ変換
            trans_data[3]=ad_vale[1]/4;    //送信データ1AD変換値1、0-1023を0-255へ変換
            trans_data[4]=ad_vale[2]/4;    //送信データ1AD変換値2、0-1023を0-255へ変換
            trans_data[5]=ad_vale[3]/4;    //送信データ1AD変換値3、0-1023を0-255へ変換
            trans_data[6]=ad_vale[4]/4;    //送信データ1AD変換値4、0-1023を0-255へ変換
            trans_data[7]=ad_vale[5]/4;    //送信データ1AD変換値5、0-1023を0-255へ変換
            trans_data[8]=ad_vale[6]/4;    //送信データ1AD変換値6、0-1023を0-255へ変換
            trans_data[9]=ad_vale[7]/4;    //送信データ1AD変換値7、0-1023を0-255へ変換

            send_data_sci1(ID_OPE,10,trans_data);    //データ送信

        }//50ms
    }//end while
}

<解説>
今まで当ブログを見ながら機能を1つずつ理解してきた人には説明は不要かと思います。
50ms間隔で制御を行っています。
AD変換値とスイッチ入力を通信で出力しています。
また、受信したデータ(AD変換値に相当)の基づき、PWM出力を制御しています。

動作確認

とりあえずTMZで受信してみます。
例によって
38400bps、8ビット、1ストップビット、偶数パリティー、フロー制御無し
です。

マイコンを起動するとデータが送られてくるはずです。
スイッチを動かしてみたり、PF0~PF7に可変抵抗を接続して動かしてみたりすれば送られてくる値が変わります。

また、アナログ0、アナログ1に値が入った相当のデータ
例アナログ0とアナログ1が255:
[100A0000FFFF000000000000EA]
をマイコンへ送ってやればLEDが500ms間だけ点灯します。

同じプログラムを書き込んだボードを2枚用意し、オスのクロスケーブルでお互いを繋いでやればシリアル通信を使った比例リモート制御ができます。


ライントレースの車体を使用すれば比例リモート操作ができます。
PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性
自己紹介:

最新コメント