yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
310 Motor📖
1.Hardware parameter
  • Hardware parameter
2.ROS robot control board tutorials
  • 3.0 ReadMe
  • 3.1 Control motor
  • 3.2 Timer got encoder data
  • 3.3 PID control robot movement
  • 3.4 4WD Robot kinematics analysis
  • 3.5 Ackerman Robot kinematics analysis
  • 3.6 Mecanum wheel kinematics analysis
3.STM32 smart car tutorials
0. Get started quickly
  • 14.Infrared sensor obstacle avoidance
  • 0. Installation Instructions
  • 1. Version configuration
  • 2. Smart car installation video
  • 3. Precautions for use
1. Introduction to STM32 board
  • 1. Learn about STM32
  • 2. Introduction to STM32 development board
  • 3. Development board pin assignment
  • 4. Introduction to HAL library and LL library
2. Development environment
  • 1. Common development tools
  • 2. STM32CubeMX Install - Use
  • 3. STM32CubeIDE Install - Use
  • 4. Common Driver Installation
  • 5. Program download and simulation
  • 6. Engineering experience and migration
3. Car expansion tutorial
  • 1.Servo control
  • 2.Basic use ultrasonic servo PTZ
  • 3.Motor control
  • 4.OLED display light sensitivity value
  • 5.Infrared sensor
  • 6.Four-way tracking module
  • 7.Infrared remote control
  • 8.Ultrasonic ranging
  • 9.PS2 controller test
  • 10.Car line patrol
  • 11.Ultrasonic follow
  • 12.Ultrasonic obstacle avoidance
  • 13.Ultrasonic obstacle avoidance (servo PTZ version)
  • 15.Infrared remote control
  • 16.PS2 handle remote control
4.2-channel motor drive module tutorial
  • 2.1 Introduction of Module
  • 2.2 For STM32
  • 2.3 For Arduino
  • 2.4 For RaspberryPi
  • 2.5 For RaspberryPi Pico
  • 2.6 For jetson nano
  • 2.7 For MSPM0G3507
  • 2.8 For MSPM0G3519new
5.4-channel motor drive tutorials
Introduction and debugging
  • 0.Motor introduction and usage
  • 1.Introduction to 4-channel motor drive board
  • 2.Control command
  • 3.PC host
USART communication
  • For Arduino
  • For Jetson NANO
  • For MSPM0G3507
  • For MSPM0G3519new
  • For PICO2
  • For RDK X5
  • For RPi5
  • For STM32
IIC communication
  • For Arduino
  • For ESP32
  • For ESP32
  • For Jetson NANO
  • For MSPM0G3507
  • For MSPM0G3519new
  • For PICO2
  • For RDK X5
  • For RPi5
  • For STM32
Download
  • Motor_3D_Model_File
  • Annex_ROSRobotControlBoard
  • Annex_STM3RobotCar
  • Annex_2-channelMotorDriveModule
  • Annex_4-channelMotorDriveModule
Download ZIP

Welcome to 310 Motor repository

2.3 For Arduino

Arduino

Arduino uno R3

1.Preparation

Connect the motor drive board and Arduino UNO according to the wiring diagram, connect the battery to the power input interface on motor drive module.

Arduino接线图

Note: The motor interface wire sequence of the dual motor drive board should correspond to the motor pin! Otherwise, the motor drive plate will be damaged

Note: The motor interface wire sequence of the dual motor drive board.

image-20230215160150782

 

2.Code
​x
#include "PinChangeInt.h"    //External interrupt

/////////////////////////// Wiring method of this routine///////////////////////////
//  ArduinoUNOpin ------ AT8236module
//        Pin5        ---        BIN1
//        Pin6        ---        BIN2
//        Pin9        ---        AIN1
//        Pin10       ---        AIN2
//        PinA5       ---        ADC
//        Pin8        ---        E1A
//        Pin4        ---        E1B
//        Pin7        ---        E2A
//        Pin2        ---        E2B
//         GND        ---        GND

/////////PWM Output pin////////
#define BIN1 5
#define BIN2 6
#define AIN1 9
#define AIN2 10
#define Voltage A5 //Analog pin reading power supply voltage

/////////Encoder pin////////
#define ENCODER_L 8  //Encoder acquisition pins: 2 for each channel, 4 in total
#define DIRECTION_L 4
#define ENCODER_R 7
#define DIRECTION_R 2

double V; //Store voltage variable
unsigned long TimeA=0;
unsigned long EncoderTime=0;
bool EncoderFlag=1;
bool Mode=0;
unsigned char LED_Count;
volatile long Velocity_L, Velocity_R ;   //Left and right wheel encoder data
float Velocity_Left, Velocity_Right = 0;   //Left and right wheel speed
int delayShow=0;
unsigned long TimeB=0;
bool MotorFlag=1;
bool TimeFlag=1;

//The default PWM value can be set directly through the serial port for different speeds
int putPWM = 255;

void setup() {
  // put your setup code here, to run once:
  //PWMpin
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);

  //LEDpin
  pinMode(13, OUTPUT);

  //Analog input pin
  pinMode(Voltage,INPUT); //Initialize as input

  //Encoder pin
  pinMode(ENCODER_L, INPUT);  
  pinMode(DIRECTION_L, INPUT);
  pinMode(ENCODER_R, INPUT);
  pinMode(DIRECTION_R, INPUT);

  attachInterrupt(0, READ_ENCODER_R, CHANGE);           //Enable external interrupt encoder interface 1
  attachPinChangeInterrupt(4, READ_ENCODER_L, CHANGE);  //Enable external interrupt encoder interface 2

  //The PWM pin is set to zero to ensure that the motor does not rotate randomly. The parameter range is 0~255255, which is the full amplitude duty cycle
  analogWrite(AIN1, 0);
  analogWrite(AIN2, 0);
  analogWrite(BIN1, 0);
  analogWrite(BIN2, 0);

 //Initialize serial port for outputting battery voltage
  Serial.begin(9600);
 
}

//Set the PWM value of motor A, the range is - 255~255, where 0~255 corresponds to the duty ratio of 0~100, and a negative number means the motor is reversed
void Set_PWMA(int pwm)
{
  if(pwm>0)
  {
    analogWrite(AIN1, 255);
    analogWrite(AIN2, 255-pwm);
  }
  else
  {
    analogWrite(AIN2, 255);
    analogWrite(AIN1, 255+pwm);
  }
}

//Set the PWM value of motor B, the range is - 255~255, where 0~255 corresponds to duty cycle 0~100, and a negative number indicates the motor is in reverse direction
void Set_PWMB(int pwm)
{
  if(pwm>0)
  {
    analogWrite(BIN1, 255);
    analogWrite(BIN2, 255-pwm);
  }
  else
  {
    analogWrite(BIN2, 255);
    analogWrite(BIN1, 255+pwm);
  }
}

/*****Function function: external interrupt reads encoder data and has double frequency function. Note that external interrupt is triggered by jump edge********/
void READ_ENCODER_L() {
  if (digitalRead(ENCODER_L) == LOW) {     //If it is the interruption triggered by the falling edge
    if (digitalRead(DIRECTION_L) == LOW)      Velocity_L--;  //Determine direction according to another phase level
    else      Velocity_L++;
  }
  else {     //If it is an interruption triggered by the rising edge
    if (digitalRead(DIRECTION_L) == LOW)      Velocity_L++; //Determine direction according to another phase level
    else     Velocity_L--;
  }
}
/*****Function function: external interrupt reads encoder data and has double frequency function. Note that external interrupt is triggered by jump edge********/
void READ_ENCODER_R() {
  if (digitalRead(ENCODER_R) == LOW) { //If it is the interruption triggered by the falling edge
    if (digitalRead(DIRECTION_R) == LOW)      Velocity_R++;//Determine direction according to another phase level
    else      Velocity_R--;
  }
  else {   //If it is an interruption triggered by the rising edge
    if (digitalRead(DIRECTION_R) == LOW)      Velocity_R--; //Determine direction according to another phase level
    else     Velocity_R++;
  }
}

void loop() {

  // put your main code here, to run repeatedly:
  TimeA = millis(); //Get boot time

  //Record timestamp
  if(EncoderFlag) EncoderFlag=0,EncoderTime = TimeA;
  if(TimeFlag) TimeFlag=0,TimeB = TimeA;

  //Serial port changes PWM value to change motor speed
  if(Serial.available())
  {
    int getInt = Serial.parseInt(); //Resolve the integer in the serial port data
    if(getInt>255) getInt=255;
    if(getInt<-255) getInt=-255;
    putPWM = getInt;
  }

  //Change the rotation direction of the motor once every 4 seconds
  if(TimeA-TimeB>3999) TimeFlag=1,MotorFlag=!MotorFlag;
  if(MotorFlag)Set_PWMA(putPWM),Set_PWMB(putPWM);
  else Set_PWMA(-putPWM),Set_PWMB(-
For STM32
For RaspberryPi

COMPANY

  • About us
  • Team Style
  • Blog

LEARNING & EXPLORATION

  • Tutorials
  • Edge AI hardware
  • Educational robots
  • Embedded intelligent hardware

WHERE TO BUY

  • Yahboom Online Store
  • Amazon
  • Alibaba
  • AliExpress
  • Mercado

TECHNOLOGY SUPPORT

  • Email: support@yahboom.com

BE A DISTRIBUTOR

  • Email: sales@yahboom.com
QR Code
QR Code

Copyright © 2017-2026 Yahboom. All Rights Reserved.

EN/中文