Arduinoで複数のサーボモータを制御する [PCA9685]
うす、今日めちゃくちゃ寒いですね。しにかけました。
前回の
ボストンダイナミクスを超える - 自由研究をします。これの続きです。
この記事見直して思ったんですけど、題名に書いてる割にボストンダイナミクス社について一切触れてないですよね。ハッタリに使われるBD社...
して
目指す機体に必要不可欠なモーターがあります。「サーボモータ」です。
あのクルクルまわるモータの一種なのですが、なにが特徴かというと
「角度の指定と保持」
が可能なのです。まあ簡単に言えば腕の関節みたいなものなんですね。
どういうところに使われているのかというと、ラジコンカーのハンドリングのために使われていたり(何度曲げてカーブするか..みたいに角度を調節できる)、鍵の施錠だったり(自室の扉にオートロックキーをつくる - 自由研究をします。ちょうど僕の記事でも使っています)、もちろんロボットの関節に使い自由な動作の実現にも役立っているわけなのです...。
Arduinoで使うのは実は簡単
とても便利なサーボモータ、制御が複雑でArduinoで扱うのは困難....ということもなく、じつはとても簡単なものなんです。
というのも最初からIDEに(いまさらなんですけど僕のArduino開発環境はArduinoIDEです、異論は結構聞きました)はいってるライブラリの中にサーボモータ用のものがあり、それをつかえばいとも簡単にArduinoでサーボモータを制御することができちゃうんです。
Arduinoとの接続もとても簡単で、サーボモータの信号線(大体の場合黄色か橙色の線です)をPWM出力のできるピンに接続、
サーボモータの電源線(大体赤色か白色)を5Vピンに(ここで話してるサーボモータは僕がいつも使うものを想定しているので、ご自身で使う場合はモータに付属しているであろうデータシートを元に外部電源を用意するなりArduinoからの電源を使うなりよろしくお願いします)接続し
あとはグラウンド線(大概黒)をArduinoのGNDピンに接続して完了です。
特別なドライバも要らないはずです。
の、はずなのですが
今回作りたいロボットで使いたいサーボモータの数がキモです。
合計9個を使いたいのですが、Arduino単体で制御できるサーボモータの数には限りがあります。
というのも
さっき、さらっと「サーボモータの信号線をArduinoのPWM出力ができるピンに接続」って言いましたが
ArduinoUNOでそれができるピンはデジタル3,5,6,9,10,11ピンとアナログピンのA0からA5ピンまでの12ピンなんですよね。
いや、一応間にあうっちゃあ間に合うんですけど「スマート」じゃないじゃないですか。
特にアナログピンが埋まってしまうのはセンサ系を活用するときに死活問題となりえますし、ほかのピンも埋まってしまってはそのうち「使いたいときにサーボモータの制御のために埋まっちゃってる」とかなったらいやです。
そこで
これを購入しました。
HiLetgoのPCA9685です
商品説明に「サーボモータに」とかかれていますけど、別にLEDの明るさ制御などにつかってもよさそうです。
はい。
今回はこれで複数のサーボモータの制御を試してみます。
つかうサーボモータです。SG90、比較的安価で小型ですし入手しやすいのでアマゾンで10個入りを買いました。
いつも使ってる青いやつとは少し違う、ガワが黒いものです。データシートをみてもまあ同じ感じなのでいつものとおり使っていきます。
注意書きというかまえおきなんですけど
この記事は(というよりこのブログ全般にいえますけど)とりあえず難しいことはおいといてこうしたらうごくわよ!的なことを書いてるので難しいこと知りたかったらよそへお行きって感じです。
しっ!ここはお前のようなまじめな勉学者がくるようなところじゃないよ!
PCA9685電源の電源事情
まずサーボモータへの電源供給ですが
単三電池、4本!w つまり6Vですね。
端子台にのめりこまします。
PCA9685自体への電源供給は5Vで、Arduinoの5Vピンからの出力で間に合いそうです。これはこの後のピン接続の項で書きますね。
Arduinoとの接続方法
PCA9685のGNDをArduinoのGNDに、
PCA9685のSCLをArduinoのSCLに、
PCA9685のSDAをArduinoのSDAに、
PCA9685のVccをArduinoの5Vピンに、
接続します(OEピンには触らないでいいです。V+ピンはサーボモータへの電源供給のためのピンだと思うんですけど、さっき端子台に電池を接続したのでこれもノータッチでよさげです)
イラスト描いたんですけど余計わかりにくいですね。せっかく書いちゃったんでここで供養します。
サーボモータの接続
便利なピンヘッダが用意されているのでここに挿します。念のため書いておきますが、黄色のピンヘッダが信号用で黒がグラウンド、赤が電源です。
プログラムのほうの解説です。
秋月電商のホームページのPCA9685に
I2C接続16チャンネル サーボ&PWM駆動キット: 組立キット 秋月電子通商 電子部品 ネット通販
に載っているArduino用のライブラリを導入します。
http://akizukidenshi.com/download/ds/akizuki/PCA9685.zip
ここからダウンロードできます。
スケッチです。
Arduinoに書き込むスケッチです。
ネットの海から捕獲してきた誰かの作ったコードです。
毎回「Carbon」っていうコードを画像ファイルに変換するサイトでしているんですけど(記事内でコードをそのまま書くと冗長に見えてしまうと思ったので)、コピペすることを考えたらそのまま変換なんてせずに生地内にペーストしたほうがよさげですかね
自分なりに読み解いた結果の解説を書こうと思ったんですが...。
でもその前に
PCA9685を操りたくてこのブログにたどり着いた諸君にこのコードを授けます。
簡単ですね!たぶんネットで見つけれるこれに関するコードで一番短いと思います。
中身を説明すると、setupの前の場所で設定を定義しsetup内でpwm出力の設定、loop内でサーボモータを操作しています。
loop内ですが
なんとなく僕の理解してる範疇内でなんとなく説明すると、
- "int angle =180;" で変数angleを設定、180を入れる
- "angle = map(angle,0,180,SERVOMIN,SERVOMAX);"
map関数で変数angleの値をサーボモータに適した値に変える - "pwm.setPWM(0,0,angle); で動かすサーボの指定、角度を変数angleで指定
って感じです。
最後の一行の"pwm.setPWM(0,0,angle);" ですけどパラメータの "0,0,angle" の話で、一つ目の数字はサーボモータの指定なんですよ。
そして言わずもがななんですけど、コード内で変数angleを使った三つ目は角度指定、じゃあ二つ目のやつって何なんですかね...動作速度?でもないみたいだし...大体の解説ページで0が代入されていたので僕もそうしてるんですけど、誰かわかる人教えてください。
最初に貼った優秀なコードを入れて動かしてみます。
シリアルモニタに "t x" (xには任意のサーボモータの番号をいれてください)を打ち込んで操作したいサーボモータの指定、
”m y” (yには任意のサーボモータの角度を入れてください。0~180です)を打ち込んでさっき指定したサーボモータの角度を制御します。
さすが人の書いたコード、とても丁寧ですし便利ですね。
まとめ
意外と簡単な制御でした。I2C通信を完全に理解したとは言いませんが他人の書いたものを引っ張ってごちゃごちゃするだけで付き合っていけてるのはよきだと思います。
ロボット製作ですが、ファンディングをCAMPFIREの方ですることにしました。
この前申請した結果、不備があったらしく再申請しろって感じで返されたので、今度は完璧に提出しようと今作ってるところです。
今回扱ったPCA9685ですが本番というか実際の機体ででも使う予定です。
サーボモータの制御のみの用途としてだけでなくPWM出力としても使えますので(これは最初のほうでも言いましたね)足の先のモータのドライバを操るためにも使おうかなと思います。
読んでくださりありがとうございました。
[ この記事はブログ投稿者の憶測や考えによりつくられています。
よって書いてある内容に誤りや言い間違いがあるかもしれません。もし修正したほうがいい場所や「こういった言い方のほうが”ソレっぽい”よ」などがありましたら後に記載してあります、リンク先のツイッターアカウントに教えてくださると嬉しいです:) ]