Ganponブログ

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

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:


 
 


5 コメント

コメント日が  古い順  |   新しい順
Unknown (ユキ)
2022-01-21 16:29:30
配線図の赤い基盤は何て言う名前ですか?
返信する
Unknown (Ganpon)
2022-01-21 18:30:03
ユキさん、こんばんは。
たしかこの基板は
「TB6612FNG搭載 デュアルモータードライバ」です。
Amazonでも購入可能です。
2モータのモータドライバーには他にも
「DRV8835使用ステッピング&DCモータドライバモジュール」というのが有ります。
これは秋月電子などで購入できます。
私は最近はDRV8835の方を使っています。
接続やソフトは変わりますが使用ピン数が減るので使いやすいです。
返信する
Unknown (ユキ)
2022-04-16 15:03:15
上記のプログラミングをコピーしてarduinoに貼り付けて検証したところエラーが出ました、arduinoのバージョンが違うとできないのでしょうか?
返信する
Unknown (Ganpon)
2022-04-16 20:52:08
ユキさん、こんばんは。
ご指摘の内容を確認しました。
gooブログのエディターのバグで、プログラムの一部が欠落していました。

新旧どちらのエディターを使ってもアップすると欠落するので、正誤表をここに記述します。

申し訳ありませんが、行番号を確認して下述の正しいプログラムに書き直してください。

(正)
29: if ((pos_x > 400) && (pos_x < 600) && (pos_y < 400)) { //前進

39: else if ((pos_x > 400) && (pos_x < 600) && (pos_y > 400) && (pos_y < 600)) {

54: else if ((pos_x > 600) && (pos_y < 400)) { //前進􀘙右旋回

63: else if ((pos_x > 600) && (pos_y > 400) && (pos_y < 600)) { //右超信地旋回

80: else if ((pos_x < 400) && (pos_y < 400)) { //前進左旋回

89: else if ((pos_x < 400) && (pos_y > 400 && pos_y < 600)) { //左超信地旋回
返信する
Unknown (ユキ)
2022-04-18 07:03:33
修正ありがとうございます。
返信する

コメントを投稿