以前、Arduino UNO でやってみたマルチタスク「すべてを一緒に All together now」を、Arduino Nano Every で試してみます。
これは、3 個の LED 、2 台のサーボモータ、1 個の入力スイッチを、同時に、かつ、独立して、動作させようというレッスンです。スケッチでクラスを利用していますが、Arduino Nano Every でも違いはないはずです。
サーボモータの電源に注意
さて、このレッスンの参考にさせてもらっている adafruit の記事でも、サーボモータの電源は Arduino から供給しています。俺は、とても試してみる勇気はないのですが、これでちゃんと動いているのでしょうか? Arduino の電源を壊してしまいませんか?
じつは今回、サーボモータ 2 台のこの回路を組んで最初に動かした時、サーボモータが正常に起動しませんでした。原因は電源です。使っている AC アダプタの電流容量が 360mA だったため、電圧が低下してしまったのです。電流容量 3A のAC アダプタに交換して、正常に起動できました。
が、その後、5V を供給していた三端子レギュレータがやたら熱くなっていることに気づきました。電源電圧も 4.8V ほどまで低下しています。使っていたのはいつもの NJM7805 。こいつの最大電流は 1.5A です。小型のヒートシンクを付けてありますが、触った感じで 40℃ 以上になっているようです。
なんかねぇ、いつもの調子でいつもの電源を使ってうっかりしていたのですが。そうです、サーボモータには 1.2A 流れるんだと、つい先日確認したばかりじゃぁないですか > 俺 (;´Д`)
ということで、最終的に使用した電源は、パソコン用の電源ユニットを改造した電源装置。5V の出力電流は 28A です。これで、サーボモータを 2 台動かしても、電源電圧が 5V を下回ることがなくなりました。
回路図
回路図も、基本的に以前やったときと変わりません。
サーボモータが 2 台になってます。抵抗、コンデンサの定数が少し違っています。が、大勢に影響あるような変更ではありません。
スケッチ
スケッチにも変更はありませんが、サーボモータを 2 台に増やしています。詳細は過去記事を参照下さい。
- // All together now
- #include <Servo.h>
- class Flasher {
- byte ledPin;
- unsigned long OnTime;
- unsigned long OffTime;
- bool ledState;
- unsigned long previousMillis;
- public:
- Flasher(byte pin, unsigned long on, unsigned long off) {
- ledPin = pin;
- pinMode(ledPin, OUTPUT);
- OnTime = on;
- OffTime = off;
- ledState = LOW;
- previousMillis = 0;
- }
- void Update() {
- unsigned long currentMillis = millis();
- if ((HIGH == ledState) && (OnTime < currentMillis - previousMillis)) {
- ledState = LOW;
- previousMillis = currentMillis;
- digitalWrite(ledPin, ledState);
- }
- else if ((LOW == ledState) && (OffTime < currentMillis - previousMillis)) {
- ledState = HIGH;
- previousMillis = currentMillis;
- digitalWrite(ledPin, ledState);
- }
- }
- };
- class Sweeper {
- Servo myservo;
- byte updateInterval;
- unsigned long lastUpdate;
- byte pos;
- byte increment;
- public:
- Sweeper(byte interval) {
- updateInterval = interval;
- lastUpdate = 0;
- pos = 0;
- increment = 1;
- }
- void Attach(byte pin) {
- myservo.attach(pin);
- }
- void Update() {
- if (updateInterval < millis() - lastUpdate) {
- lastUpdate = millis();
- pos += increment;
- myservo.write(pos);
- if (180 <= pos || 0 >= pos) increment = -increment;
- }
- }
- };
- Flasher led1(11, 123, 400);
- Flasher led2(12, 350, 350);
- Flasher led3(13, 200, 222);
- Sweeper sweeper1(15);
- Sweeper sweeper2(25);
- void setup() {
- sweeper1.Attach(9);
- sweeper2.Attach(10);
- }
- void loop() {
- sweeper1.Update();
- if(HIGH == digitalRead(2)) {
- sweeper2.Update();
- led1.Update();
- }
- led2.Update();
- led3.Update();
- }
動作の様子
2 台のサーボモータ、3 個の LED が、それぞれ独立した速度、周期で動いています。スイッチを押すと、サーボモータ 1 台と LED 1 個の動きが停止します。
Arduino Nano Every でも、全く問題なく動きました。