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

Arduino Nano Every を使ってみる – マルチタスク

以前、Arduino UNO でやってみたマルチタスク「すべてを一緒に All together now」を、Arduino Nano Every で試してみます。

Arduino のマルチタスク (6) すべてを一緒に
PSO2NGS のレベリングをしているかと思いきや、ちょいと忙殺されてまして、全然レベルが上がってません (;´Д`) さて、Arduino のマルチタスクとクラスについての勉強も、Part 1 の最終回です。参考にさせていただいた下記サイ...

これは、3 個の LED 、2 台のサーボモータ、1 個の入力スイッチを、同時に、かつ、独立して、動作させようというレッスンです。スケッチでクラスを利用していますが、Arduino Nano Every でも違いはないはずです。

サーボモータの電源に注意

さて、このレッスンの参考にさせてもらっている adafruit の記事でも、サーボモータの電源は Arduino から供給しています。俺は、とても試してみる勇気はないのですが、これでちゃんと動いているのでしょうか? Arduino の電源を壊してしまいませんか?

サーボモータ SG90 に流れる電流は 1.2A
久しぶりに、部品箱からサーボモータ SG90 を出してきました。 じつは、ずっと気になっていたのですが、サーボモータってどれだけの電流が流れるんですか? 購入した秋月電子通商のサイトのデータシートにも書かれていないし、ググっても明確な答えが...

じつは今回、サーボモータ 2 台のこの回路を組んで最初に動かした時、サーボモータが正常に起動しませんでした。原因は電源です。使っている AC アダプタの電流容量が 360mA だったため、電圧が低下してしまったのです。電流容量 3A のAC アダプタに交換して、正常に起動できました。
が、その後、5V を供給していた三端子レギュレータがやたら熱くなっていることに気づきました。電源電圧も 4.8V ほどまで低下しています。使っていたのはいつもの NJM7805 。こいつの最大電流は 1.5A です。小型のヒートシンクを付けてありますが、触った感じで 40℃ 以上になっているようです。

なんかねぇ、いつもの調子でいつもの電源を使ってうっかりしていたのですが。そうです、サーボモータには 1.2A 流れるんだと、つい先日確認したばかりじゃぁないですか > 俺 (;´Д`)

ということで、最終的に使用した電源は、パソコン用の電源ユニットを改造した電源装置。5V の出力電流は 28A です。これで、サーボモータを 2 台動かしても、電源電圧が 5V を下回ることがなくなりました。

回路図

回路図も、基本的に以前やったときと変わりません。
サーボモータが 2 台になってます。抵抗、コンデンサの定数が少し違っています。が、大勢に影響あるような変更ではありません。

スケッチ

スケッチにも変更はありませんが、サーボモータを 2 台に増やしています。詳細は過去記事を参照下さい。

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

動作の様子

2 台のサーボモータ、3 個の LED が、それぞれ独立した速度、周期で動いています。スイッチを押すと、サーボモータ 1 台と LED 1 個の動きが停止します。
Arduino Nano Every でも、全く問題なく動きました。

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