Ganponブログ

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

RC可動 M2A2ブラッドレー 回路&プログラム(番外)

2023-04-26 23:55:45 | 1/35 M2A2ブラッドレー

2023-04-27
備忘録として、完成したM2A2ブラッドレーの回路図とプログラムを残します。
尚、ESP32-WROOM-32E-MINIとモータドライバDRV8835は秋月電子通商で購入しました。

▼回路図

画像をクリックすると拡大します

▼プログラム

/*PS3_ESP32_tank_MP3_DRV8835_M2A2_v2.0
【注意】2023-08-23追記
プログラム中の 【◀】 は【 <】 、【▶】 は【>】に置き換えてください。
gooブログのエディターでは < > が記述されると、ある条件下でそれ以降の分が消えるという不具合が有るためです。

効果音はDFPlayer Mini
モータドライバはDRX8835

 【操作手順】
PSボタンでペアリング開始。白色インジケータランプ高速点滅。
 戦車の電源投入。
 インジケータランプ青色点灯でペアリング完了。

【走行コントロール】
 コントローラーの左スティック上下で前後進、
 右スティックの左右でステアリングを制御。
  ステアリングを振っていくと回転軸側が減速していき(緩旋回から信地旋回)、
 一杯に倒すと回転軸側は停止。(信地旋回)
 左スティック中央で右ステアリングを一杯に振ると超信地旋回(速度50%)

【砲身上下】右十字キーの △と✕ボタンで砲身上下。□ボタンでセンター。
【砲塔旋回】 左スティック左右で砲塔旋回。離した位置で止まる。
【リアゲート開閉」 左十字キーのUPとDOWNボタンでゲート閉、開。
【機関砲】 R1ボタンで主砲発射 40mm自動擲弾銃Mk.19
【機銃】 L1ボタンで射撃
【ヘッドライト】左十字キーのRIGHTボタンで点灯、LEFTボタンで消灯。
【ブレーキランプ】走行中以外に点灯。ヘッドライト点灯時はスモール兼用。

【疑似追尾モード】
   R2ボタンで右超信地旋回 + 砲塔左旋回
   L2ボタンで左超信地旋回 + 砲塔右旋回
*/

#include ◀Arduino.h▶ // Arduino ヘッダインクルード
#include "SoftwareSerial.h" // EspSoftwareSerial
#include "DFRobotDFPlayerMini.h"

//SoftwareSerial mySoftwareSerial(16, 17); // RX, TX EspSoftwareSerial
HardwareSerial Serial_df(2); // use HardwareSerial UART2 (16pin=RX, 17pin=TX)

DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

#include ◀Ps3Controller.h▶
#include ◀ESP32Servo.h▶
Servo servo1; // create four servo objects
int servo1Pin = 27;
Servo servo2;
int servo2Pin = 14;
Servo servo3;
int servo3Pin = 12;
int LED_1 = 23; //ブレーキランプ
int LED_2 = 22; //ヘッドライト
int LED_3 = 19; //砲撃
int LED_4 = 18; //銃撃
int k = 0;
int s = 0;
int d_time = 50;
int angle_servo1 = 80; // 上下;
int dtime = 10; //砲身上下スピード(遅延時間)
int anglenow = angle_servo1 ;
int angle_servo3 = 20 ; // リアゲート閉
int anglenow3 = angle_servo3 ;
int motor_speed;
float steering;
int pos_ly;
int pos_lx;
int pos_ry;
int pos_rx;
int AIN1 = 32; // A入力1/APHASE 左モータ AIN1
int BIN1 = 25; // B入力1/BPHASE 右モータ BIN1
int PWMApin = A5; // A入力2/AENABLE 左モータ AIN2 IO33
int PWMBpin = A19; // B入力2/BENABLE 右モータ BIN2 IO26 (IO0は起動時不安定)
int PWMA = 2; //PWMAチャンネル 0=NG 1=NG 0~15
int PWMB = 3; //PWMBチャンネル 0=NG 1=NG 0~15 

void setup() {
servo1.setPeriodHertz(50); // Standard 50hz servo PWMサイクル:20mS FS0307 120°
servo1.attach(servo1Pin, 900, 2100); // (servo1Pin, minUs, maxUs)
servo2.setPeriodHertz(50); // Standard 50hz servo PWMサイクル:20mS
servo2.attach(servo2Pin, 500, 2400); // (servo1Pin, minUs, maxUs)
servo3.setPeriodHertz(50); // Standard 50hz servo PWMサイクル:20mS FS0307 120°
servo3.attach(servo3Pin, 900, 2100); // (servo1Pin, minUs, maxUs)
//delay(50);

//mySoftwareSerial.begin(9600);
Serial_df.begin(9600); // RX2 = 16, TX2 = 17
Serial.begin(115200);

Ps3.begin("00:11:22:33:44:55"); //SixaxisPairToolで調べたmac adresに修正
Serial.println("PS3 Ready");

//if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
if (!myDFPlayer.begin(Serial_df)) { //Use HardwareSerial to communicate with mp3.
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
while (true) {
delay(0); // Code to compatible with ESP8266 watch dog.
}
}

Serial.println(F("DFPlayer Mini online."));
myDFPlayer.volume(20); //Set volume value. From 0 to 30

ledcSetup(PWMA, 5000, 8); //チャンネル,周波数,解像度(8bit=256段階)
ledcAttachPin(PWMApin, PWMA); //ledPinをPWMCHチャンネルに接続
ledcSetup(PWMB, 5000, 8); //チャンネル,周波数,解像度(8bit=256段階)
ledcAttachPin(PWMBpin, PWMB); //ledPinをPWMCHチャンネルに接続
pinMode(AIN1, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(LED_3, OUTPUT);
pinMode(LED_4, OUTPUT);

LEDtenmetsu(LED_2);

servo1.write(angle_servo1); // 0 - 180
delay(100);
servo2.write(90); // 0 - 180
delay(100);
servo3.write(angle_servo3); // 0 - 180
delay(200);
servo3.detach();

myDFPlayer.play(28); //エンジン始動
delay(2000);

}

void loop() {
if (Ps3.isConnected()) {
pos_lx = Ps3.data.analog.stick.lx;
pos_lx = pos_lx + 128;
pos_ly = Ps3.data.analog.stick.ly;
pos_ly = pos_ly + 128;
pos_rx = Ps3.data.analog.stick.rx;
pos_rx = pos_rx + 128;

//砲塔旋回 && pos_ly ▶ 102 && pos_ly ◀ 152
if ( pos_lx ▶ 230 && pos_ly ▶ 102 && pos_ly ◀ 152) { //右旋回
servo2.write(105);
} else if (pos_lx ◀ 25 && pos_ly ▶ 102 && pos_ly ◀ 152) { //左旋回
servo2.write(75);
} else { //停止
servo2.write(90);
}

//砲身上下
if ( Ps3.event.button_down.square) { // center
if (anglenow ▶ angle_servo1) {
for (anglenow = anglenow; anglenow ▶= angle_servo1; anglenow -= 1) {
servo1.write(anglenow);
delay(dtime);
}
}
else {
for (anglenow = anglenow; anglenow ◀= angle_servo1; anglenow += 1) {
servo1.write(anglenow);
delay(dtime);
}
}
}

if ( Ps3.event.button_down.triangle) { // up
for (anglenow = anglenow; anglenow ▶= (angle_servo1 - 45); anglenow -= 1 ) {
servo1.write(anglenow);
delay(dtime);
}
}

if ( Ps3.event.button_down.cross) { // down
for (anglenow = anglenow; anglenow ◀ (angle_servo1 + 35); anglenow += 1 ) {
servo1.write(anglenow);
delay(dtime);
}
}

// リアゲート開閉
if ( Ps3.event.button_down.up) { // ゲートup=閉
servo3.attach(servo3Pin);
for (anglenow3 = anglenow3; anglenow3 ▶= angle_servo3; anglenow3 -= 1 ) {
servo3.write(anglenow3);
delay(20);
}
delay(50);
servo3.detach();
}

if ( Ps3.event.button_down.down) { // ゲートdown=開
servo3.attach(servo3Pin);
for (anglenow3 = anglenow3; anglenow3 ◀ (angle_servo3 + 110); anglenow3 += 1 ) {
servo3.write(anglenow3);
delay(20);
}
delay(50);
servo3.detach();
}

if (Ps3.event.button_down.circle) {
if (s == 0) {
s = 1;
myDFPlayer.play(28); //エンジン始動
delay(5000); // delay(8000);
myDFPlayer.loop(23); //Loop 5th mp3 アイドリング
delay(d_time);
} else {
myDFPlayer.disableLoop(); //アイドリング停止
s = 0;
//delay(100);
}
}

if (Ps3.event.button_down.r3) {
myDFPlayer.disableLoop(); //アイドリング停止
s = 0;
}

if (Ps3.event.button_down.right) {
digitalWrite(LED_2, HIGH); // Headlight ON
}

if (Ps3.event.button_down.left) {
digitalWrite(LED_2, LOW); // Headlight off
}

if (Ps3.data.button.r2) { //右超信地旋回疑似砲塔追尾デモ
servo2.write(75); //砲塔左旋回
motor_speed = 255;
motor_run(motor_speed, 0, motor_speed, 1, 0);
delay(500);

}

if (Ps3.data.button.l2) { //左超信地旋回疑似砲塔追尾デモ
servo2.write(105); //砲塔右旋回
motor_speed = 255;
motor_run(motor_speed, 1, motor_speed, 0, 0);
delay(500);
}

if (Ps3.event.button_down.r1) { //機関砲
myDFPlayer.play(31);
for ( int i = 0; i ◀ 3 ; i++) {
digitalWrite(LED_3, HIGH); //発光
delay(80);
digitalWrite(LED_3, LOW);
delay(220);
}
if (s == 1) {
myDFPlayer.loop(23); //Loop 5th mp3 アイドリング
delay(d_time);
}
}

if (Ps3.event.button_down.l1) { //機銃
myDFPlayer.play(30);
delay(100);
for ( k = 0; k ◀ 9; k++) {
digitalWrite(LED_4, HIGH); //発光
delay(40);
digitalWrite(LED_4, LOW);
delay(60);
}
if (s == 1) {
myDFPlayer.loop(23); //Loop 5th mp3 アイドリング
delay(d_time);
}
}

//走行コントロール

//前進
if (pos_ly ◀= 102 && pos_rx ▶= 102 && pos_rx ◀= 152) {
motor_speed = map(pos_ly, 102, 0, 0, 255);
motor_run(motor_speed, 0, motor_speed, 0, 0);
}

//後進
else if ( pos_ly ▶= 152 && pos_rx ▶= 102 && pos_rx ◀= 152) {
motor_speed = map(pos_ly, 152, 255, 0, 255) ;
motor_run(motor_speed, 1, motor_speed, 1, 0);
}

//前進右緩旋回、信地旋回
//else if ( pos_ly ◀= 102 && pos_rx ▶ 152 && pos_rx ◀= 245) {
else if ( pos_ly ◀= 102 && pos_rx ▶= 152) {
motor_speed = map(pos_ly, 102, 0, 0, 255);
steering = motor_speed * (1.00 - (map(pos_rx, 152, 255, 0, 255) / 255.00));
motor_run(motor_speed, 0, steering, 0, 0);
}

//前進左緩旋回、信地旋回
//else if ( pos_ly ◀= 102 && pos_rx ◀ 102 && pos_rx ▶= 10) {
else if ( pos_ly ◀= 102 && pos_rx ◀= 102) {
motor_speed = map(pos_ly, 102, 0, 0, 255);
steering = motor_speed * (1.00 - (map(pos_rx, 102, 0, 0, 255) / 255.00));
motor_run(steering, 0, motor_speed, 0, 0);
}

//後進右緩旋回、信地旋回
//else if ( pos_ly ▶= 152 && pos_rx ▶ 152 && pos_rx ◀= 245) {
else if ( pos_ly ▶= 152 && pos_rx ▶= 152 ) {
motor_speed = map(pos_ly, 152, 255, 0, 255);
steering = motor_speed * (1.00 - (map(pos_rx, 152, 255, 0, 255) / 255.00));
motor_run(motor_speed, 1, steering, 1, 0);
}

//後進左緩旋回、信地旋回
//else if ( pos_ly ▶= 152 && pos_rx ◀ 102 && pos_rx ▶= 10) {
else if ( pos_ly ▶= 152 && pos_rx ◀= 102 ) {
motor_speed = map(pos_ly, 152, 255, 0, 255);
steering = motor_speed * (1.00 - (map(pos_rx, 102, 0, 0, 255) / 255.00));
motor_run(steering, 1, motor_speed, 1, 0);
}

//右超信地旋回
else if (pos_rx ▶= 245 && pos_ly ▶= 102 && pos_ly ◀= 152) {
motor_speed = 204;
motor_run(motor_speed, 0, motor_speed, 1, 0);
}

//左超信地旋回
else if (pos_rx ◀= 10 && pos_ly ▶= 102 && pos_ly ◀= 152) {
motor_speed = 204;
motor_run(motor_speed, 1, motor_speed, 0, 0);
}

else { //停止(ブレーキ)
motor_run(0, 0, 0, 0, 1);
}
}
}

void motor_run(int D0, int D1, int D2, int D3, int D4) {
//D0 : モータスピード(左)
//D1 : モータA(左)1 = HIGH / 0 = LOW
//D2 : モータスピード(右)
//D3 : モータB(右)1 = HIGH / 0 = LOW
//D4 : LED_3 ON/OFF 1 = HIGH / 0 = LOW

//analogWrite(PWMA, D0);
ledcWrite(PWMA, D0); //(チャンネル,解像度)
digitalWrite(AIN1, D1);
//analogWrite(PWMB, D2);
ledcWrite(PWMB, D2); //(チャンネル,解像度)
digitalWrite(BIN1, D3);
digitalWrite(LED_1, D4);
}

void LEDtenmetsu(int LED) {
for (int i = 0; i ◀ 2; i++) {
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
}
}



16 コメント

コメント日が  古い順  |   新しい順
コンパイルエラー (taku)
2023-08-20 13:19:46
コメント失礼します。いつも拝見させていただいています。
ブラッドレーの製作についてお伺いします。
スケッチプログラムをコピーペースト貼り付けるとコンパイルエラーになります。もう少し詳しく教えていただくことは可能でしょうか。(ところどころ抜けているような気がします)
よろしくお願いします。
返信する
Unknown (Ganpon)
2023-08-20 21:27:16
takuさん、こんばんは。
スケッチをコピペされたそうですが、
"369: "の様な行番号は削除していますか?
本文と行番号を分けて掲載できなくて申し訳ありません。

もう一つ、ボードは
"ESP32 Dev Module"を選択されていますか?
確認してください。
当方ではコンパイルエラーになりません。
返信する
コンパイルエラー (taku)
2023-08-21 18:20:55
連絡おそくなってすいません
行番号は削除したのですが
stray '\346' in program
のようないろいろな番号のエラーが出ます
必要なライブラリーはインストールしました。
まだ始めたばかりでわからないところも多いのでよろしくお願いします。
返信する
Re:コンパイルエラー (Ganpon)
2023-08-22 13:26:32
takuさん、こんにちは。
stray '\346' in program
これは、プログラム中に全角のスペースや記号が入り込んでいるというエラー表記です。
行番号346に全角スペースが記述されているようです。
注釈文中の全角スペースは問題ありませんが、プログラム文中では全角スペースは構文誤りになります。
IDEの検索機能で全角の文字(全角スペースや全角の記号)を探して削除するか、半角スペースに置換してください。
返信する
コンパイルエラー (taku)
2023-08-23 00:01:36
ご連絡ありがとうございます。
この行番号以外にもたくさんの番号のエラーが下のところに赤い文字ででてきます。
スケッチの33行目にピンクの線が付きます
これもそれが関係しているのでしょうか。

ESP32 Dev ModuleでRC可動戦車コントロールの記事のスケッチはエラーなくコンパイル終了します。
返信する
Unknown (Ganpon)
2023-08-23 21:21:32
takuさん、こんばんは。
不具合の原因が判りました。
文中の < や > が原因で文字が削除されていました。
記載されていたスケッチは変更しました。
コピペした時の手間を減らすために、行番号も削除しました。

< は ◀
> は ▶
で、記述しましたので、コピペした後に置き換えてください。
goo事務局に改善をお願いしていますが、残念ながら対応されていません。
この方法でコンパイルエラーしなくなる事を確認済みです。
返信する
コンパイルできました (taku)
2023-08-24 00:09:11
ご連絡ありがとうございます。
コンパイルエラーなく終了出来ました。
お忙しいところ、いつも対応していただきありがとうございました。
返信する
Unknown (taku)
2023-10-09 18:13:35
コメント失礼します。
同じ部品を使って回路図を見ながら基盤を
作ったのですが、なぜかモーターが回りません。(配線はあっていると思います)
書き込み終了してペアリングまでできるのですが動作しません。
考えられるような原因がわかる範囲でいいので、教えていただくことは可能でしょうか。
返信する
Unknown (Ganpon)
2023-10-10 00:12:39
takuさん、こんばんは。
1:ブレーキランプは点灯し、走行レバーを倒すと消えていますか?
2:サーボやLEDは点灯しましたか?
3:モータドライバーDRV8835のVM,VC,MODEの電圧は正しく供給されていますか?
VMはバッテリー電圧(4.2V)
VC=MODEは3.3V(3V)
4:DC-DCコンバータの出力は5V出ていますか?
中華品だと不良品も有ります。
最近私が仕入れたものでは10個中半分以上がはんだ付け不良で不安定動作していました。

回路の再確認、プログラムの誤りなど地道に確認してください。
返信する
Unknown (taku)
2023-10-10 18:14:33
ご連絡ありがとうございます。
基板には各端子に電圧はかかっています。
ブレーキランプやLEDもつかないしサーボも動きません。基盤も新しく作り替えたり部品交換もしたりしていますが症状は同じような感じです。
やはり回路てきな問題でしょうか。
返信する

コメントを投稿