フォト
2017年8月
    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 31    
無料ブログはココログ

« Digisparkを試してみました | トップページ | Lenovo Miix 2 8 のBIOSをアップデートしました »

2014年12月17日 (水)

DRV8830を使ったDCモーターの制御(1)

arduinoでDCモーターを制御したいと思い、I2C接続で制御できるDRV8830を試してみました。
秋月電子のDRV8830モータードライバモジュールを使いました。
税込170円と安いです。

モーター制御の知識はあまりないので徐々に勉強していきます。



モジュールはこんな感じ。思ったよりもも小さいです。

Dscn3340

こんな小さいICでDCモーター駆動出来るんですねぇ。
最終的にATtiny13Aを使って赤外線リモコンでダイソーのプチ電車を動かすのが目標です。

ダイソーのプチ電車(100円)

Dscn3329

100円でDCモータ付きです。
Dscn3330

DRV8830を使ったモジュールは他にいくつかあるようです。
秋月電子 DRV8830使用DCモータードライブキット
秋月電子 フルブリッジドライバ DRV8830DGQR(2個入)
ストロベリー・リナックス I2Cモータードライバ・モジュール DRV8830

データーシート等の資料はストロベリー・リナックスの製品のものが大変参考になります。

それでは実験です。

回路図
次のような配線を行いArduino Unoに接続します。データシートおよび
上記製品のモジュールの回路を参考にしました。

01

部品
  C1,C2   0.1μF セラミックコンデンサ
  C3       1000pF セラミックコンデンサ
  R1,R2   2.2kΩ 1/4W 炭素被膜抵抗
  R3       0.2Ω 1W 炭素被膜抵抗(1Wなのはこれしか入手出来なかったためです)
  M1       ダイソーのプチ電車のDCモーター(多分 秋月FA-130RA-2270相当)
 
実装

Dscn3337

Dscn3336

プチ電車は、電池ボックス部を切除しました。

Dscn3331

スケッチ
動作は加速正回転、減速正逆転、停止、加速逆回転、減速逆回転、停止を繰返します。
徐々に電圧の上げ、下げをしています。
DRV8830によるモーター制御は、関数 int write_vset(byte vs, byte ctr) で行っています。
vs で電圧を指定、ctrでブリッジ制御(正転、逆転、スタンバイ、ブレーキ)を指定します。

vs(VSET)の設定値(5V電源利用時)03
出力電圧の実測値を測定すると0.1Vほど低いです。
VSET 0x08h 以下はモーターが回転しませんでした。
テストでは、0x09h〜 0x15h (0.72V〜 1.69V)の範囲で電圧を指定しています。

ctrの設定値(2進数)
  00   スタンバイ
  01   逆転
  10   正転
  11   ブレーキ

  スタンバイ、ブレーキともモーターの回転は停止となります。

DRV8830がほとんどやってくれるので、スケッチはシンプルです。
今回のテストでは、ピン8に接続しているFAULTの処理は作りこんでいません。
今後、ピンの変化を割り込みで処理しエラーの対応を行いたいと思います。

#include <Wire.h>

// I2Cアドレス
#define DRV_ADR   0x64  // DRV8830のI2Cアドレス
#define CTR_ADR   0x00  // CONTROLレジスタのサブアドレス
#define FLT_ADR   0x01  // FAULTレジスタのアドレス

// ブリッジ制御
#define M_STANBY  B00   // スタンバイ   
#define M_REVERSE B01   // 逆転
#define M_NORMAL  B10   // 正転
#define M_BRAKE   B11   // ブレーキ

// 電圧定義
#define MAX_VSET 0x15   // 1.69V
#define MIN_VSET 0x09   // 0.72V

// 制御コマンド送信
int write_vset(byte vs, byte ctr) {
  Wire.beginTransmission(DRV_ADR);
  Wire.write(CTR_ADR);
  Wire.write( ctr + (vs<<2) );
  return Wire.endTransmission();
}

void setup() {
  Wire.begin();
}

void loop() {
  // スタンバイ
  write_vset(MIN_VSET, M_STANBY); 
  delay(1000);
  
  // 順方向 徐々にスピードを上げる
  for (byte i = MIN_VSET; i <= MAX_VSET; i++) {    
    write_vset(i, M_NORMAL);
    delay(1000);
  }
  
  // 5秒間最大電圧  
  delay(5000);
  
  // 順方向 徐々にスピードを下げる
  for (byte i = MAX_VSET; i >= MIN_VSET; i--) {    
    write_vset(i, M_NORMAL);
    delay(1000);
  }

  // 5秒間最小電圧  
  delay(5000);

  // ブレーキ      
  write_vset(MIN_VSET, M_BRAKE);
  delay(5000);

  // 逆方向 徐々にスピードを上げる
  for (byte i = MIN_VSET; i <= MAX_VSET; i++) {    
    write_vset(i, M_REVERSE);
    delay(1000);
  }
  
  // 5秒間最大電圧  
  delay(5000);
  
  // 逆方向 徐々にスピードを下げる
  for (byte i = MAX_VSET; i >= MIN_VSET; i--) {    
    write_vset(i, M_REVERSE);
    delay(1000);
  }

  // 5秒間最小電圧  
  delay(5000);

  // ブレーキ      
  write_vset(MIN_VSET, M_BRAKE);
  delay(5000);
}

実際の動き
ちょっと分かりにくいですが、雰囲気を感じてください。


意外と簡単にモーターを制御出来ました。発熱等もないです。
ただしこのモジュール、「1Aの最大連続駆動電流」をうたっていますが、
いろいろ調べてみると、実際は200mAの連続駆動が実用レベルのようです。

使い方が分かったので、今度はATtiny13Aに置き換えてみます。
「DRV8830を使ったDCモーターの制御(2)」に続きます。

« Digisparkを試してみました | トップページ | Lenovo Miix 2 8 のBIOSをアップデートしました »

arduino」カテゴリの記事

AVR」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/60825077

この記事へのトラックバック一覧です: DRV8830を使ったDCモーターの制御(1):

« Digisparkを試してみました | トップページ | Lenovo Miix 2 8 のBIOSをアップデートしました »