下手の横好きのスクラップブック!!

下手の横好きの、いろいろな記録です。
電子工作・PIC・Arduino・太陽光発電・写真などetc

Arduino用モータードライブシールド「Arudumoto」でモーターを回す(4)

2014-01-25 | Arduino

クローラーの進行方向を変える
 前回までのクローラーの進行方向は前進と後退のみでしたので、進行方向を変えたり旋回したりのスケッチを追加しました。

90度方向転換
 左・右に90度方向を変えるために、AモーターとBモーターの回転方向を逆にして、回転角度が90度になるよう時間を調整しました。

イメージ(左へ方向転換)


 方向転換のサブルーチン
  //90度左曲り
  void left(int mspeed,int mtime)
  {
  digitalWrite(dir_b,LOW);
  digitalWrite(dir_a,HIGH);
  analogWrite(pwm_b,mspeed);
  analogWrite(pwm_a,mspeed);
  if(mtime>0){
  delay(mtime);
  analogWrite(pwm_b,0);
  analogWrite(pwm_a,0);
  }
 }


左右に旋回する
 左右に曲がりながら走行するように、AモーターとBモーターの回転数を変えます。回転数の差が大きいほど小回りになります。
 モーター毎に回転数が変わるので引数が3個になります。

 イメージ(右へ旋回)

 
 旋回のサブルーチン
 //前進左旋回
 void FLcircle(int amspeed,int bmspeed,int mtime)
  {
  digitalWrite(dir_a,HIGH);
  digitalWrite(dir_b,HIGH);
  analogWrite(pwm_a,amspeed);
  analogWrite(pwm_b,bmspeed);
  if(mtime > 0){
  delay(mtime);
  analogWrite(pwm_a,0);
  analogWrite(pwm_b,0);
  }
 }

 

トータルスケッチ
 直進と左90℃方向転換を4回繰り返し元の場所に戻る
 左方向に1回転旋回し元の場所に戻る

 //モーターピン設定
 int pwm_a = 3;
 int dir_a = 12;
 int pwm_b = 11;
 int dir_b = 13;

//スタートスイッチ LEDピン設定
 int ST_SWITCH = 7;
 int LED = 6;

//サブルーチン

//前進設定
void forw()
 {
 digitalWrite(dir_a,HIGH);
 digitalWrite(dir_b,HIGH);
 }

//後退設定
void back()
 {
 digitalWrite(dir_a,LOW);
 digitalWrite(dir_b,LOW);
 } 

//前進
void forward(int mspeed,int mtime)
 {
 digitalWrite(dir_a,HIGH);
 digitalWrite(dir_b,HIGH);
 analogWrite(pwm_a,mspeed);
 analogWrite(pwm_b,mspeed);
 if(mtime > 0){
  delay(mtime);
  analogWrite(pwm_a,0);
  analogWrite(pwm_b,0);
  }
 }

//後退
void backward(int mspeed,int mtime)
 {
 digitalWrite(dir_a,LOW);
 digitalWrite(dir_b,LOW);
 analogWrite(pwm_a,mspeed);
 analogWrite(pwm_b,mspeed);
 if(mtime > 0){
  delay(mtime);
  analogWrite(pwm_a,0);
  analogWrite(pwm_b,0);
  }
 }
//90度左曲り
void left(int mspeed,int mtime)
 {
 digitalWrite(dir_b,LOW);
 digitalWrite(dir_a,HIGH);
 analogWrite(pwm_b,mspeed);
 analogWrite(pwm_a,mspeed);
 if(mtime>0){
  delay(mtime);
  analogWrite(pwm_b,0);
  analogWrite(pwm_a,0);
  }
 }
//90度右曲り
void right(int mspeed,int mtime)
 {
 digitalWrite(dir_b,HIGH);
 digitalWrite(dir_a,LOW);
 analogWrite(pwm_b,mspeed);
 analogWrite(pwm_a,mspeed);
 if(mtime>0){
  delay(mtime);
  analogWrite(pwm_b,0);
  analogWrite(pwm_a,0);
  }
 }

//前進左旋回
void FLcircle(int amspeed,int bmspeed,int mtime)
 {
 digitalWrite(dir_a,HIGH);
 digitalWrite(dir_b,HIGH);
 analogWrite(pwm_a,amspeed);
 analogWrite(pwm_b,bmspeed);
 if(mtime > 0){
  delay(mtime);
  analogWrite(pwm_a,0);
  analogWrite(pwm_b,0);
  }
 }

//前進右旋回
void FRcircle(int amspeed,int bmspeed,int mtime)
 {
 digitalWrite(dir_a,HIGH);
 digitalWrite(dir_b,HIGH);
 analogWrite(pwm_a,amspeed);
 analogWrite(pwm_b,bmspeed);
 if(mtime > 0){
  delay(mtime);
  analogWrite(pwm_a,0);
  analogWrite(pwm_b,0);
  }
 }

//停止
void stopped()
 {
 digitalWrite(dir_a,LOW);
 digitalWrite(dir_b,LOW);
 analogWrite(pwm_a,0);
 analogWrite(pwm_b,0);
 }

//緩やかにスタート
void fadein()
 {
  for(int i=0;i<=200;i+=1){
  analogWrite(pwm_a,i);
  analogWrite(pwm_b,i);
  delay(30);
  }
 }

//緩やかに停止
void fadeout()
 {
  for(int i=200;i>=0;i-=1){
  analogWrite(pwm_a,i);
  analogWrite(pwm_b,i);
  delay(30);
  }
 }

 
void setup()
  {
  //ピンモード設定
   pinMode(pwm_a, OUTPUT);
    pinMode(dir_a, OUTPUT);
 
   pinMode(pwm_b, OUTPUT);
    pinMode(dir_b, OUTPUT); 
 
  pinMode(ST_SWITCH,INPUT);
  pinMode(LED,OUTPUT);
   }


void loop()
   {

   while(1){
 if(digitalRead(ST_SWITCH)==LOW)break;
 }

  digitalWrite(LED,HIGH);

   delay(2000);


forward(150,5000);
delay(1000);
left(150,1000);

forward(150,5000);
delay(1000);
left(150,1000);

forward(150,5000);
delay(1000);
left(150,1000);

forward(150,5000);
delay(1000);
left(150,1000);


FLcircle(150,80,22000);
delay(1000);

stopped();

digitalWrite(LED,LOW);

 }
 

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Arduino用モータードライブシ... | トップ | Arduino用モータードライブシ... »
最新の画像もっと見る

コメントを投稿

Arduino」カテゴリの最新記事