Arduino web tutorijali

Ukoliko želimo upravljati motorima kod kojih se radu pojavljuju struje veće od 2A poslužit ćemo se H-mostom baziranim na čipu VNH2SP30 koji dolazi u obliku gotovog shielda za Arduino koji se popularno naziva Monster Moto Shield. <Monster Moto shield na Sparkfun-u>

Karakterisitike ovog modula su:

  • Operativni napon: 5,5 – 16 V. 
  • Van tih granica se sklop sam isključuje (overvoltage and undervoltage protection/shutdown)
  • Maksimalna struja (na mahove): 30 A
  • Operativna struja (u kontinuitetu): 14 A
  • Maksimalna PWM frekvencija: 20 kHz
  • Termalna zaštita
  • MOSFET otpor u vođenju (on-resistance): 19 mΩ
  • Arduilno kompatibilan

 Pogledajmo način na koji se spaja s motorima:

Monster moto shield

Motor 1 se spaja na izvode A1 i B1, a motor 2 na izvode A2 i B2.

Budući da je ovo shield forma pinovi koji se koriste su rezervirani:

Motor 1

  • D5 - PWM1
  • D7 - INA1
  • D8 - INB1

Motor 2

  • D6 - PWM2
  • D4 - INA2
  • D9 - INB2

Dijagnostički pinovi

  • A0 - Status mosta 1
  • A1 - Status mosta 2
  • A2 - Jacina struje most 1
  • A3 - Jacina struje most 2

 

Pogledajmo kod za upravljanje:

#define BRAKEVCC 0
#define CW   1
#define CCW  2
#define BRAKEGND 3
#define SP 1023
#define CS_THRESHOLD 100

int inApin[2] = {7, 4};  // INA: Selektor za smjer1 
int inBpin[2] = {8, 9}; // INB: Selektor za smjer2
int pwmpin[2] = {5, 6}; // PWM izlaz
int cspin[2] = {2, 3}; // CS: osjet jačine struje analogni ulaz
int enpin[2] = {0, 1}; // EN: Status ukljucenosti mosta (Analogni 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);
  }
  motorGo(0, BRAKEGND, SP);
  motorGo(1, BRAKEGND, SP);
}

void loop()
{
  motorGo(0, CW, 1023); // motor 1 - smjer 1
  motorGo(1, CCW, 1023); // motor 2 - smjer 2
  delay(3000);
  
  motorOff(0); // Iskljuci motor 1
  motorOff(1); // Iskljuci motor 2
  delay(1000);
  
  motorGo(0, CCW, 1023); // motor 1 - smjer 2
  motorGo(1, CW, 1023); // motor 2 - smjer 1
  delay(3000);
  
  motorOff(0); // Iskljuci motor 1
  motorOff(1); // Iskljuci motor 2
  delay(1000);
  
  if ((analogRead(cspin[0]) < CS_THRESHOLD) && (analogRead(cspin[1]) < CS_THRESHOLD))
    digitalWrite(statpin, HIGH);
}

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);
    }
  }
}

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);
}