ピックワールド(PIC World)

インフォメーション

この記事は 2017年02月11日 に以下のカテゴリに投稿されました Robot.

この記事のタグ

, , , , , , , , , , , ,


Arduino で 4 足歩行ロボットを作ってみるかな – (2) Arduino でサーボモーターを動かしてみる

4足歩行ロボットを作ってみるかなの2回目です。

前回は、ロボットの関節部分に使うサーボモータの事を簡単に説明しました。

決められた周期のパルスの中で、そのパルスの長さを変えることによってサーボモーターの回転角度が指定できると。

今回は、その指定を Arduino を使って、簡単なスケッチを描いて、実現してみようと思います。

まずは、これは Arduino の非常に強力で好まれている理由にもなるのですが、Arduino でスケッチを描くときに使うことのできる多くのライブラリがあるのですが、その中にもちろん Servo.h などの、サーボモーターを Arduino で動かすためのものが既に存在します。

あらよって感じで、これらの用意されたライブラリを使ってもよいのですが、もう少し理解を深めたいので、最初は別の方法で、動かしてみようと思います。

それは、PWM をスケッチの中で自分でやっちゃうという方法です。

Arduino にはもともと PWM の機能は装備されている事を知っている人も多いと思いますが、例えば今回から使ってみる Arduino Nano だと、14本のデジタル I/O ポートがあって、その内 6本のポートが PWM を使うことができます。

ただし、ここでいう Arduino に実装されている PWM には仕様が定められていて、490Hz の PWM なのですね。

さて、前回もこの図を使いましたが、もう1度見てみると・・

サーボモーターの動作

サーボモーターの動作

サーボモーターが受け付ける PWM は、50Hz です。したがってとても残念なのですが、Arduino が持っている PWM の機能は、そのままではパルス幅が短すぎて、動作しないだろうなぁということがわかります。

さて、それではどうするか・・

これは簡単ですが、所定のピンのピンモードを指定した後、パルスを出力し、所定の時間 Wait した後、パルスを切るなんて動作をさせれば動くかも・・ね。

では早速やってみますが、その前に今回使うパーツを紹介します。

Arduino Nano

Arduino Nano

今回から、Arduino Nano を使います。別に他意はないのですが、UNO はもう使ってしまって手元にないのと Nano は安価(330円っす)に手に入るからというのが大まかな理由ですが、小さいし、必要に応じて、下のような I/O ボードを使えば、ほぼ UNO と同じように使えるし・・まぁやってみます。

ただし少し調べれば出てきますけれど、CH340G というシリアル変換ドライバを使っているので、これ専用のドライバを別にインストールしておく必要がありますが、1回インストールするだけなので、大した問題では無し。こちらにドライバはあります

CH340 - ドライバをちゃんと導入すれば認識される(問題なし)

CH340 – ドライバをちゃんと導入すれば認識される(問題なし)

ドライバを解凍後インストールして念のため再起動後、USB コネクタを刺すと、全く問題なく認識されますよ。(この場合は COM4 で認識されています)

自分で作ってもよいのですが、サーボを接続するにはこんな装置を使います。

Arduino Nano V3.0 I/O 拡張ボード

Arduino Nano V3.0 I/O 拡張ボード

この I/O 拡張ボードもこんな値段で・・真ん中の黒いコネクタ部分に Arduino Nano を差し込んで使います。

Arduino Nano + Arduino Nano V3.0 I/O 拡張ボード

Arduino Nano + Arduino Nano V3.0 I/O 拡張ボード

なかなか良い感じでしょう?

さて、この後は、いよいよ PWM のスケッチです。

え~と、デジタルピンの 2番を使うことにして、大体こんなことができればよいかと。

  1. デジタルピンの2番にパルスを出力するので、Output モードに指定
  2. 2番ピンに HIGH にしてパルスを出す
  3. Wait する
  4. 2番ピンを LOW にして、パルスを止める
  5. 2番に戻って繰り返し(要するに 20ms の PWMとする)

こんな感じとなるのかなぁと思います。

さて、重要なのが2番ピンを HIGH にしたり LOW にしたりして決めるパルスの幅ですね。

先の記事で説明した通り、SG90 サーボーモーターは、1.5ms のパルスが来るとニュートラル(中点)に動き、0.5ms のパルスだと左いっぱい(-90°)、2.4ms のパルスが来ると、右いっぱい(+90°)に動くことになっています。

まぁあくまでも理解を深めるためにやることなので、各角度をハードコードしてしまいますが、こんな感じ。


int deg;

void setup() {
pinMode( 2, OUTPUT ); // デジタルピン2を OUTPUT モードに指定
}

void loop() {

// deg = 右:600 / 左:2400 / ニュートラル(中点):1500
// 20msec でこのループをずっと実行

deg=2400;
digitalWrite( 2, HIGH ); // On
delayMicroseconds( deg );
digitalWrite( 2, LOW ); // Off
delay(20); // Wait 20msec

}

おそらくは、各命令を実行するために要する時間というのがあるわけだから、そのあたりは多少数値を変える必要があるかもしれませんが、これでとりあえずは動きます。

deg=2400;

と指定してありますが、この数値を deg=600; とすれば右いっぱいにサーボモーターが回転し、左いっぱいにするには deg=2400;、中点(ニュートラル)とするには deg=1500; と指定して、ボードにプログラムを転送すればサーボモーターが動作します。

まぁ、角度を入力して、その角度に移動するといったことも、やってできなくなくはないのですが、サーボモーターの動作を理解するのであれば、これでよいでしょう。

あくまでも、動作を理解するうえで行っていることで、通常は、Arduino に用意されている Servo.h や VarSpeedServo.h ライブラリを使うのが普通です。

次回はこれらの Arduino に用意されている、サーボを動かすためのライブラリを紹介しましょう。

投稿者のプロフィール

minorus
minorus
電子機器が大好きです。
プログラムを書くのをお仕事としていたこともあるので、両方できる PIC や Arduino を使って、いろいろな(役にあんまり立たない)ものを作っています。
実は UNIX 関連のお仕事も長かったので、Raspberry Pi もお手の物なのですけれど、これから触る機会が多くなるのかなぁ。
ボチボチ行きますが、お付き合いください。
若いころの写真なので、現時点では、まだ髪の毛は黒くてありますが、お髭は真っ白になりました。
愛車の国鉄特急カラーのカスタムしたリトルカブで、時々、秋月電子通商の八潮店に出没します。

コメントを残す

最近の投稿

最近のコメント

アーカイブ