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

Arduino のマルチタスク (5) サーボと Lチカを独立して動かす

もう何年もタラタラと遊んでいた「ファンタシースターオンライン 2 (PSO2)」という MMORPG が、「PSO2 ニュージェネシス (PSO2NGS)」にアップデートされたので、せっせとレベリングに勤しんでおります。
またタラタラと何年も遊べるように、もうちょっとだけレベルを上げておきたいの。
そんなわけで、電子工作は放り出して、PSO2NGS 三昧な日々を過ごしております (^_^;)

閑話休題。

Arduino のマルチタスクとクラスについて、勉強中です。

Multi-tasking the Arduino - Part 1
Once you have mastered the basic blinking leds, simple sensors and buzzing motors, it’s time to move on to bigger and better projects. That usually involves com...

前回は、C++ クラスを使ってサーボモータをインスタンス化しました。これにより、複数のサーボモータを独立して動かすことができるようになりました。
まぁサーボモータが 1 台しかないので、目出度さもちう位也、な気分ですが (;´Д`)

Arduino のマルチタスク (4) サーボモータをクラスで動かす
Arduino のマルチタスクとクラスについて、勉強中です。 前回は、C++ のクラスを使用して複数の LED を独立して点滅させてみました。 でもまだまだ、わかったような、さっぱりわからんような (^_^;) 理解を深めるために、今回は、...

サーボと L チカはいくつ必要ですか?

Multi-tasking the Arduino – Part 1 では、サーボモータ 2台と LED 3 個を制御していますが、残念ながら俺の部品箱にサーボモータは 1 台しかなかったので、サーボモータ 1 台と LED 3 個を制御することにします。
どちらも必要な数だけインスタンス化すれば良いので、考え方は変わりません。

A clean sweep 回路図

回路図です。

これまでに作っていた L チカの回路と、サーボモータの回路を組み合わせただけです。

前回も書きましたが、サーボモータは意外と電気食いますから、5V 電源はしっかりしたものにしましょう。
データシートに記述がないので実験してみたいと考えていますが、グーグル先生によると 300~500mA はみておかないといけなさそうです。もちろん負荷をかければ電流値は大きくなりますし、台数が増えれば台数分だけの容量が必要です。
なので Arduino の 5V 出力は避けたほうがいいでしょう。

スケッチ

これも、これまでに作った L チカのスケッチと、サーボモータのスケッチをマージしただけです。少し書式や変数名を修正した部分がありますが、機能に違いはありません。

  1. #include <Servo.h>
  2. class Flasher {
  3.   byte ledPin;
  4.   unsigned long OnTime;
  5.   unsigned long OffTime;
  6.   bool ledState;
  7.   unsigned long previousMillis;
  8.   public:
  9.   Flasher(byte pin, unsigned long on, unsigned long off) {
  10.     ledPin = pin;
  11.     pinMode(ledPin, OUTPUT);
  12.     OnTime = on;
  13.     OffTime = off;
  14.     ledState = LOW;
  15.     previousMillis = 0;
  16.   }
  17.   void Update() {
  18.     unsigned long currentMillis = millis();
  19.     if ((HIGH == ledState) && (OnTime < currentMillis - previousMillis)) {
  20.       ledState = LOW;
  21.       previousMillis = currentMillis;
  22.       digitalWrite(ledPin, ledState);
  23.     }
  24.     else if ((LOW == ledState) && (OffTime < currentMillis - previousMillis)) {
  25.       ledState = HIGH;
  26.       previousMillis = currentMillis;
  27.       digitalWrite(ledPin, ledState);
  28.     }
  29.   }
  30. };
  31. class Sweeper {
  32.     Servo myservo;
  33.     byte updateInterval;
  34.     unsigned long lastUpdate;
  35.     byte pos;
  36.     byte increment;
  37.   public:
  38.   Sweeper(byte interval) {
  39.     updateInterval = interval;
  40.     lastUpdate = 0;
  41.     pos = 0;
  42.     increment = 1;
  43.   }
  44.   void Attach(byte pin) {
  45.     myservo.attach(pin);
  46.   }
  47.   void Update() {
  48.     if (updateInterval < millis() - lastUpdate) {
  49.       lastUpdate = millis();
  50.       pos += increment;
  51.       myservo.write(pos);
  52.       if (180 <= pos || 0 >= pos) increment = -increment;
  53.     }
  54.   }
  55. };
  56. Flasher led1(11, 123, 400);
  57. Flasher led2(12, 350, 350);
  58. Flasher led3(13, 200, 222);
  59. Sweeper sweeper1(15);
  60. void setup() {
  61.   sweeper1.Attach(10);
  62. }
  63. void loop() {
  64.   led1.Update();
  65.   led2.Update();
  66.   led3.Update();
  67.   sweeper1.Update();
  68. }

Now we have 5 independent tasks running non-stop with no interference.  And our loop() is only 5 lines of code! 

https://learn.adafruit.com/multi-tasking-the-arduino-part-1/a-clean-sweep

ブレッドボード

A clean sweep ブレッドボード

実験に使ったブレッドーボードのようすです。

サーボモータはお馴染みの SG90 です。コネクタの左に LED が 3 個あります。

Arduino は UNO を使いました。いつぞや AVR が故障して交換したやつですが、順調に働いてくれています。

一番下のブレッドボードは電源回路です。三端子レギュレータ 7805 なので 1A の電流は十分にとれると思います。
が、それでもサーボモータを動かすと出力電圧はかなりパルス状になります。電流だけが原因ではないのかもしれません。この辺も今度調べてみたいですね。


Next we’ll add a button so we can interact with some of these tasks.

https://learn.adafruit.com/multi-tasking-the-arduino-part-1/a-clean-sweep

さて、次回はこれにスイッチを取り付けて、一部のタスクの操作ができるようにしてみましょう。

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