Micom Car Rally NET
MCR - Micom Car Rally
大会情報 マイコンカーラリーとは? 今から始めるマイコンカーラリー 技術情報 大会記録 MCRファン倶楽部 お問い合せ
マイコンカーラリートップへ マイコンカーラリートップへ
技術情報 >> R8C/M12A 技術情報
技術情報
各種資料
YouTube情報
R8C/M12A 技術情報
上位入賞マイコンカー
よくある質問(FAQ)
ダウンロード
R8C/M12A 技術情報
モータドライブ基板Ver.4を制御する

内容
モータドライブ基板Ver.4をR8C/M12Aに接続して、モータ2個、サーボ1個を制御します。モータドライブ基板Ver.4に搭載しているLED 2個の点灯、プッシュスイッチ1個の状態取得も行います。

ワークスペース

r8cm12a_motordrive4_100.zip
ファイルを解凍し、フォルダを「c:\worksapce」に入れてください。

回路
回路を下図に示します。

回路図

モータドライブ基板Ver.4

概要

今回は、(株)日立ドキュメントソリューションズで販売されているモータドライブ基板Ver.4を使用して、下表の制御を行うことができます(マイコンカーに取り組んでいる方々はお馴染みなので説明不要かもしれませんが・・・)。

モータドライブ基板Ver.4

機器名 個数 説明
モータ 2個 DCモータを2個(ここでは、左モータ、右モータと呼びます)、制御することができます。動作は、正転、逆転、停止させることができ、正転、逆転はそれぞれ0〜100%まで1%ごとにスピード制御することができます。
サーボ 1個 RCサーボを制御することができます。動作は-90度(左90度)〜+90度(右90度)まで1度単位で制御することができます。
LED 2個 プログラムで点灯/消灯できるLEDを2個搭載しています。
※LEDは3個搭載していますが1個(LED1)は電源ランプで、プログラムで点灯/消灯できません。
プッシュ
スイッチ
1個 プログラムでON/OFFの状態を検出できるプッシュスイッチを1個搭載しています。

※左モータ制御、右モータ制御、サーボ制御は、タイマRCによるPWM信号で制御します。タイマRCについては「タイマRCによるPWM出力(3ch)」を参照してください。

モータ制御

DCモータを2個制御することができます。
右モータを制御する端子、内容を下記に示します。

R8C/
M12A
端子
ドライブ基板10ピンコネクタ端子 説明
P1_0 5ピン 右モータへPWM信号を出力します。
ON幅(デューティ比)0%でモータ停止、100%でモータ回転です。回転方向は、回転方向の端子で決まります。
P1_4 6ピン 右モータの回転方向を制御します。
"0":正転 "1":逆転

右モータの制御回路の概要を下図に示します。
回路

左モータを制御する端子、内容を下記に示します。

R8C/
M12A
端子
ドライブ基板10ピンコネクタ端子 説明
P1_2 7ピン 左モータへPWM信号を出力します。
0%でモータ停止、100%でモータ回転です。回転方向は、回転方向の端子で決まります。
P1_1 8ピン 左モータの回転方向を制御します。
"0":正転 "1":逆転

左モータの制御回路の概要を下図に示します。
回路

サーボ制御

RCサーボを制御することができます。
RCサーボを制御する端子、内容を下記に示します。

R8C/
M12A
端子
ドライブ基板10ピンコネクタ端子 説明
P1_3 4ピン サーボへPWM信号を出力します。

サーボの制御回路を下図に示します。
回路

サーボコネクタ(CN4)の2ピンの電源電圧は6V以内にする必要があります(サーボの電源電圧)。電源電圧が6V以上のとき、LM350という三端子レギュレータ(電圧を一定にする部品)を使って電圧を6V一定にします。電源電圧が6V以下(電池4本など)の場合、この部分の回路は必要ありません(部品を未実装にして、JP2の1-2間をショートします)。LM350関係の部品を取った回路を下図に示します。
回路

LED制御

LEDを2個、点灯/消灯させることができます。
LEDを制御する端子、内容を下記に示します。

R8C/
M12A
端子
ドライブ基板10ピンコネクタ端子 説明
P1_7 2ピン LED2を制御します。
"0":LED 点灯 "1":LED 消灯
P1_6 3ピン LED3を制御します。
"0":LED 点灯 "1":LED 消灯

LED回路を下図に示します。
回路

プッシュスイッチ状態検出

プッシュスイッチ1個の状態を検出することができます。
プッシュスイッチの状態を検出する端子、内容を下記に示します。

R8C/
M12A
端子
ドライブ基板10ピンコネクタ端子 説明
P1_5 9ピン プッシュスイッチ(SW1)の状態を検出します。
"0":押されているとき "1":離されているとき

プッシュスイッチの回路を下図に示します。
回路

プログラム「r8cm12a_motordrive4.c」の説明

「r8cm12a_motordrive4.c」の中に、main関数と、モータドライブ基板Ver.4に接続されている機器を制御する関数を入れています。
液晶のライブラリのように、モータドライブ基板Ver.4を制御する関数をライブラリファイルに分けてもよかったのですが、今回はマイコンカーのプログラムと同様に、一つのCファイルに入れてみました。時間があれば「motordirve4_lib.c」などのファイル名でライブラリ化してみてください。

プッシュスイッチの読み込み

■関数
書式 unsigned char pushsw_get( void );
内容 プッシュスイッチの状態を読み込みます。
引数 無し
戻り値 プッシュスイッチの状態
1:ON 0:OFF
使用例
  if( pushsw_get() == 1 ) {
    // SW ONなら
  } else {
    // SW OFFなら
  }

LEDの点灯

■関数
書式 void led_out( unsigned char led );
内容 LED(LED2,LED3)を点灯/消灯させます。
引数 LED2:bit1 LED3:bit0
"0":消灯 "1":点灯
戻り値 無し
使用例
  led_out( 0x0 );   // LED2:消灯 LED3:消灯
  led_out( 0x1 );   // LED2:消灯 LED3:点灯
  led_out( 0x2 );   // LED2:点灯 LED3:消灯
  led_out( 0x3 );   // LED2:点灯 LED3:点灯

モータ速度制御

■関数
書式 void motor( int accele_l, int accele_r );
内容 左モータ、右モータを制御します。
引数 左モータ -100:逆転100% 0:停止 100:正転100%
右モータ -100:逆転100% 0:停止 100:正転100%
戻り値 無し
使用例
  motor( -50,  50 );  // 左:逆転 50% 右:正転 50%
  motor( 100, 100 );  // 左:正転100% 右:正転100%
  motor(   0, -30 );  // 左:停止     右:逆転-30%

サーボ制御

■関数
書式 void handle( int angle );
内容 サーボを制御します。
引数 サーボ操作角度:-90〜90
-90で左へ90度、0でまっすぐ、90で右へ90度
戻り値 無し
使用例
  handle( 0 );    // 0度(まっすぐ)
  handle( -90 );  // 左へ90度
  handle( 45 );   // 右へ45度

シンボル定義

PWM周期やサーボのセンタ値の設定をします。

シンボル 内容
PWM_
CYCLE
左モータ、右モータ、サーボに加えるパルスのPWM周期を設定します。3つ共通です。設定値は次のようになります。
PWM_CYCLE=制御周期/400ns−1
サーボの周期は標準で16msです。モータは1msくらいが良いのですが、1msだとサーボが動作しないのでサーボの制御周期の16msに合わせます。
PWM_CYCLE=16ms/400ns−1=39999
SERVO_
CENTER
サーボが真っ直ぐになる値を設定します。概ね、真っ直ぐになるサーボのON幅は、1.5msです。よって、SEERVO_CENTERは次の値になります。
SERVO_CENTER=ON幅/400ns−1=1.5ms/400ns−1=3749
ただし、サーボによってセンタ値が異なるため、3749の値で動作させて、ずれに応じてこの値は適宜調整します。
※この値はサーボによって必ず異なります。動作させているサーボに合わせて必ず調整してください。
HANDLE
_STEP
サーボが1度動くときの値です。
サーボに加えるパルスのON幅を設定するレジスタ「trcgrc」に、この値を増減すると、サーボの角度が1度、増減します。サーボに加えるパルス幅とサーボの角度の関係は、一般的に下記のようになります。
0度:1.5ms
左90度:0.7ms
右90度:2.3ms
よって、右90度から左90度まで、180度分動作するパルスの差は
180度分のパルスの差=2.3−0.7=1.6ms
1度当たりのパルス幅は、
1度当たりのパルス幅=1.6ms÷180=8.89μs
trcgrcは1あたり400ns分のON幅なので、8.89μs分のON幅の値は
1度当たりの値=8.89μs÷400ns=22.22
今回のプログラムでは整数のみを扱うので四捨五入して、22が1度あたりの値となります。

プログラムを下記に示します。

#define PWM_CYCLE       39999   /* モータPWMの周期  */
#define SERVO_CENTER    3750    /* サーボのセンタ値 */
#define HANDLE_STEP     22      /* 1゜分の値        */

main関数

まず、init関数を呼んで、R8C/M12Aの内蔵周辺機能の初期化を行います。
次に、プッシュスイッチを押すまで、モータドライブ基板のLED 2個を点滅させます。プッシュスイッチを押すと、次に移ります。

void main( void )
{
  init();                       /* 初期化               */

  /* プッシュスイッチを押すまでLEDの点滅 */
  while( pushsw_get() == 0 ) {  // プッシュスイッチが押されていなければ
    led_out( 0x01 );            // whileループを繰り返す
    timer( 100 );
    led_out( 0x02 );
    timer( 100 );
  }

  /* LED消灯 */
  led_out( 0x00 );

次に、motor関数、handle関数を使って、左モータ、右モータ、サーボを動作させます。

  /* モータ、サーボ動作 */
  while( 1 ) {
    motor( 50, 0 );
    timer( 2000 );

    motor( 0, 50 );
    timer( 2000 );

    motor( -50, 0 );
    timer( 2000 );

    motor( 0, -50 );
    timer( 2000 );

    motor( 0, 0 );

    handle( 30 );
    timer( 2000 );

    handle( -30 );
    timer( 2000 );

    handle( 0 );
    timer( 2000 );
  }
}

R8C/M12Aマイコンで、モータドライブ基板Ver.4を制御することができました。製作した装置に組み込んで、自由自在に制御してみましょう!!


BACK