2007年07月15日

Arduino

少し大きめのモータを使う

L6302.jpg
以前ここで紹介したモータドライバーは、最大で2Aしか流せなかった、
もう少し大きなモータで動かしてみるために、
最大5A流せるL6203というモータドライバーを使ってみた。
L6302_1.jpg

使う部品
モータードライバーL6203(カタログ)
コンデンサー
放熱器
モーター

モータドライバーの仕様と回路
11. ENABLE:速度調整用(今回は9に接続)
10. SENSE:動力電源用GND
9. VREF:0.22μFのコンデンサーとつなぐ
8. BOOT2:動力電圧安定のため0.15μFとつなぐ
7. IN2:モータ回転方向,停止制御(今回は5に接続)
6. GND:GND
5. IN1:モータ回転方向,停止制御(今回は6に接続)
4. BOOT1:動力電圧安定のため0.15μFとつなぐ
3. OUT1:モーターに接続
2. Vs:12V
1. OUT2:モーターに接続
moterL6203.gif

モータードライバーのピンが、千鳥足になっているため、
ブレッドボードにつけれないので、簡単な半田付けをした。
動作は、ここのプログラムで確認した。

今回使ったモータは、マクソン社のギアヘッドとロータリーエンコーダ付コアレスモータ。モーターにギアボックスとセンサーが一体化しているので、精度が高いものを作るときに向いている。

マクソンのモータは、ギアヘッドとエンコーダーの組み合わせを、スイスの工場で行うため、取り寄せに1ヶ月半かかった。
簡単に手に入るギアヘッド付きのモーターは、タミヤのものがある。
また、千石電商では、多くの種類をあつかっている。

Arduino

Flashから2つのモータを動かす

moter2.jpg

ソースをダウンロード

以前、ここで紹介した方法では、1つのモーターしか動かせなかった。

今回は、2つのモータの速度を変更するために、
ArduinoのanalogWrite()関数を使って変更することにした。
analogWrite()は、基盤にPWMと書いてあるポートが使える。
moter2_ar.jpg
PWMとか書かれていないピンを使いたいときは、前回と同じ方法で、
HIGHとLOWをコントロールする必要がある。
今回は、ポートの9と10を使うことにした。
前回と違うところは、analogWrite()は0~255までしか扱えないので、
送信するデータを3桁に変更。

データの形式は、
s(ヘッダー) + 1つ目のデータ + 2つめのデータ
とした。

arduinoのソース

int motor1Pin1 = 4;             // モータ1入力ピン
int motor1Pin2 = 5;             // モータ1入力ピン
int motor2Pin1 = 6;             // モータ2入力ピン
int motor2Pin2 = 7;             // モータ2入力ピン

int speedPin1 = 9;              // モータ1速度調整ピン
int speedPin2 = 10;             // モータ2速度調整ピン

int keta, sum, count;           // データ受信用
int speed1 = 0;                 // モータ1の速度
int speed2 = 0;                 // モータ2の速度
char cwFlg1 = 'c';              // モータ1の回転方向
char cwFlg2 = 'c';              // モータ3の回転方向

const int KETAMAX = 3;          // 受信桁数 

void setup() {
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(motor2Pin1, OUTPUT);
  pinMode(motor2Pin2, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  //------------------------- データ受信
  if(Serial.available()>0){      // データが来た
    int val = Serial.read();
    if(val == 's'){              // ヘッダー受信
      count = 0;                 // データカウンター初期化
    }else if(val == 'c' || val == 'n'){ // データのはじめ
      if(count == 0){cwFlg1 = val;}     // 回転方向
      else {cwFlg2 = val;}  
      count++;
      keta = KETAMAX;            // 桁数初期化
      sum = 0;
    }else{                       // 数値データ
      val -= 48;                 // アスキー→数値に変換
      for(int i=1; i < keta; i++){// 桁数を計算
        val *= 10;
      }
      sum += val;
      keta --;
      if(keta == 0){            // すべてのデータ受信終了
        if(count==1){           // モータ1の速度
          speed1 = constrain(sum, 0, 255);  // オーバーフローする値を切り捨て
        }else{                  // モータ2の速度
          speed2 = constrain(sum, 0, 255);  // オーバーフローする値を切り捨て
        }
      }
    }
  }
  
  //------------------------- モータ動作
  // 停止、回転方向をチェック
  // モータ1
  if(speed1 == 0){              // モータ停止
    digitalWrite(motor1Pin1, LOW);
    digitalWrite(motor1Pin2, LOW);
  }else if(cwFlg1 == 'c'){      // 時計回転
    digitalWrite(motor1Pin1, HIGH);
    digitalWrite(motor1Pin2, LOW);
  }else{                      // 反時計回転
    digitalWrite(motor1Pin1, LOW);
    digitalWrite(motor1Pin2, HIGH);
  }
  // モータ2
  if(speed2 == 0){             // モータ停止
    digitalWrite(motor2Pin1, LOW);
    digitalWrite(motor2Pin2, LOW);
  }else if(cwFlg2 == 'c'){     // 時計回転
    digitalWrite(motor2Pin1, HIGH);
    digitalWrite(motor2Pin2, LOW);
  }else{                      // 反時計回転
    digitalWrite(motor2Pin1, LOW);
    digitalWrite(motor2Pin2, HIGH);
  }
  
  // モータの速度調整
  analogWrite(speedPin1, speed1);
  analogWrite(speedPin2, speed2);
}