2016/08/19

Arduinoでモーターを動かそう

いきなりだが、モーターを動かしたくなった。
唐突で、済まん。

今まで、マイコン制御でモーターを動かす、というのをやったことがないのだ。
夏休み(?)の最後に、自由研究としてやっておこう。


昨日、知人にこれを紹介してもらった。
モーター・リレー・ブザー制御入門 [ SU-1204 ]|製品情報 | エレキット

PDFが日本語で親切なのだが、シールドを購入するとなると今週にはできないな。。。
とあきらめそうだったのだが、そういえばArduinoをキットで購入したときに、モーターを動かす課題があったのを思いだした。

英語の本なので読むのに時間はかかるのだが、絵がちゃんとしてるし、こういう図になっているからこの英語はこうだろう、と読み解くことができる。
本も厚みがあって、なんかよい装丁だ。

モーターの課題は"Zoetrope"だ。
日本語だと「回転のぞき絵」らしいが、専用の単語があるとは。

image

モーターを直接GPIOに挿しても動かせない、というのはなんとなくわかっている。
電流が足りなくて、動かした瞬間にマイコンを動かせなくなってリセットがかかるんだとか。
エレキットPDFには「壊れる」と書いてあるので、やらない方がよさそうだ。

直接挿せないので、間に入ってもらう。
それが、ここではL293D、というチップだ。
チップというか、ICですな。
キット本では"H-Bridge"と書かれている。
エレキットPDFでは、モーターを動かす回路(モータードライバー回路)がH型になるので、Hブリッジ回路と呼ばれる、と説明されている。
H形鋼みたいなものか。

 

Hブリッジの説明はエレキットPDFのp.26に載っている。
トランジスタが4つあり、そのON/OFF組み合わせで電流の流れる方向が決まって、回転する方向が制御できるという代物だ。

ブレーキもできるそうだ。
なんとなく、モーターは回転するしかできないから、今の方向と逆に動かすのがブレーキかと思ったのだけど、そうではないようだ。
ちゃんと、入力をOFFにしただけよりも早く止まるらしいから、ブレーキなんだな。

フリップフロップじゃないけど、禁止状態というのもある。
この組み合わせは設定したらいかん、というやつだ。
壊れるかもしれないので、やらんごとせないかん。


L293DはST(pdf)やTIでデータシートが出てきた。
キットに付属しているのは、よく見えないけどTIじゃなかろうか。

1A-1Yと2A-2Y、3A-3Yと4A-4Yが組になっていて、AがInput、YがOutputだ。

image

image

1Aが2ピン、2Aが7ピンなので、これらがArduinoにつながっている。
1Yが3ピン、2Yが6ピンなので、これらがモーターにつながっている。
VCC1はArduinoの5V、VCC2は電池の9Vにつながっている。

1,2EN(1ピン)はArduinoにつながっている。
これがHだと、出力はH/Lのどちらかになる。
だからずっとHでよいかなー、と思っていたのだけど、そうではないんだ。

TIのデータシートの、この図が近いのかな?

image

ENをLにすると、とりあえずブレーキがかかる、という考え方でよかろうか。

なんか、Hi-Zってイメージしにくいのよねぇ。。。
上のFUNCTION TABLEだって、Z=high impedanceといいつつ、括弧してoffって書いてあるから、じゃあひっくるめてLでいいやん!と思ってしまうのだ。

電気的に絶縁状態だから、プルアップしていればHに、プルダウンしていればLになるというのはわかるのだけど、キット本ではどっちもしていない。
データシートも(off)と書いているから、つながない場合はプルダウンしていますよ、という読み方をすればよいのか。
EN1,2は1A-1Yと2A-2Yの両方にかかるから、EN1,2をLにすると、1Yと2YがL扱いになって、ブレーキがかかる、と。

こういうのをスラスラっと読めるようになるといいなあ、といつも思うのだが、ここまで考えないとまだわからないのだ。

 

さっき、Hブリッジ回路は禁止状態があると書いたが、こういうICはその状態を内部で起こせないようになっているようだ。
だから、そっちは心配しなくてよさそう。


というわけで、EN1,2がHだったら、1A,2AにH/Lが違うように入力させると回転するはずだ。

しかしキット本の回路では、プッシュスイッチが2つと、ポテンショメーターが1つつながっている。
スイッチはモーターの回転方向とON/OFF、ポテンショメーターは速度だそうだ。
速度を変えるということは、えーっと、PWMか。

アプリの方は2ページにわたって説明されている。
そんなに難しいわけでは無い。

  • setup()でGPIOの方向設定と、EN1,2をLにしておく。
  • loop()でスイッチ2つの状態とポテンショメータのAD値を取得
    • ON/OFFスイッチが押されたら、動作フラグをトグル
    • 方向スイッチが押されたら、1A,2Aをそれぞれ逆にする
    • 動作フラグがONだったらポテンショメータのAD値をEN1,2に出力、OFFだったら0出力

あれ、PWMじゃなかったのか?
EN1,2はArduinoの9ピンにつながっている。
ソースではpinMode()でOUTPUT指定だけになっているけど、これでPWMになるのか?
でも、setup()ではdigitalWrite()してて、loop()ではanalogWrite()してる。。。

ああ、analogWrite()はPWMという意味なのか。
ということは、毎回analogWrite()が呼ばれるとPWMの設定をし直しているか、あるいは内部で状態を持っていて切り替わったときだけPWMの設定をしているのだろう。
なんとなく後者だと思うから、setup()でもanalogWrite()した方が時間のばらつきが無くてよいんじゃなかろうか。


そんなこんなで、まずはモーターを動かすことができた。
アプリを適当に実装したせいで動かなかったり、スイッチがブレッドボードにうまく挿せずにチャタリングしまくったりしたが、そういうのは恥ずかしいので省略だ。

今回の例ではEN1,2をPWMにすることで速度調整したけど、A1,A2のH側をPWMにすることもできるはずだ。
まあ、そうするとPWMが2ポートいるから、EN1,2の方が楽か。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。