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

主な入手先は
・スイッチサイエンス(日本)
・朱雀技研工房ストア(日本)
・Pololu(海外)
これ以外にもあるかもしれませんが、これだけあれば入手に困ることは無いかと思います。
朱雀技研かPololuを使えば、VNH5019チップ単体で購入することもできます。詳しくは、それぞれのショップで"ST VNH5019A"等のキーワードで検索してみてください。基板加工の環境がある人は、自作したほうが安く済むかもしれません。 制御方法は、パラレル+PWMです。
A,Bの2本のデジタルピンで回転方向・フリー・ブレーキを決定し、PWMピンで出力にPWMをかけることができます。PWMの最大周波数は20kHzです。
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系のモータードライバを使うなら、ぜひ実装しておきたい機能です。モータの保護機能は、ロボットの信頼性を大きく向上させます。

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のピン
サンプルソースコードです。
今回は、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についての記事を書きます。それでは
ブログのメッセージにて、ArduinoからVNH5019を操作する方法について質問を受けました。
本当は大会レポートが先にくるはずですが、こっちの方が早くかけたので先に公開します。

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を使って制御してみる

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についての記事を書きます。それでは
コメント
コメント一覧 (6)
http://akizukidenshi.com/catalog/g/gI-01570/を使おうと思っているのですが、抵抗22kオーム、セラコン0.22マイクロFだと検出距離はどれくらいになりますか?
あと良い改良法があったら教えてください!
回路がわからないので、質問に答えられません、ごめんなさい。
>改良法
電源投入時にセンサー感度が高くなる、という特性があるようです。センサーのVcc(電源+)にトランジスタやFETを挟んでスイッチングし、電源投入直後のセンサーパルスを読み込む事で、遠くのボールを検出したりする事ができるようです。
詳しくはご自分で調べてみてください(参考記事↓)
http://blog.livedoor.jp/tec_kanpaku/archives/2214610.html
検出距離がみじかいことで悩んでいたので助かりました、スイッチング実践してみたいと思います!
閾値はどのようにして決めればいいでしょうか?
また、"高い周期でサンプリング"とは具体的にどの程度の周期でしょうか?
教えてください。
例えば,出力電流が可視化された電源装置を使ったり,VNHドライバの出力間に,ある程度ワット数の大きな抵抗を挟み,それの両端電圧と抵抗値から電流を求めるなどして,モータードライバに流れる電流を知ることができると思います.
あとは,目的の電流が流れている状態でのCSピンの電圧を読んで,それに対応する処理を回路的あるいはソフトウェア的に行えば良いと思います.
高い周期とは,可能な限り高い方が望ましいのですが,ソフトウェア的に処理する場合は,その処理専用にマイコンを使っていない限りは,他の処理に影響する場合があります.できる限り早くするという良いでは,回路的に実装するのが望ましいと思います.
オシロスコープ等で波形を観測しながら,電流が平滑化されている事を確認しつつ,最適なサンプリング周期を決めるのが良いと思います.
まずは可変抵抗とコンパレータを使って簡単なものは実装できますので,原理を理解する意味でも試して見てはどうでしょう.自分が試したのは,可変抵抗で作った電圧とCSピンをコンパレータで比較して,出力をイネーブルピンに戻す方法で,確かにある程度力がかかるとモーターが音を出して回転を弱める動作が確認できました.
音がなるのは
電流が閾値を超える→モータOFF→電流が閾値を下回る→モータON
の動作を,回路的に高速で繰り返すからです.
やってみます。
ありがとうございます。