12/7/2016

ロボ実験について


今日はゆうき君がPS3の実験を家でやってきたので見せてもらった。家ではモーター回ったというが、今日モーター3つコントローラーのボタン押して回そうとしても2つしか動かなかったり固まったりする。あり? プログラムは以下にあり。


そこで、回路に間違いがあるのかどうか考えてみた!


いろんなサイト見てると、arduinoPWMで2つモーター制御でも限界だとか書いてるものもあるが、

Arduinoでモーターいくつか回しているサイトもある。

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10159968040

上記のサイトによると、やっぱ電源容量とPWM出力が問題で動かないこともあるとの事。


が、しかし、プログラム(制御)でどうにかしないといけないのだと思う。

それか信号ミスか?


今後どうなるんだろ〜笑


(今後ちょっとやってみたいこと)

普通のモーター3つを赤外線通信で動かす実験。


プログラム


#include <PS3BT.h>
#include <usbhub.h>
#ifdef dobogusinclude
#include <spi4teensy3.h>
#include <SPI.h>
#include <math.h>
#endif
USB Usb;
BTD Btd(&Usb);
PS3BT PS3(&Btd); 
int counter =0;
bool printTemperature, printAngle;
int MM_pluspin = {3,6,10};
int MM_minuspin = {5,9,11};
int CM_pluspin = 4;
int CM_minuspin = 7;
int UD_pluspin = 1;
int UD_minuspin = 2;
bool Catch = false;
int plus[3];
int minus[3];
int Motor_power[3];
bool Move = false;
int turn_sp = 200;
const int Motor_num = 3;
const double Motor_FR = {1,1,1};
const double Motor_rad = {PI/2.0,-PI/6.0,-PI*5.0/6.0};
double Theta;
double Speed;
void setup() {
  Serial.begin(9600);
  for(int i = 0;i < Motor_num; i++){
    pinMode(MM_pluspin[i], OUTPUT);
    pinMode(MM_minuspin[i], OUTPUT);
  }
  pinMode(CM_pluspin, OUTPUT);
  pinMode(CM_minuspin, OUTPUT);
  pinMode(UD_pluspin, OUTPUT);
  pinMode(UD_minuspin, OUTPUT);
      for(int i =0;i < Motor_num;i++){
        analogWrite(MM_pluspin[i], 0);
        analogWrite(MM_minuspin[i], 0);
      }
  
#if !defined(__MIPSEL__)
  while (!Serial); 
#endif
  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1);
  }
  Serial.print(F("\r\nPS3 Bluetooth Library Started"));
}
void loop() {
  if(counter%100==0){
    Usb.Task();
    if (PS3.PS3Connected || PS3.PS3NavigationConnected) {
      /*if *1 {
        Theta = atan2( PS3.getAnalogHat(LeftHatY)-127.5 ,PS3.getAnalogHat(LeftHatX)-127.5);
        Speed = hypot( PS3.getAnalogHat(LeftHatY)-127.5 ,PS3.getAnalogHat(LeftHatX)-127.5);
        if(Speed>128) Speed = 128;
        for(int i =0;i < Motor_num;i++){
          Motor_power[i] = (int)(Motor_FR[i]*sin(Theta-Motor_rad[i])*Speed*255.0/128.0);//power-255~128
          if(Motor_power[i] < 0){
            plus[i] = 0;
            minus[i] = abs(Motor_power[i]);
          }else if(Motor_power[i] > 0){
            plus[i] = abs(Motor_power[i]);
            minus[i] = 0;
          }
        }
        Move = true;
        //Serial.println(String(int(Motor_power[0]))+" "+String(Motor_power[1])+" "+String(Motor_power[2]));
      }else if(PS3.getButtonPress(L1)){
        for(int i =0;i < Motor_num;i++){
          plus[i] = 0;
          minus[i] = turn_sp;
        }
        Move = true;
      }else if(PS3.getButtonPress(R1)){
        for(int i =0;i < Motor_num;i++){
          plus[i] = turn_sp;
          minus[i] = 0;
        }
        Move = true;
      }else{
        Move = false;
      }
      if(Move){
        for(int i =0;i <Motor_num;i++){
          analogWrite(MM_pluspin[i], plus[i]);
          analogWrite(MM_minuspin[i], minus[i]);
        }
      }*/
      /*******************************************************************************************************************/
      if (PS3.getAnalogHat(RightHatY) > 154){
          digitalWrite(UD_pluspin,LOW);
          digitalWrite(UD_minuspin,HIGH);
      }else if(PS3.getAnalogHat(RightHatY) < 100) {
          digitalWrite(UD_pluspin,HIGH);
          digitalWrite(UD_minuspin,LOW);
      }else{
          digitalWrite(UD_pluspin,LOW);
          digitalWrite(UD_minuspin,LOW);
      }
      /*********************************************************/
      if (PS3.getButtonClick(PS)) {
        Serial.print(F("\r\nPS"));
        PS3.disconnect();
      }
      else {
        if (PS3.getButtonClick(CIRCLE)) {
          Serial.print(F("\r\nCircle"));
          Catch = true;
        }
        if (PS3.getButtonClick(CROSS)){
          Serial.print(F("\r\nCross"));
          Catch = false;
        }
        if (PS3.getButtonPress(CROSS)){
          digitalWrite(CM_pluspin,LOW);
          digitalWrite(CM_minuspin,HIGH);
        }else if(!Catch){
          digitalWrite(CM_pluspin,LOW);
          digitalWrite(CM_minuspin,LOW);
        }
        if(Catch){
          //feedback
              digitalWrite(CM_pluspin,HIGH);
              digitalWrite(CM_minuspin,LOW);
        }
  
        
        if (PS3.getButtonClick(TRIANGLE)) {
          Serial.print(F("\r\nTraingle"));
          //PS3.setRumbleOn(RumbleLow);
        }
        if (PS3.getButtonClick(SQUARE))
          Serial.print(F("\r\nSquare"));
  
        if (PS3.getButtonPress(UP)) {
          //Serial.print(F("\r\nUp"));
           //analogWrite(MM_pluspin[0],200);
           //analogWrite(MM_minuspin[0],0);
           //analogWrite(MM_pluspin[1],200);
           // analogWrite(MM_minuspin[1],0);
           analogWrite(MM_pluspin[2],0);
           analogWrite(MM_minuspin[2],200); 
          /*if (PS3.PS3Connected) {
            PS3.setLedOff();
            PS3.setLedOn(LED4);
          }*/
        }
        if (PS3.getButtonPress(RIGHT)) {
          //Serial.print(F("\r\nRight"));
           //analogWrite(MM_pluspin[0],0);
           //analogWrite(MM_minuspin[0],0);
           //analogWrite(MM_pluspin[1],0);
          // analogWrite(MM_minuspin[1],0);
           analogWrite(MM_pluspin[2],0);
           analogWrite(MM_minuspin[2],0); 
           
          /*if (PS3.PS3Connected) {
            PS3.setLedOff();
            PS3.setLedOn(LED1);
          }*/
        }
        if (PS3.getButtonClick(DOWN)) {
          Serial.print(F("\r\nDown"));
          /*if (PS3.PS3Connected) {
            PS3.setLedOff();
            PS3.setLedOn(LED2);
          }*/
        }
        if (PS3.getButtonClick(LEFT)) {
          Serial.print(F("\r\nLeft"));
          /*if (PS3.PS3Connected) {
            PS3.setLedOff();
            PS3.setLedOn(LED3);
          }*/
        }
        //ButtonPress ositerutoki
        if (PS3.getButtonClick(L1))
          Serial.print(F("\r\nL1"));
        if (PS3.getButtonClick(L3))
          Serial.print(F("\r\nL3"));
        if (PS3.getButtonClick(R1))
          Serial.print(F("\r\nR1"));
        if (PS3.getButtonClick(R3))
          Serial.print(F("\r\nR3"));
        if (PS3.getButtonClick(SELECT)) {
          Serial.print(F("\r\nSelect - "));
          PS3.printStatusString();
        }
        if (PS3.getButtonClick(START)) {
          Serial.print(F("\r\nStart"));
          printAngle = !printAngle;
        }
      }
    }
  }
  counter++;
  
}



*1:PS3.getAnalogHat(LeftHatX) > 142 || PS3.getAnalogHat(LeftHatX) < 112 ||

      PS3.getAnalogHat(LeftHatY) > 142 || PS3.getAnalogHat(LeftHatY) < 112)&&!PS3.getButtonPress(L1)&&!PS3.getButtonPress(R1