クリエイティブ・制作

【Arduino入門】赤外線ラジコンの作り方|配線とコード完全解説

Arduino と赤外線リモコン(家にあるDVDレコーダーのリモコン)で、簡単なラジコンを作ってみました。

赤外線受信モジュール(CHQ1838)でリモコン信号を受け取り、モータードライバ(L298N)経由でDCモーター2基を制御します。
「1:前進 / 2:後進 / 3:左回転 / 4:右回転」の4操作だけに絞ったシンプル仕様です。

この記事では、必要な部材・配線・ソースコードをまとめて紹介します。


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制作】赤外線受信モジュールでリモコン信号を読み取る方法

Arduinoと赤外線受信モジュールを使って、リモコン信号を読み取る電子工作で遊んでみました。 仕組みはとてもシンプルですが、 赤外線が扱えるようになると電子工作の幅が一気に広がります。 今回は初心者 ...

続きを見る

こちらもCHECK

【Arduino制作】赤外線リモコンでモーター制御!初心者向け解説

家にあるDVDレコーダーのリモコンで、Arduinoのモーター制御ができたら面白そうだなと思い、実際に作ってみました。 赤外線受信モジュールでリモコン信号を読み取り、 モータードライバ経由でDCモータ ...

続きを見る


実行結果

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

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

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


まとめ

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

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

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

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


✅ ITキャリアを育てるコミュニティ「ITキャリアラボ」

「独学だと続かない…」
「相談できる人がいない…」
「同じ目標の仲間がほしい…」

そんな方向けに、
無料のLINEコミュニティ『ITキャリアラボ』を運営しています。

エンジニア歴20年・講師の僕が、

・資格学習のコツ
・勉強法アドバイス
・キャリア相談
・IT業界のリアル情報

などを発信&質問対応しています。

📌 参加無料・匿名OK・LINEだけで完結
📌 まずは「話を聞くだけ」でも大歓迎

独学で悩む時間を減らしたい人は、気軽に頼ってください。

👇お気軽にどうぞ

ITキャリアラボ

【無料】ITの悩みを気軽に相談できるコミュニティ・ITキャリアラボ

IT業界を目指すあなたへ|「ITキャリアラボ」無料コミュニティのご案内 「IT業界に転職したいけど、何から始めればいいかわからない…」「資格の勉強が続かない…」「相談できる人がいない…」 そんな不安、 ...

続きを見る

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

ユウイチ

20年間ソフトウェアエンジニアとして働いた後、フリーランスを経て現在は1人社長として活動。 プログラミング講師やIT教育を中心に活動しながら、趣味でゲーム開発やシナリオ作成にも挑戦中。どちらも「創ることを通じて人を笑顔にしたい」という想いから始めた、大切なライフワーク。 「創造と教育で、人生に迷う人の“自由な一歩”を支援」を理念に発信中。

-クリエイティブ・制作