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

For Jetson NANO

Drive motor and read encoder-IIC

1.1 Explanation

Please read 《0. Motor introduction and usage》first to understand the motor parameters, wiring method, and power supply voltage you are currently using. To avoid improper operation and damage to the driver board or motor.

I2C and serial communication cannot be shared, only one can be selected.

Hardware wiring:

Motor4-channel motor drive board(Motor)
M2M-
V3V3
AH1A
BH1B
GGND
M1M+
4-channel motor drive boardJetson NANO B01(Physical Pins)
SDA3
SCL5
GND6
5V4

 

1.2 Instructions

Use file transfer software, such as WinSCP. You need to search and download the software yourself.

Transfer the py file to the root directory of the motherboard through the software, then open the terminal and run the command.

sudo python3 ~/IIC.py

If the terminal prompts an error message indicating that the smbus module is missing.

Use the following command to install this module and try running again.

xxxxxxxxxx
sudo apt update
sudo apt install python3-smbus

 

1.3 Code analysis

​x
UPLOAD_DATA = 1  #1:接收总的编码器数据 2:接收实时的编码器
                 #1: Receive total encoder data 2: Receive real-time encoder

MOTOR_TYPE = 1  #1:520电机 2:310电机 3:测速码盘TT电机 4:TT直流减速电机 5:L型520电机
                #1:520 motor 2:310 motor 3:speed code disc TT motor 4:TT DC reduction motor 5:L type 520 motor
  • UPLOAD_DATA: used to set the data of the motor encoder. Set 1 to the total number of encoder pulses and 2 to the real-time pulse data of 10ms.

  • MOTOR_TYPE: used to set the type of motor used. Just modify the corresponding numbers according to the comments according to the motor you are currently using. You don’t need to modify the rest of the code.

If you need to drive the motor and observe the data, just modify the two numbers at the beginning of the program. No changes are required to the rest of the code.

xxxxxxxxxx
def set_motor_parameter():

    if MOTOR_TYPE == 1:
        set_motor_type(1)  # 配置电机类型
        time.sleep(0.1)
        set_pluse_phase(30)  # 配置减速比,查电机手册得出
        time.sleep(0.1)
        set_pluse_line(11)  # 配置磁环线,查电机手册得出
        time.sleep(0.1)
        set_wheel_dis(67.00)  # 配置轮子直径,测量得出
        time.sleep(0.1)
        set_motor_deadzone(1900)  # 配置电机死区,实验得出
        time.sleep(0.1)

    elif MOTOR_TYPE == 2:
        set_motor_type(2)
        time.sleep(0.1)
        set_pluse_phase(20)
        time.sleep(0.1)
        set_pluse_line(13)
        time.sleep(0.1)
        set_wheel_dis(48.00)
        time.sleep(0.1)
        set_motor_deadzone(1600)
        time.sleep(0.1)

    elif MOTOR_TYPE == 3:
        set_motor_type(3)
        time.sleep(0.1)
        set_pluse_phase(45)
        time.sleep(0.1)
        set_pluse_line(13)
        time.sleep(0.1)
        set_wheel_dis(68.00)
        time.sleep(0.1)
        set_motor_deadzone(1250)
        time.sleep(0.1)

    elif MOTOR_TYPE == 4:
        set_motor_type(4)
        time.sleep(0.1)
        set_pluse_phase(48)
        time.sleep(0.1)
        set_motor_deadzone(1000)
        time.sleep(0.1)

    elif MOTOR_TYPE == 5:
        set_motor_type(1)
        time.sleep(0.1)
        set_pluse_phase(40)
        time.sleep(0.1)
        set_pluse_line(11)
        time.sleep(0.1)
        set_wheel_dis(67.00)
        time.sleep(0.1)
        set_motor_deadzone(1900)
        time.sleep(0.1)

This is used to store the parameters of the Yahboom motor. By modifying the MOTOR_TYPE parameter above, one-click configuration can be achieved.

In normally, do not modify the code here when using the Yahboom motor.

If you are using your own motor, or if a certain data needs to be modified according to your needs, you can check the course《1.2 Control command》 to understand the specific meaning of each command.

xxxxxxxxxx
if __name__ == "__main__":
    try:
        t = 0
        print("please wait...")
        set_motor_parameter() # 设置自己的电机参数  Set your own motor parameters

        while True:
            t += 10
            M1 = t
            M2 = t
            M3 = t
            M4 = t

            if MOTOR_TYPE == 4:
                control_pwm(M1*2, M2*2, M3*2, M4*2)
            else:
                control_speed(M1, M2, M3, M4)#直接发送命令控制电机  Send commands directly to control the motor
            
            if t> 1000 or t < -1000:
                t = 0

            if UPLOAD_DATA == 1:
                now_string = read_all_encoder()  # 读取累计编码器数据   Read the accumulated encoder data
                print(now_string)
            elif UPLOAD_DATA == 2:
                offset_string = read_10_encoder()  # 读取实时编码器数据 Read real-time encoder data
                print(offset_string)          
            time.sleep(0.1)

In the main program loop, the speed of the four motors will be slowly increased from 0 to 1000. If the motor type is 4, that is, the motor without encoder, the PWM of the motor is directly controlled.

At the same time, the data sent by the driver board is read and printed out.

xxxxxxxxxx
# 读取编码器数据    Read encoder data
def read_10_encoder():
    global encoder_offset
    formatted_values = []
    for i in range(4):
        reg = READ_TEN_M1_ENCODER_REG + i
        buf = i2c_read(MOTOR_MODEL_ADDR, reg, 2)
        encoder_offset[i] = (buf[0] << 8) | buf[1]
        if encoder_offset[i] & 0x8000:  # 检查最高位(符号位)是否为 1  Check if the highest bit (sign bit) is 1
            encoder_offset[i] -= 0x10000 # 将其转为负数 Turn it into a negative number
        formatted_values.append("M{}:{}".format(i + 1, encoder_offset[i]))
    return ", ".join(formatted_values)

def read_all_encoder():
    global encoder_now
    formatted_values = []
    for i in range(4):
        high_reg = READ_ALLHIGH_M1_REG + (i * 2)
        low_reg = READ_ALLLOW_M1_REG + (i * 2)
        high_buf = i2c_read(MOTOR_MODEL_ADDR, high_reg, 2)
        low_buf = i2c_read(MOTOR_MODEL_ADDR, low_reg, 2)
        
        high_val = high_buf[0] <<8 | high_buf[1]
        low_val = low_buf[0] <<8 | low_buf[1]
        
        encoder_val = (high_val << 16) | low_val
        
        # 处理符号扩展,假设 32 位有符号整数    Handles sign extension, assuming 32-bit signed integers
        if encoder_val >= 0x80000000:  # 如果大于 2^31,说明应该是负数  If it is greater than 2^31, it should be a negative number
            encoder_val -= 0x100000000  # 将其转为负数  Turn it into a negative number
        encoder_now[i] = encoder_val
        formatted_values.append("M{}:{}".format(i + 1, encoder_now[i]))
    return ", ".join(formatted_values) 

After getting the data from the driver board, it is shifted, and the shift is required to get the correct data.

1.4 Experimental phenomenon

After the wiring is correct, place the program in the root directory, and then run the command sudo python3 ~/IIC.py. You can see that the motor will gradually speed up, then stop, and repeat.

At the same time, you can see the printed motor value in the terminal constantly changing.

For ESP32
For MSPM0G3507

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/中文