Помогите с MonsterMotoShield

Тема в разделе "Arduino & Shields", создана пользователем OOM, 2 апр 2017.

  1. OOM

    OOM Нерд

    Люди добрые помогите пли..............з.
    Есть двухканальный драйвер моторов VNH2SP30, два мотора, аналоговый джойстик с двумя осями и кнопкой.
    Вопрос? Как это все соединить вместе
     
  2. Onkel

    Onkel Гуру

    впаиваете пины в монстр мото, и вставляете монстр мото в уно, скачиваете пример с сайта arduino.cc
     
  3. OOM

    OOM Нерд

    Код (Text):

    /*  MonsterMoto Shield Example Sketch
      date: 5/24/11
      code by: Jim Lindblom
      hardware by: Nate Bernstein
      SparkFun Electronics

     This is really simple example code to get you some basic
     functionality with the MonsterMoto Shield. The MonsterMote uses
     two VNH2SP30 high-current full-bridge motor drivers.

     Use the motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)
     function to get motors going in either CW, CCW, BRAKEVCC, or
     BRAKEGND. Use motorOff(int motor) to turn a specific motor off.

     The motor variable in each function should be either a 0 or a 1.
     pwm in the motorGo function should be a value between 0 and 255.

    This code is beerware; if you see me (or any other SparkFun employee) at the
    local, and you've found our code helpful, please buy us a round!

    Distributed as-is; no warranty is given.
     */
    #define BRAKEVCC 0
    #define CW   1
    #define CCW  2
    #define BRAKEGND 3
    #define CS_THRESHOLD 100

    /*  VNH2SP30 pin definitions
     xxx[0] controls '1' outputs
     xxx[1] controls '2' outputs */
    int inApin[2] = {7, 4};  // INA: Clockwise input
    int inBpin[2] = {8, 9}; // INB: Counter-clockwise input
    int pwmpin[2] = {5, 6}; // PWM input
    int cspin[2] = {2, 3}; // CS: Current sense ANALOG input
    //int enpin[2] = {0, 1}; // EN: Status of switches output (Analog pin)

    int statpin = 13;

    void setup()
    {
      Serial.begin(9600);
      pinMode(statpin, OUTPUT);

      // Initialize digital pins as outputs
      for (int i=0; i<2; i++)
      {
        pinMode(inApin[i], OUTPUT);
        pinMode(inBpin[i], OUTPUT);
        pinMode(pwmpin[i], OUTPUT);
      }
      // Initialize braked
      for (int i=0; i<2; i++)
      {
        digitalWrite(inApin[i], LOW);
        digitalWrite(inBpin[i], LOW);
      }
    //TCCR0B = TCCR0B & B11111000 | B00000001;    // Таймер 0 делитель    1 для частоты ШИМ 62500.00 Hz
    TCCR0B = TCCR0B & B11111000 | B00000010;    // Таймер 0 делитель    8 для частоты ШИМ  7812.50 Hz
     // TCCR0B = TCCR0B & B11111000 | B00000011;    // Таймер 0 делитель   64 для частоты ШИМ   976.56 Hz (По умолчанию)
    //TCCR0B = TCCR0B & B11111000 | B00000100;    // Таймер 0 делитель  256 для частоты ШИМ   244.14 Hz
    //TCCR0B = TCCR0B & B11111000 | B00000101;    // Таймер 0 делитель 1024 для частоты ШИМ    61.04 Hz
    }

    void loop()
    {
     delay(1000);
      {
      for(int i=0; i<255; i++)
     {
      motorGo(0, CCW, i);
      motorGo(1, CW, i);
      delay(3000);
     }
     delay(500);
    for(int i=255;i>0;i--){
      motorGo(0, CCW, i);
      motorGo(1, CW, i);
      delay(3000);
     }
     motorOff(0);
     motorOff(1);
    if ((analogRead(cspin[0]) < CS_THRESHOLD) && (analogRead(cspin[1]) < CS_THRESHOLD))
        digitalWrite(statpin, HIGH);
     }
     delay(1000);
    {
      for(int i=0; i<255; i++){  
      motorGo(0, CW, i);
      motorGo(1, CCW, i);
      delay(3000);
     }
     delay(500);
    for(int i=255;i>0;i--){
        motorGo(0, CW, i);
      motorGo(1, CCW, i);
      delay(3000);
    }
    motorOff(0);
     motorOff(1);
      if ((analogRead(cspin[0]) < CS_THRESHOLD) && (analogRead(cspin[1]) < CS_THRESHOLD))
        digitalWrite(statpin, HIGH);
    }
    delay(1000);
    }

    void motorOff(int motor)
    {
      // Initialize braked
      for (int i=0; i<2; i++)
      {
        digitalWrite(inApin[i], LOW);
        digitalWrite(inBpin[i], LOW);
      }
      analogWrite(pwmpin[motor], 0);
    }

    /* motorGo() will set a motor going in a specific direction
     the motor will continue going in that direction, at that speed
     until told to do otherwise.

     motor: this should be either 0 or 1, will selet which of the two
     motors to be controlled

     direct: Should be between 0 and 3, with the following result
     0: Brake to VCC
     1: Clockwise
     2: CounterClockwise
     3: Brake to GND

     pwm: should be a value between ? and 1023, higher the number, the faster
     it'll go
     */
    void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)
    {
      if (motor <= 1)
      {
        if (direct <=4)
        {
          // Set inA[motor]
          if (direct <=1)
            digitalWrite(inApin[motor], HIGH);
          else
            digitalWrite(inApin[motor], LOW);

          // Set inB[motor]
          if ((direct==0)||(direct==2))
            digitalWrite(inBpin[motor], HIGH);
          else
            digitalWrite(inBpin[motor], LOW);

          analogWrite(pwmpin[motor], pwm);
        }
      }
    }


     
    Вот код. Моторы плавно разгоняются и останавливаются в обе стороны.
    Но как управлять ими с помощью джойстика?
    Если возможно подскажите.