SSブログ

リモートコントロール(RC)戦車をつくる【スケッチ_モータ制御】 [RC戦車]

モータドライバ回路ができたので、モータを制御するスケッチを完成させます。以前にモータの状態の代わりに3個のLEDを組み合わせて点灯・消灯させたスケッチを作ったので、それを元に編集していきます。

【スケッチ】
/*
  SparkFun Electronics 2013
  Playing with Infrared Remote Control
  
  IR Receiver Breakout (SEN-8554): Supply voltage of 2.5V to 5.5V
    Attach
    OUT: To pin 13 on Arduino
    GND: GND
    VCC: 5V
  
  This is based on Ken Shirriff's code found on GitHub:
  https://github.com/shirriff/Arduino-IRremote/

  This code works with cheap remotes. If you want to look at the individual timing
  of the bits, use this code:
  http://www.arduino.cc/playground/Code/InfraredReceivers
*/

#include <IRremote.h>           // 赤外線送受信用ヘッダファイル

int RECV_PIN = 11;              // 赤外線受信モジュール
IRrecv irrecv(RECV_PIN);        // 赤外線受信用オブジェクトの設定
decode_results results;         // 赤外線受信結果を格納する
#define POWER 0x10EFD827
#define A 0x10EFF807
#define B 0x10EF7887
#define C 0x10EF58A7
#define UP 0x10EFA05F
#define DOWN 0x10EF00FF
#define LEFT 0x10EF10EF
#define RIGHT 0x10EF807F
#define SELECT 0x10EF20DF

#define SPEED 128               //モータへの電圧(スピード)は一定

// set pin numbers:
 // 右キャタピラ用ピン
const int R_Vref = 5;           //D5(PWM)
const int R_OUT1 = 3;           //D3
const int R_OUT2 = 4;           //D4
 // 左キャタピラ用ピン
const int L_Vref = 6;           //D6(PWM)
const int L_OUT1 = 7;           //D7
const int L_OUT2 = 8;           //D8

// 初期化(電源投入/リセット時1回のみ実行):
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver

// initialize the motor driver pin as an output(Arduinoにモータドライバへのピンが出力であることを伝える)
  pinMode(R_Vref, OUTPUT);
  pinMode(R_OUT1, OUTPUT);
  pinMode(R_OUT2, OUTPUT);
  pinMode(L_Vref, OUTPUT);
  pinMode(L_OUT1, OUTPUT);
  pinMode(L_OUT2, OUTPUT);

 // モータドライバのスピードを指定
  analogWrite(R_Vref, SPEED);
  analogWrite(L_Vref, SPEED);
}

// main loop:
void loop() 
{
  if (irrecv.decode(&results))  //(★これが無いと動作しない)
  {
    switch(results.value)
    {
      case UP:                  //UPなら前進
        digitalWrite(R_OUT1, LOW);
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);
        delay(1600);            //100µs待つ(貫通電流防止)
        digitalWrite(R_OUT1, HIGH);
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, HIGH);
        digitalWrite(L_OUT2, LOW);
        break;
      case RIGHT:               //RIGHTなら右転進
        digitalWrite(R_OUT1, LOW);
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);
        delay(1600);            //100µs待つ(貫通電流防止)
        digitalWrite(R_OUT1, LOW);
        digitalWrite(R_OUT2, HIGH);
        digitalWrite(L_OUT1, HIGH);
        digitalWrite(L_OUT2, LOW);
        break;
      case LEFT:                //LEFTなら左転進
        digitalWrite(R_OUT1, LOW);
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);
        delay(1600);            //100µs待つ(貫通電流防止)
        digitalWrite(R_OUT1, HIGH);
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, HIGH);
        break;
      case DOWN:                //DOWNなら後進
        digitalWrite(R_OUT1, LOW);
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);
        delay(1600);            //100µs待つ(貫通電流防止)
        digitalWrite(R_OUT1, LOW);
        digitalWrite(R_OUT2, HIGH);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, HIGH);
        break;
      case SELECT:              //SELECTなら停止
        digitalWrite(R_OUT1, LOW);
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);
        break;
      default:
        break;
    }
      irrecv.resume();          // 受信機をリセットする(★これが無いと1回のみの制御となる)
  }
}

※#include <IRremote.h>は表示の不具合で全角<>で記載しています。本当は半角<>ですのでご注意ください。

【Tips】 ちょっとしたノウハウをまとめます。
①ピンはボードのピンヘッダでアサイン
最初、デバイスピン番号でアサインしていましたが、動作確認で挙動がおかしかったので確認していたところ、ボードのピンヘッダでアサインしてうまくいきました。ちょっと焦りました。。。

【ArduinoProMini(The Simple)ピン配置図】
ArduinoProMini(The Simple)ピン配置図.jpg

②3ピンはPWM出力可能のはずだが、信号が出ない!
最初、アナログ出力(PWM)として「R_Vref = 3;」でピンアサインしたのですが、その後動作確認したところ信号が出力されていないので、5ピンに再アサインしたらOKでした。
3ピンはPWM出力可能のはずですが、出力しない原因は不明。
個体の問題なのか、互換機としてのこの製品の制限なのかなー?



profile_picture_40×40.JPG
#月が近いので続きもののようにみえるけど、実は1年ぶりだー( ´艸`)
nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。