yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
Self-balancing Robot Car📖
00.Get started quickly
  • 01.Balance car manual
  • 02.Balancing car assembly
  • 03.Get started quickly
  • 04.Balance car interface description
  • 05.Common Problem Analysis
  • 06.Balance Car V2 Library Function Development Manual
01.Environment development
  • 01.MDK-ARM installation
  • 02.STM32CubeIDE installation
  • 03.Common driver installation
  • 04.Download the program
  • 05.MDK-ARM project usage
  • 06.Program simulation
  • 07. VSCode Installation
02.STM32 getting started course
  • 01.Project creation
  • 02.LED Control(GPIO)
  • 03.Buzzer control(GPIO)
  • 04.Button control(EXTI)
  • 05.Serial communication(USART)
  • 06.Voltage detection(ADC)
  • 07.Basic timer(TIM)
  • 08.Universal timer(TIM)
  • 09.Advanced Timer(TIM)
  • 10.I2C Communication(I2C)-OLED
  • 11.SPI communication(SPI)-2.4G handle
  • 12.Independent Watchdog (IWDG)
  • 13.Window Watchdog (WWDG)
  • 14.DMA-USART
  • 15.DMA-I2C
03.STM32 expansion course
  • 01.Battery voltage detection (ADC)
  • 02.Ultrasonic module-measuring distance (TIM)
  • 03.Motor drive+encoder (TIM)
  • 04.OLED Data-Display(I2C)
  • 05.MPU6050-Data Read (I2C)
  • 06.Bluetooth module-Data reading (USART)
  • 07.2.4G handle-Data reading (SPI)
  • 08.Tracking module-Read status (GPIO)
  • 09.CCD module-Reading data (ADC)
  • 10.Electromagnetic module-Reading data (ADC)
  • 11.K210 module-Serial communication (USART)
  • 12.Tmini-Plus lidar-Reading data (USART)
04.Robot car PID control course
  • 01.PID basic concept
  • 02.PID example analysis
  • 03.P, PI, PD controller theory
  • 04.Position PID
  • 05.Incremental PID
  • 06.Cascade PID
  • 07.Balance principle of car
  • 08.Car upright control (PD)
  • 09.Car speed ​​control (PI)
  • 10.Car steering control (PD)
  • 11.Got angle and angular velocity (DMP algorithm)
  • 12.Got angle and angular velocity (Kalman filter algorithm)
  • 13.Got angle and angular velocity(Complementary filter algorithm)
05.Robot car basic course
  • 01.Car parameter adjustment
  • 02.Ultrasonic obstacle avoidance
  • 03.Ultrasonic follow
  • 04.Bluetooth remote control
  • 05.Load balance
06.Robot car advanced course
  • 01.4-channel tracking
  • 02.4-channel tracking avoid
  • 03.2.4G handle control
  • 04.CCD tracking
  • 05.CCD tracking avoid
  • 06.Electromagnetic tracking
  • 07.K210-QR code recognition
  • 08.K210-Color line tracking
  • 09.K210-Color follow
  • 10.K210-Self learning
  • 11.K210-Number recognition
  • 12.Lidar avoid
  • 13.Lidar guard
  • 14.Lidar follow
  • 15.Lidar patrol
  • 16.Lidar wall tracking-straight line
  • 17.Lidar wall tracking-multiple walls
  • 18. DIY Automatic driving car
07.Robot car LQR control
  • Robot car LQR control
08.Circuit design
  • 01.Overall circuit design
  • 02.STM32 minimum system
  • 03.Serial port circuit design
  • 04.Power circuit design
  • 05.MPU6050 Circuit Design
  • 06.Motor drive circuit design
09.Mathematical model
  • Mathematical model
10.Expand course
  • Autonomous Driving
Download
  • APP(Android)
  • Codes
  • Hardware-Info
  • SCH
  • Software Tools
  • STM32_Chip_DataSheet
  • 3D_Model_File
  • Video_PPT
Download ZIP

Welcome to Self-balancing Robot Car repository

12.Tmini-Plus lidar-Reading data (USART)

Tmini-Plus lidar-Reading data (USART)

Tmini-Plus lidar-Reading data (USART)Hardware connectionControl principleSoftware configurationPin definitionSoftware codeControl functionExperimental phenomenon

The tutorial demonstrates how to receive radar data via serial port 3 and print the distance values corresponding to each angle of the radar via serial port 1.

The tutorial only introduces the standard library project code

Hardware connection

image-20240825215601776

Since we have configured a special connection line, we only need to install it to the corresponding interface:

PeripheralsDevelopment board
Tmini-Plus radar: VCC5V
Tmini-Plus radar: TXDPC10
Tmini-Plus radar: RXDPC11
Tmini-Plus radar: GNDGND

Control principle

  • Tmini-Plus radar

image-20240808181410636

Product nameTmini-Plus radar
Scanning frequency6-12Hz
Sampling frequency4000 times/s
Measuring radiusBlack object: 12m
Minimum measuring distance0.05m
Ranging principleTOF ranging
Scanning angle360°
Communication interfaceStandard asynchronous serial port (UART)
1. Baud rate: 230400
2. Data bits: 8
3. Check bit: None
4. Stop bit: 1
ROS supportROS1/ROS2
Windows supportHost computer

** Radar angle distribution**

The arrow in the center of the radar points to 0°/360°, and the angle increases clockwise.

image-20240820204133150

Communication protocol

​x
For detailed information, please refer to the "T_Mini_Plus Manual"

Software configuration

Pin definition

Main control chipPinMain function (after reset)Default multiplexing functionRedefine function
STM32F103RCT6PC10PC10USART4_TX/SDIO_D2USART3_TX
STM32F103RCT6PC11PC11USART4_RX/SDIO_D3USART3_RX

Software code

Since the default pin function is a normal IO pin function, we need to use the redefine function.

xxxxxxxxxx
Product supporting materials source code path: Attachment → Source code summary → 2. Extended_Course → 12. Tmini-Plus_Ladar

Control function

The tutorial only briefly introduces the code, you can open the project source code to read it in detail.

USART3_init

xxxxxxxxxx
void USART3_init(u32 baudrate)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure; 
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_AFIO, ENABLE);
    
    GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);    

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
      
    USART_InitStructure.USART_BaudRate = baudrate;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART3, &USART_InitStructure); 
    USART_ITConfig(USART3, USART_IT_TXE, DISABLE);  
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);      
    //USART_ClearFlag(USART3,USART_FLAG_TC);
    USART_Cmd(USART3, ENABLE);
    
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

USART3_IRQHandler

xxxxxxxxxx
void USART3_IRQHandler(void)
{
    uint8_t Rx3_Temp;
    if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
    {
        USART_ClearITPendingBit(USART3, USART_IT_RXNE);
        Rx3_Temp = USART_ReceiveData(USART3);
        recv_lidar_data(Rx3_Temp);
    }
}

recv_lidar_data

xxxxxxxxxx
void recv_lidar_data(u8 rxtemp)
{
    static uint8_t step = 0;
    static uint16_t si_len = 0;
    static uint8_t si_index = 0;
    switch(step)
    {
        
        case 0:
            if(rxtemp == Lidar_HeaderLSB)
            {
                step = 1;
                g_recvbuf[0] = Lidar_HeaderLSB; 
            }   
        break;
        
        case 1:
            if(rxtemp == Lidar_HeaderMSB) 
            {
                step = 2;
                g_recvbuf[1] = Lidar_HeaderMSB; 
            }
        break;
            
        case 2: g_recvbuf[step] = rxtemp; step++; break; // CT Information
        case 3: g_recvbuf[step] = rxtemp; step++; si_len = rxtemp * 3; // Number of S
            
            // Here we judge whether the data length is greater than the cache.
            if(si_len+10>=TempLen_Max)
            {
                    si_len = 0;
                    step = 0;
                    memset(g_recvbuf,0,sizeof(g_recvbuf));
            }               
            break; 
            
        case 4: g_recvbuf[step] = rxtemp; step++;  break; //Start angle low 8 bits
        case 5: g_recvbuf[step] = rxtemp; step++;  break; //Start angle high 8 bits
        case 6: g_recvbuf[step] = rxtemp; step++;  break; //End angle low 8 bits
        case 7: g_recvbuf[step] = rxtemp; step++;  break; //End angle high 8 bits
        case 8: g_recvbuf[step] = rxtemp; step++;  break; //Check code low 8 bits
        case 9: g_recvbuf[step] = rxtemp; step++;  break; //Check code high 8 bits
                
        case 10:
        {
                g_recvbuf[step + si_index] = rxtemp;  
                si_index++;
                
                if(si_index >= si_len )
                {
                    Deal_Radar();
                    si_index = 0;
                    si_len = 0;
                    step = 0;
                    memset(g_recvbuf,0,sizeof(g_recvbuf));
                }
                break;
        }
    }
}

Experimental phenomenon

The Tmini-Plus_Ladar.hex file generated by the project compilation is located in the OBJ folder of the Tmini-Plus_Ladar project. Find the Tmini-Plus_Ladar.hex file corresponding to the project and use the FlyMcu software to download the program into the development board.

After the program is successfully downloaded: the serial port will print the radar angle and its corresponding distance.

image-20240827181014881

K210 module-Serial communication (USART)
PID basic concept

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

Copyright © 2017-2026 Yahboom. All Rights Reserved.

EN/中文