2018-10-19
arduinoの基礎勉強をしてきたが、このへんで当初の目的であったarduinoでRC可動戦車を動かす計画に入ります。
これまでの応用で、ジョイスティックで2個のDCモータをPWM速度可変で動かします。
DCモータはモータドライバーを介して動かします。
スティック操作と動きは、慣れたVSタンクの仕様に準拠させます。
↑で直進、↓で後進、
→で右超信地旋回、←左超信地旋回、
右斜め上で前進右旋回、左斜め上で前進左旋回、
右斜め下で後進右旋回、左斜め下で後進左旋回、
中央付近(フリーポジション)で停止。
スティックの角度(位置)で低速から高速までコントロールします。
Arduino Joystick 2 DC motor control
【接続図】
//joystick_control_2_dc_motor_B
//1個のjoystickで2個のDCモータをコントロールし前進、後退、信地旋回、超信地旋回させる
int joystick_x = A0;
int joystick_y = A1;
int pos_x;
int pos_y;
int PWMA = 11; //Aモータ PWM 右側モータ
int AIN1 = 9; //Aモータ IN1
int AIN2 = 8; //Aモータ IN2
int BIN1 = 7; //Bモータ IN1
int BIN2 = 6; //Bモータ IN2
int PWMB = 10; //Bモータ PWM 左側モータ
int motor_speed;
const int speed1 = 128; //超信地旋回速度
void setup ( ) {
Serial.begin (9600); //9600bpsでシリアル通信
pinMode(PWMA, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
pinMode(PWMB, OUTPUT);
pinMode (joystick_x, INPUT) ;
pinMode (joystick_y, INPUT) ;
}
void loop () {
pos_x = analogRead (joystick_x) ; //joystickのX方向の値 0-400-600-1023
pos_y = analogRead (joystick_y) ; //joystickのY方向の値 0-400-600-1023
if ((pos_x > 400) && (pos_x < 600) && (pos_y < 400)) { //前進
motor_speed = map(pos_y, 400, 0, 0, 255);
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, HIGH);
analogWrite(PWMA, motor_speed);
digitalWrite(BIN1, LOW);
digitalWrite(BIN2, HIGH);
analogWrite(PWMB, motor_speed);
}
//joystickセンター付近は停止
else if ((pos_x > 400) && (pos_x < 600) && (pos_y > 400) && (pos_y < 600)) {
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, LOW);
digitalWrite(BIN1, LOW);
digitalWrite(BIN2, LOW);
}
else if ((pos_x > 400) && (pos_x < 600) && (pos_y > 600)) { //後進
motor_speed = map(pos_y, 600, 1023, 0, 255);
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, LOW);
analogWrite(PWMA, motor_speed);
digitalWrite(BIN1, HIGH);
digitalWrite(BIN2, LOW);
analogWrite(PWMB, motor_speed);
}
else if ((pos_x > 600) && (pos_y < 400)) { //前進右旋回
motor_speed = map(pos_y, 400, 0, 0, 255);
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, LOW);
analogWrite(PWMA, motor_speed);
digitalWrite(BIN1, LOW);
digitalWrite(BIN2, HIGH);
analogWrite(PWMB, motor_speed);
}
else if ((pos_x > 600) && (pos_y > 400) && (pos_y < 600)) { //右超信地旋回
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, LOW);
analogWrite(PWMA, speed1);
digitalWrite(BIN1, LOW);
digitalWrite(BIN2, HIGH);
analogWrite(PWMB, speed1);
}
else if ((pos_x > 600) && (pos_y > 600)) { //後進右旋回
motor_speed = map(pos_y, 600, 1023, 0, 255);
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, LOW);
analogWrite(PWMA, motor_speed);
digitalWrite(BIN1, HIGH);
digitalWrite(BIN2, LOW);
analogWrite(PWMB, motor_speed);
}
else if ((pos_x < 400) && (pos_y < 400)) { //前進左旋回
motor_speed = map(pos_y, 400, 0, 0, 255);
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, HIGH);
analogWrite(PWMA, motor_speed);
digitalWrite(BIN1, LOW);
digitalWrite(BIN2, LOW);
analogWrite(PWMB, motor_speed);
}
else if ((pos_x < 400) && (pos_y > 400 && pos_y < 600)) { //左超信地旋回
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, HIGH);
analogWrite(PWMA, speed1);
digitalWrite(BIN1, HIGH);
digitalWrite(BIN2, LOW);
analogWrite(PWMB, speed1);
}
else if ((pos_x < 400) && (pos_y > 600)) { //後進左旋回
motor_speed = map(pos_y, 600, 1023, 0, 255);
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, LOW);
analogWrite(PWMA, motor_speed);
digitalWrite(BIN1, LOW);
digitalWrite(BIN2, LOW);
analogWrite(PWMB, motor_speed);
}
}