yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
K230 Vision Module📖
1. Quick Start
  • 0.Get start
  • 1. K230 firmware download and burning
  • 2. Install the programming environment
  • 3. Debug and run routines
  • 4. Offline running routine
  • 5. Micropython Quick Start
  • 6. GUI Program Instructions
  • 7.K230 module bracket installation tutorial
  • 8.K230 module 2DOF PTZ installation tutorial
2. Basic Courses
  • 1.FPIOA pin assignment
  • 2.RGB lights
  • 3.Buzzer
  • 4.Buttons
  • 5.Serial communication
  • 6.I2C communication
  • 7.PWM
  • 8.WDT watchdog
  • 9.Timer
  • 10.Fourier Transform
  • 11.SHA256 encryption
  • 12.AES encryption
  • 13.Multithreading
  • 14.File reading and writing
  • 15.Image Display
  • 16.Touch Display
  • 17.Camera display
  • 18.Image Flip
  • 19.Camera
3. Draw the image
  • 1. Draw the lines
  • 2. Draw the circle
  • 3. Draw the rectangle
  • 4. Draw the ellipse
  • 5. Draw the arrow
  • 6. Draw the crosshairs
  • 7. Draw text
  • 8. Draw key points
4. Graphics detection
  • 1. Line segment detection
  • 2. Rectangle Detection
  • 3. Circle detection
  • 4. Object edge detection
  • 5. Line inspection basics:fast linear regression
5. Color recognition
  • 1. Color recognition
  • 2. Object Counting
  • 3. Multi-color recognition
  • 4. K230 Color Line Patrol
6.1 CV_lite Image Processing Special Topic
  • 1.Introduction to cv_litenew
  • 2.cv_lite API Reference Manualnew
  • 3.Color Block Recognition - Grayscale Imagenew
  • 4.Color Block Recognition - Color Imagenew
  • 5.Circle Recognition - Grayscale Imagenew
  • 6.Circle Recognition - Color Imagenew
  • 7.Corner Recognition - Grayscale Imagenew
  • 8.Corner Recognition - Color Imagenew
  • 9.Edge Recognition - Grayscale Imagenew
  • 10. Edge Recognition - Color Imagenew
  • 11. Rectangle Recognition - Grayscale Imagenew
  • 12.Rectangle Recognition - Color Imagenew
  • 13.Rectangle recognition combined with corner recognition - grayscale imagenew
  • 14.Rectangle recognition combined with corner recognition - color imagenew
  • 15.Image Binarization - Grayscalenew
  • 16.Image Binarization - Color Imagenew
  • 17.Exposure Adjustmentnew
  • 18.Image Black Hat Operationsnew
  • 19.Image Color Histogramnew
  • 20.Image Closingnew
  • 21.Image Expansionnew
  • 22.Image Corrosionnew
  • 23.Gaussian Blurnew
  • 24.Gradient Transformationnew
  • 25.Mean Fuzzynew
  • 26.Image Openingnew
  • 27.Image Top Hat Operationnew
  • 28.PnP rangingnew
  • 29.Find rectangles and measure distancesnew
  • 30.Image grayscale world white balancenew
6.2 OpenCV Image Processing Special Topicnew
  • 1. OpenCV Introduction
  • 2. OpenCV API Reference
  • 3. Image Basic Transforms
  • 4. Morphological Operations
  • 5. Color Segmentation and Shape Classification
  • 6. Corner and Centroid Detection
  • 7. Hough Circle Detection
  • 8. Hough Line Detection
  • 9. Contour Analysis
  • 10. Drawing Functions
  • 11. Template Matching
  • 12. Image Blur Filtering
  • 13. Edge Detection
  • 14. Thresholding
  • 15. Color Segmentation
  • 16. Histogram and Pixel Transformation
  • 17. Arithmetic and Bitwise Operations
  • 18. Channel Operation and Statistics
  • 19. Image File Read and Write
  • 20. Pixel Level Transformation
7. Code type recognition
  • 1.Barcode recognition
  • 2.QR code recognition
  • 3.AprilTag tag recognition
  • 4.DM code recognition
8. Face Recognition
  • 1.[Must-read] General code structure and prerequisite knowledge of AI vision routines
  • 2.Face Detection
  • 3.Facial key point recognition
  • 4.Face orientation detection
  • 5.Face 3D Network
  • 6.Gaze direction detection
  • 7.Register for face recognition
9. Human body characteristics
  • 1. Human body detection
  • 2. Human key point detection
  • 3. Human posture recognition
  • 4. Fall detection
  • 5. Palm detection
  • 6. Palm key point detection
  • 7. Palm key point classification
  • 8. Gesture Recognition
  • 9. Dynamic gesture recognition
  • 10. Rock, Paper, Scissors
10. Scenario Application
  • 1.OCR character detection
  • 2.OCR character recognition
  • 3.yolov8n target detection
  • 4.yolov8n segmentation
  • 5. Self-learning object recognition
  • 6. License plate detection
  • 7. License Plate Recognition
  • 8. Target Tracking
  • 9. Fruit classification
  • 10. Garbage classification
  • 11. Road sign recognition
11. Audio and video processing
  • 1. Audio Recording
  • 2. Play Audio
  • 3. Video Recording
  • 4. Play Video
  • 5. Keyword wake-up
12. Network Basics
  • 1. Wireless network connection
  • 2. AP hotspot mode
  • 3. TCP-Server Example
  • 4. TCP-Client Example
  • 5. UDP-Server Example
  • 6. UDP-Client Example
  • 7. HTTP-Server Example
  • 8. HTTP-Client Example
  • 9. MQTT Quick Start
  • 10. MQTT-Publisher
  • 11. MQTT-Subscriber
  • 12. RTSP real-time image transmission
  • 13. RTSP real-time image transmission combined with AIDemo
  • 14. Call OpenRouter large model aggregation service
  • 15. Open the Resource Monitoring Panel
13. LVGL Graphical Interface
  • 1. Introduction to LVGL
  • 2. Create a button
  • 3. Create a slider
  • 4. Create an Image
  • 5. Create a text box and keyboard
14. GUI Code Tutorial & Secondary Development
  • 01.GUI System Architecture
  • 02.Core Engine Initialization
  • 03.Application Discovery Mechanism in GUI
  • 04.Desktop Layout Algorithm
  • 05.Advanced UI Styling
  • 06.BaseApp Base Class Analysis
  • 07.Hello_World Practical
  • 08.GUI Application Lifecycle and Resource Management
15. Train your own model
  • 1. Local deployment of yolo training environment
  • 2. Use online platforms for training
16.Touch Course
  • 1.Touch point detectionnew
  • 2.Touch Paintingnew
  • 3.Touch to take a photonew
17. Multi-master communication (purchased separately)
ESP32-K230
  • 1.k230 color recognition
  • 2.k230 barcode recognition
  • 3.k230 QR code recognition
  • 4.k230Apriltag code recognition
  • 5.k230DM code recognition
  • 6.k230 face detection
  • 7.k230 gaze direction
  • 8.k230 face recognition
  • 9.k230 human body detection
  • 10.k230 fall detection
  • 11.k230 palm detection
  • 12.k230 gesture recognition
  • 13.k230OCR character recognition
  • 14.k230 object detection
  • 15.k230 target tracking
  • 16.k230 self-learning object recognition
  • 17.k230 license plate recognition
Jetson-K230
  • 1.k230 color recognition
  • 2.k230 barcode recognition
  • 3.k230 QR code recognition
  • 4.k230Apriltag code recognition
  • 5.k230DM code recognition
  • 6.k230 face detection
  • 7.k230 gaze direction
  • 8.k230 face recognition
  • 9.k230 human body detection
  • 10.k230 fall detection
  • 11.k230 palm detection
  • 12.k230 gesture recognition
  • 13.k230OCR character recognition
  • 14.k230 object detection
  • 15.k230 target tracking
  • 16.k230 self-learning object recognition
  • 17.k230 license plate recognition
MSPM0G3507-K230
  • 1.k230 color recognition
  • 2.k230 barcode recognition
  • 3.k230 QR code recognition
  • 4.k230Apriltag code recognition
  • 5.k230DM code recognition
  • 6.k230 face detection
  • 7.k230 gaze direction
  • 8.k230 face recognition
  • 9.k230 human body detection
  • 10.k230 fall detection
  • 11.k230 palm detection
  • 12.k230 gesture recognition
  • 13.k230OCR character recognition
  • 14.k230 object detection
  • 15.k230 target tracking
  • 16.k230 self-learning object recognition
  • 17.k230 license plate recognition
Pico-K230
  • 1.k230 color recognition
  • 2.k230 barcode recognition
  • 3.k230 QR code recognition
  • 4.k230Apriltag code recognition
  • 5.k230DM code recognition
  • 6.k230 face detection
  • 7.k230 gaze direction
  • 8.k230 face recognition
  • 9.k230 human body detection
  • 10.k230 fall detection
  • 11.k230 palm detection
  • 12.k230 gesture recognition
  • 13.k230OCR character recognition
  • 14.k230 object detection
  • 15.k230 target tracking
  • 16.k230 self-learning object recognition
  • 17.k230 license plate recognition
raspberrypi-K230
  • 1.k230 color recognition
  • 2.k230 barcode recognition
  • 3.k230 QR code recognition
  • 4.k230Apriltag code recognition
  • 5.k230DM code recognition
  • 6.k230 face detection
  • 7.k230 gaze direction
  • 8.k230 face recognition
  • 9.k230 human body detection
  • 10.k230 fall detection
  • 11.k230 palm detection
  • 12.k230 gesture recognition
  • 13.k230OCR character recognition
  • 14.k230 object detection
  • 15.k230 target tracking
  • 16.k230 self-learning object recognition
  • 17.k230 license plate recognition
RDK-K230
  • 1.k230 color recognition
  • 2.k230 barcode recognition
  • 3.k230 QR code recognition
  • 4.k230Apriltag code recognition
  • 5.k230DM code recognition
  • 6.k230 face detection
  • 7.k230 gaze direction
  • 8.k230 face recognition
  • 9.k230 human body detection
  • 10.k230 fall detection
  • 11.k230 palm detection
  • 12.k230 gesture recognition
  • 13.k230OCR character recognition
  • 14.k230 object detection
  • 15.k230 target tracking
  • 16.k230 self-learning object recognition
  • 17.k230 license plate recognition
STM32-K230
  • 1. stm32_k230 color recognition
  • 2. stm32_k230 barcode recognition
  • 3. stm32_k230 QR code recognition
  • 4. stm32_k230Apriltag code recognition
  • 5. stm32_k230DM code recognition
  • 6. stm32_k230 face detection
  • 7.stm32_k230 looking direction
  • 8. stm32_k230 face recognition
  • 9. stm32_k230 human body detection
  • 10. stm32_k230 fall detection
  • 11. stm32_k230 palm detection
  • 12. stm32_k230 gesture recognition
  • 13. stm32_k230OCR character recognition
  • 14. stm32_k230 object detection
  • 15. stm32_k230 target tracking
  • 16. stm32_k230 self-learning object recognition
  • 17.stm32_k230 license plate recognition
Arduino-K230
  • 1.arduino_k230 color recognition
  • 2.arduino_k230 barcode recognition
  • 3.arduino_k230 QR code recognition
  • 4.arduino_k230 Apriltag code recognition
  • 5.arduino_k230 DM code recognition
  • 6.arduino_k230 face detection
  • 7.arduino_k230 looking direction
  • 8.arduino_k230 face recognition
  • 9.arduino_k230 human body detection
  • 10.arduino_k230 fall detection
  • 11.arduino_k230 palm detection
  • 12.arduino_k230 gesture recognition
  • 13.arduino_k230 OCR character recognition
  • 14.arduino_k230 object detection
  • 15.arduino_k230 target tracking
  • 16.arduino_k230 self-learning object recognition
  • 17.arduino_k230 license plate recognition
Microbit-K230
  • 1.microbit_k230 color recognition
  • 2.microbit_k230 barcode recognition
  • 3.microbit_k230 QR code recognition
  • 4.microbit_k230 Apriltag code recognition
  • 5.microbit_k230 DM code recognition
  • 6.microbit_k230 face detection
  • 7.microbit_k230 looking direction
  • 8.microbit_k230 face recognition
  • 9.microbit_k230 human body detection
  • 10.microbit_k230 fall detection
  • 11.microbit_k230 palm detection
  • 12.microbit_k230 gesture recognition
  • 13.microbit_k230 OCR character recognition
  • 14.microbit_k230 object detection
  • 15.microbit_k230 target tracking
  • 16.microbit_k230 self-learning object recognition
  • 17.microbit_k230 license plate recognition
MSPM0G3519-K230
  • 1. K230 Color Recognitionnew
  • 2. K230 Barcode Recognitionnew
  • 3. K230 QR Code Recognitionnew
  • 4. K230 Apriltag Code Recognitionnew
  • 5. K230 DM Code Recognitionnew
  • 6. K230 Face Detectionnew
  • 7. K230 Gaze Directionnew
  • 8. K230 Face Recognitionnew
  • 9. K230 Human Body Detectionnew
  • 10. K230 Fall Detectionnew
  • 11. K230 Palm Detectionnew
  • 12. K230 Gesture Recognitionnew
  • 13. K230 OCR Character Recognitionnew
  • 14. K230 Object Detectionnew
  • 15. K230 Target Trackingnew
  • 16. K230 Self-learning Object Recognitionnew
  • 17. K230 License Plate Recognitionnew
18.Extension case (purchase separately)
For 2DOF Electric Platform
  • 1.Moving target control and automatic tracking system
  • 2.Human body recognition alarm
  • 3.Gesture Recognition
  • 4.Rock Paper Scissors
  • 5.Fruit sorting
  • 6.Color Tracking
  • 7.Face Tracking
MSPM0G3507 wheeled chassis V1/V2 combined with K230 application case
  • 1.Visual tracking
  • 2.Color tracking
  • 3.Color response
  • 4.Road sign recognition
  • 5.Machine code tracking
  • 6.QR code recognition action
  • 7.Autonomous avoid
  • 8.License plate tracking
  • 9.Face tracking
  • 10.Gaze direction tracking
  • 11.Palm tracking
  • 12.Target tracking
  • 13.Human body tracking
  • 14.OCR character recognition action
STM32 wheeled chassis V1/V2 combined with K230 application case
  • 1.Visual tracking
  • 2.Color tracking
  • 3.Color response
  • 4.Road sign recognition
  • 5.Machine code tracking
  • 6.QR code recognition action
  • 7.Autonomous avoid
  • 8.License plate tracking
  • 9.Face tracking
  • 10.Gaze direction tracking
  • 11.Palm tracking
  • 12.Target tracking
  • 13.Human body tracking
  • 14.OCR character recognition action
MSPM0G3519 wheeled chassis V1/V2 combined with K230 application case
  • 1.Visual trackingnew
  • 2.Color trackingnew
  • 3.Color responsenew
  • 4.Road sign recognitionnew
  • 5.Machine code trackingnew
  • 6.QR code recognition actionnew
  • 7.Autonomous avoidnew
  • 8.License plate trackingnew
  • 9.Face trackingnew
  • 10.Gaze direction trackingnew
  • 11.Palm trackingnew
  • 12.Target trackingnew
  • 13.Human body trackingnew
  • 14.OCR character recognition actionnew
19. Expansion case(purchase separately)new
  • 1.Motion target control and Auto track system
  • 2.Vehicle-mounted balance ball motion control system
Download
  • Manual
  • CanMV IDE
  • Software Tools
  • Firmware
  • Source Code
  • Appendix
Download ZIP

Welcome to K230 Vision Module repository

1.Motion target control and Auto track system

Motion target control and Auto track system

1. Introduction

Please read the materials in the 24-Channel Servo Driver Board and STM32 Getting Started tutorials first. Understand how to flash programs and the basics of STM32. This will make it easier to learn and flash the subsequent programs.

Usage Tips: It is best to use battery power to keep the servos operating normally. If you use a data cable for power, although the servos can still move, the servo voltage cannot reach the normal working voltage of 7.4V, so the servo movement effect will be poorer.

2. Equipment List

  • K230 x2

  • 24-Channel Servo Driver Board x2

  • 2D Electric Gimbal x2

  • Green Laser Pointer x1

  • 7.4V Battery x1

  • Red Laser Pointer x1

  • Red Laser Pointer Bracket x1

  • Male-to-Male Dupont Wires x2

  • Aluminum Alloy Plate x2

The red laser pointer needs to be recognized by the K230. Users can choose a qualified laser pointer for the competition on their own, or they can choose the red laser pointer from the equipment list that can be recognized and meets the competition requirements. For fixing the laser pointer, you can find a suitable laser pointer bracket on your own or choose the bracket from the list. Select the square bracket model with 22.5mm size. Note that if using this square bracket, you need to disassemble it and use only part of it. For usage, refer to the image in the placement position section.

3. Placement Position

image

The placement position is shown in the figure. You can choose our aluminum substrate car frame as the baseplate for fixing the K230 and gimbal, or fix them on your own. The distance between K230 and the gimbal is approximately 7cm. The 2D gimbal system is 1m away from the black frame as required by the problem.

4. Experiment Preparation

First, build the 2D gimbal according to the 2D Gimbal Assembly Tutorial.

Hardware Wiring:

Wiring

2D Gimbal24-Channel Servo Driver Board
X-Axis ServoS1
Y-Axis ServoS2
K230 Vision Module24-Channel Motor Driver Board
5V5V
GNDGND
TXRX3
RXTX3

Note: When plugging in the servo wires, make sure the yellow wire is aligned with the yellow GPIO port of the 24-channel servo driver board, and the brown wire is aligned with the black GPIO port of the 24-channel servo driver board.

5. K230 Key Code Analysis

  • get_square.py

​x
    # Find inner frame
    if flag_find_first_rect == False:
        # The threshold parameter is used to set the detection threshold (the threshold value is related to the pixel size of the rectangle to be detected; setting the threshold within the area range of the rectangle to be detected can reduce external noise)
        # The x_gradient and y_gradient parameters are used to set the edge gradient threshold (larger x_gradient and y_gradient values mean more accurate recognition but longer processing time; smaller values are faster but more susceptible to interference)
        # Both are related to ambient brightness
        # When finding rectangles, adjust threshold, x_gradient, and y_gradient values
        for rect in img.find_rects(threshold = 80000, x_gradient=10, y_gradient=10):
            if rect:
                flag_find_first_rect = True
                # Get the coordinates of the four corners of the rectangle
                first_rect_corners = rect.corners()
                area = rect.magnitude() # Rectangle pixel area size
                print(area)
    # Find outer frame
    if flag_find_first_rect == True:
        if flag_find_second_rect == False:
            for rect in img.find_rects(threshold = 60000, x_gradient=10, y_gradient=10):
                if rect:
                    area = rect.magnitude()
                    if area < 90000:
                        flag_find_second_rect = True
                        # Get the coordinates of the four corners of the rectangle
                        second_rect_corners = rect.corners()
                    print(area)


This code is to obtain the four corner coordinates of a rectangle. By finding the outer and inner rectangles of the black frame, the center rectangle is determined, and thus the four vertex coordinates of the center rectangle are obtained.

  • red_light.py

xxxxxxxxxx
def color_blob(img,hano,color):# Find the largest color blob of the specified color
    blobs = img.find_blobs([hano],roi=light_roi,merge = True)
    if blobs:
        global last_cx
        global last_cy
        for blob in blobs:
            roi = (blob.x()-5,blob.y()-5,blob.w()+10,blob.h()+10)# Get the range of the circumscribed circle of the bright spot
            if img.find_blobs([color],roi=roi,x_stride=1, y_stride=1,
                             area_threshold=0, pixels_threshold=0,merge=False,margin=1):# Found the specified color
               cx = blob[5]
               cy = blob[6]
               img.draw_rectangle(blob[0:4],color=(0,0,255)) # Draw rectangle
               img.draw_cross(blob[5], blob[6],color=(0,0,255)) # Draw cross
               last_cx = cx# Update coordinates
               last_cy = cy# Update coordinates
               return cx, cy, 1
        return last_cx, last_cy, 0
    return last_cx, last_cy, 0




This code is to obtain the coordinates of the target color blob. By calling the K230's color blob finding function, blobs within the threshold are found. For this problem, it is the red color blob, so the threshold needs to be defined as red.

  • Coordinate Segmentation Function

xxxxxxxxxx
def conversion_postion(x,y):
    if x > 510:
       x_h = 255
       x_l = 255
       x_z = x-255-255
    elif 510>=x>=255:
       x_h = 255
       x_l = x-255
       x_z = 0
    else:
       x_h = x
       x_l = 0
       x_z = 0
    if y > 510:
       y_h = 255
       y_l = 255
       y_z = y-255-255
    elif 510>=y>=255:
       y_h = 255
       y_l = y-255
       y_z = 0
    else:
       y_h = y
       y_l = 0
       y_z = 0
    return x_h,x_l,x_z,y_h,y_l,y_z

Since STM32 can only transmit 8-bit binary numbers, the maximum transmission data is 255. Our K230 uses a resolution of 640x480, so the coordinates need to be segmented. The 640 is split into 3 frames for transmission.

6. Gimbal 1 Key Code Analysis

  • control.c

xxxxxxxxxx
void go_to_point(uint16_t now_x, uint16_t now_y, uint16_t targ_x, uint16_t targ_y)
{
    uint16_t i;
    float step_num = 1000;/* 1000 steps*/
    float step_x, step_y; /* Step values  */
    float going_x = now_x, going_y = now_y; /* Current target values*/

    step_x = (targ_x - now_x) / step_num;
    step_y = (targ_y - now_y) / step_num;


    for(i = 0; i < step_num; i++)
{

    kfp_x.source = step_x;
    kfp_y.source = step_y;
    kfp_x.out = KalmanFilter(&kfp_x, kfp_x.source);
    kfp_y.out = KalmanFilter(&kfp_y, kfp_y.source);
    going_x += kfp_x.out;
        going_y += kfp_y.out;

        set_target(going_x, going_y);




    }
}


This code subdivides the coordinates of two points. The idea is to divide the 2 points of a rectangle into many points, then perform PID calculations between these points, making the servo movement more precise. At the same time, it can also control the speed of the servo moving around the black frame.

xxxxxxxxxx
uint8_t get_point1_p()
{
    uint8_t lable, load_1, load_2,load_3, ret = 0;
    if(DataDecode1(&Uart3_RingBuff,&lable, &load_1, &load_2, &load_3) == 0){

          if(lable == 0x10){
            rec_step_point[3][0] = (load_1 + load_2 + load_3);
        } else if(lable == 0x11){
            rec_step_point[3][1] = (load_1 + load_2 + load_3);
        } else if(lable == 0x12){
            rec_step_point[0][0] = (load_1 + load_2 + load_3);
        } else if(lable == 0x13){
            rec_step_point[0][1] = (load_1 + load_2 + load_3);
        } else if(lable == 0x14){
            rec_step_point[1][0] = (load_1 + load_2 + load_3);
        } else if(lable == 0x15){
            rec_step_point[1][1] = (load_1 + load_2 + load_3);
        } else if(lable == 0x16){
            rec_step_point[2][0] = (load_1 + load_2 + load_3);
        } else if(lable == 0x17){
            rec_step_point[2][1] = (load_1 + load_2 + load_3);
            mode_flag = 4;
        }

    }
    return ret;
}


This code combines the 3 frames of data transmitted from K230. As mentioned earlier, K230's coordinate data is split into 3 frames and transmitted separately. This code combines the data to form the correct rectangle vertex coordinates. Then the x and y coordinates of the rectangle are assigned to the 2D array in sequence. When the last coordinate is acquired, a defined flag is assigned.

xxxxxxxxxx
static uint8_t step_flag =0;
    if(step_flag ==0)
    {


    USART_Cmd(USART3, ENABLE);
        get_point1_p();// Get coordinates

    }


    if(mode_flag == 4&&step_flag==0){
    USART_Cmd(USART3, DISABLE);// Enable USART3
    TIM_ITConfig(TIM1,TIM_IT_Update, ENABLE);// Enable timer 1


        TIM_Cmd(TIM4, ENABLE); // Enable PID timer

        go_to_point(rec_step_point[0][0], rec_step_point[0][1], rec_step_point[1][0], rec_step_point[1][1]);
        go_to_point(rec_step_point[1][0], rec_step_point[1][1], rec_step_point[2][0], rec_step_point[2][1]);
        go_to_point(rec_step_point[2][0], rec_step_point[2][1], rec_step_point[3][0], rec_step_point[3][1]);
        go_to_point(rec_step_point[3][0], rec_step_point[3][1], rec_step_point[0][0], rec_step_point[0][1]);

    go_to_point(rec_step_point[0][0], rec_step_point[0][1], rec_step_point[1][0], rec_step_point[1][1]);
        go_to_point(rec_step_point[1][0], rec_step_point[1][1], rec_step_point[2][0], rec_step_point[2][1]);
        go_to_point(rec_step_point[2][0], rec_step_point[2][1], rec_step_point[3][0], rec_step_point[3][1]);
        go_to_point(rec_step_point[3][0], rec_step_point[3][1], rec_step_point[0][0], rec_step_point[0][1]);
    step_flag+=1;




        }

Note: Gimbal 1 must first disable USART3 at the location of the serial port definition function. For this code, first define the flag, then open USART3 to run the coordinate acquisition function. After acquisition is complete, another flag is assigned. Under the judgment of two flags, execution continues. Then disable USART3 to prevent serial port data reception from competing with the PID calculation and servo PWM movement processes. Enable the PID calculation timer and PWM movement timer. Then execute the subdivided PID movement function to control the servo to move within the rectangular frame. After movement is complete, add 1 to the flag to stop the servo.

7. Gimbal 2 Key Code Analysis

  • control.c

xxxxxxxxxx
uint8_t get_point2_p()   // Coordinate processing function
{
    uint8_t lable, load_1, load_2 ,load_3 ,ret=0;
    if(DataDecode1(&Uart3_RingBuff,&lable, &load_1, &load_2,&load_3) == 0){
     if(lable == 0x00){
            rec_step_p[0][0] = load_1 + load_2 + load_3 ;
//          ret=1;


        } else if(lable == 0xff){

            rec_step_p[0][1] = load_1 + load_2 + load_3 ;
//          ret=1;


        }


    return ret;
}
}


This code combines the 3 frames of data transmitted from K230. As mentioned earlier, K230's coordinate data is split into 3 frames and transmitted separately. This code combines the data to form the correct coordinates, and assigns the coordinates to the 2D array.

xxxxxxxxxx
int a_Err=(int)x_pid.Err, b_Err=(int)y_pid.Err;


    get_point2_p();
    if(abs(a_Err) + abs(b_Err) < 800){/* Audio-visual reminder*/
          BEEP_ON;
           }
    else {
          BEEP_OFF;
           }
    set_target(rec_step_p[0][0],rec_step_p[0][1]);


This code uses the coordinates obtained above as the PID target values to control servo movement. At the same time, an audio-visual reminder is given when the sum of X-axis and Y-axis errors is less than the threshold.

8. 2D Gimbal Important Code Analysis

  • bsp_servo.c

xxxxxxxxxx
ServTypdef Xserv = {
    .pwm = 1022,
    .MAXPWM = 2400,
    .MINPWM = 500,
    .MIDPWM = 1097
};


ServTypdef Yserv = {
    .pwm = 1022,
    .MAXPWM = 2100,
    .MINPWM = 400,
    .MIDPWM = 933
};

This code sets the initial starting position of the servos. Gimbal 1 and Gimbal 2 have different positions, so this needs to be modified to fit the gimbal movement range. Since the zero points of x and y on K230 are in the upper left corner, I set the gimbal's initial power-on position in the upper left corner. Then the gimbal can be adjusted proportionally according to the coordinate changes from K230. If adjusting the gimbal position and fine-tuning the position, these position parameters need to be adjusted.

xxxxxxxxxx

void servo_ctr(ServTypdef *servo, int PidInput)
{
    uint16_t CompSet = servo->MIDPWM + PidInput;


    if( CompSet > servo->MAXPWM ){
        CompSet = servo->MAXPWM;
    } else if ( CompSet < servo->MINPWM  ){
        CompSet = servo->MINPWM;
    }
    if(servo->pwm == CompSet){/* Avoid redundant comparison value changes*/

        return;
    }

    if( servo == &Xserv ){


    GPIO_SetBits(Servo_J1_PORT, Servo_J1_PIN );     // Set servo signal high
    delay_us(CompSet);                  // Delay for the number of microseconds of the pulse value


    GPIO_ResetBits(Servo_J1_PORT, Servo_J1_PIN );           // Set servo signal low
    delay_ms(20 - CompSet/1000);
    }
    else if( servo == &Yserv ){


    GPIO_SetBits(Servo_J2_PORT, Servo_J2_PIN );     // Set servo signal high
    delay_us(CompSet);                      // Delay for the number of microseconds of the pulse value


    GPIO_ResetBits(Servo_J2_PORT, Servo_J2_PIN );           // Set servo signal low
    delay_ms(20 - CompSet/1000);
    }
}


This code connects the PID output to PWM. It is the link between PID and PWM. It also performs amplitude limiting on the PWM and is the core code for servo movement. It controls servo rotation through delays and PWM changes, connecting servo movement with PWM.

  • pid.c

xxxxxxxxxx
float pid_calculate(PID_TypeDef *PID,float CurrentValue)
{
  PID->Err =  PID->Target - CurrentValue;
    PID->Integral += PID->Err;
    if(PID->Integral > 7000){
        PID->Integral = 7000;
    }
    if(PID->Integral < -7000){
        PID->Integral = -7000;
    }    // Integral limiting
    PID->PID_out = PID->Kp * PID->Err                                       /* Proportional */
         + PID->Ki * PID->Integral                                  /* Integral */
             + PID->Kd * (PID->Err - PID->LastErr);                     /* Derivative */

    PID->LastErr = PID->Err;
        return PID->PID_out;
}

This code is the configuration of positional PID calculation. It includes integral limiting. Positional PID calculates the current error value (difference between target and actual values), integral value (sum of past errors), and derivative value (rate of error change), then weights and adds these three parts to get the PID output.

  • bsp_usart.c

xxxxxxxxxx
uint8_t DataDecode1(RingBuff_t *ringbuff, uint8_t *data1, uint8_t *data2, uint8_t *data3,uint8_t *data4)
{
    static uint8_t uart_dec_count;
    static uint8_t uart_rec_data[6];
    uint8_t ret = 1;


    if(Read_RingBuff(ringbuff, &uart_rec_data[uart_dec_count]) == RINGBUFF_ERR){
        return 1;

    }
        if((uart_dec_count == 0)&&(uart_rec_data[uart_dec_count] != 0x55)) {            // Frame header 0x55
        uart_rec_data[uart_dec_count] = 0;
    }
        else if((uart_dec_count == 1)&&(uart_rec_data[uart_dec_count] != 0xaa)){      // Second frame 0xaa
        uart_rec_data[uart_dec_count] = 0;
        uart_rec_data[uart_dec_count-1] = 0;
        uart_dec_count = 0;
        }else if((uart_dec_count == 6)&&(uart_rec_data[uart_dec_count] != 0xfa)){      // Frame tail 0xfa
        uart_rec_data[uart_dec_count] = 0;
        uart_rec_data[uart_dec_count-1] = 0;
        uart_rec_data[uart_dec_count-2] = 0;
        uart_rec_data[uart_dec_count-3] = 0;
        uart_rec_data[uart_dec_count-4] = 0;
        uart_rec_data[uart_dec_count-5] = 0;
        uart_dec_count = 0;
    }
    else{
        if(uart_dec_count == 6)// Successfully received one frame of data
        {
            *data1 = uart_rec_data[2];
        *data2 = uart_rec_data[3];
                *data3 = uart_rec_data[4];
            *data4 = uart_rec_data[5];
        ret = 0;


        }
        uart_dec_count++;
        if(uart_dec_count == 7)
        {
            uart_dec_count = 0;
        }

    }
    return ret;


}

This code is for receiving K230 data. Data is received only when the frame header is 0x55, the second data is 0xaa, and the frame tail is 0xfa. The three data values identify one frame of data. Since the 4 vertex coordinates transmitted from K230 are each split into 3 groups for transmission, the transmitted data is quite large. To ensure the transmitted data is accurate, three data values are used to confirm one frame of data.

9. Effect Demonstration

1. Pencil Frame Drawing Effect Description

The problem requires completing a circle around the perimeter without leaving the line within 30 seconds. Our movement circle time is less than 30 seconds, perfectly meeting the requirements and able to return to the center point.

2. Basic Part Frame Drawing Effect Description

This problem requires moving in a circle within a rectangular frame with a time limit of 30 seconds. As seen from the video, the time perfectly matches the requirement, and the movement is also quite good. Since drawing a regular square is too simple, the demonstration shows drawing an arbitrary frame.

3. Advanced Part Gimbal Tracking Effect Description

This problem requires the red laser pointer to move in a circle while the green laser pointer follows, with the distance between them not exceeding 3cm. There should be an audio reminder when within range. As seen from the video, the red laser pointer's movement is good, and the green laser pointer does not exceed 3cm. There is an audio reminder when tracking is achieved, perfectly meeting the problem requirements.

OCR character recognition action
Vehicle-mounted balance ball motion control system

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