ラジコンの車体部分は前回で一通り完成しました。ただ、制作を進めていく中でいくつか課題も見えてきました。今回は、引き続きラジコンのコントローラー部分の制作と合わせて、車体に載せるArduinoが大きすぎる課題を、Arduino Pro Miniを利用してクリアしていきたいと思います。
今回の電子工作レシピ
完成までの時間目安:90分
必要なパーツ
- Arduino Pro mini (Arduino Pro Mini 328 5V 16MHz https://www.switch-science.com/catalog/946/)
- FTDI-USBシリアル変換ケーブル(http://akizukidenshi.com/catalog/g/gM-05840/)
- ブレッドボード(http://www.switch-science.com/catalog/313/)
- DCモーター(FA-130RA-227 http://akizukidenshi.com/catalog/g/gP-06437/)
- サーボモーター( https://www.switch-science.com/catalog/1659/)
- モータードライバ(BD6222HFP http://akizukidenshi.com/catalog/g/gI-08041/)
- SOP16ピンDIP変換基板(http://akizukidenshi.com/catalog/g/gP-06541/)
- ダイオード(1N4007 http://akizukidenshi.com/catalog/g/gI-00934/)×2
- 抵抗器 10KΩ×2 / 100KΩ×2
- タクトスイッチ (http://akizukidenshi.com/catalog/g/gP-08075/)
- ジョイスティック (http://akizukidenshi.com/catalog/g/gM-06807/)
- コンデンサ(100μF http://akizukidenshi.com/catalog/g/gP-02724/)
- 単3電池ボックス(4本直列用)
- 単3電池×4本
- トグルスイッチ(http://akizukidenshi.com/catalog/g/gP-03913/)
- LEGOブロック – 適量
- 8Tピニオンギア(http://www.tamiya.com/japan/products/product_info_ex.html?products_id=15289)
コントローラーを作成
ラジコンを操作するコントローラーを作成していきます。
前回、車体の動きは左右にタイヤを回す、前進・後退の動作を可能にしましたので、コントローラーもこれに応じて操作できる形にします。具体的にArduino上でのプログラムを作成する際のイメージとしては、コントローラー部品を利用して、アナログ入力で入力された値を動作に反映させるという流れになります。
今回はコントローラー部品に、タクトスイッチと、ジョイスティックを利用します。

写真1 タクトスイッチ
タクトスイッチ
タクトスイッチはその名の通り、スイッチ部品になります。押すとカチッとなり、指を話すとボタンが元に戻ります。使い方としては、押している間だけボタンをONにしたい場合等に利用するスイッチとなります。

写真2 ジョイスティック
ジョイスティック
ゲーム等でもおなじみのジョイスティックは、縦横2軸に可変抵抗器が備わった部品になっています。スティックを上下左右に動かすと、その可変抵抗器が動いて抵抗値が変わります。Arduinoではその抵抗値の変化量を元にジョイスティックの状態を知ることができるようになっています。

写真3 こんなイメージのコントローラーにします。

写真4 コントローラー
タクトスイッチは、それぞれ前進・後退に利用します。ジョイスティックは、左右のステアリング操作に利用します。このジョイスティックはXY軸の2軸方向に動かすことができますが、今回は、ステアリングの操作のみに利用するのでX軸の1軸のみ利用します。
具体的には下記のような回路となります。

図1 コントローラー部分の回路
それぞれ、スイッチとジョイスティックからの入力を確認する為に、サンプルプログラムを動かしてみます。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //******************************************* // コントーラーのサンプルプログラム //******************************************* int aPin = 2; int bPin = 4; int cPin = A2; void setup() { Serial.begin(9600); Serial.println( "setup" ); pinMode(aPin,INPUT); pinMode(bPin,INPUT); } void loop() { Serial.print( "JOYSTICK:" ); Serial.println(analogRead(A2)); if (digitalRead(aPin) == HIGH){ Serial.println( "A" ); } if (digitalRead(bPin) == HIGH){ Serial.println( "B" ); } delay(100); } |
ジョイスティックには、アナログ入力で0〜1023の値が入ってきます。ジョイスティックの場合、スティックが左右(X軸)中央が初期状態のため、今回の回路では静止時には512の値が常に表示されます。
タクトスイッチは、押している時だけ回路が通じるので、if文の中の処理が実行されるようになっています。
コントローラーが動くことがわかったら、ラジコン本体に組み込んでみます。
回路は図のようになります。

図2 ラジコン回路
ちょっと複雑になってきて一見するとややこしく見えますが、一つ一つはこれまで積み重ねて来た通り単純ですので、ジャンプワイヤーの繋ぎ間違いだけ気をつけながら進めていきます。

写真5 一通りの準備ができました。
最終的に、プログラムはこのようになります。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <Servo.h> //サーボモーター用ライブラリを読み込み Servo myservo; //サーボ用のオブジェクトを作成 int val; //サーボの角度を格納するための変数 int aPin = 2; int bPin = 4; int cPin = 9; int dPin = 10; void setup() { myservo.attach(11); //デジタル11番ピンをサーボの角度命令出力ピンとして設定 Serial.begin(9600); Serial.println( "setup" ); pinMode(aPin,INPUT); pinMode(bPin,INPUT); pinMode(cPin,OUTPUT); pinMode(dPin,OUTPUT); } void loop() { int st = analogRead(A2); //0〜1023、中心は512 float st2 = ( float )st/1023; val = st2*90; val = val+45; myservo.write(val); //ジョイスティックの値からサーボを動かす Serial.print( "SERVO:" ); Serial.print(st2); Serial.print( "-" ); Serial.println(val); if (digitalRead(aPin) == HIGH){ Serial.println( "A" ); digitalWrite(cPin,HIGH); digitalWrite(dPin,LOW); } else if (digitalRead(bPin) == HIGH){ Serial.println( "B" ); digitalWrite(cPin,LOW); digitalWrite(dPin,HIGH); } else { digitalWrite(cPin,LOW); digitalWrite(dPin,LOW); } delay(100); } |
一通りラジコンカーの機能を持ったところまで完成しましたね。
ただ、やはり今のままだとArduinoが大きいため不便です。
そこで、これからはよりスマートなラジコンカーにするための工夫を色々としてみたいと思います。
Arduino Pro miniで小型化
これまではArduino UNOをずっと利用してきましたが、ラジコンカーに載せるにはちょっとサイズが大きいため、今回Arduino Pro mini(互換機)を利用して小型化を図ってみたいと思います。
第一回目でも触れたように、Arduinoには様々な種類があります。その中でもかなり小さい種類のArduino Pro miniの互換機を今回使ってみます。ちなみに互換機についてですが、Arduinoのチップに書き込むプログラムは公開されており、誰でもそのプログラムを使って少しの部品と対応するチップ(AVRマイコンなど)に書き込むことで自作のArduinoを自作することができます。それを利用して製品版と互換を持つ互換機がそれぞれのArduinoで販売されていますので、製品がない場合や、製品とは少し違う仕様のものを利用したい場合、少し安く購入したい場合等は互換機を探してみると良いかもしれません。

写真6 Arduino UNO(上)とArduino Pro mini(互換機)(下)
Arduino UNOとArduino Pro miniの大きな違いは、下記になります。
- サイズが圧倒的に小さい
- 動作電圧が3.3v版・5v版がある(今回は5v版利用)
- Arduino UNOはUSBで接続するのに対して、Arduino Pro miniはシリアル接続
- Analogピンに6,7がある(Arduino UNOはない)
上記の中で、特に動作電圧が違うバージョンがあるということが違うArduinoを利用する上で重要な点になってきます。
例えば5vで動作するようなサーボを利用する場合、5vのArduinoだと、そのまま外部電圧なしに動かすことができます。ところが、3.3vのArduinoの場合、電圧が足りずに動きません!Arduino Pro miniを利用する場合、用途に応じて5vか3.3vかを選択する必要があります。
基本的な操作はArduino UNOと同じですが、下記の図のように設定などが一部違ってきます。

図3 「ツール」-「マイコンボード」でArduino Pro miniを選択

図4 「ツール」-「シリアルポート」もUSBで接続したシリアルケーブルを選択
設定が完了したらArduino UNO同様利用することができますので、ためしにLチカしてみます。

写真7 Arduino Pro miniでLチカ
無事Lチカできたら、Arduino UNOで作成したラジコンカーの回路をArduino Pro mini用に移していきます。
移すと言っても、それぞれのピン番号を見ながら、ジャンプワイヤーを刺し直すだけなので、あっという間に移行は完了します。

写真8 Arduino UNOからArduino Pro miniに移行が完了

写真9 ボディに載せます
ラジコンカー、無事完成しましたね!
さらに軽くしたり、コンパクトにするにはまだまだ様々な方法があります。車体をLEGO以外のものに変えてみたり、ブレッドボード部分を基板にハンダ付けするなどをしたりすることで無限の可能性が出てきますね。
次回以降は、色々なセンサを取りあげて、センサの特徴を利用したラジコン作りをしていきたいと思います。