Arduinoその他工作

Arduino Nanoでチェーンプログラムロボットを動かそう(後編:モータドライバの使い方〜完成)

前編では、チェーンプログラムロボットをArduino Nanoで動かすための、準備的な作業を行いました。今回はその続きで、チェーンプログラムロボットを完成させて制御できるようにします。完成まであともうひと踏ん張りですので、頑張っていきましょう!
Arduino Nanoでチェーンプログラムロボットを動かそう(前編:構想〜パーツ組み立て)

完成した作品

完成図・チェーンプログラムロボット

■目次

●モータドライバBD65496MUVの使い方
●Arduino Nanoとモータドライバの接続
●電源の接続
●モータの配線
●頭の取り付けと配線
●プログラムの書き込みと動作の確認
●Scratchで子供と一緒に遊ぼう

モータドライバBD65496MUVの使い方

まずは、モータを動かす方法を考えます。チェーンプログラムロボットには「FA-130」というモータが使われており、このモータを回転させるには数百mAの電流を流すことが必要です。しかし、Arduino Nanoはピン1つあたり最大で40mA・全体で200mAまでしか電流を流すことができず、モータとArduino Nanoとを直接に接続することはできません。そこで、モータドライバを介して接続しましょう。

今回はBD65496MUV搭載モータドライバを使いますので、はじめにこのモジュールの使い方を紹介しておきます。なお、買ってきた時点ではピンは半田付けされていませんので、自分で半田付けします。

モジュール1つにつき、1つのモータを制御することができます。モータ用の電源として2V〜16Vのものを使うことができ、さまざまなモータと組み合わせることができます。
12本のピンのうち、図1のように9本のピンを使ってモータを制御します。INAのピンにPWMの信号を送ると、そのデューティ比×モータ用電圧が、OUTA/OUTBに出力されます。また、OUTA/OUTBのどちらがプラスになるかは、INBに与える信号で決まります(表1)。

図1 BD65496MUVの接続方法

図1 BD65496MUVの接続方法

 

INA OUTA OUTB
HIGH
LOW

表1 INBに与える信号とOUTA/OUTBのプラス/マイナスの関係

例えば、図2のようにArduino NanoとBD65496MUVを接続するとします(INA/INBを、それぞれ3番/4番ピンに接続)。また、モータ用電源として9Vの電池を接続したとします。

この状況で、リスト1のプログラムを実行します。analogWrite関数はPWM出力を行う関数で、引数に255を渡すとデューティー比が100%になります。ここでは引数に153を渡していますので、153÷255=0.6から、デューティ比が60%のPWMが出力されます。したがって、モータに加わる電圧は、疑似的に9V×60%=5.4Vになる、ということです。

図2 Arduino NanoとBD65496MUVの接続の例

図2 Arduino NanoとBD65496MUVの接続の例

 

analogWrite(3, 153);
digitalWrite(4, HIGH);

リスト1 モータドライバを制御する例

 

Arduino Nanoとモータドライバの接続

それでは、チェーンプログラムロボットの組み立ての続きに入りましょう!まず、ブレッドボード上でArduino Nanoとモータドライバを接続します。
チェーンプログラムロボットでは、左右の車輪をそれぞれ別のモータで回転させるようになっています。そこで、モータドライバを2つ使って、左右のモータを別々に制御できるようにします。

BD65496MUVにはPWMを送りますが、Arduino NanoでPWM出力に対応しているピンは、3/5/6/9/10/11の6本あります。これらのうち、3番と5番を使うことにします。また、2番と4番を、モータドライバのINBに接続しました(図3)。Arduino Nanoの隣にあるモータドライバで、右車輪のモータを制御、その右にあるモータドライバで左車輪のモータを制御します。
 

図3 Arduino Nanoとモータドライバの接続

図3 Arduino Nanoとモータドライバの接続

なお、実際の配線の際には一般的なジャンプワイヤではなく、単線の堅いジャンプワイヤを使って、ブレッドボード上を這うように配線することをお勧めします(写真1)。このあとで電源やロボットの頭を接続していきますが、単線を使った方が配線が混乱しにくくなります。

写真1 Arduino Nanoとモータドライバを接続したところ

写真1 Arduino Nanoとモータドライバを接続したところ

また、図3ではモータドライバの「PWM(MODE)」のピンをブレッドボードのプラスのラインに接続していますが、写真1だと接続していないように見えます。実際はモータドライバの裏側を利用して、図4のように配線しました。

図4 PWM(MODE)ピンの接続(赤い線は実際にはモータドライバの裏側に配線)

図4 PWM(MODE)ピンの接続(赤い線は実際にはモータドライバの裏側に配線)

 

電源の接続

今回のロボットのように、USBケーブルから電源を取りにくいものを作ることもあります。その場合は、作りたいものに何らかの電源を組み込み、そこから電力を供給するようにします。

今回は、電源として乾電池を使用します。Arduino Nanoの電源は、006P電池(9Vの長方形の電池)から取ります。Arduino Nanoには「VIN」というピンがあって、7〜12Vの電源を接続することができます。VINに006P電池のプラスを接続し、GNDにマイナスを接続すれば、動作させることができます。
また、ロボット同梱のモータ(FA-130)は定格では1.5〜3Vで駆動するものですが、今回は高めの電圧をかけられるよう、単3乾電池3本(1.5V×3で4.5V)を使います。

電池は電池ボックスに収め、そこからブレッドボードに配線します。秋月電子通商で「ジャンパーワイヤ付きバッテリースナップ」というものが売られていて、これと電池ボックスを組み合わせると、ブレッドボードに電池を接続する際に便利です。
006Pの電池ボックスとしては、ELPAの「PP-006NH」というものを使いました。電池をはめ込んだ後、バッテリースナップを取り付けられるようになっています。また、単3の電池ボックスでバッテリースナップを取り付けられるものは、秋月電子通商で販売されています。

まず、単3用の電池ボックスにバッテリースナップを取り付け、ユニバーサルプレートの片方の端にねじ止めします。その際、ジャンプワイヤがユニバーサルプレートの中央の方に向くようにします。
そして、ユニバーサルプレートの反対側に006Pの電池ボックスを取り付けます。これもバッテリースナップをつけたときに、ジャンプワイヤがユニバーサルプレートの中央を向くようにします(写真2)。電池をつけた側を下にして、チェーンプログラムロボットに乗せます。

写真2 電池ボックスと電池を取り付けたところ

写真2 電池ボックスと電池を取り付けたところ

単3電池からの赤/黒の線は、ブレッドボード上でArduino Nanoの1〜12番ピン側にあるプラス/マイナスのラインに接続します。
また、9V電池からの黒い線は、ブレッドボートのマイナスのラインを経由して、Arduino Nanoの「VIN」のピンがある側のGNDピンに接続。一方の赤い線は、Arduino Nanoとモータドライバの間の空きラインに接続しましょう(図5、写真3)。このあとロボットの頭の部分を取り付けますが、頭にあるスイッチを通して、Arduino NanoのVINに接続するようにします。

図5 電池ボックスとブレッドボードとの接続

図5 電池ボックスとブレッドボードとの接続

 

写真3 電池ボックスからの線をブレッドボードに接続したところ

写真3 電池ボックスからの線をブレッドボードに接続したところ

 

モータの配線

次に、モータをブレッドボード上のモータドライバに配線します。
モータからは黄色と青の線が出ています。図6のように、右車輪のモータからの線は、黄色をOUTA、青をOUTBに接続します。一方、左車輪からの線は、青をOUTA/黄色をOUTBに接続します(写真4)。

図6 モータの配線

図6 モータの配線


 
写真4 モータの配線が終わったところ

写真4 モータの配線が終わったところ

 

頭の取り付けと配線

次に、ロボットの頭の部分を取り付けていきます。頭につけたサーボモータ(SG90)/WS2812B/スイッチは、図7のようにブレッドボードに接続します。
 

図7 サーボモータ(SG90)/WS2812B/スイッチの配線

図7 サーボモータ(SG90)/WS2812B/スイッチの配線

SG90からは赤/茶色/オレンジの3本の線が出ています。赤と茶色は電源用の線で、それぞれをArduino Nanoの5V/GNDのラインに接続します。また、オレンジは制御用の信号を送る線ですが、これはArduino Nanoの12番ピンに接続します。
WS2812BのVDD/GNDからの線は、Arduino Nanoの5V/GNDのラインに接続します。また、片方のWS2812BのDATA INにも線を取り付けましたが、その線はArduino Nanoの13番ピンに接続しています。

線を接続し終わったら、頭の部分を土台にはめ込んで、ねじで固定します(説明書の19番の手順を参照)。
これで、Arduino Nano版のチェーンプログラムロボットが完成です(写真5)!長時間の組み立てお疲れさまでした。

写真5 Arduino Nano版のチェーンプログラムロボットが完成したところ

写真5 Arduino Nano版のチェーンプログラムロボットが完成したところ

 

プログラムの書き込みと動作の確認

最後に、Arduino Nanoにプログラムを書き込んで、ロボットを動かしましょう。

●Adafruit NeoPixelライブラリの組み込み

WS2812Bを制御するために、「Adafruit NeoPixel」というライブラリを使います。
「第50回 フルカラーLEDテープを使ったちょっとお洒落な電子工作 〜Arduinoでパーツやセンサを使ってみよう」の回でインストールしている方は、そのライブラリを使うことができます。
まだインストールしていない方は、以下の手順でインストールしてください。

①Arduino IDEを起動します。
②「スケッチ」→「ライブラリをインクルード」→「ライブラリの管理」メニューを選びます。
③ライブラリマネージャが起動しますので、キーワードの欄に「NeoPixel」と入力します。
④「Adafruit NeoPixel」ライブラリが見つかりますので、「インストール」ボタンをクリックします(図8)。

 

図8 Adafruit NeoPixelライブラリのインストール

図8 Adafruit NeoPixelライブラリのインストール

 

●ベースとなるプログラム

まず、ベースとなるプログラムを用意します。これはリスト2のようになります。
setup関数では、以下のようにロボットを初期化します。

①モータは停止
②SG90は90度にし、頭が正面に向くようにする
③WS2812Bは消灯

loop関数は空になっていますが、この中身によって、ロボットの動きを制御することができます。
なお、プログラムの書き込みが終わった後は、Arduino NanoからUSBケーブルを抜いて、チェーンプログラムロボット本体のスイッチをオンにすると、電池を電源としてロボットを動作させることができます。

リスト2 ベースのプログラム

 

●モータを動かす

モータドライバの制御の流れは、「モータドライバBD65496MUVの使い方」のところで解説した通りです。

モータを回す速さは、3/5番ピンのPWM出力で値で決めます。リスト2の中で、この2つのピンにはそれぞれ「LEFT_A」「RIGHT_A」の定数名を付けていますので、それを使ってピン番号を指定します。
4.5Vの電池を接続していますので、定格上限の3Vでモータを回すには、デューティ比が3分の2のPWM信号を出力します。また、定格下限の1.5Vでモータを回すなら、デューティー比が3分の1のPWM信号を出力します。
analogWrite関数で255を指定するとデューティ比が1になりますので、3分の2なら170(=255÷3×2)、3分の1なら85(=255÷3×1)を指定します。

また、左右のモータの方向は、2/4番ピンに出力する値で決めます。これらのピンにはそれぞれ「LEFT_B」「RIGHT_B」の定数名を付けています。
例えば、loop関数をリスト3のようにすると、右車輪と左車輪のそれぞれのモータに、定格上限の3Vの電圧をかけて、ロボットを前進させることができます。
また、リスト3の3行目を関数を「digitalWrite(RIGHT_B, LOW);」に変えると、左車輪は前進、右車輪は後退になりますので、その場で右旋回するような動きになります。

リスト3 ロボットを前進させる

●頭を動かす

頭を動かすには、「sg90.write(角度)」のような関数を実行して、サーボモータの角度を指定します。
例えば、loop関数をリスト4のようにすると、頭を左右に振る(角度を0度〜180度の間で段階的に増減させる)ことを繰り返します。

リスト4 頭を左右に振る

 

●WS2812Bを点灯する

WS2812BのLEDの色を決めるには、以下のような関数を実行します。

pixels.setPixelColor(番号, pixels.Color(赤, 青, 緑));

「番号」には、左右の目を表す番号を指定します。左/右それぞれの目の番号に対して、リスト2の先頭で「LEFT_EYE」「RIGHT_EYE」の定数を定義していますので、それを使うことができます。
また、「赤」「青」「緑」には、RGBの光の三原色の強さを、それぞれ0〜255の範囲で指定します。
そして、左右の目の色を決めたら、「pixels.show();」の関数を実行して、LEDを点灯させます。
例えば、loop関数をリスト5のようにすると、左右の目が赤→緑→青→白と順番に点灯し、その動作を繰り返します。

リスト5 左右の目を光らせる

 

●サンプルのプログラム

ここまでに解説してきたことを組み合わせることで、ロボットにさまざまな動作をさせることができます。例えば、以下の動画のようなコミカルな動きをさせることもできます。
このプログラムは以下のアドレスからダウンロードすることができますので、ぜひお試しください。
https://www.h-fj.com/deviceplus/chain_program_robot_demo.zip

チェーンプログラムロボットをArduino Nanoで制御した例

Scratchでお手軽に制御してみよう

Arduino Nanoは、Scratchと組み合わせてプログラムを作ることもできます。
初めてプログラミングに触れる場合や、子供と一緒にこのロボットで遊びたい時は、Scratchの方が視覚的にも分かりやすいので、お勧めです。モータとサーボモータの制御をScratchで行うことができます。

詳しい手順は省略しますが、以下のようにすることで、Scratchでこのロボットを制御することができます。

①パソコンにScratch Offline Editorをインストールします。
②「Scrattino2」というArduino用Scratch拡張をインストールします。
(ダウンロード元: https://github.com/yokobond/Scrattino2/releases
③Scrattino2を起動し、Arduino Nanoと接続しておきます。
④Arduino IDEで、「ファイル」→「スケッチ例」→「Firmata」→「StandardFirmata」を開き、Arduino IDEに書き込みます。
⑤Scrattino2のダウンロード元から「scrattino2_resources.zip」をダウンロードし、そのZipファイルの中にある「scrattino.sb2」ファイルをScratchで開きます。
⑥Scratchの「スクリプト」の「その他」に、Arduinoを制御するためのブロックがありますので、それらを組み合わせます。

図9は、実際にScratchでスクリプトを作ってみた例です。ロボットを前後に動かしながら、頭を左右に振るという動きをします。
なお、WS2812Bの制御は、Scrattino2が対応していないので、残念ながら行うことはできません。ただ、単色の一般的なLEDに変えれば、Lチカと同じ仕組みになりますので、Scratchで制御できます。
 

図9 Scratchでロボットを動かす例

図9 Scratchでロボットを動かす例

 

まとめ

Arduino Nanoでチェーンプログラムロボットを動かせるようになりましたが、いかがだったでしょうか?プログラム次第でいろいろな動きをさせることができますので、皆様もぜひ試行錯誤してみてください。
また、今回の例のように、Arduino Nanoはコンパクトで何かに内蔵するのに便利です。Arduino Nanoでいろいろと作ってみると良いでしょう。

cta_watering-machine
藤本壱

PC関連のフリーライターで、2016年秋からRaspberry PiやArduinoを使った電子工作にも取り組んでいます。プログラム次第でいろいろ作り込める点が、電子工作の面白さだと感じています。