Ganponブログ

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

ArduinoでRC可動戦車(2)スケッチ

2020-07-21 23:18:33 | Arduino

ArduinoでRC可動戦車(2)のスケッチが、上手く動かないとの事で、
確認したところ、一部が欠落していました。
訂正しても、上手く書き換わってくれないので、こちらに改めて表記しました。

 

 

// PS3BT_arduino_battle_tank_2dcmotor
#include <AFMotor.h>
#include <PS3BT.h>
#include <usbhub.h>
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif

USB Usb;
BTD Btd(&Usb); //そうしたBluetooth Dongleの事例を作成する必要があります
PS3BT PS3(&Btd); //これで事例が作成されます
//PS3BT PS3(&Btd, 0x00, 0x15, 0x83, 0x3D, 0x0A, 0x57);
// これにはBluetoothアドレスも格納されます
// これはスケッチを実行するときにドングルから取得できます

//モーターシールドの3,4のモーターを使用する
AF_DCMotor motor3(3, MOTOR12_64KHZ); //右側モータ
AF_DCMotor motor4(4, MOTOR12_64KHZ); //左側モータ

int pos_y;
int pos_x;
int motor_sp;
const int motor_sp1 = 128; //超信地旋回速度
const int motor_sp0 = 0; //超低速

void setup() {
  Usb.Init();
  Serial.begin(115200);
  while (!Serial); // シリアルポートが接続するのを待つ
  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); //halt
  }
  Serial.print(F("\r\nPS3 Bluetooth Library Started"));

  motor3.run(RELEASE);
  motor4.run(RELEASE);
}

void loop() {
  Usb.Task();
  if (PS3.PS3Connected) {
    //スティックの中央は127だけどピタリと止まらないので+-10ほど余裕を持たせる。
    //左スティック上下の値(最上部0、中央127、最下部255)を読み込む
    pos_y = PS3.getAnalogHat(LeftHatY);
    pos_x = PS3.getAnalogHat(LeftHatX);

    //左スティックがセンター付近は停止
    if (pos_x >= 117 && pos_x <= 137 && pos_y >= 117 && pos_y <= 137) {
      motor3.setSpeed(0);
      motor3.run(RELEASE);
      motor4.setSpeed(0);
      motor4.run(RELEASE);
    }

    //前進
    else if (pos_y < 117 && pos_x > 117 && pos_x < 137) {
      //左スティック中央(127)から最上部(0)の値をモーターのスピード0から255に変換
      motor_sp = map(pos_y, 137, 0, 0, 255);
      motor3.setSpeed(motor_sp);
      motor3.run(FORWARD);
      motor4.setSpeed(motor_sp);
      motor4.run(FORWARD);
    }

    //後進
    else if ( pos_y > 137 && pos_x > 117 && pos_x < 137) {
      motor_sp = map(pos_y, 137, 255, 0, 255);
      motor3.setSpeed(motor_sp);
      motor3.run(BACKWARD);
      motor4.setSpeed(motor_sp);
      motor4.run(BACKWARD);
    }

    //前進右旋回
    else if ( pos_y < 117 && pos_x > 137) {
      motor_sp = map(pos_y, 117, 0, 0, 255);
      motor3.setSpeed(motor_sp0);
      motor3.run(FORWARD);
      motor4.setSpeed(motor_sp);
      motor4.run(FORWARD);
    }

    //前進左旋回
    else if ( pos_y < 117 && pos_x < 117) {
      motor_sp = map(pos_y, 117, 0, 0, 255);
      motor3.setSpeed(motor_sp);
      motor3.run(FORWARD);
      motor4.setSpeed(motor_sp0);
      motor4.run(FORWARD);
    }

    //後進右旋回
    else if ( pos_y > 137 && pos_x > 137) {
      motor_sp = map(pos_y, 137, 255, 0, 255);
      motor3.setSpeed(motor_sp0);
      motor3.run(BACKWARD);
      motor4.setSpeed(motor_sp);
      motor4.run(BACKWARD);
    }

    //後進左旋回
    else if ( pos_y > 137 && pos_x < 117) {
      motor_sp = map(pos_y, 117, 0, 0, 255);
      motor3.setSpeed(motor_sp);
      motor3.run(BACKWARD);
      motor4.setSpeed(motor_sp0);
      motor4.run(BACKWARD);
    }

    //右超信地旋回
    else if ( pos_y > 117 && pos_y < 137 && pos_x > 137) {

      motor3.setSpeed(motor_sp1);
      motor3.run(BACKWARD);
      motor4.setSpeed(motor_sp1);
      motor4.run(FORWARD);
    }

    //左超信地旋回
    else if ( pos_y > 117 && pos_y < 137 && pos_x < 117) {

      motor3.setSpeed(motor_sp1);
      motor3.run(FORWARD);
      motor4.setSpeed(motor_sp1);
      motor4.run(BACKWARD);
    }
  }
}


12 コメント

コメント日が  古い順  |   新しい順
有難うございます。 (黒霧島)
2020-07-22 16:45:16
先日質問させていただいた者です。

上記のプログラムで無事に動作させることができました!

こちらのモータードライバを使用している記事が見つからず、とても困っていたので助かりました。

有難うございます。
返信する
Unknown (Ganpon)
2020-07-22 19:11:29
黒霧島さん、こんばんは。
アップしていたスケッチの一部が欠落しているとは、気が付きませんでした。
どうも「<」記号が関係しているようです。
無事、動作する様になって良かったです。
今後は、これをカスタムして、楽しんでください。
返信する
Unknown (AMD信者)
2020-12-27 19:47:34
こんばんは
このページのプログラムをカスタムして〇や✖ボタンで操作できるようにしました(PWM制御はなし、モータードライバはTA7257Pを使用)。
ですがボタンを一度押すと別のボタンを押すまで実行されてしまうので長押しで動くようにしたいのですが、色々試しましたが結局わからず悩んでいます。もしよろしければアドバイス等教えて頂けませんか?よろしくお願いいたします。
返信する
Unknown (Ganpon)
2020-12-28 02:59:54
AMD信者さん、こんばんは。
コントローラの仕様がその様になっているようですね。
そのため、〇でライト点灯、✖でライト消灯の様な操作に向いています。
お役に立てず申し訳ありません。

他のスイッチに関しては、
Arduinoサンプルプログラム(ファイル/スケッチ例/USB Host Shield Library 2.0/Bluetooth/PS3BT)を開いてArduinoに書き込み、シリアルモニターでコントローラの各ボタンの動作を確認してみると参考になるかも?
やり方は、Arduinoの本を参考にしてください。
因みに私が使用しているモータードライバーは
DRV8835です。
(秋月電子でDRV8835使用ステッピング&DCモータドライバモジュールを購入しています。)
TB6612FNGも使う事が有ります。
返信する
Unknown (AMD信者)
2020-12-28 09:48:45
返信ありがとうございます。
コントローラーの仕様とは思っていなかったので知れてよかったです。
モータードライバ参考にさせていただきます。
ありがとうございます
返信する
ps4 ble 通信とぎれ (hik)
2022-08-21 17:35:53
プログラム参考にさせていただきました。
構成も、同じだとおもいます。
usbホスト、モーターシールドなど、
問題は、ps4コントローラーとの通信が
良く切れる事です。安定しないもので
しょうか?
返信する
Re:ps4 ble 通信とぎれ (Ganpon)
2022-08-21 22:30:52
hikさん、こんばんは。
ここで紹介しているのはPS3コントローラを使用したものです。
PS4を使用するためには、一部をPS4BT用に書き換える必要が有ります。
正しく置き換えが出来ていれば通信が途切れることはないと思います。
ArduinoのUSB Host Shield Library 2.0の PS3BTとPS4BTのスケッチを参考にチェックしてください。

ひょっとしたら、貴殿のBluetooth環境が安定していないのでは?
返信する
ps4 ble 通信とぎれ (hik)
2022-08-21 23:28:29
コメントありがとうございます。ps4btの
スケッチを見直してみます。
ps4のコントローラーで同時に、2つの動作はできますか?今のところ、できません。
初心者なのでよくわかりません。
仕様でしょうか?
返信する
Unknown (Ganpon)
2022-08-22 00:43:29
hikさん、こんばんは。
PS4コントローラで2つの動作?
1. 2つ同時にコントロールできるか?
 >基本的には出来ません。
  理由はBluetoothのMACアドレスは個別なためです。
  Bluetoothドングルのアドレスが書き換える事が出来れば可能になると思いますが、ツールが有るかどうか?

2. 同時にではなく2台以上を其々コントロールできるか?
 >できます。
  PS4BTでのペアリングは、その都度自動で同期してくれます。
返信する
ps4 ble 通信とぎれ (hik)
2022-08-22 23:24:56
コメントありがとうございます。
イメージはespレーサーという商品なのですが、RCの様に動いています。
ESP32 マルチタスク(デュアルコア)が
同時操作を可能にしているのでしょうか?
返信する

コメントを投稿