Hướng Dẫn Arduino Motor Shield VNH2SP30 Điều Khiển Động Cơ 30A - 2 Kênh


VNH2SP30 Mạch Điều Khiển Động Cơ 30A là sản phẩm mạch điều khiển động cơ sử dụng IC VNH2SP30 cho dòng ngõ ra lên đến 30A. Mạch được thiết kế phù hợp với Arduino Uno nên có thể cắm trực tiếp để sử dụng mà không cần dây cắm bên ngoài, rất tiện lợi và thẩm mĩ. Sản phẩm này là lựa chọn tốt nhất thay cho module L298 khi động cơ cần dòng lớn mà L298 ko thể cung cấp nổi. Nó có thể điều khiển được 2 động cơ với 2 IC VNH2SP30 được tích hợp trên mạch, thích hợp sử dụng điều khiển các loại động cơ có dòng tiêu thụ lớn như 775, 550 hay các loại động cơ khác.

Thông số kỹ thuật:

  • Dải điện áp: 5.5v-16v
  • Dòng tối đa: 30A
  • Dòng liên tục: 14A
  • Trở kháng nội MOSFET: 19mΩ (mỗi chân)
  • Tần số PWM tối đa: 20khz
  • Có chân current sensor (có thể kết nối với chân analog để đo dòng)
  • Bảo vệ quá dòng và quá áp

Link mua sản phẩm:

Sơ đồ chân:

  • A0-EN1: Kích hoạt chân cho động cơ 1
  • A1-EN2: Kích hoạt chân cho động cơ 2
  • A2-C1: Cảm biến hiện tại cho động cơ 1
  • A3-C2: Cảm biến hiện tại cho động cơ 2
  • D7-AIN1: Theo chiều kim đồng hồ (CW) cho động cơ 1
  • D4-BIN1: Theo chiều kim đồng hồ (CCW) cho động cơ 1
  • D8-AIN2: Ngược chiều kim đồng hồ (CCW) cho động cơ 2
  • D9-BIN2: Ngược chiều kim đồng hồ (CCW) cho động cơ 2
  • D5-PWMA: PWM cho động cơ 1
  • D6-PWMB: PWM cho động cơ 2
  • VM: Nguồn cho động cơ
  • A1 - B1: Động cơ 1
  • A2 - B2: Động cơ 2

Cách điều khiển quay động cơ:

Động cơ 1

  • DỪNG: D7=0, D8=0 & D7=1, D8=1
  • CCW: D7=0, D8=1
  • CW: D7=1, D8=0

Động cơ 2

  • DỪNG: D4=0, D9=0 & D4=1, D9=1
  • CCW: D4=0, D9=1
  • CW: D4=1, D9=0

Gắn Shield với Arduino R3:

Code:

#define BRAKE 0
#define CW    1
#define CCW   2
#define CS_THRESHOLD 15   // Definition of safety current (Check: "1.3 Monster Shield Example").

//MOTOR 1
#define MOTOR_A1_PIN 7
#define MOTOR_B1_PIN 8

//MOTOR 2
#define MOTOR_A2_PIN 4
#define MOTOR_B2_PIN 9

#define PWM_MOTOR_1 5
#define PWM_MOTOR_2 6

#define CURRENT_SEN_1 A2
#define CURRENT_SEN_2 A3

#define EN_PIN_1 A0
#define EN_PIN_2 A1

#define MOTOR_1 0
#define MOTOR_2 1

short usSpeed = 150;  //default motor speed
unsigned short usMotor_Status = BRAKE;
 
void setup()                         
{
  pinMode(MOTOR_A1_PIN, OUTPUT);
  pinMode(MOTOR_B1_PIN, OUTPUT);

  pinMode(MOTOR_A2_PIN, OUTPUT);
  pinMode(MOTOR_B2_PIN, OUTPUT);

  pinMode(PWM_MOTOR_1, OUTPUT);
  pinMode(PWM_MOTOR_2, OUTPUT);

  pinMode(CURRENT_SEN_1, OUTPUT);
  pinMode(CURRENT_SEN_2, OUTPUT);  

  pinMode(EN_PIN_1, OUTPUT);
  pinMode(EN_PIN_2, OUTPUT);

  Serial.begin(9600);              // Initiates the serial to do the monitoring 
  Serial.println(); //Print function list for user selection
  Serial.println("Enter number for control option:");
  Serial.println("1. STOP");
  Serial.println("2. FORWARD");
  Serial.println("3. REVERSE");
  Serial.println("4. READ CURRENT");
  Serial.println("+. INCREASE SPEED");
  Serial.println("-. DECREASE SPEED");
  Serial.println();

}

void loop() 
{
  char user_input;   
  while(Serial.available())
  {
    user_input = Serial.read(); //Read user input and trigger appropriate function
    digitalWrite(EN_PIN_1, HIGH);
    digitalWrite(EN_PIN_2, HIGH); 
     
    if (user_input =='1')
    {
       Stop();
    }
    else if(user_input =='2')
    {
      Forward();
    }
    else if(user_input =='3')
    {
      Reverse();
    }
    else if(user_input =='+')
    {
      IncreaseSpeed();
    }
    else if(user_input =='-')
    {
      DecreaseSpeed();
    }
    else
    {
      Serial.println("Invalid option entered.");
    }
      
  }
}

void Stop()
{
  Serial.println("Stop");
  usMotor_Status = BRAKE;
  motorGo(MOTOR_1, usMotor_Status, 0);
  motorGo(MOTOR_2, usMotor_Status, 0);
}

void Forward()
{
  Serial.println("Forward");
  usMotor_Status = CW;
  motorGo(MOTOR_1, usMotor_Status, usSpeed);
  motorGo(MOTOR_2, usMotor_Status, usSpeed);
}

void Reverse()
{
  Serial.println("Reverse");
  usMotor_Status = CCW;
  motorGo(MOTOR_1, usMotor_Status, usSpeed);
  motorGo(MOTOR_2, usMotor_Status, usSpeed);
}

void IncreaseSpeed()
{
  usSpeed = usSpeed + 10;
  if(usSpeed > 255)
  {
    usSpeed = 255;  
  }
  
  Serial.print("Speed +: ");
  Serial.println(usSpeed);

  motorGo(MOTOR_1, usMotor_Status, usSpeed);
  motorGo(MOTOR_2, usMotor_Status, usSpeed);  
}

void DecreaseSpeed()
{
  usSpeed = usSpeed - 10;
  if(usSpeed < 0)
  {
    usSpeed = 0;  
  }
  
  Serial.print("Speed -: ");
  Serial.println(usSpeed);

  motorGo(MOTOR_1, usMotor_Status, usSpeed);
  motorGo(MOTOR_2, usMotor_Status, usSpeed);  
}

void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)         //Function that controls the variables: motor(0 ou 1), direction (cw ou ccw) e pwm (entra 0 e 255);
{
  if(motor == MOTOR_1)
  {
    if(direct == CW)
    {
      digitalWrite(MOTOR_A1_PIN, LOW); 
      digitalWrite(MOTOR_B1_PIN, HIGH);
    }
    else if(direct == CCW)
    {
      digitalWrite(MOTOR_A1_PIN, HIGH);
      digitalWrite(MOTOR_B1_PIN, LOW);      
    }
    else
    {
      digitalWrite(MOTOR_A1_PIN, LOW);
      digitalWrite(MOTOR_B1_PIN, LOW);            
    }
    
    analogWrite(PWM_MOTOR_1, pwm); 
    
  }
  else if(motor == MOTOR_2)
  {
    if(direct == CW)
    {
      digitalWrite(MOTOR_A2_PIN, LOW);
      digitalWrite(MOTOR_B2_PIN, HIGH);
    }
    else if(direct == CCW)
    {
      digitalWrite(MOTOR_A2_PIN, HIGH);
      digitalWrite(MOTOR_B2_PIN, LOW);      
    }
    else
    {
      digitalWrite(MOTOR_A2_PIN, LOW);
      digitalWrite(MOTOR_B2_PIN, LOW);            
    }
    
    analogWrite(PWM_MOTOR_2, pwm);
  }
}

Mở cổng Serial Monitor:

Sau khi bạn đã hoàn thành việc biên dịch mã nguồn mẫu vào bo mạch arduino uno của mình, hãy chuyển đến Tool> Serial Monitor và bạn sẽ nhận được một màn hình nối tiếp như trong hình trên.

Kết quả:

Video:

Nhận xét

Mới hơn Cũ hơn