Mira&Luna's nursery lab

旅乙女と発明娘の子供部屋

2つのサーボモータを1つのスイッチでコントロールします。

f:id:miraluna:20181215104752j:plain:w200 Mira

サーボモータ(Servo motor):指定した位置まで指定した速度で回転させることができるモーターのこと。(出典;Mirapedia)

ロボットのアームやジオラマなど、サーボモータは電子工作界隈でも人気のあるパーツ。マイコンにプログラムを書き込めば自在にモーターをコントロールできちゃうんだから、使い勝手が幅広くて、何より楽しいですよね🐔
"サーボ (Servo) の語源はラテン語の 「servus(英語のslave・servantの意)」。"
(出典;Wikipedia)
Servant=召使い → 召使いもちのミラ → ミラはお嬢様 f:id:miraluna:20200516143652j:plain:w50

コメント欄に「2つのサーボを1つのスイッチで動かす方法」というリクエストをいただいたので、試してみました。(takaharaさん、ありがとうございます。)
Arduinoを使ってサーボ(召使い)を制御します🍎

◆ My servant
f:id:miraluna:20210307111953j:plain

使用するサーボモータはTower Proさんの「SG90」という小さなサーボ。そういえば私、サーボモータ、これ1個しか持っていないや🦒


<今回作るプログラムスケッチ>
今回書くスケッチは、スイッチを押すと1つのサーボが動いて、もう一度押すともう一方のサーボが動いて、さらにもう一度押すと両方のサーボがもとの位置に戻るというもの。

.そこでまずサーボを「penA」「penB」と名前を付けて、別のピンにつなぎます。「pen」というのはpenguinという名前の名残です。SG90って、ペンギンに似ていると思いませんか?
サーボをつなぐピンはPWM制御に対応したピン(Arduino UNOならデジタルピンの3,5,6,9,10,11)を使います。
別の名前をつけて別のピンにつなぐことで、それぞれ別の動きをさせることができます。

.次にスイッチを押した回数をカウントするコードを作ります。

p=p+1;
if(p>2){p=0;}

ループの中に書けば、ループごとに"p"の値が1ずつ増えて、2より大きく(3に)なったら0に戻ります。
スイッチを1回押した状態(p=0)、2回押した状態(p=1)、3回押した状態(p=2)をつくり、Arduinoが認識できるようにするわけですね。

."if文"を使って、pの値に応じたプログラムを書きます。

if(p==0){
(pが0のときのプログラム)
 penAが180°まで回転する
}
if(p==1){
(pが1のときのプログラム)
 penBが180°まで回転する
}
if(p==2){
(pが2のときのプログラム)
 penAとBが0°まで回転する
}
Arduinoがpの値を読み取り、その値に対応した3つのうちの1つのプログラムを動かします。


そんな流れで動かしたいと思います。今回は"Servo.h"ライブラリを使用します。


Tea time 🍰
f:id:miraluna:20210302183413j:plain
                       Mira & Luna's nursery lab

<スケッチ>

/*
 * 2つのサーボを1つのスイッチで制御
 * 1回目押すとサーボAが180°へ。2回目押すとサーボBが180°へ。
 * 3回目押すとAとBが0°へ。
 */
#include <Servo.h>
Servo penA;
Servo penB;
int push=7;
void setup() {
penA.attach(6);//PWMにつなぐ。[~]マークの3,5,6,9,10,11
penB.attach(9);
pinMode(push,INPUT_PULLUP);
}
int p=0;

void loop() {
  if(digitalRead(push)==LOW){ //7pinのボタンを押すと実行
  delay(30); //誤作動防止用
  if(p==0){ //1回目のpush
    penA.write(180);
    delay(400);}
  if(p==1){//2回目のpush
    penB.write(180);
    delay(400);}
  if(p==2){
    penA.write(0);
    penB.write(0);
    delay(400);}
p=p+1; //カウント+1
if(p>2){p=0;} //カウントが2を越えたら0に戻る
}
}

penA(B).writeの後の"delay"は、サーボが回転する間の「待ち」です。90°動くのに対して、約0.2秒(delay(200))。
サーボAは6ピンに、サーボBは9ピンにつなぎ、スイッチは7ピンとGNDの間に"押すとつながるスイッチ(タクトスイッチなど)"を入れます。
もし速度を変えるのならば、別のプログラムを書くか、"VarSpeedServo.h"ライブラリを使うとよいと思います。VarSpeedServo.hのダウンロードは🍌こちらの記事🍌にリンクがあるので、記事内からなんとかリンクを見つけ出してくださいね。(面倒な場合はGoogle検索ですぐに見つかるライブラリです🥕)


◆ ブレッドボードで実験🧪
f:id:miraluna:20210307111728j:plain

さっき言ったように私、サーボモータを1個しか持っていないの。
でも実験はできます。サーボモータの信号線を6ピンにさしたときの挙動と、9ピンにさしたときの挙動を両方調べれば無問題よ。

調べた結果、上のプログラムスケッチで無事動作しました。
複数のサーボを制御しようと考えている方々の参考にしてもらえればうれしいです。


サーボモータについての他の記事> ↓

🐠サーボモータを動かす
miraluna.hatenablog.com
🍒つまみを回して回転させる
miraluna.hatenablog.com
🐻ライブラリを使わないでスピードを制御
miraluna.hatenablog.com


ミラでした。
f:id:miraluna:20180806220931j:plain:w200



(上)  (下)
Q. プログラミングの勉強におすすめの本などがあれば教えてください。
A. 私はこの本の古いバージョンを(上)と(下の半分くらい)読みましたが、他にはプログラミングの知識や技術のない素人です。でも、この本(特に(上))はプログラムを実際に作りながら読み進めていくので、実技の授業を受けているみたいでよく身に付きました。時間はかかったけど、趣味でこつこつ進めたので楽しかったです。