Ganponブログ

趣味の模型作り、ドライブ、旅行など
since Mar.2017

ArduinoでRC可動戦車(1)【Arduinoスケッチ訂正版】

2018-10-25 21:55:20 | Arduino
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);
}
}


ArduinoでRC可動戦車(1)

2018-10-25 21:54:15 | Arduino

2018-10-19
arduinoの基礎勉強をしてきたが、このへんで当初の目的であったarduinoでRC可動戦車を動かす計画に入ります。
これまでの応用で、ジョイスティックで2個のDCモータをPWM速度可変で動かします。
DCモータはモータドライバーを介して動かします。

スティック操作と動きは、慣れたVSタンクの仕様に準拠させます。
↑で直進、↓で後進、
→で右超信地旋回、←左超信地旋回、
右斜め上で前進右旋回、左斜め上で前進左旋回、
右斜め下で後進右旋回、左斜め下で後進左旋回、
中央付近(フリーポジション)で停止。
スティックの角度(位置)で低速から高速までコントロールします。

Arduino Joystick 2 DC motor control

【接続図】

 

【スケッチ】一部が欠落していたので、訂正版を公開します。2022-04-26
朱書きの行をコメントに書いた内容に置き換えてください。

joystick_control_2_dc_motor_B.ino 


1: //joystick_control_2_dc_motor_B
2: //1個のjoystickで2個のDCモータをコントロールし前進、後退、信地旋回、超信地旋回させる
3: int joystick_x = A0;
4: int joystick_y = A1;
5: int pos_x;
6: int pos_y;
7: int PWMA = 11; //Aモータ PWM 右側モータ
8: int AIN1 = 9; //Aモータ IN1
9: int AIN2 = 8; //Aモータ IN2
10: int BIN1 = 7; //Bモータ IN1
11: int BIN2 = 6; //Bモータ IN2
12: int PWMB = 10; //Bモータ PWM 左側モータ
13: int motor_speed;
14: const int speed1 = 128; //超信地旋回速度
15: void setup ( ) {
16: Serial.begin (9600); //9600bpsでシリアル通信
17: pinMode(PWMA, OUTPUT);
18: pinMode(AIN1, OUTPUT);
19: pinMode(AIN2, OUTPUT);
20: pinMode(BIN1, OUTPUT);
21: pinMode(BIN2, OUTPUT);
22: pinMode(PWMB, OUTPUT);
23: pinMode (joystick_x, INPUT) ;
24: pinMode (joystick_y, INPUT) ;
25: }
26: void loop () {
27: pos_x = analogRead (joystick_x) ; //joystickのX方向の値 0-400-600-1023
28: pos_y = analogRead (joystick_y) ; //joystickのY方向の値 0-400-600-1023
29: if ((pos_x > 400) && (pos_x
30: motor_speed = map(pos_y, 400, 0, 0, 255);
31: digitalWrite(AIN1, LOW);
32: digitalWrite(AIN2, HIGH);
33: analogWrite(PWMA, motor_speed);
34: digitalWrite(BIN1, LOW);
35: digitalWrite(BIN2, HIGH);
36: analogWrite(PWMB, motor_speed);
37: }
38: //joystickセンター付近は停止
39: else if ((pos_x > 400) && (pos_x < 600) && (pos_y > 400) && (pos_y
40: digitalWrite(AIN1, LOW);
41: digitalWrite(AIN2, LOW);
42: digitalWrite(BIN1, LOW);
43: digitalWrite(BIN2, LOW);
44: }
45: else if ((pos_x > 400) && (pos_x < 600) && (pos_y > 600)) { //後進
46: motor_speed = map(pos_y, 600, 1023, 0, 255);
47: digitalWrite(AIN1, HIGH);
48: digitalWrite(AIN2, LOW);
49: analogWrite(PWMA, motor_speed);
50: digitalWrite(BIN1, HIGH);
51: digitalWrite(BIN2, LOW);
52: analogWrite(PWMB, motor_speed);
53: }
54: else if ((pos_x > 600) && (pos_y
55: motor_speed = map(pos_y, 400, 0, 0, 255);
56: digitalWrite(AIN1, LOW);
57: digitalWrite(AIN2, LOW);
58: analogWrite(PWMA, motor_speed);
59: digitalWrite(BIN1, LOW);
60: digitalWrite(BIN2, HIGH);
61: analogWrite(PWMB, motor_speed);
62: }
63: else if ((pos_x > 600) && (pos_y > 400) && (pos_y
64: digitalWrite(AIN1, HIGH);
65: digitalWrite(AIN2, LOW);
66: analogWrite(PWMA, speed1);
67: digitalWrite(BIN1, LOW);
68: digitalWrite(BIN2, HIGH);
69: analogWrite(PWMB, speed1);
70: }
71: else if ((pos_x > 600) && (pos_y > 600)) { //後進右旋回
72: motor_speed = map(pos_y, 600, 1023, 0, 255);
73: digitalWrite(AIN1, LOW);
74: digitalWrite(AIN2, LOW);
75: analogWrite(PWMA, motor_speed);
76: digitalWrite(BIN1, HIGH);
77: digitalWrite(BIN2, LOW);
78: analogWrite(PWMB, motor_speed);
79: }
80: else if ((pos_x
81: motor_speed = map(pos_y, 400, 0, 0, 255);
82: digitalWrite(AIN1, LOW);
83: digitalWrite(AIN2, HIGH);
84: analogWrite(PWMA, motor_speed);
85: digitalWrite(BIN1, LOW);
86: digitalWrite(BIN2, LOW);
87: analogWrite(PWMB, motor_speed);
88: }
89: else if ((pos_x < 400) && (pos_y > 400 && pos_y
90: digitalWrite(AIN1, LOW);
91: digitalWrite(AIN2, HIGH);
92: analogWrite(PWMA, speed1);
93: digitalWrite(BIN1, HIGH);
94: digitalWrite(BIN2, LOW);
95: analogWrite(PWMB, speed1);
96: }
97: else if ((pos_x < 400) && (pos_y > 600)) { //後進左旋回
98: motor_speed = map(pos_y, 600, 1023, 0, 255);
99: digitalWrite(AIN1, HIGH);
100: digitalWrite(AIN2, LOW);
101: analogWrite(PWMA, motor_speed);
102: digitalWrite(BIN1, LOW);
103: digitalWrite(BIN2, LOW);
104: analogWrite(PWMB, motor_speed);
105: }
106: }
107: