趣味 電子工作

Arduino+家にあるリモコン(赤外線)でラジコンを作ってみました

以下の不満を解消するため、会社員をやめてフリーランスになった『NaruTaku』と申します。

会社員時代の不満

・収入の限界(給料が上がらない)

・自由な時間が持てない(会社に拘束される)

・人間関係がしんどい

※フリーランスになり、これらの不満は解消されました(収入も増え、自分の時間を増やし、のびのびと働くことができております)

今回は趣味の電子工作についてなのですがArduino+家にあるDVDレコーダーのリモコンでラジコンを作成してみましたので、その内容を紹介したいと思います。

Arduinoでラジコン作成

使用部材は以下になります。

使用部材

  • 二層式 二階建て 2輪駆動 三輪スマートカー車体キット
  • Arduino(互換機) UNO R3
  • モータードライバー (L298N)
  • DCモーター
  • 赤外線受信モジュール(CHQ1838)
  • 9V型角型電池用ホルダー、DCプラグ端子台
  • 単三用電池ボックス

上記、個々に部品を集めることもできますが、セットでも販売されております。


以上が使用部材となります。

配線

組み立てていく中で適宜配線していくのですが、まずArduinoと各部材の配線を紹介します。以下のように接続しました。

1.赤外線受信モジュール(CHQ1838)とArduino
・赤外線受信モジュールの+(5V)⇒Arduinoの5V
・赤外線受信モジュールの-(GND)⇒ArduinoのGND
・赤外線受信モジュールのS⇒Arduinoの12ピン

今回は赤外線受信モジュールのSをArduinoの12ピンに接続しましたが、デジタルIOピンならどこでもよいです。また、赤外線受信モジュールはものによってピン配線が違うようなので、S,+(5V)、GNDのピンの位置はお手持ちのものを確認してください。

2.モータードライバとArduino
・モータードライバのENA⇒Arduinoの5ピン
・モータードライバのIN1⇒Arduinoの2ピン
・モータードライバのIN2⇒Arduinoの4ピン
・モータードライバのENB⇒Arduinoの6ピン
・モータードライバのIN3⇒Arduinoの7ピン
・モータードライバのIN4⇒Arduinoの8ピン
ENA,ENBはPWM出力に対応しているピンに接続する必要があります。今回5ピンと6ピンに接続しましたが、PWM出力に対応しているピンは他にも,3,6,9,10,11とありますので、これらのいずれかでしたら大丈夫です。ちなみに、基板に表示されている「 ~ 」がPWM出力対応であることを示しています(ただし、使用するピンで周波数は異なる。5ピンと6ピンは同じ周波数です)。IN1、IN2I、N3とIN4は回転の方向を決めるために制御する信号になりますので、デジタルIOピンならどこでもよいです。

3.モータードライバと単三用電池ボックス
・モータードライバのVSM(Vin)⇒単三用電池ボックスの+
・モータードライバのGND⇒単三用電池ボックスのー
モータードライバへ入力する電圧です。5V~35Vの範囲で入力できます(製品によって多少違うかもです)が、今回は6Vを供給します。注意点は5V端子は入力でなく出力端子になりますので、ここに電源電圧をつないではいけません。

4.モータードライバとDCモーター
・モータードライバのMOTORAのどちらか⇒DCモーター1の端子のどちらか
・モータードライバのMOTORAのどちらか⇒DCモーター1の端子のどちらか
・モータードライバのMOTORBのどちらか⇒DCモーター2の端子のどちらか
・モータードライバのMOTORBのどちらか⇒DCモーター2の端子のどちらか
私が使ったモータードライバには二つの端子がまとめて「MOTORA」「MOTORB」となっていました。「OUT1」、「OUT2」、「OUT3」、「OUT4」と記載されている製品もあるようです。ここにDCモータ-の端子をつなぐのですが、どちらをどちらにつないでも問題ありません。この二つの端子を制御することによって回転方向を決めるので、接続した端子に合わせて制御してやればよいことになります。(IN1とIN2がMOTORAの二つの端子(OUT1,OUT2)、IN3とIN4がMOTORBの二つの端子(OUT3,OUT4)に対応しています)

Arduinoへは9V型角型電池用ホルダーのDCプラグ端子をArduinoのDCジャックへ接続し、9Vで動作させます。

配線は以上なのですが、先に配線をしてしまうと組み立てできなくなってしまいますので、組み立てていく途中で適宜配線していくようにします。

組み立て

それでは、実際に組み立てていきます。私は以下の順序で組み立てました。

順序

  • 下段シャーシにモーター2個(車輪もつける)と補助車輪1個を取り付ける
  • 下段シャーシにモータードライバー (L298N)を取り付け、電源部分以外を配線する
  • 上段シャーシにArduinoと赤外線受信モジュール(CHQ1838)、単三用電池ボックス、9V角型電池用ボックスを取り付ける
  • 配線する
  • 下段シャーシと上段シャーシを接続する

では、簡単ですが説明してきます。

1.下段シャーシにモーター2個(車輪もつける)と補助車輪1個を取り付ける

以下の写真のようにモーターと補助輪を取り付けます。

補助輪は直接シャーシにつけるのではなく、少し高さをつけて取り付けます。補助輪を取り付けた後、モータにタイヤを取り付けます。

2.下段シャーシにモータードライバー (L298N)を取り付け、電源部分以外を配線する

以下の写真のようにモータドライバーを取り付け、電源部分以外を接続しておきます。(モータードライバー側だけで、まだArduinoには接続しません)

取り付けの際、シャーシとモータドライバーの間にスペーサー代わりにナットを挟むと安定します。

このタイミングでモータードライバーのMOTORAとMOTORBに接続した線(それぞれ2本づつ)をモーターへ接続(はんだづけ)します。線はシャーシ中央付近に空いている穴から下に落とすとよいと思います。

ネットなどでセット購入すると、モーターに線がはんだづけされた状態で送られてくるものあるようなのですが、私はモーターを個別で購入したので、このタイミングではんだづけを実施しました。ちなみに、はんだづけが必要になるのはここだけです。

はんだ苦手なので、へたくそです^^;

3.上段シャーシにArduinoと赤外線受信モジュール(CHQ1838)、単三用電池ボックス、9V角型電池用ボックスを取り付ける

途中で写真を撮るの忘れて完成後の写真しかないのですが、以下のレイアウトで上段シャーシにArduino、赤外線モジュール、単三電池ボックス、9V角型電池用ボックスを取り付けます。

上記の写真は接続した後ですが、まだこのタイミングでは、上段シャーシと下段シャーシは接続しません。

4.配線する

このタイミングで先に紹介させていただいた通りに配線しました。モータードライバーに接続しておいた線は上段シャーシの前方の穴から通しました。

単三電池ボックスの線はモータードライバーの電源へ接続するので、上段シャーシの中央付近の穴から下へ落としました。

5.下段シャーシと上段シャーシを接続する

上下のシャーシを接続して完成です。固定した方が配線しやすければ、必要な線を通した後に上下のシャーシを接続し、接続後に配線してもよいと思います。配線完了後に9V電池、単三電池4本を電池ボックスに入れ、Arduino、モータードライバーへの通電を確認しておきます。以上で組み立ては完了となります。

ソフトウェア作成

ソースコードは以下になります。


#include <IRremote.h>
#define IR_RECEIVE_PIN  12  //受信ピン指定

IRrecv rcvdata(IR_RECEIVE_PIN); // 受信オブジェクトを作成 
decode_results dec_results;  // 受信データの格納先

// Arduinoとモータードライバ(L298N)の接続
// モーターA
int ENA = 5;
int IN1 = 2;
int IN2 = 4;

// モーターB
int ENB = 6;
int IN3 = 7;
int IN4 = 8;

//未受信カウンター
int no_rcvcnt;

void setup() {
  // put your setup code here, to run once:
   rcvdata.enableIRIn();     // 赤外線受信開始

  // 制御に使用するArduinoピンをoutputにセット
  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);

  no_rcvcnt = 0;
}

void loop() {
  // put your main code here, to run repeatedly:
   if (rcvdata.decode(&dec_results)) {      // 受信確認
      if (dec_results.value == 0xA23D807F){ // 1ボタンを押すと前進
            // モーターA
            // 回転方向指定
            digitalWrite(IN1, LOW);
            digitalWrite(IN2, HIGH);
            // 出力(電圧)指定 0~255(8bit)
            analogWrite(ENA, 230);

            // モーターB
            // 回転方向指定
            digitalWrite(IN3, LOW);
            digitalWrite(IN4, HIGH);
            // 出力(電圧)指定 0~255(8bit)
            analogWrite(ENB, 230);
       }else if(dec_results.value == 0xA23D40BF){ // 2ボタンを押すと後進
            // モーターA
            // 回転方向指定
            digitalWrite(IN1, HIGH);
            digitalWrite(IN2, LOW);
            // 出力(電圧)指定 0~255(8bit)
            analogWrite(ENA, 230);

             // モーターB
            // 回転方向指定
            digitalWrite(IN3, HIGH);
            digitalWrite(IN4, LOW);
            // 出力(電圧)指定 0~255(8bit)
            analogWrite(ENB, 230);
       }else if(dec_results.value == 0xA23DC03F){ // 3ボタンを押すと左回転
            // モーターA
            // 回転方向指定
            digitalWrite(IN1, LOW);
            digitalWrite(IN2, HIGH);
            // 出力(電圧)指定 0~255(8bit)
            analogWrite(ENA, 230);

             // モーターB
            // 回転方向指定
            digitalWrite(IN3, HIGH);
            digitalWrite(IN4, LOW);
            // 出力(電圧)指定 0~255(8bit)
            analogWrite(ENB, 230);
       }
       else if(dec_results.value == 0xA23D20DF){ // 4ボタンを押すと右回転
            // モーターA
            // 回転方向指定
            digitalWrite(IN1, HIGH);
            digitalWrite(IN2, LOW);
            // 出力(電圧)指定 0~255(8bit)
            analogWrite(ENA, 230);

             // モーターB
            // 回転方向指定
            digitalWrite(IN3, LOW);
            digitalWrite(IN4, HIGH);
            // 出力(電圧)指定 0~255(8bit)
            analogWrite(ENB, 230);
       }
       rcvdata.resume();                    //リセット
       no_rcvcnt = 0;
   }else{
      //受信していないときは停止(2回で確定にする)
      if(no_rcvcnt >0){
         // モーターA
         // 停止
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        // PWM出力 0に設定
        analogWrite(ENA, 0);

        // モーターB
         // 停止
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
        // PWM出力 0に設定
        analogWrite(ENB, 0);
        }else{
          no_rcvcnt++;
        }
   }
   delay(100); //100ms待つ
}

上記ソースコードの説明ですが、以下の記事で説明しているソースコードを組み合わせた形になりますので、参考にしていただければと思います。

こちらもCHECK

Arduinoで赤外線受信モジュールを使いリモコン信号受信してみました

続きを見る

こちらもCHECK

Arduino+家にあるリモコン(赤外線)でモーター制御してみました

続きを見る

実行結果

実際に動かしてみました。ちゃんと「1」、「2」、「3」、「4」だけに反応し、ほかのボタンには反応せず、ボタンを押している間だけ想定したように動いてくれています。

猫が「なにこれ?」という感じでずっと見ていましたが、しばらくすると慣れてきてめっちゃ攻撃しはじめました笑

以上、今回はArduino+家にあるリモコンでラジコンを作成した内容を紹介させていただきました。

まとめ

今回はラジコンを作成してみました。

実際に手を動かして動くものができると、愛着がわきまくります笑

この愛着があるから、ものづくりが好きでやめられないのだと思います^^

今後もものづくりは継続しますので、また何か作りましたら紹介させていただきます。

最後まで読んでくださりありがとうございました。

  • この記事を書いた人
  • 最新記事

NaruTaku

40代のフリーランスエンジニア・シナリオライター。 20代前半から20年間エンジニアとしてキャリアを積みフリーランスへ転身。ソフトウェア開発とゲーム開発、シナリオ執筆をメインに、プログラミング講師・Webライターとしても活動。また、フリーランスになり見た目の重要性に今さら気づき、ヒゲ脱毛を実施中。

-趣味, 電子工作