ホーム > カテゴリ > ロボット・電子工作・マイコン >

ラジコンカーを作成する(赤外線) [Arduino]

赤外線リモコンを使用してロボットカーを操作するラジコンです。

今回はDCモーターを操作する「モータードライバー」を使用していないので「前進、左旋回、右旋回」のみです。また、緑色のLEDは赤外線受信OK。赤色のLEDは赤外線受信の失敗となります。

写真

[表]

[後]

[裏]

※裏側にある白いミニブレッドボードは未使用です。

[リモコン]

使用部品・材料

総額で約3500円です。(Arduino本体の値段を除く)

部品/材料値段備考
ブレッドボード
2個
¥270秋月電子の通販コード(P-00315)
オプトサプライ赤外線リモコン(OE13KIR)¥300秋月電子の通販コード(M-07245)
赤外線リモコン受信モジュール(PL-IRM1261-C438)¥100この受信モジュールは片側しか受信できないように見えますが、壁の反射で360度どの方向からでも赤外線を受信できるようです。

秋月電子の通販コード(I-04169)
LED
2種類
数円赤色と緑色
NchパワーMOSFET 2SK703
2個
¥60このトランジスター(MOSFET)はモーターを動作させる為の電気的なスイッチです。

秋月電子の通販コード(I-11616)
コンデンサ(100μF 25V 85℃)¥10コンデンサは電圧の安定やノイズの除去などの効果があります。

The Arduino Starter Kit(日本語版)に付属していたコンデンサを使用しています。(秋月電子のP-03122と同じだと思います)
ダイオード(IN4007 MIC)
2個
数円ダイオードはモーターから発生する逆起電力でトランジスターやArduinoが壊れないように防ぎます。

The Arduino Starter Kit(日本語版)に付属していたダイオードを使用しています。(IN4007シリーズならほぼ同じだと思います)
カーボン抵抗器数円220Ω(4個)と1KΩ(2個)を使用
前輪用のキャスター¥100大きなホームセンターで白いキャスターを購入。アマゾンだと「タミヤ ボールキャスター 2セット入 (70144)」(903円)も検討すると良いです。
タミヤ
ユニバーサルプレート 2枚セット (70157) 
¥468
タミヤ
ツインモーターギヤーボックス (70097)
¥587ギアは低速ギヤー比203:1のCタイプを使用します。

1つのモーターの電圧は恐らく1.5Vから3Vです。9Vでモーターを回すと超高速になりますのでモーターが壊れる可能性が高いのでご注意ください。
タミヤ
マンモスダンプ 17013
¥819タイヤ2個単3電池ボックスのみを使用しています。

単3電池ボックスをモーターの電源としてプラスマイナスを逆に使用するとダイオードが熱くなって危険ですので注意して下さい。

[使用例]
3mmプラネジ(7mm)+六角スペーサー(14mm)セット¥50基盤やユニバーサルプレートの連結用。
秋月電子の通販コード(P-01861)
9V電池¥100Arduino本体用
単3電池
2本
¥50モーター用
2.1mmDCプラグ付バッテリースナップ¥609V電池用。
秋月電子の通販コード(P-07357)
コネクタ付コード(みの虫×ジャンパーワイヤ)¥110単3電池ボックス用。
秋月電子の通販コード(C-08916)

LEDやコンデンサ、ダイオードには「極性」がありますので、プラス、マイナスを絶対に間違えない様にしてください。また、その他の電子部品にも仕様がありますので必ず部品のデータシートをご確認ください。

配線図

※大きい配線図はZIPで提供しています。

FritZingで配線図を作成する時にMOSFET/赤外線受信モジュールのパーツがないので、他のパーツで代用しています。

スケッチ(プログラム)

「赤外線リモコンのデータを受信する」と「ライントレースカー」を組み合わせたコードとなります。(この記事リンクは冒頭にあります)

#define INFRARED        2  // 赤外線センサー
#define RECEIVE_OK      3  // 受信OK(LED)
#define RECEIVE_ERROR   4  // 受信失敗(LED)
#define R_MOTORPIN      9  // 右のモーター
#define L_MOTORPIN     10  // 左のモーター
 
void setup() {
  Serial.begin(9600);   
  
  // モーター
  pinMode(R_MOTORPIN, OUTPUT); 
  pinMode(L_MOTORPIN, OUTPUT);  
  
  // 赤外線
  pinMode(INFRARED, INPUT);
  pinMode(RECEIVE_OK,OUTPUT);
  pinMode(RECEIVE_ERROR,OUTPUT);  
}
 
void loop() {
  unsigned long dword = 0, pls;

  // リーダーコードの開始(8T = 9ms)
  while(digitalRead(INFRARED) == HIGH){
    // none
  }
  
  // リーダーコードの終了(4T = 4.5ms)
  while(digitalRead(INFRARED) == LOW){
    // none    
  } 

  // NECフォーマットの読み込み(32bit)
  // (16bitのカスタマーコード(メーカー識別コード) + 8bitのデータコード + 8bitの反転データコード)
  for(int i = 0; i < 32; i++) {       
    // パルスの検出(パルスの長さ)    
    // ※戻り値はマイクロ秒(μs)
    pls = pulseIn(INFRARED, HIGH);          

    // パルス検出のタイムアウト(1秒)
    if(pls >= 1000000) {
      Serial.println("timeout");   
      return;                
    }
     
    // ビットが1の場合にデータを加算する
    // ※ビット0= 1125μs ビット1 = 2250μs
    if(pls >=  1126){
     // Serial.println(pls);   
      dword |= 1UL << i;  
    }
  }

  // 待機状態のエラーを回避
  // ※このスケッチ固有のエラーです。
  if(dword == 0){return;}
    
  // リピートコード(9ms + 2.25ms)
  pulseIn(INFRARED, HIGH);  
 
  // ストップビット(0.56ms)
  while(digitalRead(INFRARED) == HIGH){
    // none
  } 

  // データコードが正しく受信できているかを確認
  byte bit8_data1 = (dword >> 16) & 0xFF;         // データコード
  byte bit8_data2 = 255 - ((dword >> 24) & 0xFF); // データコードの反転

  if(bit8_data1 == bit8_data2){
    
    // 送信波形を反転する
    dword = (dword  >> 24)  & 0xFF        |
            ((dword >> 16)  & 0xFF) << 8  |
            ((dword >>  8)  & 0xFF) << 16 |            
             (dword & 0xFF)         << 24;   

    // デバッグ用         
    Serial.println(dword ,HEX);     
    
    // 直進
    if(dword == 0x10EFA05F){
      digitalWrite(R_MOTORPIN, HIGH);
      digitalWrite(L_MOTORPIN, HIGH);   

      // 1秒
      delay(1000); 
         
    // 左へ  
    }else if(dword == 0x10EF10EF){
      digitalWrite(R_MOTORPIN, HIGH);
      digitalWrite(L_MOTORPIN, LOW); 

      // 0.5秒
      delay(500); 
      
    // 右へ  
    }else if(dword == 0x10EF807F){
      digitalWrite(R_MOTORPIN, LOW);
      digitalWrite(L_MOTORPIN, HIGH); 

      // 0.5秒
      delay(500); 
    }        
    
    digitalWrite(R_MOTORPIN, LOW);
    digitalWrite(L_MOTORPIN, LOW);
  
    
    // LEDの点灯(成功)     
    digitalWrite(RECEIVE_OK,HIGH);
    delay(300);
    digitalWrite(RECEIVE_OK,LOW);
  }else{
    // LEDの点灯(失敗)     
    digitalWrite(RECEIVE_ERROR,HIGH);
    delay(300);
    digitalWrite(RECEIVE_ERROR,LOW); 
  }  
} 

赤外線を受信した際のモーターの実行時間など各自で調整して下さい。

最後に

今回は赤外線を使用したラジコンです。電波を使用したラジコンと比べると受信感度は悪いですのでご了承ください。





掲示板

ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。

関連記事



公開日:2017年03月30日 最終更新日:2017年08月20日
記事NO:02311