Give full play to the role of the driver module . First of all, we need to understand PWM This concept .

PWM

   Pulse width modulation (PWM) Basic principles : The control mode is to control the switching device of inverter circuit , A series of pulses with equal amplitude are obtained at the output , Use these pulses instead of sine waves or required waveforms . That is to say, multiple pulses are generated in the half cycle of the output waveform , The equivalent voltage of each pulse is sinusoidal , The obtained output is smooth and has less low order harmonics . The width of each pulse is modulated according to certain rules , The output voltage of inverter circuit can be changed , The output frequency can also be changed . 

 

tool / raw material

*
Driver module ,arduino modular , DuPont line , Bus bar , Car

*
ArduinoIDE, wait

method / step

*
Drive module wiring

   In the previous tutorial, I have said that if you want to control the output of the driver , Need to drive “ENA”“ENB” Control , Therefore, we need to pull out the two jumper caps of the selected part in the figure . And will “ENA” connect Arduino
UNO Development board “5” Pin ,“ENB” connect “6” Pin . 

 

*
Arduino The code test is as follows :

 

int leftCounter=0,  rightCounter=0;

unsigned long time = 0, old_time = 0; // Time stamp

unsigned long time1 = 0; // Time stamp

float lv,rv;// Left , Right wheel speed

 

#define STOP        0

#define FORWARD     1

#define BACKWARD    2

#define TURNLEFT    3

#define TURNRIGHT   4

#define CHANGESPEED 5

 

int leftMotor1 = 16;

int leftMotor2 = 17;

int rightMotor1 = 18;

int rightMotor2 = 19;

bool speedLevel=0;

 

int leftPWM = 5;

int rightPWM = 6;

 

void setup() {

  // put your setup code here, to run once:

  Serial.begin(9600); 

  attachInterrupt(0,RightCount_CallBack, FALLING);

  attachInterrupt(1,LeftCount_CallBack, FALLING);

 

  pinMode(leftMotor1, OUTPUT);

  pinMode(leftMotor2, OUTPUT);

  pinMode(rightMotor1, OUTPUT);

  pinMode(rightMotor2, OUTPUT);

  pinMode(leftPWM, OUTPUT);

  pinMode(rightPWM, OUTPUT);

}

 

void loop() {

  // put your main code here, to run repeatedly:

  SpeedDetection();

 

  if(Serial.available()>0)

  {

    char cmd = Serial.read();

 

    Serial.print(cmd);

    motorRun(cmd);

    if(speedLevel)  // Output different speeds according to different gears

    {

      analogWrite(leftPWM, 120);

      analogWrite(rightPWM, 120);

    }

    else

    {

      analogWrite(leftPWM, 250);

      analogWrite(rightPWM, 250);

    }

  }  

}

/*

 * * Speed calculation

 */

bool SpeedDetection()

{

  time = millis();// In Milliseconds , Calculate current time  

  if(abs(time - old_time) >= 1000) // If the time is up 1 second

  {  

    detachInterrupt(0); // Turn off external interrupt 0

    detachInterrupt(1); // Turn off external interrupt 1

    // Count the number of pulses per second from the encoder , Convert to current speed value

    // What is the unit of speed per minute , Namely r/min. The encoder disk is 20 A void .

    Serial.print("left:");

    lv =(float)leftCounter*60/20;// Trolley wheel motor speed

    rv =(float)rightCounter*60/20;// Trolley wheel motor speed

    Serial.print("left:");

    Serial.print(lv);// Upload the current high speed of the left wheel motor to the upper computer , Low byte

    Serial.print("     right:");

    Serial.println(rv);// Upload the current high speed of the left wheel motor to the upper computer , Low byte

    // Return to the initial state of encoder speed measurement

    leftCounter = 0;   // Clear the pulse count to zero , In order to calculate the next second pulse count

    rightCounter = 0;

    old_time=  millis();     // Record the time node of speed measurement per second    

    attachInterrupt(0, RightCount_CallBack,FALLING); // Reopen external interrupt 0

    attachInterrupt(1, LeftCount_CallBack,FALLING); // Reopen external interrupt 0

    return 1;

  }

  else

    return 0;

}

/*

 * * Interrupt service function of right wheel encoder

 */

void RightCount_CallBack()

{

  rightCounter++;

}

/*

 * * Interrupt service function of left wheel encoder

 */

void LeftCount_CallBack()

{

  leftCounter++;

}

/*

 * * Car motion control function

 */

void motorRun(int cmd)

{

  switch(cmd){

    case FORWARD:

      Serial.println("FORWARD"); // Output status

      digitalWrite(leftMotor1, HIGH);

      digitalWrite(leftMotor2, LOW);

      digitalWrite(rightMotor1, HIGH);

      digitalWrite(rightMotor2, LOW);

      break;

     case BACKWARD:

      Serial.println("BACKWARD"); // Output status

      digitalWrite(leftMotor1, LOW);

      digitalWrite(leftMotor2, HIGH);

      digitalWrite(rightMotor1, LOW);

      digitalWrite(rightMotor2, HIGH);

      break;

     case TURNLEFT:

      Serial.println("TURN  LEFT"); // Output status

      digitalWrite(leftMotor1, HIGH);

      digitalWrite(leftMotor2, LOW);

      digitalWrite(rightMotor1, LOW);

      digitalWrite(rightMotor2, HIGH);

      break;

     case TURNRIGHT:

      Serial.println("TURN  RIGHT"); // Output status

      digitalWrite(leftMotor1, LOW);

      digitalWrite(leftMotor2, HIGH);

      digitalWrite(rightMotor1, HIGH);

      digitalWrite(rightMotor2, LOW);

      break;

     case CHANGESPEED:

      Serial.println("CHANGE SPEED"); // Output status

      if(speedLevel)  // Switch gears when receiving shift command

        speedLevel=0;

      else

        speedLevel=1;

      break;

     default:

      Serial.println("STOP"); // Output status

      digitalWrite(leftMotor1, LOW);

      digitalWrite(leftMotor2, LOW);

      digitalWrite(rightMotor1, LOW);

      digitalWrite(rightMotor2, LOW);

  }

}

 

*
For the sake of your understanding , Here is a special explanation :

      In the main function void loop() Add in PWM Output function ,analogWrite(pin,
value) Function “pin” Represents the pin used ,“value” Represents output PWM The size of the value , The scope is 0~255.

if(speedLevel)  // Output different speeds according to different gears

    {      

analogWrite(leftPWM, 120);      analogWrite(rightPWM, 120);  

  }  

  else 

   {   

   analogWrite(leftPWM, 250);      analogWrite(rightPWM, 250); 

    }

 

Technology