クローラーの進行方向を変える
前回までのクローラーの進行方向は前進と後退のみでしたので、進行方向を変えたり旋回したりのスケッチを追加しました。
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);
}