yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
STM32-BoardCar📖
0. Get started quickly
  • 0.ReadMe
  • 1. Installation Instructions
  • 2. Version configuration
  • 3. Smart car installation video
  • 4. Precautions for use
1. Introduction to STM32 development 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. Setting up and using the 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. Development board basic tutorial
  • 1. RGB searchlight (GPIO)
  • 2. Buzzer control (GPIO)
  • 3. Button control (EXTI)
  • 4. Serial communication (UASRT)
  • 5. Voltage detection (ADC)
  • 6. Internal temperature sensor(ADC)
  • 7. Independent watchdog(IWDG)
  • 8. Window watchdog(WWDG)
  • 9. Basic timer (TIM6)
  • 10. Universal Timer (TIM3)
  • 11. Advanced timers (TIM1)
  • 12. I2C Communication (IIC)
  • 13. Off-chip Flash (SPI)
  • 14. On-chip Flash (Flash)
  • 15. DMA:USART
  • 16. DMA:SPI
  • 17. DMA:I2C
  • 18. USB communication
  • 19. USB analog U disk
  • 20. FreeRTOS
4. Car expansion tutorial
  • 1. Servo control
  • 2. Basic use of ultrasonic steering gear gimbal
  • 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.K230 Vision Module
  • 11.AI voice interaction integration module
5. Robot car tutorials
  • 1. Car line patrol
  • 2. Ultrasonic follow
  • 3. Ultrasonic obstacle avoidance
  • 4. Ultrasonic obstacle avoidance (servo gimbal version)
  • 5. Infrared sensor obstacle avoidance
  • 6. Infrared remote control
  • 7. PS2 handle remote control
  • 8.K230 face tracking on PTZ
  • 9.K230 color tracking
  • 10.K230 Color Line Patrol
  • 11.K230 QR code command
  • 12.K230 machine code tracking
  • 13.K230 road sign indication action (voice)
  • 14.K230 color response (voice)
  • 15.K230 gesture control (voice)
  • 16.K230 Rock-Paper-Scissors Game (Voice)
6. Operation video
  • 1-How to install STM32CubeIDE software
  • 2-How to create Demo project
  • 3-How to download code into STM32 robot car
  • 4-How to open and compile a code file for STM32
  • 5-About IR control and Charge battery
Download
  • Code
  • SCH
  • Software File
  • STM32 Chip DataSheet
  • Installation manual
Download ZIP

Welcome to STM32-BoardCar repository

12.K230 machine code tracking

k230 machine code tracking

k230 machine code tracking1. Software-Hardware2. Brief principle1. Hardware schematic2. Physical connection diagram3. Control principle3. Main functions4. Partial code analysis5. Experimental Phenomenon

This tutorial is a comprehensive experiment combining multiple peripherals. You can first understand a single peripheral and then conduct this experiment.

1. Software-Hardware

  • STM32F103CubeIDE

  • STM32 Robot Development Board

k230 module: external

  • Type-C data cable or ST-Link

Download or simulate the development board

2. Brief principle

1. Hardware schematic

image-20231028102757858

2. Physical connection diagram

K230 wiring (Note: The wiring in the figure below is for position reference only. We are equipped with K230 dual-head PH2.0 4Pin all-black wire, with fool-proof design, no need to worry about wiring problems)

PixPin_2025-06-10_19-21-14

Motor wiring

image-20231031094208747

3. Control principle

  • Program flow chart

Yes
No
Start
K230 detects target
K230 sends data according to specified protocol
MCU parses data and controls the trolley to respond
Trolley stops
ModuleFunction
k230 visual moduleIdentify machine code and send data to the microcontroller through the serial port

Communication protocol:

Start characterLengthDelimiterRoutine numberDelimiterxDelimiteryDelimiterwDelimiterhDelimiterIDDelimiterdegreesEnd character
$XX,04,XXX,XXX,XXX,XXX,XXX,...$

id: The label number of the identified mechanical code degress: The angle of the identified mechanical code

The microcontroller receives the data sent by k230 through the serial port and processes the data. By judging whether the received data content is in the above frame format, we extract the data x, y, w, h after it meets the data frame format, and then track it

3. Main functions

Function: Pto_Data_Parse

Function prototypevoid Pto_Data_Parse(uint8_t *data_buf, uint8_t num)
FunctionParse the data information returned by K230
Input parameter 1Array pointer of received data
Input parameter 2Size of received data
Return valueNone

Function Car_Move**

Function prototypevoid Car_Move(void)
FunctionCar tracking logic control
Return valueNone
For the underlying driver, you can refer to [Chapter 3: Advanced Timer Tutorial] and [Chapter 4: Motor Control Tutorial]
For the application layer, you can read the source code in the project file by yourself

4. Partial code analysis

  • yb_protocol.c

​x
//*
 * @Brief: 数据分析 Data analysis
 * @Note: 解析传入的数据帧,提取字段值并处理
 *        Parse the incoming data frame, extract field values and process them
 * @Parm: 传入接受到的一个数据帧和长度 Pass in a received data frame and length
 * @Retval: 无返回值 No return value
 */
void Pto_Data_Parse(uint8_t *data_buf, uint8_t num)
{
    uint8_t pto_head = data_buf[0];
    uint8_t pto_tail = data_buf[num-1];
    // 验证帧头和帧尾 Verify frame header and footer
    if (!(pto_head == PTO_HEAD && pto_tail == PTO_TAIL)) {
        return;
    }

    uint8_t data_index = 1;
    uint8_t field_index[PTO_BUF_LEN_MAX] = {0};
    int i = 0;

    // 处理分隔符,将逗号替换为字符串结束符,记录字段位置
    // Process delimiters, replace commas with string terminators and record field positions
    for (i = 1; i < num-1; i++) {
        if (data_buf[i] == ',') {
            data_buf[i] = 0;
            field_index[data_index] = i;
            data_index++;
        }
    }

    // 处理无分隔符的情况,整个数据作为标签处理
    // Handle the case without delimiters, treat the entire data as a label
    if (data_index == 1) {
        uint8_t len = num - 2;
        memcpy(lubiao, (char*)data_buf+1, len);
        lubiao[len] = '\0';  // 确保字符串以'\0'结尾 Ensure the string ends with '\0'
    }
    else { // 处理多字段情况 Process multiple fields
        for (i = 0; i < data_index; i++) {
            uint8_t start = field_index[i] + 1;
            uint8_t len;
            
            if (i == data_index - 1) {
                // 最后一个字段,长度计算到帧尾前
                // Last field, length calculated up to before the frame footer
                len = (num - 1) - start;
            } else {
                // 中间字段,长度为下一个分隔符位置减去当前起始位置
                // Middle field, length is the next delimiter position minus the current start position
                len = field_index[i + 1] - start;
            }
            
            // 根据字段索引和总数处理不同类型的数据
            // Process different types of data based on field index and total count
            if (i == 6 && data_index == 7) {
                memcpy(msg, (char*)data_buf + start, len);
                msg[len] = '\0';  // 确保字符串以'\0'结尾 Ensure the string ends with '\0'
            }
            else if (i == 2 && data_index == 3) {
                memcpy(game, (char*)data_buf + start, len);
                game[len] = '\0';  // 确保字符串以'\0'结尾 Ensure the string ends with '\0'
            }
            else {
                // 其他字段转换为整数值
                // Convert other fields to integer values
                values[i] = Pto_Char_To_Int((char*)data_buf + start);
            }
        }
        
        // 帧长度验证,检查协议定义的长度与实际长度是否一致
        // Frame length verification, check if the protocol-defined length matches the actual length
        uint8_t pto_len = values[0];
        if (pto_len != num) {
            printf("pto_len error:%d , data_len:%d\n", pto_len, num);
            return;
        }

        // 提取协议ID Extract protocol ID
        pto_id = values[1];
    }

    // 提取坐标和尺寸信息 Extract coordinate and dimension information
    int x = values[2];
    int y = values[3];
    int w = values[4];
    int h = values[5];

    // 打印坐标和尺寸信息 Print coordinate and dimension information
    printf("dmcode:x:%d, y:%d, w:%d, h:%d,\n", x, y, w, h);

    // 打印游戏信息 Print game information
    printf("msg:%s\n", game);

    // 调试信息已注释 Debug information commented out
    // printf("game:%d\n", pto_id);
    // printf("msg:%s\n", msg);
}
  • app_motor.c

xxxxxxxxxx
//控制小车运行,输入的参数分别为x、y、z三个轴上的速度值
//Control the movement of the car. The input parameters are the speed values on the x, y, and z axes.
void wheel_Ctrl(int16_t V_x, int16_t V_y, int16_t V_z)
{
    float robot_APB = Motion_Get_APB();
//    speed_lr = -V_y;
    speed_lr = 0;
    speed_fb = V_x;
    speed_spin = (V_z / 1000.0f) * robot_APB;
    if (V_x == 0 && V_y == 0 && V_z == 0)
    {
        Motion_Stop(STOP_BRAKE);
        return;
    }

    speed_L1_setup = speed_fb + speed_lr - speed_spin;
    speed_L2_setup = speed_fb - speed_lr - speed_spin;
    speed_R1_setup = speed_fb - speed_lr + speed_spin;
    speed_R2_setup = speed_fb + speed_lr + speed_spin;

    if (speed_L1_setup > 1000)
        speed_L1_setup = 1000;
    if (speed_L1_setup < -1000)
        speed_L1_setup = -1000;
    if (speed_L2_setup > 1000)
        speed_L2_setup = 1000;
    if (speed_L2_setup < -1000)
        speed_L2_setup = -1000;
    if (speed_R1_setup > 1000)
        speed_R1_setup = 1000;
    if (speed_R1_setup < -1000)
        speed_R1_setup = -1000;
    if (speed_R2_setup > 1000)
        speed_R2_setup = 1000;
    if (speed_R2_setup < -1000)
        speed_R2_setup = -1000;

    Motion_Set_Speed(speed_L1_setup, speed_L2_setup, speed_R1_setup, speed_R2_setup);
}

5. Experimental Phenomenon

After successfully downloading the program, we need to take a machine code and then put it under the lens of the k230 visual module for recognition. The car does not move when it does not recognize the machine code. When the machine code enters the camera acquisition range of the car, the car starts to follow the machine code and keep the machine code in the middle of the video screen. Due to the limited acquisition range of the camera, the machine code cannot be moved too fast, otherwise it will be out of the frame and cannot follow the machine code.

xxxxxxxxxx
For program download, please refer to [Chapter 2: Development Environment Construction and Use → 2.6 Program Download and Simulation]

K230 Code Burning

Required tools: K230, SD card, CanMV IDE K230

We find the k230_track_recong.py file in the project folder, then drag it to CanMV IDE K230, and then choose to save the opened script as main.py to CanMV

PixPin_2025-06-10_19-59-03

Obtaining machine code:

Click Tools->Machine Vision->AprilTag Machine Code Generator on CanMV IDE

PixPin_2025-06-19_19-55-53

K230 QR code command
K230 road sign indication action (voice)

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