Arduino 入門
Lesson 30
【ステッピングモーター編 その3】
「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。
少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。
本記事はLesson 30 【ステッピングモーター編 その3】です。
Lesson 28、Lesson 29では、ステッピングモーターの制御について学習しました。
![](https://omoroya.com/wp-content/uploads/2019/11/arduino-lesson28-00-160x90.jpg)
![](https://omoroya.com/wp-content/uploads/2019/12/arduino-lesson29-00-160x90.jpg)
Lesson 30は赤外線受信センサモジュールを追加してリモコンでステッピングモーターを制御します。
イメージ的にはコントローラーのイメージ。
そこまで、高級な制御のスケッチは書きませんが・・・。
せっかく、モーターを扱う学習なので遠隔で操作したいですよね。
何より、遠隔で何か操作するって面白いんです!
Arduino入門編の解説にて使用しているArduinoは互換品です。
互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
正規品(Arduino UNO R3)の本体単品がほしい方はこちらとなります。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
はじめに
赤外線受信センサの原理、使用方法はLesson 15、ステッピングモーターの原理、使用する電子部品の説明はLesson 28、Lesson 29にて解説しています。
まずは、Lesson 15、28、29を学習してからLesson 30に取り組むことをお勧めします。
ではさっそく本題に入ります。
ステッピングモーターをリモコンと赤外線受信センサで制御するとは以下のことをするということです。
- リモコンから送信されたパルスを赤外線センサで受信しArduinoでコードとして読み取る。
- 読み取ったコードによって、if文やcase文でステッピングモーターに制御信号を送信する。
Lesson 30 目標
本Lessonの目標は以下です。
2.赤外線受信センサの使い方を思い出す。
今回も遊ぶことを最大の目標に楽しみましょう!
準備
ではLessonの準備に取り掛かりましょう。
電子部品の種類はLesson 28で使った電子部品プラス、赤外線受信センサモジュールとなります。
電子部品の詳細はLesson 15、Lesson 28を確認してください。
では、頑張って組み上げていきましょう。
必要なもの
下記に示した電子部品はLesson 15、Lesson 28で使用した部品となります。
- USB接続用のPC(IDE統合環境がインストールされたPC)
→管理人が勝手に比較したBTOメーカーを紹介しています。 - UNO R3(以下UNO)、おすすめUNO互換品(ELEGOO)
- PCとUNOを接続するUSBケーブル
- ブレッドボード安価(大)、ブレッドボード安価(中)
※おすすめブレッドボード(大)、おすすめブレッドボード(中) - ステッピングモーターとドライバモジュール 安価品
- 電源モジュール
- 電源モジュールに供給する電源(9Vの電池
- 9V電池用ソケット
- ACアダプタ 9V/1A
※電池にするか、ACアダプタにするかは使用用途に応じて決めてください。
赤外線受信センサモジュールはリモコンとのセットがおすすめです。
※赤外線受信センサモジュールのみ購入し自宅のテレビのリモコンで制御することも可能です。
●セット
●受信モジュール単品
ステッピングモーターとドライバモジュールはセットで売られています。
数多くほしいかたは、5個セットなどもあります。
※こちらAmazon発送です。
Jumper wire、抵抗は今後も頻繁に利用します。
Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。
短めが使いやすい場合も。
抵抗も単品で揃えるよりはセットをおすすめします。
抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!
という方は、「電子工作基本部品セット」が使い勝手が良い。
使用部品説明
新たに使う電子部品は特にありません。
以下に示す主要部品の詳細はLesson 15、Lesson 28にて解説しています。
- 赤外線受信センサモジュール
- 28BYJ-48 ステッピングモーター
- ULN2003ドライバモジュール
以下の部品に関しては、Lesson 26にて詳細を解説していますのでご確認ください。
ちなみに、ELEGOO UNO キットには全てが合わせて梱包されています。
赤外線受信センサモジュール 使い方
Lesson 15にて詳細を解説しています。
下記をご確認ください。
ステッピングモーター 制御方法
下記はLesson 28、Lesson 29にて解説しています。
詳細は下記をご確認ください。
![](https://omoroya.com/wp-content/uploads/2019/11/arduino-lesson28-00-160x90.jpg)
![](https://omoroya.com/wp-content/uploads/2019/12/arduino-lesson29-00-160x90.jpg)
実践 回路作成とコード作成
Lesson 28の回路に赤外線受信センサモジュールを追加します。
Arduinoのピン配置を確認したい方は番外編02を参照してください。
回路図
ドライバモジュールのコネクトピンにステッピングモーターを接続。
Arduinoはデジタル入出力ピンの8,9,10,11番ピンを使用しドライバーモジュールに接続。
12番ピンは赤外線受信センサモジュールのY(受信データの出力ピン)に接続
8番ピン ⇒ IN4(ドライバモジュール)
9番ピン ⇒ IN3(ドライバモジュール)
10番ピン ⇒ IN2(ドライバモジュール)
11番ピン ⇒ IN1(ドライバモジュール)
12番ピン ⇒ Y(受信データの出力ピン)
上記に加えて電源を確保。
回路図がこちら。
Lesson 28に赤外線受信センサモジュールを追加したのみとなります。
こちらがブレッドボード図。
回路図は「fritzing」を利用しています。
「fritzing」の使い方は下記を参照してください。
接続
下図に示すように、用意した部品を使用して接続しましょう。
部品は赤外線受信センサモジュール、ステッピングモーター、ドライバモジュール(ULN2003A)、電源モジュールとなります。
部品点数が少ないため、接続は簡単です。
使用するポートは、デジタルピンの「8,9,10,11,12」です。
穴に挿入しづらいときは、ラジオペンチなどを使用してください。
接続部分の一部を拡大したものも載せておきます。
コードの書き込み
接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。
スケッチ(コード)を書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。
本LessonではLesson 15、Lesson 28で使用したライブラリを使用します。
また、リモコンはLesson 15でPanasonic製TVリモコンのコードを取得しています。
そのためELEGOOセットに梱包されているリモコンではなくPanasonicのTVリモコンを使用します。
TVのリモコンで動かせた方が、面白いと思うんですよね。
リモコンのボタンは音量ボタンの+とーを利用します。
リモコンから取得できるコードは以下となります。
※詳細はLesson 15を参照ください。
Panasonic社製のTVリモコン | 取得できるコード 16進表示 |
---|---|
音量ボタン + | 1000405 |
音量ボタン - | 1008485 |
コマンド説明
これまでの復習も兼ねて、IRremote.hとStepper.hのコマンドの一覧を記載しておきます。
●IRremote.hコマンド一覧
コマンド | 内容 |
---|---|
IRrecv xxx(pin) | 受信で使用するオブジェクトの作成。 xxx:オブジェクト名 pin:使用するピン番号例 オブジェクト名:irrecv 使用するピン番号:12 IRrecv irrecv(12); |
xxx.enableIRIn() | 作成したオブジェクト名で赤外線受信スタート。
例 |
decode_results yyy | 受信情報の格納先を指定。 yyy:格納先変数格納されるデータ一覧 decode_type:メーカ名 value:受信データ bits:受信データのビット数 rawbuf[]:制外線ON/OFFにかかる時間 rawlen:赤外線ON/OFFの回数例 1.resultsという格納先を作成 decode_results results; 2.受信データの取得 data = results.value; |
xxx.decode(&yyy) | 受信の確認。 xxx:オブジェクト名 yyy:格納先変数 返り値:未受信0/受信1例 真であればif文内実行例 if (irrecv.decode(&results)) { ・・・ } |
xxx.resume() | .decode()の返り値をリセット。 .decodeと.resume()はセットで使用。 xxx:オブジェクト名例 オブジェクト名irrecvの返り値をリセット irrecv.resume(); |
●Stepper.hコマンド一覧
コマンド | 内容 |
---|---|
Stepper(steps, pin1, pin2, pin3, pin4) | Arduinoボードに接続されているステッパモータを表すStepperクラスのインスタンスを新たに生成。 setup()とloop()より前で定義。 steps:1回転あたりのステップ数 (int) pin1, pin2, pin3, pin4:モータに接続されているピンの番号 戻り値:作成したインスタンス例 myStepperというインスタンスを生成。 100ステップ、Arduinoのピンは8,9,10,11を定義。 Stepper myStepper(100, 8, 10, 9, 11); |
Stepper:setSpeed(rpms) | モータの速さを毎分の回転数(RPM)で設定。 rpms:1分間あたりの回転数 正の数 (long) 戻り値:なし例 スピードを20RPMにセット ※インスタンス名 myStepperで定義済みの場合 myStepper.setSpeed(20); |
Stepper:step(steps) | setSpeed()で設定した速さで、指定したステップ数だけモータを回す。steps:モーターが回転するステップ数。 逆回転は負を設定(int) 戻り値:なし例 1000ステップモーターを回す。 ※インスタンス名 myStepperで定義済みの場合 myStepper.step(1000); |
サンプルコード
Lesson 28 でも紹介しましたが、ステッピングモーターについてはGitHubにサンプルコードがあります。
興味のあるかたは、参考にしてみてください。
本Lessonでは、Lesson 28で作成したサンプルコードをもとにしています。
Lesson 28のコードをリモコンと赤外線受信センサで制御できるように改良しました。
//Lesson 30 ステッピングモーター編 その3 //リモコンと赤外線受信センサによるモーター制御 //https://omoroya.com/ // 電子部品 // 赤外線受信センサモジュール リモコン // 電源モジュール,ドライバモジュール(ULN2003A),ステッピングモーター //ライブラリインクルード #include <IRremote.h> #include <Stepper.h> // 赤外線受信センサの出力ピンを接続するピンの設定 const int REV_PIN = 12; // ステッピングモータが1回転するのに必要なステップ数を定義 //2相励磁方式で制御するため2048 step で1回転 const int MOTOR_STEPS = 2048; // 1回転あたりのステップ数と接続するピンの設定 Stepper myStepper(MOTOR_STEPS, 8, 10, 9, 11); // 受信で使用するオブジェクトを作成 IRrecv irrecv(REV_PIN); // 受信で使用するオブジェクトを作成 'irrecv' decode_results results; // 受信情報の格納先を作成 'results' void setup() { irrecv.enableIRIn(); // 作成したオブジェクトで赤外線受信をスタート myStepper.setSpeed(10); // 10回転/1分に設定 rpm(1分あたりの回転数) } void loop() { if (irrecv.decode(&results)) // 受信したかどうかの確認 未受信=0/受信=1 { switch(results.value) { case 0x1000405: // Panasonic 音量 +ボタンを押した場合 myStepper.step(512); // 512ステップで90度回転 delay(1000); // 1000ms待つ break; case 0x1008485: // Panasonic 音量 -ボタンを押した場合 myStepper.step(-512); // -512ステップで-90度回転 delay(1000); // 1000ms待つ break; } irrecv.resume(); // .decode()の返り値をリセット // 静止時には電流を遮断する。 digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); } }
動作確認
では、さっそく動作を確認していきます。
※gifで作成しているため、画像サイズは小さくしてあります。
下記に示す、1、2の順番でリモコンの音量ボタンを押しています。
1.TVリモコン音量+ 左90度
2.TVリモコン音量- 右90度
音量ボタンの+を2回押せば、左に180度回転します。
3回続ければ270度です。
Lesson 15を参考に音量だけではなく、他のボタンなども割り当てて色々遊んでみてください!
まとめ
今回は以下の内容について理解してもらいました。
2.赤外線受信センサの使い方を思い出す。
3.楽しんで遊ぶ。
TVのリモコンを使って、ステッピングモーターを制御する。
本Lessonは家にある身近なリモコンで制御するというところがミソです。
色んなリモコンを使って、遊んでみましょう!
楽しいです。
Lesson 30 【ステッピングモーター編 その3】 はここまで。
ステッピングモーターについてはその3で終了です。
疑問点、質問などありましたら気軽にコメントください。
次回、Lesson 31は【6軸モーションセンサ編 その1】 です。
3軸加速度+3軸ジャイロ(角速度)の6軸モーションセンサで遊びます。
使いこなせれば、必ず面白いと感じることができる電子部品です。
![](https://omoroya.com/wp-content/uploads/2020/02/arduino-lesson31-00-160x90.jpg)
最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでもOKです。
リンク切れ、間違いなどあればコメントいただけると助かります。
Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。
Arduino入門編、Arduino入門編2で使用しているUNOはAmazonにて購入可能です。
Arduino入門編では互換品を使用。
Arduinoはオープンソース。
複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
学習用、遊び用、お試し用には安価な互換品がおすすめです。
ELEGOO UNO キット レベルアップ チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用
上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
Amazonでお得に買う方法
Amazonでお得に購入するならAmazon Mastercard、Amazonギフト券がおすすめです。
時期により異なりますが、様々なキャンペーンを実施しています。
\Amazonギフト券/
Amazonギフトカード キャンペーン
\Amazon Mastercard お申込み/
Amazon Mastercard 申し込み
いずれの場合もプライム会員である方がお得!!
\Amazon Prime 30日間の無料会員を試す/
無料会員登録
コメント
返信、本当に有難うございました。
おかげさまで解決出来ました。
そこで追加で質問なんですが、三つ目のリモコンボタンを利用して動作途中でも止まる方法のスケッチ例を教えて頂ければと思います。
割込みという事でattachinterraptを使用しようとしたのですが、Switch関数とは干渉するとの事でもがいても上手くいきません。
それとステッピングモーター独自の発電ブレーキも相まって、上手くいきません。スケッチ例をよろしく御願い申し上げます。
ステッピングモーターの発電ブレーキの解説もあれば助かります。
コメントありがとうございます。
ちょっと、検討する余力がいまはなく・・・。
ご了承ください。
10進数→2進数でした。すみません。
コメントありがとうございます。
ライブラリのバージョンに関しては
「ツール」→「ライブラリを管理…」にて「ライブラリマネージャ」を開く。
「IRremote.h」を検索。
インストールしたいバージョンを選択して「更新」で変更できます。
16進か2進かというお話は、好みなので自分のわかりやすいほうでよいと思います。
ただ、16進のほうが短くなるので見やすいと思います。
最新バージョンに関しては、まだ内容を確認していません。
プログラム初心者です。
いつも参考にさせて頂いています。
リモコン信号を受信して全く動作しません。
受信信号のコードが違うと思うのですが、includeするライブラリをバージョンが古いものにしないといけないと思います。
バージョン変更の詳細なやり方を御指導願えれば、助かります。
また、最新バージョンとの違いや信号は16進数か10進数のどちらで統一して書けば良いか等、御指導願えればと思います。
ライブラリ管理も上手くいきません。
リモコン受信信号ばかりの深みにはまって、挫折しそうです。
どうかよろしく御願い申し上げます。
面白かった
コメントありがとうございます。
いつも参考させて頂いております。
質問ですが myStepper.step(-512); // -512ステップで-90度回転
ーステップ数で逆回転しないのですが、なぜでしょうか?
教えて頂けたら助かります。
コメントありがとうございます。
ボタンを押したときに何かしら動作はしますか?
ボタンを押しても反応がない場合は、case文が実行されていないことが考えられます。
リモコンから取得できるコードを確認してみてください。