アフィリエイト広告
アフィリエイト広告

Arduino Nano Every を使ってみる – サーボモータ

前回は、3個のLED、2台のサーボモーター、1個のスイッチを使って、それぞれ独立して動作するマルチタスクのレッスンを、Arduino Nano Every で試してみました。

Arduino Nano Every を使ってみる – マルチタスク
以前、Arduino UNO でやってみたマルチタスク「すべてを一緒に All together now」を、Arduino Nano Every で試してみます。 これは、3 個の LED 、2 台のサーボモータ、1 個の入力スイッチを、...

今回は、ちょっと後先になるのですが、サーボモータを動かすレッスンを、もう一度やってみます。

サーボモータを動かす方法

サーボモータを動かすにはどうすればよいのか。過去に試してみたことがあります。

サーボモータを動かしてみる
すでに「Arduino のマルチタスク」でサーボモータを動かしているのですが、ちょっと基本的なことを試してみたいと思います。 どうすれば動く? えーと、ググってください m(_ _;)m まぁ簡単に言うと、スケッチ例「servo」の中の「k...

サーボモータは、規定の幅のパルスを 1 回与えると、その幅に応じた角度まで動きます。そして、連続して動かすため、あるいは、その位置で止めておくために、20ms 周期でパルスを与える、のでした。
20ms という周期はラフです。周期が半分でも倍でも、サーボモータは動きます。なぜ 20ms なのか。データシートにそう書いてあるから、ですね m(_ _;)m

Arduino には、servo.h というライブラリがあります。これを使えば、そんな動作原理など気にせずにサーボモータは使えます。
でも、そこはそれ、勉強ですから、ライブラリを使わずに動かしてみることにしましょう。

回路図

2 台のサーボモータを動かす回路

サーボモータを動作させる回路は、スケッチ例の Knob にならいますが、サーボモータは 2 台にしています。2 台のサーボモータを、独立して、同時に動くようにします。

入力のボリュームの電源は、Arduino の 5V 出力を使用し、モータの電源と分離します。
アナログ入力のコンデンサ C5 、C6 は、ノイズ除去と、入力のインピーダンスを下げる目的です。

モータ用の 5V 電源容量は、3A 程度以上をお勧めします。Arduino の 5V 出力は避けるのが吉です。

スケッチ

スケッチは、ライブラリを使っていません。ライブラリを使うもよし、使わんでもよし。お好みでどうぞ。
マルチタスクを行なうスケッチなので、クラスを使ってみました。まだよくわからんですが、まぁこんなもんでしょ (^_^;)

  1. // Servo to follow (class) 2022.06.30 meyon
  2. // without library
  3. class Follow {
  4.     byte servoPin;
  5.     byte potentiometerPin;
  6.     int value;
  7.     unsigned long pwmPeriod;
  8.     int minDutyCycle;
  9.     int maxDutyCycle;
  10.     unsigned long prevMillis;
  11.     int dutyCycle;

クラスの宣言とメンバ変数。

  1.   public:
  2.     Follow(byte pot, byte serv) {
  3.       potentiometerPin = pot;
  4.       servoPin = serv;
  5.       pinMode(servoPin, OUTPUT);
  6.       pwmPeriod = 20;
  7.       minDutyCycle = 600;
  8.       maxDutyCycle = 2300;
  9.       prevMillis = 0;
  10.     }

コンストラクタは、全ての変数を初期化します。

pwmPeriod は、パルスの周期 20ms を規定しています。が、ループを回るのに時間がかかるので、実際には 22ms ぐらいで、わりと不安定です。
minDutyCycle と maxDutyCycle は、0° と 180° のときのパルス幅 (μs) です。データシートでは、それぞれ 0.5ms 、2.4ms ですが、個体によってばらつきがあり、今回使ったサーボモータでは、この値が良い感じでした。

  1.   void update() {
  2.     value = analogRead(potentiometerPin);
  3.     dutyCycle = map(value, 0, 1023, minDutyCycle, maxDutyCycle);
  4.     if(pwmPeriod < millis() - prevMillis) {
  5.       digitalWrite(servoPin, HIGH);
  6.       delayMicroseconds(dutyCycle);
  7.       digitalWrite(servoPin, LOW);
  8.       prevMillis = millis();
  9.     }
  10.   }
  11. };

メンバ関数。サーボモータの制御を行ないます。

ボリュームの位置を読み取り、パルス幅に変換します。更新時間を過ぎていれば、パルスを出力します。パルス出力中は delay させているので、その分が周期の遅れになります。

  1. Follow follow1(0, 9);
  2. Follow follow2(1, 10);
  3. void setup() {
  4. }
  5. void loop() {
  6.   follow1.update();
  7.   follow2.update();
  8. }

オブジェクトの生成。
setup() はすること、ないです。
loop() で、インスタンスごとに update() を呼び出します。
言葉が面倒くさい (;´Д`)

ブレッドボード

2 台のサーボモータを動かす

動画ではないですが、とりあえずこんな感じでやってます。ってことで。

まとめ

サーボモータを動かすことはこれまでもやってきているので、特に問題はないでしょう。気をつけなければならないことは、モータ用の電源の容量。1 台あたり 1.2A 以上を確保するのが吉です。

今回試したかったのは、Arduino Nano Every でもそのまま動くか、ってところです。こちらも、特に Arduino Nano と置き換えて比較してませんが、これまでと同様にスケッチ書いて制御できていますので、問題はないだろうと思います。
なお、リファレンスによれば、ライブラリ servo.h は Arduino Nano Every に対応しています。

タイトルとURLをコピーしました