Ganponブログ

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

ArduinoでRC可動戦車(2)

2018-10-29 12:55:56 | Arduino
2018-10-23
PS3コントローラ、USBシールド、モータードライブシールド、Bluetoothドングルを入手。
ジョイスティックで有線コントロールから、PS3コントローラで無線コントロールへ挑戦します。
 
2018-10-24
入手したモータードライブシールドのモータ1の出力がPWM制御出来ていなかった。
当初はスケッチ(プログラム)の誤りと思い、いろいろ変更したり、使用実績のあるモータドライバに変更するためにスケッチを書き直したり。。。。。。
テストで接続したモータ1からモータ4に接続変更すると正常にPWM制御でき速度可変に出来た。
どの段階で故障したのかは不明のため、代理店への返品は見送ります。(モータ2,3,4は使える)
1モータでの動作確認ができたので、2モータで直進、後進、右旋回、左旋回、停止、右超信地旋回、左超信地旋回をPS3コントローラを使いluetoothで無線コントロールするスケッチを書きます。
書き上げては、検証、コンパイル、書き込み、実行、修正、を繰り返し、何とか完成しました。
 
タミヤの楽しい工作キットで実際に走るタンクを試作します。
 
3枚の基板が段積みになっています。
下がArduino UNO
中がUSBシールド(USBトングルが装着されてます)
上がモータドライブシールドです。
3.7Vバッテリで動作させるには、低ON抵抗の他のモータドライバに変更する必要が有ります。
出来ましたが、第1転輪と第3転輪の距離が短すぎて不安定です。
10mm広げます。
モータドライブシールド外部電源の単3電池x4ボックス(6V)は車体下部へ移動。

Arduinoユニット右は006P電池です。
Arduinoの外部電源入力ジャックに接続しています。
外部電源の仕様は7~12Vですが。。。。
仕様より低いDC5Vを印可した場合でも辛うじて動きました。
この場合、3.3V出力端子は3.3V。 5v出力端子は3.3V。 Vinは4.3V。
やはり5V系の適正電圧が出ていません。
 外部電源入力に006P電池(9v)を印可すると、3.3V出力端子は3.3V。 5v出力端子は4.5V。 Vinは5.5V。
 
 
 
Arduino PS3 Bluetooth controlled tank  試運転
 

 

 

 

 

 

 


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:


 
 

Arduinoをはじめよう

2018-10-24 15:02:11 | Arduino

2018-09-30
ふとしたことから「Arduinoをはじめよう 第3版」を古本で手に入れました。
記憶力が衰える毎日ですが、67歳になって勉強を始めてみようと思います。

読み始めると、直ぐにキットが必要になります。
そこでArduino UNO互換機をネットで入手。
Uno R3 コントロールボード以外に、ブレッドボード、LED,抵抗、Cds、スイッチ、LCD、モータ、サーボ、リレーなどの教材に使うパーツが入っているので助かります。

Arduino IDEはネットで入手。
「Arduinoをはじめよう」(以下、テキスト)にそって、スケッチをArduino IDEに書き込み、ベリファイ、コンパイル、マイコンボードに書き込み、そして動作の確認。
文法やコマンドリファレンスなど覚えることが多いですが、最後まで挫けずにいきたいです。



10日経過しました。
未だ挫折していません。
テキストに沿ってスケッチを入力し、検証し、マイコンボードに書き込み、実行させます。
毎日がこの繰り返しです。

「Arduinoをはじめよう 第3版」
10/01 Example4-2 ボタンが押されている間、LEDを点灯。
10/01 Example4-3 ボタンが押されている間、LEDを点灯。
10/01 Example4-5 ボタンが押されている間、LEDを点灯。ボタンのバウンジング対応。
10/01 Example5-2 ボタンを押したままで明るさが変化する。
10/01 Example5-3 Cdsを接続し、アナログ入力の値に応じて点滅周期が変わる。
10/01 Example5-4 周囲が明るいとLEDは明るく、暗いとLEDも暗くなる。
10/06 Example5-5 アナログ入力ピン0の値をPCにデータ転送し、シリアルモニタで確認する。
10/09 Example7-2 Aruduinoネットワークランプ(LEDはRGB_LEDに変更)
         シリアルモニタから文字入力、送信して色を変化させる。

「ELEGOO UNO R3 スーパースターターキット」の演習もやってみます。
10/06 Lesson4 RGB_LED
10/06 Lesson5 デジタル入力 ボタンAでLED点灯、BでLEDオフ
10/06 Lesson6 アクティブブザー
10/06 Lesson7 パッシブブザーで音階を発生
10/06 Lesson8 傾斜スイッチでLED点灯
10/06 Lesson9 サーボモータを0度から180度まで連続動作
10/07 Lesson9 自習 ボタンA,Bを追加して、ボタンでcw,ccw回転をさせる
10/12 Lesson13 赤外線モジュールでリモコンのコードを読む
10/14 Lesson10 超音波モジュールで障害物までの距離を測定
10/14 Lesson11 DHT11 温度と湿度を測定
10/14 Lesson12 アナログジョイスティックの値を読む

そろそろ、無線でモータなどをコントロールすることを目標に、ネットで調査を始めます。
PS3コントローラをBluetoothでArduinoに接続したいと考えています。