From d95ff849643cbdc98a0672e216e945eeff591f79 Mon Sep 17 00:00:00 2001
From: SinKy-Yan <1340793687@outlook.com>
Date: Fri, 26 Apr 2024 13:42:54 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=BD=AF=E4=BB=B6=E8=8B=B1?=
=?UTF-8?q?=E6=96=87=E6=96=87=E6=A1=A3=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=8E=9F?=
=?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=AD=E6=8F=8F=E8=BF=B0=E4=B8=8D=E5=BD=93?=
=?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/doc/en/README.md | 183 +++++++
docs/doc/en/audio/recognize.md | 0
docs/doc/en/basic/app.md | 38 ++
docs/doc/en/basic/app_usage.md | 12 +
docs/doc/en/basic/linux_basic.md | 62 +++
docs/doc/en/basic/maixpy_upgrade.md | 23 +
docs/doc/en/basic/maixvision.md | 84 ++++
docs/doc/en/basic/os.md | 28 ++
docs/doc/en/basic/python.md | 58 +++
docs/doc/en/basic/python_pkgs.md | 31 ++
docs/doc/en/faq.md | 47 ++
docs/doc/en/modules/acc.md | 0
docs/doc/en/modules/thermal_cam.md | 0
docs/doc/en/modules/tof.md | 0
docs/doc/en/peripheral/gpio.md | 0
docs/doc/en/peripheral/i2c.md | 0
docs/doc/en/peripheral/pwm.md | 0
docs/doc/en/peripheral/spi.md | 0
docs/doc/en/peripheral/uart.md | 0
docs/doc/en/peripheral/wdt.md | 0
docs/doc/en/pro/compile_os.md | 0
docs/doc/en/sidebar.yaml | 206 ++++----
docs/doc/en/source_code/add_c_module.md | 16 +
docs/doc/en/source_code/build.md | 71 +++
docs/doc/en/source_code/contribute.md | 31 ++
docs/doc/en/source_code/faq.md | 19 +
docs/doc/en/source_code/maixcdk.md | 14 +
docs/doc/en/video/jpeg_streaming.md | 44 ++
docs/doc/en/vision/ai.md | 24 +
docs/doc/en/vision/apriltag.md | 127 +++++
docs/doc/en/vision/assets/custmize_model1.png | Bin 0 -> 140637 bytes
.../doc/en/vision/assets/custmize_model10.png | Bin 0 -> 253080 bytes
.../doc/en/vision/assets/custmize_model11.png | Bin 0 -> 115031 bytes
docs/doc/en/vision/assets/custmize_model2.png | Bin 0 -> 345863 bytes
docs/doc/en/vision/assets/custmize_model3.png | Bin 0 -> 105265 bytes
docs/doc/en/vision/assets/custmize_model4.png | Bin 0 -> 255846 bytes
docs/doc/en/vision/assets/custmize_model5.png | Bin 0 -> 548005 bytes
docs/doc/en/vision/assets/custmize_model6.png | Bin 0 -> 551397 bytes
docs/doc/en/vision/assets/custmize_model7.png | Bin 0 -> 321580 bytes
docs/doc/en/vision/assets/custmize_model8.png | Bin 0 -> 50097 bytes
docs/doc/en/vision/assets/custmize_model9.png | Bin 0 -> 227521 bytes
docs/doc/en/vision/body_key_points.md | 26 +
docs/doc/en/vision/camera.md | 59 +++
docs/doc/en/vision/classify.md | 41 ++
docs/doc/en/vision/custmize_model.md | 459 ++++++++++++++++++
docs/doc/en/vision/display.md | 96 ++++
docs/doc/en/vision/face_recognition.md | 53 ++
docs/doc/en/vision/find_blobs.md | 169 +++++++
docs/doc/en/vision/image_ops.md | 340 +++++++++++++
docs/doc/en/vision/maixhub_train.md | 52 ++
docs/doc/en/vision/object_track.md | 0
docs/doc/en/vision/qrcode.md | 95 ++++
docs/doc/en/vision/self_learn_classifier.md | 53 ++
docs/doc/en/vision/self_learn_detector.md | 13 +
docs/doc/en/vision/yolov5.md | 43 ++
docs/doc/zh/README.md | 7 +-
docs/doc/zh/sidebar.yaml | 2 +-
docs/doc/zh/source_code/build.md | 46 +-
docs/doc/zh/source_code/faq.md | 14 +-
59 files changed, 2567 insertions(+), 119 deletions(-)
create mode 100644 docs/doc/en/audio/recognize.md
create mode 100644 docs/doc/en/basic/app.md
create mode 100644 docs/doc/en/basic/app_usage.md
create mode 100644 docs/doc/en/basic/linux_basic.md
create mode 100644 docs/doc/en/basic/maixpy_upgrade.md
create mode 100644 docs/doc/en/basic/maixvision.md
create mode 100644 docs/doc/en/basic/os.md
create mode 100644 docs/doc/en/basic/python.md
create mode 100644 docs/doc/en/basic/python_pkgs.md
create mode 100644 docs/doc/en/faq.md
create mode 100644 docs/doc/en/modules/acc.md
create mode 100644 docs/doc/en/modules/thermal_cam.md
create mode 100644 docs/doc/en/modules/tof.md
create mode 100644 docs/doc/en/peripheral/gpio.md
create mode 100644 docs/doc/en/peripheral/i2c.md
create mode 100644 docs/doc/en/peripheral/pwm.md
create mode 100644 docs/doc/en/peripheral/spi.md
create mode 100644 docs/doc/en/peripheral/uart.md
create mode 100644 docs/doc/en/peripheral/wdt.md
create mode 100644 docs/doc/en/pro/compile_os.md
create mode 100644 docs/doc/en/source_code/add_c_module.md
create mode 100644 docs/doc/en/source_code/build.md
create mode 100644 docs/doc/en/source_code/contribute.md
create mode 100644 docs/doc/en/source_code/faq.md
create mode 100644 docs/doc/en/source_code/maixcdk.md
create mode 100644 docs/doc/en/video/jpeg_streaming.md
create mode 100644 docs/doc/en/vision/ai.md
create mode 100644 docs/doc/en/vision/apriltag.md
create mode 100644 docs/doc/en/vision/assets/custmize_model1.png
create mode 100644 docs/doc/en/vision/assets/custmize_model10.png
create mode 100644 docs/doc/en/vision/assets/custmize_model11.png
create mode 100644 docs/doc/en/vision/assets/custmize_model2.png
create mode 100644 docs/doc/en/vision/assets/custmize_model3.png
create mode 100644 docs/doc/en/vision/assets/custmize_model4.png
create mode 100644 docs/doc/en/vision/assets/custmize_model5.png
create mode 100644 docs/doc/en/vision/assets/custmize_model6.png
create mode 100644 docs/doc/en/vision/assets/custmize_model7.png
create mode 100644 docs/doc/en/vision/assets/custmize_model8.png
create mode 100644 docs/doc/en/vision/assets/custmize_model9.png
create mode 100644 docs/doc/en/vision/body_key_points.md
create mode 100644 docs/doc/en/vision/camera.md
create mode 100644 docs/doc/en/vision/classify.md
create mode 100644 docs/doc/en/vision/custmize_model.md
create mode 100644 docs/doc/en/vision/display.md
create mode 100644 docs/doc/en/vision/face_recognition.md
create mode 100644 docs/doc/en/vision/find_blobs.md
create mode 100644 docs/doc/en/vision/image_ops.md
create mode 100644 docs/doc/en/vision/maixhub_train.md
create mode 100644 docs/doc/en/vision/object_track.md
create mode 100644 docs/doc/en/vision/qrcode.md
create mode 100644 docs/doc/en/vision/self_learn_classifier.md
create mode 100644 docs/doc/en/vision/self_learn_detector.md
create mode 100644 docs/doc/en/vision/yolov5.md
diff --git a/docs/doc/en/README.md b/docs/doc/en/README.md
index e69de29b..0ad7179d 100644
--- a/docs/doc/en/README.md
+++ b/docs/doc/en/README.md
@@ -0,0 +1,183 @@
+---
+title: MaixPy Quick Start
+---
+
+
+
+
+> For an introduction to MaixPy, please see the [MaixPy official website homepage](../../README.md)
+
+## Get a MaixCAM Device
+
+Purchase the MaixCAM development board from the [Sipeed Taobao](https://item.taobao.com/item.htm?id=784724795837) or [Sipeed AliExpress](https://www.aliexpress.com/store/911876460) store.
+
+**It is recommended to purchase the bundle with a `TF card`, `camera`, `2.3-inch touchscreen`, `case`, `Type-C data cable`, `Type-C one-to-two mini board`, and `4P serial port socket+cable`**, which will be convenient for later use and development. **The following tutorials assume that you already have these accessories** (including the screen).
+
+If you did not purchase a TF card, you will need to **prepare** a **TF card reader** to flash the system.
+
+>! Note that currently only the MaixCAM development board is supported. Other development boards with the same chip are not supported, including Sipeed's development boards with the same chip. Please be careful not to purchase the wrong board, which could result in unnecessary waste of time and money.
+
+## Getting Started
+
+### Prepare the TF Image Card and Insert it into the Device
+
+If the package you purchased includes a TF card, it already contains the factory image. If the TF card was not installed in the device at the factory, you will first need to carefully open the case (be careful not to tear the ribbon cables inside) and then insert the TF card. Additionally, since the firmware from the factory may be outdated, you can follow the instructions on [Upgrading and Flashing the System](https://wiki.sipeed.com/maixpy/doc/zh/basic/os.html) to upgrade the system to the latest version.
+
+If you did not purchase a TF card, you need to flash the system onto a self-provided TF card. Please refer to [Upgrading and Flashing the System](./basic/os.md) for the flashing method, and then install it on the board.
+
+### Power On
+
+Use a `Type-C` data cable to connect the `MaixCAM` device and power it on. Wait for the device to boot up and enter the function selection interface.
+
+![maixcam_font](../../static/image/maixcam_font.png)
+
+If the screen does not display:
+* Please confirm that you purchased the bundled TF card. If you confirm that you have a TF card and it is inserted into the device, you can try [updating to the latest system](./basic/os.md).
+* If you did not purchase the TF card bundle, you need to follow the instructions in [Upgrading and Flashing the System](./basic/os.md) to flash the latest system onto the TF card.
+* Also, ensure that the screen and camera cables are not loose. The screen cable can easily come off when opening the case, so be careful.
+
+### Connect to the Network
+
+For the first run, you need to connect to the network, as you will need it later to activate the device and use the IDE.
+
+* On the device, click `Settings`, select `WiFi`, and click the `Scan` button to start scanning for nearby `WiFi`. You can click several times to refresh the list.
+* Find your WiFi hotspot. If you don't have a router, you can use your phone as a hotspot.
+* Enter the password and click the `Connect` button to connect.
+* Wait for the `IP` address to be obtained. This may take `10` to `30` seconds. If the interface does not refresh, you can exit the `WiFi` function and re-enter to check, or you can also see the `IP` information in `Settings` -> `Device Info`.
+
+### Update the Runtime Libraries
+
+**This step is very important!!!** If this step is not done properly, other applications and functions may not work (e.g., they may crash).
+
+* First, ensure that you have completed the previous step of connecting to WiFi and have obtained an IP address to access the internet.
+* On the device, click `Settings`, and select `Install Runtime Libraries`.
+* After the installation is complete, you will see that it has been updated to the latest version. Then exit.
+
+If it shows `Request failed` or `请求失败` (Request failed), please first check if the network is connected. You need to be able to connect to the internet. If it still doesn't work, please take a photo and contact customer service for assistance.
+
+### Use Built-in Applications
+
+Many applications are built-in, such as Find Blobs, AI Detector, Line Follower, etc. For example, Find Blobs:
+
+
+
+Please explore other applications on your own. More applications will be updated in the future. For usage documentation and application updates, please see the [MaixHub App Store](https://maixhub.com/app).
+
+**Note: The applications only include a part of the functionality that MaixPy can achieve. Using MaixPy, you can create even more features.**
+
+## Use as a Serial Module
+
+> If you want to use the device as the main controller (or if you don't understand what a serial module is), you can skip this step.
+
+The built-in applications can be used directly as serial modules, such as `Find Blobs`, `Find Faces`, `Find QR Codes`, etc.
+
+Usage:
+* Hardware connection: You can connect the device to the `Type-C one-to-two mini board`, which allows you to connect the device via serial to your main controller, such as `Arduino`, `Raspberry Pi`, `STM32`, etc.
+* Open the application you want to use, such as QR code recognition. When the device scans a QR code, it will send the result to your main controller via serial.
+> The serial baud rate is `115200`, the data format is `8N1`, and the protocol follows the [Maix Serial Communication Protocol Standard](https://github.com/sipeed/MaixCDK/blob/master/docs/doc/convention/protocol.md). You can find the corresponding application introduction on the [MaixHub APP](https://maixhub.com/app) to view the protocol.
+
+## Prepare to Connect the Computer and Device
+
+To allow the computer (PC) and the device (MaixCAM) to communicate later, we need to have them on the same local area network. Two methods are provided:
+* **Method 1 (strongly recommended)**: Wireless connection. The device uses WiFi to connect to the same router or WiFi hotspot as the computer. You can connect to your WiFi in the device's `Settings -> WiFi Settings`.
+* **Method 2**: Wired connection. The device connects to the computer via a USB cable, and the device will act as a virtual USB network card, allowing it to be on the same local area network as the computer via USB.
+
+> Method 2 may encounter some problems due to the need for USB and drivers, so it is recommended to start with WiFi instead. You can find common issues in the [FAQ](./faq.md).
+
+
+.. details::Method 2 has different setup methods on different computer systems, click to expand
+ * **Linux**: No additional setup is required. Just plug in the USB cable. Use `ifconfig` or `ip addr` to view the `usb0` network card. **Note** that the IP address you see here, e.g., `10.131.167.100`, is the computer's IP. The device's IP is the last octet changed to `1`, i.e., `10.131.167.1`.
+ * **Windows**: You can first confirm if a RNDIS device has been added in the `Network Adapters`. If so, you can use it directly. Otherwise, you need to manually install the RNDIS network card driver:
+ * Open the computer's `Device Manager`.
+ * Then find a RNDIS device with a question mark under `Other Devices`, right-click and select `Update Driver Software`.
+ * Select `Browse my computer for driver software`.
+ * Select `Let me pick from a list of available drivers on my computer`.
+ * Select `Network Adapters`, then click `Next`.
+ * On the left, select `Microsoft`, on the right, select `Remote NDIS Compatible Device`, then click `Next`, and select `Yes`.
+ * After installation, the effect is as follows:
+ ![RNDIS](../../static/image/rndis_windows.jpg)
+ * **MacOS**: No additional setup is required. Just plug in the USB cable. Use `ifconfig` or `ip addr` to view the `usb0` network card. **Note** that the IP address you see here, e.g., `10.131.167.100`, is the computer's IP. The device's IP is the last octet changed to `1`, i.e., `10.131.167.1`.
+
+ ## Prepare the Development Environment
+
+ * Download and install [MaixVision](https://wiki.sipeed.com/maixvision).
+ * Connect the device and computer with a Type-C cable, open MaixVision, and click the `"Connect"` button in the bottom left corner. It will automatically search for devices. After a short wait, you will see the device, and you can click the connect button next to it to connect to the device.
+
+ If **no device is detected**, you can also manually enter the device's IP address in the **device**'s `Settings -> Device Info`. You can also find solutions in the [FAQ](./faq.md).
+
+ **After a successful connection, the function selection interface on the device will disappear, and the screen will turn black, releasing all hardware resources. If there is still an image displayed, you can disconnect and reconnect.**
+
+ Here is a video example of using MaixVision:
+
+
+
+ ## Run Examples
+
+ Click `Example Code` on the left side of MaixVision, select an example, and click the `Run` button in the bottom left to send the code to the device for execution.
+
+ For example:
+ * `hello_maix.py`: Click the `Run` button, and you will see messages printed from the device in the MaixVision terminal, as well as an image in the upper right corner.
+ * `camera_display.py`: This example will open the camera and display the camera view on the screen.
+ ```python
+ from maix import camera, display, app
+
+ disp = display.Display() # Construct a display object and initialize the screen
+ cam = camera.Camera(640, 480) # Construct a camera object, manually set the resolution to 640x480, and initialize the camera
+ while not app.need_exit(): # Keep looping until the program exits (you can exit by pressing the function key on the device or clicking the stop button in MaixVision)
+ img = cam.read() # Read the camera view and save it to the variable img, you can print(img) to print the details of img
+ disp.show(img) # Display img on the screen
+ ```
+ * `yolov5.py` will detect objects in the camera view, draw bounding boxes around them, and display them on the screen. It supports detection of 80 object types. For more details, please see [YOLOv5 Object Detection](./vision/yolov5.md).
+
+ You can try other examples on your own.
+
+> If you encounter image display stuttering when using the camera examples, it may be due to poor network connectivity, or the quality of the USB cable or the host's USB being too poor. You can try changing the connection method or replacing the cable, host USB port, or computer.
+
+ ## Install Applications on the Device
+
+ The above examples run code on the device, but the code will stop running when `MaixVision` is disconnected. If you want the code to appear in the boot menu, you can package it as an application and install it on the device.
+
+ Click the `Install App` button in the bottom left corner of `MaixVision`, fill in the application information, and the application will be installed on the device. Then you will be able to see the application on the device.
+ You can also choose to package the application and share your application to the [MaixHub App Store](https://maixhub.com/app).
+
+> The default examples do not explicitly write an exit function, so you can exit the application by pressing the function key on the device. (For MaixCAM, it is the user key.)
+
+ If you want the program to start automatically on boot, you can set it in `Settings -> Boot Startup`.
+
+ ## Next Steps
+
+ If you like what you've seen so far, **please be sure to give the MaixPy open-source project a star on [GitHub](https://github.com/sipeed/MaixPy) (you need to log in to GitHub first). Your star and recognition is the motivation for us to continue maintaining and adding new features!**
+
+ Up to this point, you've experienced the usage and development workflow. Next, you can learn about `MaixPy` syntax and related features. Please follow the left sidebar to learn. If you have any questions about using the API, you can look it up in the [API documentation](/api/).
+
+ It's best to learn with a specific purpose in mind, such as working on an interesting small project. This way, the learning effect will be better. You can share your projects and experiences on the [MaixHub Share Plaza](https://maixhub.com/share) and receive cash rewards!
+
+ ## Share and Discuss
+
+ * **[MaixHub Project and Experience Sharing](https://maixhub.com/share)**: Share your projects and experiences, and receive cash rewards. The basic requirements for receiving official rewards are:
+ * **Reproducible**: A relatively complete process for reproducing the project.
+ * **Showcase**: No detailed project reproduction process, but an attractive project demonstration.
+ * **Bug-solving experience**: Sharing the process and specific solution for resolving a particular issue.
+ * [MaixPy Official Forum](https://maixhub.com/discussion/maixpy) (for asking questions and discussion)
+ * Telegram: [MaixPy](https://t.me/maixpy)
+ * MaixPy Source Code Issues: [MaixPy issue](https://github.com/sipeed/MaixPy/issues)
+ * For business cooperation or bulk purchases, please contact support@sipeed.com.
diff --git a/docs/doc/en/audio/recognize.md b/docs/doc/en/audio/recognize.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/doc/en/basic/app.md b/docs/doc/en/basic/app.md
new file mode 100644
index 00000000..cd9b9eb8
--- /dev/null
+++ b/docs/doc/en/basic/app.md
@@ -0,0 +1,38 @@
+---
+title: App development and app stores
+---
+
+## Introduction to Application Ecosystem
+
+In order to make the development board ready to use out of the box, make it easy for users to use without barriers, enable developers to share their interesting applications, and provide effective channels for receiving feedback and even profits, we have launched a simple application framework, including:
+
+- **[App Store](https://maixhub.com/app)**: Developers can upload and share applications, which users can download and use without needing to develop them. Developers can receive certain cash rewards (from MaixHub or user tips).
+- **Pre-installed Apps**: The official provides some commonly used applications, such as color block detection, AI object detection tracking, QR code scanning, face recognition, etc., which users can use directly or use as serial module.
+- **MaixPy + MaixCDK Software Development Kit**: Using [MaixPy](https://github.com/sipeed/maixpy) or [MaixCDK](https://github.com/sipeed/MaixCDK), you can quickly develop embedded AI visual and audio applications in Python or C/C++, efficiently realizing your interesting ideas.
+- **MaixVision Desktop Development Tool**: A brand-new desktop code development tool for quick start, debugging, running, uploading code, installing applications to devices, one-click development, and even support for graphical block-based programming, making it easy for elementary school students to get started.
+
+Everyone is welcome to pay attention to the App Store and share their applications in the store to build a vibrant community together.
+
+
+## Packaging Applications
+
+Using MaixPy + MaixVison makes it easy to develop, package, and install applications:
+- Develop applications with MaixPy in MaixVision, which can be a single file or a project directory.
+- Connect the device.
+- Click the "Install" button at the bottom-left corner of MaixVision, fill in the basic information of the application in the popup window, where the ID is used to identify the application. A device cannot simultaneously install different applications with the same ID, so the ID should be different from the IDs of applications on MaixHub. The application name can be duplicated. You can also upload an icon.
+- Click "Package Application" to package the application into an installer. If you want to upload it to the [MaixHub App Store](https://maixhub./com/app), you can use this packaged file.
+- Click "Install Application" to install the packaged application on the device.
+- Disconnect from the device, and you will see your application in the device's app selection interface. Simply click on it to run the application.
+
+> If you develop with MaixCDK, you can use `maixcdk release` to package an application. Refer to the MaixCDK documentation for specifics.
+
+## Exiting Applications
+
+If you have developed a relatively simple application without a user interface and a back button, you can exit the application by pressing the device's function button (usually labeled as USER, FUNC, or OK) or the back button (if available, MaixCAM does not have this button by default).
+
+
+## Basic Guidelines for Application Development
+
+- Since touchscreens are standard, it is recommended to create a simple interface with touch interaction. You can refer to examples for implementation methods.
+- Avoid making interfaces and buttons too small, as MaixCAM default screen is 2.3 inches with 552x368 resolution and high PPI. Make sure fingers can easily tap without making mistakes.
+- Implement a simple serial interaction for the main functionality of each application based on the [serial protocol](https://github.com/sipeed/MaixCDK/blob/master/docs/doc/convention/protocol.md) (see [example](https://github.com/sipeed/MaixPy/tree/main/examples/communication/protocol)). This way, users can directly use it as a serial module. For instance, in a face detection application, you can output coordinates via serial port when a face is detected.
diff --git a/docs/doc/en/basic/app_usage.md b/docs/doc/en/basic/app_usage.md
new file mode 100644
index 00000000..d1caee2e
--- /dev/null
+++ b/docs/doc/en/basic/app_usage.md
@@ -0,0 +1,12 @@
+---
+title: Application User Guide
+---
+
+After powering on, it will automatically enter the application selection interface, where various built-in applications are available in the [MaixHub App Store](https://maixhub.com/app). Here you can find descriptions and instructions for using each corresponding application.
+
+The commonly used settings are `Settings -> Language`, as well as `Settings -> WiFi`. The `App Store` application can be used for upgrading and installing applications. Once connected to a WiFi network that has internet access, you can scan and install applications from the [MaixHub App Store](https://maixhub.com/app).
+
+Moreover, applications you develop can also be uploaded to the [MaixHub App Store](https://maixhub.com/app) to share with others. High-quality and outstanding applications will receive official red envelope rewards, and excellent applications will gain recognition and support from everyone.
+
+Whether it's a simple application for collecting sensor data or a complex function application, let's work together to create more interesting things!
+
diff --git a/docs/doc/en/basic/linux_basic.md b/docs/doc/en/basic/linux_basic.md
new file mode 100644
index 00000000..79bbfc6a
--- /dev/null
+++ b/docs/doc/en/basic/linux_basic.md
@@ -0,0 +1,62 @@
+---
+title: Basic Knowledge of Linux
+---
+
+## Introduction
+
+For beginners just starting out, you can skip this chapter for now and come back to it after mastering the basics of MaixPy development.
+
+The latest MaixPy supports running Linux on the MaixCAM hardware, so the underlying MaixPy development is based on the Linux system. Although Sipeed has done a lot of work for developers with MaixPy, making it possible to enjoy using it without knowledge of the Linux system, there might be situations where some low-level operations are necessary or for the convenience of developers unfamiliar with Linux. In this section, we will cover some basic Linux knowledge.
+
+## Why Linux System is Needed
+
+Specific reasons can be researched individually. Here are a few examples in simplified terms that may not sound too technical but are easy for beginners to understand:
+* In microcontrollers, our program is usually a loop, but with Linux, we can run multiple programs simultaneously, each appearing to run independently, where the actual execution is handled by the operating system.
+* With a large community of Linux-based developers, required functionalities and drivers can be easily found without the need to implement them from scratch.
+* Linux offers a rich set of accompanying software tools for convenient development and debugging. Some Linux common tools not mentioned in this tutorial can theoretically be used as well.
+
+## File System
+
+What is a file system?
+* Similar to a computer's file system, Linux manages hardware disks using a file system, making it easy for us to read and write data to the disk.
+* For students who have learned about microcontrollers but not familiar with file system development, imagine having a Flash or TF card where data can be read and written through APIs even after power loss. However, Flash has read/write limitations, requiring a program to ensure its longevity. A file system is like a mature program that manages the Flash space and read/write operations. By calling the file system's APIs, we can significantly reduce development work and ensure stability and security with proven programs.
+
+## Transferring Files between Computer and Device (Development Board)
+
+Since the device has Linux and a file system, how do we send files to it?
+
+For MaixPy, we offer MaixVision for file management in future versions. Before that, you can use the following method:
+
+Here we mainly discuss transferring files through the network. Other methods can be explored on your own by searching for "transferring files to Linux":
+* Ensure the device and computer are connected to the same local network, for example:
+ * When the MaixCAM's USB port is connected to the computer, a virtual network card is created which can be seen in the device manager on the computer, and the device's IP can be found in the device's `Settings -> Device Information`.
+ * Alternatively, connect to the same local network on the device through `Settings -> WiFi`.
+* Use SCP or SFTP protocols on the computer to transfer files to the device. There are many specific software options and methods, such as:
+ * On Windows, you can use WinSCP, FileZilla, or the scp command.
+ * On Linux, use FileZilla or the scp command.
+ * On Mac, use FileZilla or the scp command.
+
+## Terminal and Command Line
+
+The terminal is a tool for communicating with and operating the Linux system, similar to Windows' `cmd` or `PowerShell`.
+
+For example, we can enter `ssh root@maixcam-xxxx.local` in the Terminal tool on a Windows system with PowerShell or on a Linux system. You can find the specific name in the device's `Settings->Device Information`, which allows us to connect to the device through the terminal (both username and password are `root`).
+
+Then, we can operate the device by entering commands. For instance, the `ls` command can list the files in the current directory of the device, while `cd` is used to switch to a different directory (similar to clicking folders in file management on a computer),
+
+```shell
+cd / # Switch to the root directory
+ls # Display all files in the current directory (root directory)
+```
+
+This will display similar content as below:
+
+```shell
+bin lib media root tmp
+boot lib64 mnt run usr
+dev linuxrc opt sbin var
+etc lost+found proc sys
+```
+
+For more command learning, please search for `Linux command line usage tutorials` on your own. This is just to introduce beginners to basic concepts so that when developers mention them, they can understand what they mean.
+
diff --git a/docs/doc/en/basic/maixpy_upgrade.md b/docs/doc/en/basic/maixpy_upgrade.md
new file mode 100644
index 00000000..c7ba3598
--- /dev/null
+++ b/docs/doc/en/basic/maixpy_upgrade.md
@@ -0,0 +1,23 @@
+---
+title: Update MaixPy.
+---
+
+There are two methods to begin with. If you are new to this and want to keep things simple, you can try using the pre-installed MaixPy firmware on the TF card that comes with the device. You can consider updating it later.
+
+However, since we don't know when the TF card you received was manufactured, it is recommended to update the system.
+
+## Updating the System Directly
+
+Follow the steps in [Upgrading and Flashing the System](./os.md) to upgrade to the latest system, which already includes the newest MaixPy firmware.
+
+## Updating Only the MaixPy Firmware
+
+Check the latest version information and release notes in the [MaixPy repository release page](https://github.com/sipeed/MaixPy/releases). It includes details about the MaixPy firmware and the system information corresponding to each version.
+
+If you prefer not to update the system (since system changes are usually minimal, you can check if there are any system-related changes in the MaixPy update notes before deciding whether to update the system), you can simply update the MaixPy firmware.
+
+* Set up WiFi in the settings to connect the system to the internet.
+* Click on `Update MaixPy` in the settings app to proceed with the update.
+
+> If you are comfortable using the terminal, you can also update MaixPy by using `pip install MaixPy -U` in the terminal.
+
diff --git a/docs/doc/en/basic/maixvision.md b/docs/doc/en/basic/maixvision.md
new file mode 100644
index 00000000..13fc5d6b
--- /dev/null
+++ b/docs/doc/en/basic/maixvision.md
@@ -0,0 +1,84 @@
+---
+title: MaixVision - MaixPy Programming + Graphical Block Programming
+---
+
+## Introduction
+
+MaixVision is a developer programming tool specifically designed for the Maix ecosystem, supporting MaixPy programming and graphical block programming. It also supports online running, debugging, and real-time image preview, allowing the synchronization of the device display screen for easy debugging and development.
+
+It also supports packaging applications and installing them on devices, making it convenient for users to generate and install applications with a single click.
+
+Additionally, it integrates some handy development tools, such as file management, threshold editors, QR code generators, and more.
+
+## Using MaixPy Programming and Online Running
+
+By following the steps in the [Quick Start](../README.md), we can easily use MaixPy programming and run programs online.
+
+## Real-time Image Preview
+
+MaixPy provides a `display` module, which can display images on the screen. When calling the `show` method of the `display` module, the image will be sent to MaixVision for display in real-time, for example:
+
+```python
+from maix import display, camera
+
+cam = camera.Camera(640, 480)
+disp = display.Display()
+while 1:
+ disp.show(cam.read())
+```
+
+Here, we capture an image using the camera, and then display it on the screen using `disp.show()`, which will also transmit the image to MaixVision for display.
+
+By clicking the `Pause` button in the top right corner, the transmission of the image to MaixVision display will stop.
+
+## Computing the Histogram of an Image
+
+In the previous step, we could see the image in real-time on MaixVision. By selecting a region with the mouse, we can view the histogram of that area below the image. Choosing different color representation methods allows us to see histograms of different color channels. This feature helps us find suitable parameters when working on image processing algorithms.
+
+## Using Graphical Block Programming
+
+Currently in development, stay tuned for updates.
+
+## Distinguishing Between `Device File System` and `Computer File System`
+
+An important concept to grasp here is distinguishing between the **`Computer File System`** and **`Device File System`**:
+
+- **Computer File System**: This operates on the computer. Opening files or projects in MaixVision accesses files stored on the computer. Any changes are automatically saved to the computer's file system.
+- **Device File System**: When a program runs, it sends files to the device for execution. Therefore, files accessed within the code are read from the device's file system.
+
+A common issue arises when a file is saved on the computer at `D:\data\a.jpg`, and then the file is referenced on the device like `img = image.load("D:\data\a.jpg")`. This file cannot be found on the device because there is no `D:\data\a.jpg` file stored there.
+
+For specific instructions on transferring computer files to the device, please refer to the following section.
+
+## Transferring Files to the Device
+
+Currently in development. In the meantime, you can use alternative tools:
+
+Begin by knowing the device's IP address or device name, which MaixVision can search for, or check in the device's `Settings -> System Information`, where you might find something similar to `maixcam-xxxx.local` or `192.168.0.123`. The username and password are both `root`, and the file transfer protocol is `SFTP` with port number `22`.
+
+There are various user-friendly software options available for different operating systems:
+
+### For Windows
+
+Use tools like [WinSCP](https://winscp.net/eng/index.php) or [FileZilla](https://filezilla-project.org/) to connect to the device via `SFTP`. Provide the necessary device and account information to establish the connection.
+
+For further guidance, perform a quick online search.
+
+### For Linux
+
+Use the `scp` command in the terminal to transfer files to the device, for example:
+
+```bash
+scp /path/to/your/file.py root@maixcam-xxxx.local:/root
+```
+
+### For Mac
+
+- **Method 1**: Use the `scp` command in the terminal to transfer files to the device, for example:
+
+```bash
+scp /path/to/your/file.py root@maixcam-xxxx.local:/root
+```
+
+* **Method 2**: Use tools like [FileZilla](https://filezilla-project.org/) to connect to the device, transfer the files to the device, choose the `SFTP` protocol, fill in the device and account information, and connect.
+
diff --git a/docs/doc/en/basic/os.md b/docs/doc/en/basic/os.md
new file mode 100644
index 00000000..d8cde7c7
--- /dev/null
+++ b/docs/doc/en/basic/os.md
@@ -0,0 +1,28 @@
+---
+title: Upgrade and burn system.
+---
+
+## Introduction
+
+If you have purchased the official (Sipeed) package with a TF card, typically the system has already been pre-programmed at the factory and can be used directly without further steps.
+
+However, to avoid using an outdated version of the pre-programmed system, it is highly recommended to first upgrade to the latest system following the tutorial.
+
+## How to Confirm if System Upgrade is Needed
+
+* Upon booting up to the main menu, click on `Settings`, then `Device Info` to check the system's version number.
+* Visit the [MaixPy Release History page](https://github.com/sipeed/MaixPy/releases) to review the update logs, which contain information on MaixPy firmware and system image updates. If there are significant updates after your current version, it is advisable to upgrade.
+
+ > If the latest system update only includes routine MaixPy firmware updates compared to your current system, you may choose not to upgrade. You can simply update `MaixPy` separately in `Settings` under `Update MaixPy`.
+
+## Obtaining the Latest System
+
+Visit the [MaixPy Release page](https://github.com/sipeed/MaixPy/releases) to find the latest system image file, such as `maixcam_os_20240401_maixpy_v4.1.0.xz`.
+
+Alternate link:
+* [Sourceforge](https://sourceforge.net/projects/maixpy/files/)
+
+## Burning the System Image to MaixCAM
+
+Refer to the [MaixCAM System Flashing Guide](https://wiki.sipeed.com/hardware/zh/maixcam/os.html).
+
diff --git a/docs/doc/en/basic/python.md b/docs/doc/en/basic/python.md
new file mode 100644
index 00000000..40845099
--- /dev/null
+++ b/docs/doc/en/basic/python.md
@@ -0,0 +1,58 @@
+---
+title: Basic Knowledge of Python
+---
+
+The tutorial documentation of MaixPy does not delve into specific Python syntax tutorials because there are already too many excellent Python tutorials available. Here, we only introduce what needs to be learned, provide guidance on directions and paths.
+
+## Introduction to Python
+
+Python is an interpreted, object-oriented, dynamically typed high-level programming language.
+* Interpreted: It does not require compilation, runs directly. The advantage is rapid development, while a minor drawback is the slower execution speed due to code interpretation on each run. However, most often, the bottleneck lies in the developer's code rather than the language itself.
+* Object-oriented: It supports object-oriented programming, allowing the definition of classes and objects. Compared to procedural languages, it is easier to organize code. For more details, please search independently.
+* Dynamically typed: Variables do not need to declare types, can be assigned directly, and the type will be automatically determined based on the assignment. This reduces code volume, but can also lead to type errors, requiring the developer's attention.
+
+In conclusion, for developers unfamiliar with Python, it is very easy to get started as Python offers plenty of ready-to-use libraries, a large developer community, short application development cycles, making it highly worthwhile to learn!
+
+## Python Environment Setup
+
+You can install Python on your computer according to the Python tutorial you are following for learning.
+Alternatively, you can connect to a device via MaixVision on MaixVision and then run the program on the development board.
+
+## What Python Basics are Needed to Use MaixPy?
+
+* Basic concepts of Python.
+* Basic concepts of object-oriented programming.
+* Basic syntax of Python, including:
+ * Tab indentation alignment syntax.
+ * Variables, functions, classes, objects, comments, etc.
+ * Control statements such as if, for, while, etc.
+ * Modules and importing modules.
+ * Basic data types such as int, float, str, list, dict, tuple, etc.
+ * Difference between bytes and str, and conversion.
+ * Exception handling, try-except.
+ * Common built-in functions like print, open, len, range, etc.
+ * Common built-in modules like os, sys, time, random, math, etc.
+
+Mastering the above foundational knowledge will enable you to smoothly program with MaixPy. With the help of subsequent tutorials and examples, if unsure, you can refer to search engines, official documentation, or ask ChatGPT to successfully complete your development tasks.
+
+## For Developers Experienced in Another Object-Oriented Programming Language
+
+If you are already proficient in an object-oriented language like C++/Java/C#, you simply need to quickly review Python syntax before starting to use it.
+
+You can refer to resources like [Runoob Tutorial](https://www.runoob.com/python3/python3-tutorial.html) or the [Python Official Tutorial](https://docs.python.org/3/tutorial/index.html).
+
+Alternatively, you can explore individual developers' blogs, such as [Wow! It's Python](https://neucrack.com/p/59).
+
+## For Developers with C Language Experience but No Object-Oriented Programming Experience
+
+If you only know C and lack understanding of object-oriented concepts, you can start by learning about object-oriented programming concepts before diving into Python. It's relatively quick and you can search for video tutorials for entry-level guidance.
+
+After following introductory video tutorials, you can then refer to documentation tutorials such as [Runoob Tutorial](https://www.runoob.com/python3/python3-tutorial.html) or the [Python Official Tutorial](https://docs.python.org/3/tutorial/index.html) to get started!
+
+Once you have acquired the basic knowledge, you can start using MaixPy for programming based on the documentation and examples.
+
+## For Programming Beginners
+
+If you have never dealt with programming before, you will need to start learning Python from scratch. Python is also quite suitable as an introductory language. You can search for video tutorials for specific guidance.
+
+After mastering the basic syntax, you will be able to use MaixPy for programming by following examples provided.
diff --git a/docs/doc/en/basic/python_pkgs.md b/docs/doc/en/basic/python_pkgs.md
new file mode 100644
index 00000000..b94361ff
--- /dev/null
+++ b/docs/doc/en/basic/python_pkgs.md
@@ -0,0 +1,31 @@
+---
+title: Add extra Python packages.
+---
+
+## Introduction
+
+MaixPy is based on the Python language and provides a wide range of functionalities and APIs for embedded application development. In addition to this, you can also use other Python packages to extend its functionality.
+
+## Installing Additional Python Packages
+
+> Please note that not all Python packages are supported. Generally, only pure Python packages are supported, not C extension packages. C extension packages may require you to manually cross-compile them on a computer (which is quite complex and won't be covered here).
+
+### Method 1: Installing Using Python Code
+
+You can install the package you need in MaixVision using Python code, for example:
+
+```python
+import os
+os.system("pip install package_name")
+```
+
+To update a package, you can use:
+
+```python
+import os
+os.system("pip install --upgrade package_name")
+```
+
+### Method 2: Installing Using the Terminal and pip Command
+
+Follow the terminal usage method introduced in [Linux Basics](./linux_basic.md) and use `pip install package_name` to install the package you need.
diff --git a/docs/doc/en/faq.md b/docs/doc/en/faq.md
new file mode 100644
index 00000000..a05632f3
--- /dev/null
+++ b/docs/doc/en/faq.md
@@ -0,0 +1,47 @@
+---
+title: MaixPy FAQ (Frequently Asked Questions)
+---
+
+This page lists common questions and solutions related to MaixPy. If you encounter any issues, please search for answers here first.
+If you cannot find an answer on this page, you can post your question with detailed steps on the [MaixHub Discussion Forum](https://maixhub.com/discussion).
+
+## MaixVision cannot find the device?
+
+First, confirm whether the connection method is WiFi or USB cable.
+**WiFi**:
+* Ensure that WiFi is correctly connected and has obtained an IP address. You can view the `ip` in `Settings -> Device Info` or `Settings -> WiFi`.
+
+**USB Cable**:
+* Ensure that the device is connected to the computer via a Type-C data cable, and the device is powered on and has entered the function selection interface.
+* Ensure that the device driver is installed:
+ * On Windows, check if there is a USB virtual network adapter device in `Device Manager`. If there is an exclamation mark, it means the driver is not installed properly. Follow the instructions in [Quick Start](./README.md) to install the driver.
+ * On Linux, you can check if there is a `usb0` device by running `ifconfig` or `ip addr`, or check all USB devices with `lsusb`. Linux already includes the driver, so if the device is not recognized, check the hardware connection, ensure the device system is up-to-date, and ensure the device has booted up properly.
+ * On macOS, follow the same steps as Linux.
+* Additionally, check the quality of the USB cable and try using a high-quality cable.
+* Additionally, check the quality of the computer's USB port. For example, some small form factor PCs have poor EMI design on their USB ports, and connecting a good quality USB hub may allow the device to work. You can also try a different USB port or a different computer.
+
+## MaixVision camera example shows choppy video
+
+The default GC4653 camera has a maximum frame rate of 30 frames per second (FPS). Under normal circumstances, the MaixVision display should not appear choppy to the naked eye. If choppiness occurs, first consider transmission issues:
+* Check the network connection quality, such as WiFi.
+* If using a USB connection, check the USB cable quality, computer USB port quality, and try using a different computer, USB port, or USB cable for comparison.
+
+## What is the difference between MaixPy v4 and v1/v3?
+
+* MaixPy v4 uses the Python language and is the culmination of the experiences from v1 and v3, offering better supporting software and ecosystem, more features, simpler usage, and more comprehensive documentation. While the hardware has significant improvements, the pricing is even more affordable compared to the other two versions. Additionally, it provides compatibility with the K210 user experience and API, making it easier for users to migrate quickly from v1 to v4.
+* v1 used the Micropython language and had many limitations, such as limited third-party library support. Additionally, due to the hardware performance limitations of the Maix-I (K210), there was not enough memory, limited AI model support, and lack of hardware acceleration for many codecs.
+* v3 also used the Python language and was based on the Maix-II-Dock (v831) hardware. However, the hardware had limited AI model support, and the Allwinner ecosystem was not open enough, with an incomplete API. This version was only intended for use with the Maix-II-Dock (v831) and will not receive further updates.
+
+## Does MaixPy currently only support MaixCAM, or can it work with other boards using the same chipset?
+
+MaixPy currently only supports the MaixCAM series of boards. Other boards using the same chipset, including Sipeed's boards like the LicheeRV-Nano, are not supported. It is strongly recommended not to attempt using MaixPy with other boards, as it may result in device damage (such as smoke or screen burn), for which you will be solely responsible.
+
+In the future, Sipeed's Maix series of products will continue to be supported by MaixPy. If you have any needs that cannot be met by MaixCAM, you can post your requirements on the [MaixHub Discussion Forum](https://maixhub.com/discussion) or send an email to support@sipeed.com.
+
+## Can I use a camera or screen other than the officially bundled ones?
+
+It is not recommended to use cameras or screens other than the officially bundled ones, unless you have sufficient software and hardware knowledge and experience. Otherwise, it may result in device damage.
+
+The officially bundled accessories have been fine-tuned for both software and hardware, ensuring the best performance and allowing for out-of-the-box usage. Other accessories may have different interfaces, drivers, and software, requiring you to calibrate them yourself, which is an extremely complex process.
+
+However, if you are an expert, we welcome you to submit a pull request!
diff --git a/docs/doc/en/modules/acc.md b/docs/doc/en/modules/acc.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/doc/en/modules/thermal_cam.md b/docs/doc/en/modules/thermal_cam.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/doc/en/modules/tof.md b/docs/doc/en/modules/tof.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/doc/en/peripheral/gpio.md b/docs/doc/en/peripheral/gpio.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/doc/en/peripheral/i2c.md b/docs/doc/en/peripheral/i2c.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/doc/en/peripheral/pwm.md b/docs/doc/en/peripheral/pwm.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/doc/en/peripheral/spi.md b/docs/doc/en/peripheral/spi.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/doc/en/peripheral/uart.md b/docs/doc/en/peripheral/uart.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/doc/en/peripheral/wdt.md b/docs/doc/en/peripheral/wdt.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/doc/en/pro/compile_os.md b/docs/doc/en/pro/compile_os.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/doc/en/sidebar.yaml b/docs/doc/en/sidebar.yaml
index 79dbab37..dabc8295 100644
--- a/docs/doc/en/sidebar.yaml
+++ b/docs/doc/en/sidebar.yaml
@@ -1,83 +1,127 @@
items:
- file: README.md
- label: Brief
-- collapsed: false
- items:
- - collapsed: false
- file: maix/err.md
- label: err
- - collapsed: false
- file: maix/tensor.md
- label: tensor
- - collapsed: false
- file: maix/image.md
- label: image
- - collapsed: false
- file: maix/camera.md
- label: camera
- - collapsed: false
- file: maix/display.md
- label: display
- - collapsed: false
- file: maix/comm.md
- label: comm
- - collapsed: false
- file: maix/thread.md
- label: thread
- - collapsed: false
- file: maix/fs.md
- label: fs
- - collapsed: false
- file: maix/time.md
- label: time
- - collapsed: false
- file: maix/i18n.md
- label: i18n
- - collapsed: false
- file: maix/protocol.md
- label: protocol
- - collapsed: false
- file: maix/example.md
- label: example
- - collapsed: false
- file: maix/app.md
- label: app
- - collapsed: false
- file: maix/nn.md
- items:
- - collapsed: false
- file: maix/nn/F.md
- label: F
- label: nn
- - collapsed: false
- file: maix/peripheral.md
- items:
- - collapsed: false
- file: maix/peripheral/timer.md
- label: timer
- - collapsed: false
- file: maix/peripheral/wdt.md
- label: wdt
- - collapsed: false
- file: maix/peripheral/pwm.md
- label: pwm
- - collapsed: false
- file: maix/peripheral/gpio.md
- label: gpio
- - collapsed: false
- file: maix/peripheral/spi.md
- label: spi
- - collapsed: false
- file: maix/peripheral/uart.md
- label: uart
- - collapsed: false
- file: maix/peripheral/i2c.md
- label: i2c
- - collapsed: false
- file: maix/peripheral/adc.md
- label: adc
- label: peripheral
- - collapsed: false
- file: maix/touchscreen.md
- label: touchscreen
- label: maix
+ label: Quick Start
+- file: faq.md
+ label: FAQ
+
+- label: Base
+- file: basic/os.md
+ label: Burning system
+- file: basic/app_usage.md
+ label: App uses
+- file: basic/maixpy_upgrade.md
+ label: Update MaixPy
+- file: basic/maixvision.md
+ label: MaixVision uses
+- file: basic/python.md
+ label: Python syntax
+- file: basic/linux_basic.md
+ label: Linux fundamentals
+- file: basic/python_pkgs.md
+ label: Add python packages
+- file: basic/app.md
+ label: Apps development
+
+- label: Basic images and algorithms
+- file: vision/display.md
+ label: Screen uses
+- file: vision/camera.md
+ label: Camera uses
+- file: vision/image_ops.md
+ label: Image control
+- file: vision/find_blobs.md
+ label: Finding color blocks
+- file: vision/qrcode.md
+ label: QRcode identity
+- file: vision/apriltag.md
+ label: AprilTag identity
+
+- label: AI Vision
+- file: vision/ai.md
+ label: AI vision knowledge
+- file: vision/classify.md
+ label: AI object classify
+- file: vision/yolov5.md
+ label: YOLOv5 object detect
+- file: vision/face_recognition.md
+ label: Face detect
+- file: vision/body_key_points.md
+ label: Human critical point detection
+- file: vision/self_learn_classifier.md
+ label: Self-learning classifier
+- file: vision/self_learn_detector.md
+ label: Self-learning detector
+- file: vision/object_track.md
+ label: Object tracking and counting
+- file: vision/ocr.md
+ label: OCR
+- file: vision/maixhub_train.md
+ label: MaixHub online AI training
+- file: vision/custmize_model.md
+ label: Custom model
+
+
+- label: AI audio
+- file: audio/record.md
+ label: Audio record
+- file: audio/play.md
+ label: Play audio
+- file: audio/classifier.md
+ label: AI voice classifier
+- file: audio/keyword.md
+ label: Keyword recognize
+- file: audio/recognize.md
+ label: Real-time voice recognize
+- file: audio/synthesis.md
+ label: Speech synthesis
+
+- label: Video
+- file: video/record.md
+ label: Video record
+- file: video/play.md
+ label: Play video
+- file: video/jpeg_streaming.md
+ label: JPEG stream
+- file: video/rtsp.md
+ label: RTSP stream
+
+
+- label: On-chip peripherals
+- file: peripheral/gpio.md
+ label: GPIO
+- file: peripheral/uart.md
+ label: UART
+- file: peripheral/i2c.md
+ label: I2C
+- file: peripheral/pwm.md
+ label: PWM
+- file: peripheral/spi.md
+ label: SPI
+- file: peripheral/wdt.md
+ label: WDT watchdog
+
+- label: Off-chip modules
+- file: modules/acc.md
+ label: Accelerometer
+- file: modules/temp_hum.md
+ label: Temperature and humidity
+- file: modules/tof.md
+ label: TOF
+- file: modules/thermal_cam.md
+ label: Thermal imaging
+
+- label: Advanced
+- file: source_code/contribute.md
+ label: Contribute
+- file: source_code/build.md
+ label: Build source code
+- file: source_code/faq.md
+ label: MaixPy Source FAQ
+- file: source_code/add_c_module.md
+ label: Write in C/C++
+- file: source_code/maixcdk.md
+ label: MaixCDK develop
+- file: pro/compile_os.md
+ label: Build firmware
+
+
diff --git a/docs/doc/en/source_code/add_c_module.md b/docs/doc/en/source_code/add_c_module.md
new file mode 100644
index 00000000..31495320
--- /dev/null
+++ b/docs/doc/en/source_code/add_c_module.md
@@ -0,0 +1,16 @@
+---
+title: Adding a C/C++ Module to MaixPy
+---
+
+## Introduction
+
+Sometimes we need to execute a function efficiently, and the speed of Python cannot meet the requirements. In such cases, we can use C/C++ or other compiled languages to implement the function.
+
+## General Function Encapsulation
+
+If the function you want to encapsulate does not depend on other functionalities of MaixPy, you can directly use the general method of adding C/C++ modules with Python, such as ffi, ctype, etc. You can search for relevant methods online.
+> Welcome to contribute methods via PR
+
+## If Your Module Needs to Depend on Other Basic APIs of MaixPy
+
+You need to learn how to compile and use [MaixCDK](https://github.com/sipeed/MaixCDK) first, because MaixPy is generated from MaixCDK APIs. Some functionalities in MaixPy are also available in MaixCDK, and then... TODO
diff --git a/docs/doc/en/source_code/build.md b/docs/doc/en/source_code/build.md
new file mode 100644
index 00000000..4cb23aa9
--- /dev/null
+++ b/docs/doc/en/source_code/build.md
@@ -0,0 +1,71 @@
+---
+title: MaixPy develop source code guide
+---
+
+## Get source code
+
+```shell
+git clone https://github.com/sipeed/MaixPy
+cd MaixPy
+```
+
+## Build and pack to wheel
+
+
+```shell
+python setup.py bdist_wheel maixcam
+```
+
+`maixcam` Can be replaced with other board config, see [setup.py]([./configs](https://github.com/sipeed/MaixPy/blob/main/setup.py)) 's `platform_names` variable.
+
+
+After build success, you will find wheel file in `dist` directory, use `pip install -U MaixPy****.wheel` on your device to install or upgrade.
+
+> `python setup.py bdist_wheel maixcam --skip-build` will not execute build command and only pack wheel, so you can use `maixcdk menuconfig` and `maixcdk build` first to customize building.
+
+## Build manually
+
+```shell
+maixcdk build
+```
+
+## Run test after modify source code
+
+* First, build source code by
+```shell
+maixcdk build
+```
+
+* If build for PC self(platform `linux`):
+Then execute `./run.sh your_test_file_name.py` to run python script.
+```shell
+cd test
+./run.sh examples/hello_maix.py
+```
+
+* If cross compile for borad:
+ * The fastest way is copy `maix` dir to device's `/usr/lib/python3.11/site-packages/` directory, then run script on device.
+ * Or pack wheel and install on device by `pip install -U MaixPy****.wheel`, then run script on device.
+
+## Preview documentation locally
+
+Documentation in [docs](https://github.com/sipeed/MaixPy/tree/main/docs) directory, use `Markdown` format, you can use [teedoc](https://github.com/teedoc/teedoc) to generate web version documentation.
+
+And the API doc is generated when build MaixPy firmware, **if you don't build MaixPy, the API doc will be empty**.
+
+```shell
+pip install teedoc -U
+cd docs
+teedoc install -i https://pypi.tuna.tsinghua.edu.cn/simple
+teedoc serve
+```
+
+Then visit `http://127.0.0.1:2333` to preview documentation on web browser.
+
+
+## For developers who want to contribute
+
+See [MaixPy develop source code guide](./contribute.md)
+
+If you encounter any problems when use source code, please refer to [FAQ](./faq.md) first.
+
diff --git a/docs/doc/en/source_code/contribute.md b/docs/doc/en/source_code/contribute.md
new file mode 100644
index 00000000..e304ca09
--- /dev/null
+++ b/docs/doc/en/source_code/contribute.md
@@ -0,0 +1,31 @@
+---
+title: Contributing to MaixPy Documentation Modification and Code Contribution
+---
+
+## Contributing to MaixPy Documentation Modification
+
+* Click the "Edit this page" button in the top right corner of the documentation you want to modify to enter the GitHub source documentation page.
+* Make sure you are logged in to your GitHub account.
+* Click the pencil icon in the top right corner of the GitHub preview documentation page to modify the content.
+* GitHub will prompt you to fork a copy to your own repository. Click the "Fork" button.
+> This step forks the MaixPy source code repository to your own account, allowing you to freely modify it.
+* Modify the documentation content, then fill in the modification description at the bottom of the page, and click "Commit changes".
+* Then find the "Pull requests" button in your repository and click to create a new Pull request.
+* In the pop-up page, fill in the modification description and click "Submit Pull request". Others and administrators can then see your modifications on the [Pull requests page](https://github.com/sipeed/MaixPy/pulls).
+* Wait for the administrator to review and approve, and your modifications will be merged into the MaixPy source code repository.
+* After the merge is successful, the documentation will be automatically updated to the [MaixPy official documentation](https://wiki.sipeed.com/maixpy).
+> Due to CDN caching, it may take some time to see the update. For urgent updates, you can contact the administrator for manual refreshing.
+> You can also visit [en.wiki.sipeed.com/maixpy](https://en.wiki.sipeed.com/maixpy) to view the GitHub Pages service version, which is updated in real-time without caching.
+
+## Contributing to MaixPy Code Contribution
+
+* Visit the MaixPy code repository address: [github.com/sipeed/MaixPy](https://github.com/sipeed/MaixPy)
+* Before modifying the code, it is best to create an [issue](https://github.com/sipeed/MaixPy/issues) first, describing the content you want to modify to let others know your ideas and plans, so that everyone can participate in the modification discussion and avoid duplication of effort.
+* Click the "Fork" button in the top right corner to fork a copy of the MaixPy code repository to your own account.
+* Then clone a copy of the code from your account to your local machine.
+* After modifying the code, commit it to your repository.
+* Then find the "Pull requests" button in your repository and click to create a new Pull request.
+* In the pop-up page, fill in the modification description and click "Submit Pull request". Others and administrators can then see your modifications on the [Pull requests page](https://github.com/sipeed/MaixPy/pulls).
+* Wait for the administrator to review and approve, and your modifications will be merged into the MaixPy source code repository.
+
+> Note that most of the MaixPy code is automatically generated from [MaixCDK](https://github.com/sipeed/MaixCDK), so if you modify the C/C++ source code, you may need to modify this repository first.
diff --git a/docs/doc/en/source_code/faq.md b/docs/doc/en/source_code/faq.md
new file mode 100644
index 00000000..c69bedf5
--- /dev/null
+++ b/docs/doc/en/source_code/faq.md
@@ -0,0 +1,19 @@
+MaixPy Source Code FAQ
+===
+
+## subprocess.CalledProcessError: Command '('lsb_release', '-a')' returned non-zero exit status 1.
+
+Edit `/usr/bin/lsb_release` as root, change the first line from `#!/usr/bin/python3` to `python3`.
+
+Then compile again and it should work.
+
+## ImportError: arg(): could not convert default argument 'format: maix::image::Format' in method '.__init__' into a Python object (type not registered yet?)
+
+Pybind11 need you to register `image::Format` first, then you can use it in `camera::Camera`, to we must fist define `image::Format` in generated `build/maixpy_wrapper.cpp` source file.
+
+To achieve this, edit `components/maix/headers_priority.txt`, the depended on should be placed before the one use it.
+e.g.
+```
+maix_image.hpp
+maix_camera.hpp
+```
diff --git a/docs/doc/en/source_code/maixcdk.md b/docs/doc/en/source_code/maixcdk.md
new file mode 100644
index 00000000..eedf49ec
--- /dev/null
+++ b/docs/doc/en/source_code/maixcdk.md
@@ -0,0 +1,14 @@
+---
+title: Switching to MaixCDK for C/C++ Application Development
+---
+
+In addition to developing with MaixPy, there is also a corresponding C/C++ SDK available, called [MaixCDK](https://github.com/sipeed/MaixCDK).
+
+## Introduction to MaixCDK
+
+MaixPy is built on top of MaixCDK, and most of MaixPy's APIs are automatically generated based on MaixCDK's APIs. Therefore, any functionality available in MaixPy is also included in MaixCDK.
+If you are more familiar with C/C++ programming or require higher performance, you can use MaixCDK for development.
+
+## Using MaixCDK
+
+The MaixCDK code repository is located at [github.com/sipeed/MaixCDK](https://github.com/sipeed/MaixCDK), where you can find the MaixCDK code and documentation.
diff --git a/docs/doc/en/video/jpeg_streaming.md b/docs/doc/en/video/jpeg_streaming.md
new file mode 100644
index 00000000..774ceb86
--- /dev/null
+++ b/docs/doc/en/video/jpeg_streaming.md
@@ -0,0 +1,44 @@
+---
+title: MaixPy Video Stream JPEG Streaming / Sending Images to Server
+update:
+ - date: 2024-04-03
+ author: neucrack
+ version: 1.0.0
+ content: Initial document
+
+---
+
+## Introduction
+
+Sometimes it is necessary to send images to a server or push video from a camera to a server. Here, we provide the simplest method, which is to compress images into `JPEG` format and send them one by one to the server.
+
+Note, this is a very basic method and not a formal way to stream video. It is also not suitable for high-resolution, high-frame-rate video streams, as it involves sending images one by one. For more efficient video streaming, please use the `RTSP` or `RTMP` modules discussed later.
+
+## How to Use
+
+```python
+from maix import image
+import requests
+
+# create image
+img = image.Image(640, 480, image.Format.FMT_RGB)
+# draw something
+img.draw_rect(60, 60, 80, 80, image.Color.from_rgb(255, 0, 0))
+
+# convert to jpeg
+jpeg = img.to_format(image.Format.FMT_JPEG) # image.Format.FMT_PNG
+# get jpeg bytes
+jpeg_bytes = jpeg.to_bytes()
+
+# faster way, borrow memory from jpeg object,
+# but be careful, when jpeg object is deleted, jpeg_bytes object MUST NOT be used, or program will crash
+# jpeg_bytes = jpeg.to_bytes(copy = False)
+
+# send image binary bytes to server
+url = "http://192.168.0.123:8080/upload"
+res = requests.post(url, data=jpeg_bytes)
+print(res.status_code)
+print(res.text)
+```
+
+As you can see, the image is first converted into `JPEG` format, and then the binary data of the `JPEG` image is sent to the server via `TCP`.
diff --git a/docs/doc/en/vision/ai.md b/docs/doc/en/vision/ai.md
new file mode 100644
index 00000000..319b1331
--- /dev/null
+++ b/docs/doc/en/vision/ai.md
@@ -0,0 +1,24 @@
+---
+title: Basic Knowledge of AI Vision
+update:
+ - date: 2024-04-03
+ author: neucrack
+ version: 1.0.0
+ content: Initial documentation
+---
+
+## Introduction
+
+If you don't have an AI background, you can first read [What is Artificial Intelligence (AI) and Machine Learning](https://wiki.sipeed.com/ai/en/basic/what_is_ai.html) to understand the basic concepts of AI before learning about AI.
+
+Then, the visual AI we use is generally based on the `deep neural network learning` method. If you are interested, you can check out [Deep Neural Network (DNN) Basics](https://wiki.sipeed.com/ai/en/basic/dnn_basic.html).
+
+## Using Visual AI in MaixPy
+
+Using visual AI in MaixPy is very simple. By default, commonly used AI models are provided, and you can use them directly without having to train the models yourself. You can find the `maixcam` models in the [MaixHub Model Library](https://maixhub.com/model/zoo).
+
+Additionally, the underlying APIs have been well-encapsulated, and you only need to make simple calls to implement them.
+
+If you want to train your own model, you can start with [MaixHub Online Training](https://maixhub.com/model/training/project). On the online platform, you can train models just by clicking, without the need to purchase expensive machines, set up complex development environments, or write code, making it very suitable for beginners and also for experienced users who are too lazy to read code.
+
+Generally, once you have obtained the model file, you can transfer it to the device and call the MaixPy API to use it. The specific calling methods are discussed in the following sections.
diff --git a/docs/doc/en/vision/apriltag.md b/docs/doc/en/vision/apriltag.md
new file mode 100644
index 00000000..ee164986
--- /dev/null
+++ b/docs/doc/en/vision/apriltag.md
@@ -0,0 +1,127 @@
+---
+title: MaixPy Apriltag Recognition
+update:
+ - date: 2024-04-03
+ author: lxowalle
+ version: 1.0.0
+ content: Initial documentation
+---
+
+Before reading this article, make sure you are familiar with how to develop with MaixPy. For more details, please read [MaixVision -- MaixPy Programming + Graphical Block Programming](../basic/maixvision.md).
+
+## Introduction
+
+This article introduces how to use MaixPy to recognize Apriltag labels.
+
+## Using MaixPy to Recognize Apriltag Labels
+
+MaixPy's `maix.image.Image` provides the `find_apriltags` method, which can be used to recognize Apriltag labels.
+
+### How to Recognize Apriltag Labels
+
+A simple example of recognizing Apriltag labels and drawing bounding boxes:
+
+```python
+from maix import image, camera, display
+
+cam = camera.Camera()
+disp = display.Display()
+
+families = image.ApriltagFamilies.TAG36H11
+x_scale = cam.width() / 160
+y_scale = cam.height() / 120
+
+while 1:
+ img = cam.read()
+
+ new_img = img.resize(160, 120)
+ apriltags = new_img.find_apriltags(families = families)
+ for a in apriltags:
+ corners = a.corners()
+
+ for i in range(4):
+ corners[i][0] = int(corners[i][0] * x_scale)
+ corners[i][1] = int(corners[i][1] * y_scale)
+ x = int(a.x() * x_scale)
+ y = int(a.y() * y_scale)
+ w = int(a.w() * x_scale)
+ h = int(a.h() * y_scale)
+
+ for i in range(4):
+ img.draw_line(corners[i][0], corners[i][1], corners[(i + 1) % 4][0], corners[(i + 1) % 4][1], image.COLOR_RED)
+ img.draw_string(x + w, y, "id: " + str(a.id()), image.COLOR_RED)
+ img.draw_string(x + w, y + 15, "family: " + str(a.family()), image.COLOR_RED)
+
+ disp.show(img)
+```
+
+Steps:
+
+1. Import the image, camera, and display modules
+
+ ```python
+ from maix import image, camera, display
+ ```
+
+2. Initialize the camera and display
+
+ ```python
+ cam = camera.Camera()
+ disp = display.Display()
+ ```
+
+3. Get the image from the camera and display it
+
+ ```python
+ while 1:
+ img = cam.read()
+ disp.show(img)
+ ```
+
+4. Call the `find_apriltags` method to recognize Apriltag labels in the camera image
+
+ ```python
+ new_img = img.resize(160, 120)
+ apriltags = new_img.find_apriltags(families = families)
+ ```
+
+ - `img` is the camera image obtained through `cam.read()`
+ - `img.resize(160, 120)` is used to scale down the image to a smaller size, allowing the algorithm to compute faster with a smaller image
+ - `new_img.find_apriltags(families = families)` is used to find Apriltag labels, and the query results are saved in `apriltags` for further processing. The `families` parameter is used to select the Apriltag family, defaulting to `image.ApriltagFamilies.TAG36H11`
+
+5. Process the recognized label results and display them on the screen
+
+ ```python
+ for a in apriltags:
+ # Get position information (and map coordinates to the original image)
+ x = int(a.x() * x_scale)
+ y = int(a.y() * y_scale)
+ w = int(a.w() * x_scale)
+ corners = a.corners()
+ for i in range(4):
+ corners[i][0] = int(corners[i][0] * x_scale)
+ corners[i][1] = int(corners[i][1] * y_scale)
+
+ # Display
+ for i in range(4):
+ img.draw_line(corners[i][0], corners[i][1], corners[(i + 1) % 4][0], corners[(i + 1) % 4][1], image.COLOR_RED)
+ img.draw_string(x + w, y, "id: " + str(a.id()), image.COLOR_RED)
+ img.draw_string(x + w, y + 15, "family: " + str(a.family()), image.COLOR_RED)
+ img.draw_string(x + w, y + 30, "rotation : " + str(180 * a.rotation() // 3.1415), image.COLOR_RED)
+ ```
+
+ - Iterate through the members of `apriltags`, which is the result of scanning Apriltag labels through `img.find_apriltags()`. If no labels are found, the members of `apriltags` will be empty.
+ - `x_scale` and `y_scale` are used to map coordinates. Since `new_img` is a scaled-down image, the coordinates of the Apriltag need to be mapped to be drawn correctly on the original image `img`.
+ - `a.corners()` is used to get the coordinates of the four vertices of the detected label, and `img.draw_line()` uses these four vertex coordinates to draw the shape of the label.
+ - `img.draw_string` is used to display the label content, where `a.x()` and `a.y()` are used to get the x and y coordinates of the top-left corner of the label, `a.id()` is used to get the label ID, `a.family()` is used to get the label family type, and `a.rotation()` is used to get the rotation angle of the label.
+
+### Common Parameter Explanations
+
+Here are explanations for common parameters. If you can't find parameters to implement your application, you may need to consider using other algorithms or extending the required functionality based on the current algorithm's results.
+
+| Parameter | Description | Example |
+| --------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
+| roi | Set the rectangular region for the algorithm to compute. roi=[x, y, w, h], where x and y represent the coordinates of the top-left corner of the rectangle, and w and h represent the width and height of the rectangle. The default is the entire image. | Compute the region with coordinates (50,50) and a width and height of 100:
```img.find_apriltags(roi=[50, 50, 100, 100])``` |
+| families | Apriltag label family type | Scan for labels from the TAG36H11 family:
```img.find_apriltags(families = image.ApriltagFamilies.TAG36H11)``` |
+
+This article introduces common methods. For more API information, please refer to the [image](../../../api/maix/image.md) section of the API documentation.
diff --git a/docs/doc/en/vision/assets/custmize_model1.png b/docs/doc/en/vision/assets/custmize_model1.png
new file mode 100644
index 0000000000000000000000000000000000000000..d33a9332cee766e45c3037aa7a20976de90f966e
GIT binary patch
literal 140637
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