TADAです。
ブログのメッセージにて、ArduinoからVNH5019を操作する方法について質問を受けました。
本当は大会レポートが先にくるはずですが、こっちの方が早くかけたので先に公開します。

 thumb_IMG_4180_1024

VNH5019搭載モータードライバについて


主な入手先は
スイッチサイエンス(日本)
朱雀技研工房ストア(日本)
Pololu(海外)

これ以外にもあるかもしれませんが、これだけあれば入手に困ることは無いかと思います。 
朱雀技研かPololuを使えば、VNH5019チップ単体で購入することもできます。詳しくは、それぞれのショップで"ST VNH5019A"等のキーワードで検索してみてください。基板加工の環境がある人は、自作したほうが安く済むかもしれません。 制御方法は、パラレル+PWMです。
A,Bの2本のデジタルピンで回転方向・フリー・ブレーキを決定し、PWMピンで出力にPWMをかけることができます。PWMの最大周波数は20kHzです。

CSピンとENピンを使った電流制限回路


CS(Current Sense)ピンとGNDとの電圧を読み込むことで、モータに流れている電流を検出することができます。
EN(Enable)ピンを外部でGNDに落とすことで、A,B,PWM全てのロジック操作を無効にすることができます。ただし、Hブリッジへ供給されたパワーを遮断する能力はありません。

CSピンとENピンを使うことで、モータの電流制限回路を簡単に実装できるようになっています。
実装方法として、マイコンを使う方法と、回路的に実装する方法があります。

マイコンを使う場合、CSピンをマイコンのADCに、ENピンをデジタルピンにそれぞれ接続します。
ACDで読み込んだCSの電圧から、モータの電流値を監視し、CSピンから出力される電圧が閾値を上回ったら、ENピンをHIGHからLOWに落とし、モータを解放します。閾値を下回っていれば、ENをHIGHに戻し、モータ出力を有効化します。
この処理を、高い周期でサンプリングし繰り返すことで、リアルタイムの電流制限回路を実装できます。 もう一つの方法として、先述のアルゴリズムを回路的に実装する方法があります。
コンパレータを使う方法を例としてあげます。
半固定抵抗等でつくった基準電圧と、CSピンから出力された電圧をコンパレータに通し、その出力をENピンに接続します。こうすることで、CSピンから出力される電圧が閾値を上回ったら、ENピンがHIGHからLOWに落ちる回路が実装できます。 

どちらの方法にも、メリット・デメリットがあると思うので、環境によって使い分けるといいと思います。マイコンで実装したほうが、始動電流が大きなモーターへの実装がし易いかもしれません。
とにかく、VNH系のモータードライバを使うなら、ぜひ実装しておきたい機能です。モータの保護機能は、ロボットの信頼性を大きく向上させます。

Arduinoを使って制御してみる

thumb_IMG_4183_1024
PololuのArduino-Micro互換機 "A-star 32U4 Mini SV (as Arduino)" を使って実験します。
VNH5019は、logic電源2.5Vから動作しますので、3.3V駆動のCPUからでも問題なく制御することができます。Arduino DUEやSTM32 Nucleo等でも制御が可能です。

今回は、電流制限回路は実装していないので、ベタ打ちプログラミングで回してみるだけのテストです。
制御に必要なピンは以下の5本のピンです。

1, VDD (+5V)
2, GND (GND)
3, IN_A (デジタルピン)
4, IN_B (デジタルピン)
5, PWM (PWM出力ピン) 
※カッコ内はArduinoのピン

サンプルソースコードです。
const byte VNHpin_A = 8;    // 方向指定ピンA
const byte VNHpin_B = 7;    // 方向指定ピンB
const byte VNHpin_P = 9;    // PWMピン

void setup() {}

void loop() {

  pinMode (VNHpin_A, OUTPUT);
  pinMode (VNHpin_B, OUTPUT);
  pinMode (VNHpin_P, OUTPUT); // 無くても良い

  while (true) {
    VNH_setSpeed (100);
    delay (500);
    VNH_setSpeed (0);
    delay (500);
    VNH_setSpeed (-100);
    delay (500);
    VNH_setSpeed (0);
    delay (500);
  }
}

void VNH_setSpeed (const int pwm_value) {
  
  if (pwm_value > 0) {
    digitalWrite (VNHpin_A, 1);
    digitalWrite (VNHpin_B, 0);
    analogWrite  (VNHpin_P, abs(pwm_value));
  }
  else if (pwm_value < 0) {
    digitalWrite (VNHpin_A, 0);
    digitalWrite (VNHpin_B, 1);
    analogWrite  (VNHpin_P, abs(pwm_value));
  }
  else {
    digitalWrite (VNHpin_A, 0);
    digitalWrite (VNHpin_B, 0);
    analogWrite  (VNHpin_P, 0);
  }
}
0.5秒おきに{正転(+100)→停止(0)→逆転(-100)→停止(0)} を無限にくりかえします。
今回は、7番,8番ピンを、それぞれIN_A, IN_Bに接続し、9番ピンをPWM出力として使用します。
関数VNH_setSpeed() は、値が0より大きいか小さいかで回転方向を指定する関数の例です。

【関数】

VNH_setSpeed (speed);

speed : 範囲 -255 ~ 0 ~ 255
0のとき、モーターはフリーになります。 


自分がモータ制御関数をつくる際は、上のサンプルとほぼ同じ構造の関数を、Classをつかって抽象化し、メインプログラム中で、必要な数だけ実体化して使っています。
正直、Classをよく分かっていないので、意味不明なことを言っているかもしれません。これから、Kpの助けも借りながら、もっと詳しく勉強していきたいと思っています。


以上、ArduinoをつかったVNH5019搭載モータードライバの制御方法についてでした。 
また近いうちにJAPAN-OPENについての記事を書きます。それでは