Ai-Thinker Rd-01

Ai-Thinker · Rd-01

24-ГГц радар присутствия с BL602, UART, Wi-Fi и BLE; питание модуля 3,3 В.

Автор: SLDV LAB

Опубликовано · Обновлено

СложностьСредне
Проекты с компонентом

О МОДУЛЕ

Что делает Rd-01

Rd-01 — компактный модуль Ai-Thinker с FMCW-радаром S3KM111L и микроконтроллером BL602. Анализ отражённого 24-ГГц сигнала позволяет различать движение и слабые движения человека. Поэтому он подходит для освещения и комнатной автоматизации, где одного события движения недостаточно. «Неподвижная цель» в протоколе — результат радарной классификации, а не гарантия обнаружения абсолютно неподвижного человека при любых условиях.

Модуль выдаёт радарные данные по UART и допускает собственную разработку прошивки BL602. Wi-Fi и BLE аппаратно предусмотрены, но доступные сетевые функции, приложение и формат UART зависят от установленной прошивки. Это самостоятельная модель Rd-01: настройки похожих Rd-01H, Rd-03, LD2410 и плат ESP32 не следует переносить автоматически.

У радара собственные печатные антенны на плате. Wi-Fi/BLE используют отдельный IPEX-разъём для подходящей внешней антенны 2,4 ГГц. Наличие антенны в комплекте по снимку не подтверждено. Неизвестная прошивка может начать радиопередачу сразу после включения: подходящую внешнюю антенну 2,4 ГГц нужно подключить к IPEX до подачи питания. Частота радара 24 ГГц и частота сетевого радио 2,4 ГГц относятся к разным трактам.

Результат зависит от установки, чувствительности зон и задержки исчезновения цели. Вентиляторы, шторы, растения, животные, вибрация и отражающие поверхности могут влиять на срабатывания. Не закрывайте радарную часть металлом; материал корпуса и размещение проверяйте по руководству производителя. Модуль не является медицинским прибором, счётчиком людей или единственным каналом системы безопасности.

На фото пользователя читается Rd-01. Ревизия PCB, прошивка и наличие заднего разъёма у конкретного экземпляра не установлены; производитель показывает варианты монтажа с площадками, штырями и шестиконтактным разъёмом. Иллюстрация распиновки взята из спецификации V1.1.1 без изменения обозначений. Обложка — вырезанный модуль из исходного изображения пользователя, без дорисовки деталей.

Характеристики

Принцип
FMCW-радар, обнаружение движения и микродвижений
Радарный чип
S3KM111L
Контроллер связи
Bouffalo Lab BL602, 32-bit RISC; 276 КБ RAM, 2 МБ Flash по спецификации модуля
Диапазон радара
24–24.25 ГГц
Дальность по V1.1.1
Настенная установка: типично 5 м; потолочная: типично 3,5 м; зависит от условий и настройки
Заявленный угол покрытия
До ±60°; реальная зона зависит от монтажа
Питание
3–3.6 В
Требование к источнику
Не менее 500 мА при 3,3 В; не номинальное постоянное потребление
Уровни интерфейса
UART TTL относительно питания 3,3 В; не RS-232 и не 5-В логика
Радиосвязь
Wi-Fi IEEE 802.11 b/g/n и BLE 5.0 в BL602; программная доступность зависит от прошивки
Антенны
Радар: PCB; Wi-Fi/BLE: внешняя 2,4 ГГц через IPEX
Размер
35 × 18 мм; SMD-12
Рабочая температура
-40–85 °C
UART: расхождение документов
V1.1.1: 115200 baud по умолчанию; протокол/руководство V1.0.0: 256000, 8N1. Проверять фактическую прошивку.
Дистанция в отчёте
Поля UART в сантиметрах; шаг зон и формат целого числа не являются точностью дальномера
Исполнение
Ревизия и задний разъём конкретного экземпляра не подтверждены
Интерфейс
UART, Wi-Fi, Bluetooth
Питание модуля
3,0–3,6 В, номинально 3,3 В; источник должен обеспечивать не менее 500 мА. Это требование к источнику, а не постоянное потребление 500 мА. На 3V3 и GPIO нельзя подавать 5 В. Использовать отдельный стабилизированный источник 3,3 В с общей землёй USB–UART. Не считать маломощный выход 3V3 адаптера подходящим без проверки. Не соединять два источника 3,3 В параллельно. При неизвестной прошивке до подачи питания подключить подходящую внешнюю антенну 2,4 ГГц к IPEX: прошивка может начать передачу автоматически.

ПРАКТИКА

Подключение

Схема подключения
Контакт модуляКонтакт платыНазначение
3V3, физический вывод 12Отдельный стабилизированный источник +3,3 ВИсточник ≥500 мА. Подключать при выключенном питании; проверить Top/Bottom View, не считать выводы слева направо по фото.
GND, физические выводы 1 и 11GND источника и GND USB–UART-адаптераОбщая земля обязательна; не соединять два плюсовых выхода питания.
GPIO16 / TXD, физический вывод 9RX адаптера USB–UART с логикой 3,3 ВВ примере: ПК с Python 3 и pyserial 3.5. Это GPIO16 самого BL602, а не GPIO16 компьютера или ESP32.
GPIO7 / RXD, физический вывод 10Не подключать в приёмном диагностическом примереTX адаптера остаётся свободным: команды настройки и прошивка не передаются.
CHIP_EN, физический вывод 7Не подключать к RTS/DTR адаптераАктивный высокий уровень; в нормальном режиме не удерживать в сбросе. Открытие COM-порта может переключать линии RTS/DTR, поэтому физически оставить их свободными.
GPIO8 / Bootstrap, физический вывод 8Не подключать к адаптеру в этом примереПри подаче питания высокий уровень включает программирование, низкий — обычную загрузку. Не менять штатные цепи загрузки; надпись GPIO8_NC на рисунке не отменяет boot-функцию.
GPIO17 / GPIO1 / GPIO2 / GPIO4 / GPIO5Физические выводы 2 / 3 / 4 / 5 / 6Не используются в примере. Их альтернативные функции требуют собственной прошивки; универсальный дискретный OUT присутствия здесь не предполагается.
IPEX Wi-Fi/BLEСовместимая антенна 2,4 ГГцНе радарная антенна. При неизвестной прошивке подключить подходящую антенну до подачи питания: радио может передавать сразу после старта. Снимок не подтверждает её наличие в комплекте.

ВАШ ПРОЕКТ · ВАШ ДАТЧИК

Интегрируйте модуль с ChatGPT

Скопируйте запрос в ChatGPT. Укажите свою плату и среду разработки — получите подключение и код для своего проекта.

Помоги интегрировать Ai-Thinker Rd-01, 24-ГГц модуль на S3KM111L и BL602. Сначала уточни задачу, маркировку и ревизию модуля, текущую прошивку, плату/компьютер-хост, среду и питание. Категория — датчик расстояния/присутствия. Не подменяй его Rd-01H, Rd-03 или LD2410 и не обещай готовую совместимость ESPHome по похожему протоколу.

Начни с безопасного приёма UART без изменения настроек: питание 3,3 В от источника ≥500 мА, общая земля, TX Rd-01 (GPIO16, pin9) → RX 3,3-В адаптера; TX/RTS/DTR адаптера отключены. В V1.1.1 указан default 115200, а руководство и протокол V1.0.0 используют 256000 8N1. Установи фактическую скорость и формат по валидным кадрам, не по случайным байтам. Нет поддерживаемых кадров не означает отсутствие человека.

После уточнения хоста предложи точные GPIO, питание, зависимости, полный минимальный пример, ошибки и проверку. Отдельно проверь boot GPIO8 и EN, если модуль не запускается. Различай состояния движения/стационарной цели и расстояние; не называй шаг зон точностью. Настройку чувствительности и задержек делай только после подтверждения версии протокола. Проверь прошивку и подходящую внешнюю антенну 2,4 ГГц на IPEX. При неизвестной прошивке подключи её до подачи питания: автоматическую радиопередачу при старте исключить нельзя. Не прошивай модуль ради первого теста и не утверждай проверку на устройстве без реального запуска.

Библиотеки

Установите библиотеку для своей среды и откройте пример из её документации.

Что именно прописать

Точная конфигурация примера
Rd-01 → USB–UART TTL 3.3 V → PC; Python 3 + pyserial 3.5

Приём без команд. Адаптер должен поддерживать фактическую скорость, включая нестандартную 256000; поддержку проверить в документации своего адаптера/драйвера.

Питание
3.3 V regulated; supply capacity >= 500 mA

Отдельное питание и общая земля; 5 В запрещены. Наличие 3V3 на адаптере не доказывает достаточный ток.

UART module TX / RX
GPIO16 pin9 / GPIO7 pin10

В примере подключён только TX модуля к RX адаптера. Не путать физические выводы с GPIO.

Параметры линии
8 data bits; no parity; 1 stop bit; no flow control

8N1 подтверждено протоколом V1.0.0. Смена скорости порта ПК не меняет конфигурацию модуля.

Скорости пассивной проверки
115200, 256000

По 8 секунд на каждую. Документы расходятся; ни одна скорость не объявлена универсальной для всех прошивок.

Формат поддерживаемого отчёта
F4 F3 F2 F1 + uint16_le length + payload + F8 F7 F6 F5

Парсер принимает только правильное обрамление. Разбирает обычный payload type 0x02 длиной 13 байт, marker 0xAA, tail 55 00.

Состояния цели
0 none; 1 moving; 2 stationary; 3 moving_and_stationary

Только значения из валидного базового отчёта. Отсутствие отчётов не заменяет state=0.

Дистанция / энергия
uint16 little-endian cm / uint8 0..100

Дистанции показаны как сырые поля отчёта, включая нули; это не гарантированная точность и не список отдельных людей.

Управляющие линии
Adapter TX, RTS and DTR physically disconnected

Драйвер может переключать RTS/DTR при открытии порта даже без flow control. Не соединять их с EN/Bootstrap.

Прошивка и беспроводная связь
Keep installed firmware; confirm antenna and firmware features

До подачи питания при неизвестной прошивке подключить подходящую антенну 2,4 ГГц к IPEX. Тест не посылает команд включения Wi-Fi/BLE, не записывает Flash и не меняет чувствительность, но уже установленная прошивка может автоматически включать радио.

Подготовка ПК: отдельное окружение Python

text
python -m venv .venv
# Активируйте .venv способом своей ОС, затем:
python -m pip install pyserial==3.5

Команды подготовки, а не выполненный тест. Python 3 и pyserial 3.5; драйвер USB–UART должен быть установлен из официального источника. Уточнить реальное имя порта через ОС.

Полный rd01_receive_only.py: пассивная проверка UART

python
"""Rd-01 receive-only UART diagnostic. Python 3 + pyserial 3.5.
Wire sensor TX (GPIO16, module pin 9) to adapter RX and share GND.
Leave adapter TX/RTS/DTR disconnected. Supply sensor separately at 3.3 V.
"""
import argparse
import time

HEADER = bytes.fromhex("F4 F3 F2 F1")
FOOTER = bytes.fromhex("F8 F7 F6 F5")
STATES = {0: "none", 1: "moving", 2: "stationary", 3: "moving_and_stationary"}


def extract_frames(buf):
    """Consume complete report frames; preserve partial input for the next read."""
    frames = []
    while True:
        start = buf.find(HEADER)
        if start < 0:
            if len(buf) > 3:
                del buf[:-3]
            break
        if start:
            del buf[:start]
        if len(buf) < 6:
            break
        size = int.from_bytes(buf[4:6], "little")
        if not 13 <= size <= 1024:
            del buf[0]
            continue
        total = 6 + size + 4
        if len(buf) < total:
            break
        if bytes(buf[6 + size:total]) != FOOTER:
            del buf[0]
            continue
        payload = bytes(buf[6:6 + size])
        del buf[:total]
        if payload[1] == 0xAA and payload[-2:] == b"\x55\x00":
            frames.append(payload)
    return frames


def decode_basic(payload):
    if len(payload) != 13 or payload[0] != 0x02:
        return None
    if payload[2] not in STATES or payload[5] > 100 or payload[8] > 100:
        return None
    return {
        "state": STATES[payload[2]],
        "moving_cm": int.from_bytes(payload[3:5], "little"),
        "moving_energy": payload[5],
        "stationary_cm": int.from_bytes(payload[6:8], "little"),
        "stationary_energy": payload[8],
        "detection_cm": int.from_bytes(payload[9:11], "little"),
    }


def main():
    import serial
    ap = argparse.ArgumentParser(description=__doc__)
    ap.add_argument("port", help="Actual adapter port, e.g. COM4 or /dev/ttyUSB0")
    args = ap.parse_args()
    for baud in (115200, 256000):
        framed = decoded = received = 0
        buf = bytearray()
        print("Trying", baud, "8N1, receive only")
        try:
            with serial.Serial(args.port, baudrate=baud,
                               bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE,
                               stopbits=serial.STOPBITS_ONE, timeout=0.2,
                               xonxoff=False, rtscts=False, dsrdtr=False) as port:
                deadline = time.monotonic() + 8.0
                while time.monotonic() < deadline:
                    chunk = port.read(512)
                    received += len(chunk)
                    buf.extend(chunk)
                    if len(buf) > 8192:
                        del buf[:-8192]
                    for payload in extract_frames(buf):
                        framed += 1
                        data = decode_basic(payload)
                        if data is not None:
                            decoded += 1
                            print(data)
                print("Bytes:", received, "report frames:", framed,
                      "supported basic reports:", decoded)
        except (serial.SerialException, ValueError) as err:
            print("Port/rate error:", err)
        if decoded == 0:
            print("No supported basic reports. This does NOT mean no person.")
            print("Check power, common GND, TX-to-RX, baud, firmware and output mode.")


if __name__ == "__main__":
    main()

Полный пример для Rd-01 + ПК + 3,3-В USB–UART, не для конкретной платы ESP32. Проверены синтаксис и разбор контрольного кадра из официального протокола; физического модуля и COM-порта для проверки не было. Серийные данные только читаются. Инженерный/другой payload может иметь валидное обрамление, но не декодируется как обычный отчёт.

Запуск и интерпретация

text
python rd01_receive_only.py COM4
# Альтернатива Linux, если это фактический порт:
python rd01_receive_only.py /dev/ttyUSB0

Выбрать одну команду и заменить порт своим. Ожидаются валидные базовые отчёты с state и полями сантиметров/энергии, если установленная прошивка их выдаёт. Восемь секунд без отчётов не доказывают неисправность или пустую комнату: проверить проводку, питание, скорость, режим и прошивку. Для сравнения состояния пройти в зоне, затем спокойно посидеть и покинуть её, учитывая задержку исчезновения цели. Это план проверки, не подтверждённый результат.

Проекты с этим компонентом

Все проекты

Связанные проекты пока не опубликованы.

Связанные материалы и компоненты