O mmWave C4001 é um sensor baseado em radar de 24 GHz para deteção humana. Uma vantagem chave do C4001 em relação aos sensores PIR comuns é a capacidade de detetar presença estática. Sensores PIR reagem apenas a movimento, enquanto o C4001 pode detetar micro-movimentos como a respiração. É também mais resistente a fatores ambientais como luz, temperatura e poeira.
O sensor suporta deteção de movimento até 25 metros e deteção de presença humana até 16 metros. Fornece saídas UART e digitais para fácil integração com microcontroladores. Neste tutorial, aprenderás a ligar o sensor mmWave C4001 a um Arduino ou ESP32. Vamos usá-lo para deteção de movimento e para medir a distância e velocidade de objetos.
Peças Necessárias
Podes adquirir o sensor mmWave C4001 na Amazon ou DFRobot. Também vais precisar de um Arduino ou um ESP32. Neste tutorial uso um Arduino UNO e um ESP32 Lite, mas qualquer outro Arduino, ESP32 ou ESP8266 também funcionará. Por fim, uma breadboard e alguns cabos Dupont para as ligações serão úteis.

Sensor Radar mmWave C4001

ESP32 Lite

Cabo USB C

Arduino Uno

Cabo USB para Arduino UNO

Conjunto de Cabos Dupont

Breadboard
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Hardware do Sensor mmWave C4001
O sensor C4001 baseia-se na tecnologia de radar de ondas milimétricas de 24 GHz. Utiliza FMCW modulação FMCW (Frequency-Modulated Continuous Wave) para medir distância e movimento. O sensor transmite continuamente um sinal modulado em frequência e analisa a forma de onda refletida.
A diferença de frequência entre os sinais transmitido e recebido é usada para calcular a distância. O desvio Doppler é usado para detetar movimento e velocidade. Isto permite ao sensor detetar tanto movimentos grandes como movimentos muito pequenos, como a respiração.
Ao contrário dos sensores PIR, este método de deteção não depende de radiação infravermelha. Funciona independentemente das condições de luz ambiente e temperatura. A imagem abaixo mostra a parte traseira e frontal do módulo do sensor mmWave C4001. Podes ver as antenas douradas do radar na frente da placa.

Capacidades de Deteção
O sensor suporta múltiplos modos de medição em paralelo. Pode detetar presença humana, movimento, distância e velocidade. O alcance máximo para deteção de movimento é até 25 metros. A deteção de presença humana é fiável até cerca de 16 metros.
O alcance de medição de distância começa aproximadamente em 1,2 metros e estende-se até 25 metros. O alcance de deteção de velocidade é de 0,1 m/s a 10 m/s.
O feixe do radar tem um campo de visão de cerca de 100° horizontalmente e 40° verticalmente. Isto permite cobertura ampla com um único sensor.

Características Elétricas
O C4001 opera com uma tensão de alimentação (VIN) de 3,3 V ou 5 V. Isto torna-o compatível com microcontroladores comuns como Arduino e ESP32.
A taxa de comunicação serial padrão é 9600 baud. O sensor fornece comunicação UART e um pino de saída digital. A interface UART permite acesso a dados detalhados de medição como distância e velocidade. A saída digital pode ser usada para sinais simples de deteção de presença.
O módulo inclui pinos para alimentação (VIN), terra (GND), transmissão serial (TX), receção serial (RX) e um sinal de saída digital (OUT). A imagem abaixo mostra o pinout do módulo:

Processamento de Sinal e Saída
O sensor processa internamente as reflexões do radar e fornece dados estruturados. Via UART, fornece informação em tempo real sobre os alvos detetados. Isto inclui estado de presença, estado de movimento, distância e velocidade.
O pino de saída digital fornece um sinal alto ou baixo baseado no estado de deteção. Isto é útil para aplicações simples baseadas em gatilho. O processamento interno reduz a necessidade de análise complexa de sinal no microcontrolador.
Desempenho Ambiental
O C4001 tem forte resistência a interferências ambientais. Não é afetado por condições de iluminação, poeira, humidade ou variações de temperatura.
A faixa de temperatura de operação é de −40 °C a 85 °C. Isto permite o uso em ambientes interiores e exteriores.
O sensor mantém desempenho estável em condições onde sensores infravermelhos normalmente falham. Isto inclui ambientes quentes ou cenários com movimento humano mínimo.
Especificações Técnicas
A tabela seguinte resume as especificações técnicas do sensor mmWave C4001.
| Parâmetro | Valor |
|---|---|
| Tensão de Operação | 3,3 V / 5 V |
| Corrente de Operação | 10 mA (média), 100 mA (pico) |
| Frequência de Operação | 24 GHz |
| Tipo de Modulação | FMCW (Frequency-Modulated Continuous Wave) |
| Alcance de Deteção de Movimento | Até 25 m |
| Alcance de Deteção de Presença Humana | Até 16 m |
| Alcance de Medição de Distância | 1,2 m a 25 m |
| Alcance de Medição de Velocidade | 0,1 m/s a 10 m/s |
| Ângulo do Feixe | 100° (horizontal) × 40° (vertical) |
| Interfaces de Comunicação | UART, I/O Digital |
| Taxa de Baud Padrão | 9600 |
| Temperatura de Operação | −40 °C a 85 °C |
| Dimensões do Módulo | 26 mm × 30 mm |
Usar o Sensor mmWave C4001 sem Microcontrolador
É necessário usar um microcontrolador (ou computador) para programar definições específicas do sensor mmWave C4001. Por exemplo, podes definir a distância de deteção ou a sensibilidade. Mas, uma vez configurado, podes usar o C4001 sem microcontrolador.
O diagrama de ligações abaixo mostra como ligar um LED que acende se o sensor detetar uma pessoa. Basta fornecer energia (3,3…5V) aos pinos VIN e GND e depois ligar um LED com um resistor ao pino OUT:

Para a maioria das aplicações práticas, provavelmente quererás ligar um Relé em vez de um LED para controlar um dispositivo de maior tensão ou corrente. Isto é possível, mas precisarás de usar um Relay Module com circuito amplificador integrado, pois o pino OUT não pode acionar diretamente a bobina do relé. Abaixo está um circuito de exemplo:

Para mais informações sobre módulos relé, vê os How To Use A Relay With Arduino, Interfacing a Relay Module With ESP32 e os Control AC devices with Solid State Relay tutoriais.
Nas próximas secções, vou mostrar como ligar o sensor mmWave C4001 a um Arduino ou ESP32. Uma vez configurado, podes decidir se queres usar o sensor com ou sem microcontrolador. Para tarefas de controlo mais complexas, precisarás do microcontrolador.
Ligação do Sensor mmWave C4001 ao Arduino
Ligar o sensor mmWave C4001 a um Arduino UNO é fácil. Começa por ligar o VIN ao 5V ou 3,3V do Arduino. Depois liga o GND ao GND. Finalmente, ligamos a interface UART ligando RX ao GPIO 5 e TX ao GPIO 4. A imagem abaixo mostra a ligação completa:

Para conveniência, aqui está uma tabela com as ligações que precisas fazer:
| C4001 | Arduino Uno |
|---|---|
| VIN | 5V ou 3,3V |
| GND | GND |
| RX | GPIO 5 |
| TX | GPIO 4 |
Nem sequer precisarás de uma breadboard para ligar o sensor a um Arduino UNO. Quatro cabos Dupont são suficientes. A foto abaixo mostra a minha ligação:

Ligação do Sensor mmWave C4001 ao ESP32
O ESP32 tem três interfaces seriais e podes configurar os pinos e a interface que queres usar. Aqui ligo o TX ao GPIO 17 e o RX ao GPIO 16. Precisamos lembrar disto ao escrever o código. Finalmente, ligamos o VIN a 3,3V e o GND ao G. A imagem abaixo mostra a ligação completa:

Para conveniência, aqui está uma tabela com as ligações que precisas fazer:
| C4001 | ESP32 Lite |
|---|---|
| VIN | 3,3V |
| GND | G |
| RX | 17 |
| TX | 16 |
Instalar a biblioteca DFRobot_C4001
Antes de escrever código para deteção de movimento, precisaremos instalar a biblioteca DFRobot_C4001. Para instalar esta biblioteca, vai ao repositório DFRobot_C4001, clica no botão verde “<> Code” e depois em “Download ZIP” para descarregar a biblioteca como um ficheiro ZIP, como mostrado abaixo:

Depois cria um novo Sketch Arduino, vai a Sketch -> Include Library -> Add .ZIP Library … para instalar a biblioteca ZIP descarregada (DFRobot_C4001-master.zip):

Exemplo de Código: Deteção de Movimento com C4001
O código seguinte inicializa o sensor radar C4001 via interface UART e espera até o sensor ser detetado. Depois configura o sensor para operar em modo de velocidade e ativa a deteção de micro-movimentos para maior sensibilidade. No loop principal, verifica continuamente alvos detetados e lê a distância e velocidade. Quando um alvo está presente, os valores medidos são enviados para o monitor serial.
// Libraries:
// - DFRobot_C4001 V 1.0.0
// https://github.com/DFRobot/DFRobot_C4001
// - ESP32 Core V 3.3.8
#include "DFRobot_C4001.h"
#if defined(ARDUINO_AVR_UNO) || defined(ESP8266)
SoftwareSerial mySerial(4, 5);
DFRobot_C4001_UART radar(&mySerial, 9600);
#elif defined(ESP32)
DFRobot_C4001_UART radar(&Serial2, 9600, /*rx*/ 17, /*tx*/ 16);
#endif
void setup() {
Serial.begin(115200);
while (!radar.begin()) {
Serial.println("Can't find sensor");
delay(1000);
}
radar.setSensorMode(eExitMode);
radar.setDetectionRange(/*min*/ 30, /*max*/ 1000, /*trig*/ 1000);
radar.setTrigSensitivity(1); // 0-9
radar.setKeepSensitivity(2); // 0-9
radar.setDelay(/*trig*/ 0, /*keep*/ 4);
radar.setPwm(/*pwm1*/ 50, /*pwm2*/ 0, /*timer*/ 10);
radar.setIoPolaity(1);
}
void loop() {
if (radar.motionDetection()) {
Serial.println("Motion detected");
}
delay(100);
}
Incluir Biblioteca
O código começa por incluir a biblioteca DFRobot_C4001.h para o sensor. Contém as definições de classes e funções de comunicação para o sensor.
#include "DFRobot_C4001.h"
Configuração Específica da Plataforma
O código suporta Arduino Uno, ESP8266 e ESP32. Usa compilação condicional para selecionar a interface serial correta. Para Arduino Uno e ESP8266, é usada uma porta serial por software, necessária devido às limitações de interfaces UART hardware nestas placas.
#if defined(ARDUINO_AVR_UNO) || defined(ESP8266) SoftwareSerial mySerial(4, 5); DFRobot_C4001_UART radar(&mySerial, 9600);
O pino 4 é configurado como RX e o pino 5 como TX. O sensor comunica a 9600 baud.
Para o ESP32, é usada uma UART hardware, melhorando a fiabilidade e desempenho.
#elif defined(ESP32) DFRobot_C4001_UART radar(&Serial2, 9600, /*rx*/ 17, /*tx*/ 16); #endif
O ESP32 está configurado para usar Serial2 com GPIO17 como RX e GPIO16 como TX. Podes especificar outros pinos aqui.
Inicialização do Objeto
O objeto DFRobot_C4001_UART representa o sensor radar. Gere toda a comunicação e configuração. O construtor recebe uma interface serial e uma taxa de baud. No ESP32, parâmetros adicionais definem os pinos RX e TX.
Função Setup
A função setup inicializa a comunicação serial e configura o sensor.
void setup() {
Serial.begin(115200);
A interface serial principal é iniciada a 115200 baud para saída de depuração no Monitor Serial.
while (!radar.begin()) {
Serial.println("Can't find sensor");
delay(1000);
}
A função radar.begin() inicializa a comunicação com o sensor. Verifica se o módulo responde corretamente. Se o sensor não for detetado, o código imprime uma mensagem de erro e tenta novamente a cada segundo.
Modo do Sensor
O modo do sensor define como os eventos de deteção são tratados.
radar.setSensorMode(eExitMode);
O modo eExitMode é baseado em gatilho. O sensor gera uma saída quando movimento é detetado e reinicia após uma condição definida. Este modo é otimizado para aplicações simples de deteção de movimento.
Outros modos podem fornecer dados contínuos, mas o modo de saída foca-se na deteção baseada em eventos.
Configurações de Alcance de Deteção
O alcance de deteção define onde o sensor deteta movimento ativamente.
radar.setDetectionRange(/*min*/ 30, /*max*/ 1000, /*trig*/ 1000);
O alcance mínimo é definido para 30 cm. Objetos mais próximos são ignorados. O alcance máximo é 1000 cm. Objetos além desta distância são ignorados.
O alcance de gatilho define a distância em que os eventos de deteção são gerados. Neste caso, é igual ao alcance máximo, ativando toda a zona de deteção.
Configuração de Sensibilidade
O sensor oferece dois tipos de configurações de sensibilidade.
radar.setTrigSensitivity(1); // 0-9
A sensibilidade de gatilho controla a facilidade de deteção de movimento. Um valor baixo como 1 reduz a sensibilidade e ajuda a evitar falsos positivos.
radar.setKeepSensitivity(2); // 0-9
A sensibilidade de manutenção controla como o sensor mantém a deteção após o movimento ser detetado. Um valor ligeiramente mais alto assegura que pequenos movimentos mantêm a deteção ativa.
Estes dois parâmetros permitem ajustar entre rapidez de resposta e estabilidade.
Configuração de Temporização
As definições de temporização definem a rapidez da reação do sensor e o tempo que permanece ativo.
radar.setDelay(/*trig*/ 0, /*keep*/ 4);
O atraso de gatilho está definido para 0, significando que o sensor reage imediatamente ao detetar movimento.
O atraso de manutenção está definido para 4. Define quanto tempo o estado de deteção é mantido após o movimento parar, evitando comutação rápida entre detetado e não detetado.
Configurações de Saída PWM
O sensor pode gerar sinais PWM para controlo externo.
radar.setPwm(/*pwm1*/ 50, /*pwm2*/ 0, /*timer*/ 10);
O primeiro canal PWM está definido para um valor de 50, definindo o ciclo de trabalho.
O segundo canal PWM está desativado, definido para 0.
O valor do temporizador define o período do PWM. Esta funcionalidade pode ser usada para controlar dispositivos externos como LEDs ou relés diretamente pelo sensor.
Polaridade da Saída
A polaridade da saída define o nível lógico do sinal de deteção. Note que o nome da função na biblioteca está escrito incorretamente (“Polaity” em vez de “Polarity”).
radar.setIoPolaity(1);
Um valor de 1 define a saída como ativa em nível alto. Isto significa que o sinal de saída fica ALTO quando movimento é detetado. Se definido para 0, a lógica é invertida e o sinal fica BAIXO quando movimento é detetado.
Função Loop
A função loop verifica continuamente a presença de movimento.
void loop() {
if (radar.motionDetection()) {
Serial.println("Motion detected");
}
delay(100);
}
A função radar.motionDetection() retorna true quando movimento é detetado. A lógica de deteção usa todos os parâmetros configurados, incluindo alcance, sensibilidade e temporização.
Quando movimento é detetado, uma mensagem é impressa no monitor serial.
O curto atraso de 100 milissegundos assegura atualizações rápidas mantendo baixo o uso da CPU.
Exemplo de Código: Medições de Velocidade e Distância com C4001
O próximo código inicializa o sensor radar mmWave C4001 usando comunicação UART e configura-o para deteção de movimento e velocidade. No loop principal, o código verifica continuamente se um alvo é detetado e, se sim, lê a distância e velocidade do alvo. Os valores medidos são então impressos no monitor serial, permitindo o acompanhamento em tempo real de objetos em movimento.
// Libraries:
// - DFRobot_C4001 V 1.0.0
// https://github.com/DFRobot/DFRobot_C4001
// - ESP32 Core V 3.3.8
#include "DFRobot_C4001.h"
#if defined(ARDUINO_AVR_UNO) || defined(ESP8266)
SoftwareSerial mySerial(4, 5);
DFRobot_C4001_UART radar(&mySerial, 9600);
#elif defined(ESP32)
DFRobot_C4001_UART radar(&Serial2, 9600, /*rx*/ 17, /*tx*/ 16);
#endif
void setup() {
Serial.begin(115200);
while (!radar.begin()) {
Serial.println("Can't find sensor");
delay(1000);
}
Serial.println("Sensor connected");
radar.setSensorMode(eSpeedMode);
radar.setFrettingDetection(eON);
delay(500);
Serial.println("Ready");
}
void loop() {
if (radar.getTargetNumber() > 0) {
Serial.print("Distance: ");
Serial.print(radar.getTargetRange());
Serial.print(" m Speed: ");
Serial.print(radar.getTargetSpeed());
Serial.println(" m/s");
}
delay(100);
}
Incluir Biblioteca
Como antes, o código começa por incluir a biblioteca necessária para o sensor radar.
#include "DFRobot_C4001.h"
Configuração Específica da Plataforma
De seguida, temos a mesma compilação condicional para suportar múltiplas plataformas. Seleciona a interface serial correta dependendo da placa.
#if defined(ARDUINO_AVR_UNO) || defined(ESP8266) SoftwareSerial mySerial(4, 5); DFRobot_C4001_UART radar(&mySerial, 9600); #elif defined(ESP32) DFRobot_C4001_UART radar(&Serial2, 9600, /*rx*/ 17, /*tx*/ 16); #endif
No Arduino Uno e ESP8266, o pino 4 é configurado como RX e o pino 5 como TX. No ESP32, o Serial2 é inicializado com GPIO17 como RX e GPIO16 como TX.
Função Setup
A função setup inicializa a comunicação serial e prepara o sensor.
void setup() {
Serial.begin(115200);
O monitor serial é iniciado a 115200 baud para imprimir os resultados das medições.
while (!radar.begin()) {
Serial.println("Can't find sensor");
delay(1000);
}
Serial.println("Sensor connected");
A função radar.begin() inicializa a comunicação com o sensor. O loop garante que o programa espera até o sensor responder. Uma vez bem-sucedido, uma mensagem de confirmação é impressa.
Modo do Sensor
O sensor é configurado para o modo de velocidade.
radar.setSensorMode(eSpeedMode);
O modo eSpeedMode permite análise de movimento com medição de velocidade. Neste modo, o sensor acompanha alvos em movimento e calcula a sua velocidade usando o desvio Doppler. Este modo difere da simples deteção de presença porque fornece informação dinâmica sobre o movimento.
Deteção de Micro-Movimentos
O código ativa a deteção de fretting.
radar.setFrettingDetection(eON);
A deteção de fretting permite ao sensor detetar movimentos muito pequenos. Isto inclui micro-movimentos como a respiração ou ligeiros movimentos do corpo. Quando ativado, o sensor torna-se mais sensível a movimentos subtis e essencialmente permite detetar pessoas estacionárias.
Atraso de Estabilização
É adicionado um curto atraso após a configuração.
delay(500);
Serial.println("Ready");
O atraso dá tempo ao sensor para aplicar as novas definições. Depois disso, o sistema está pronto para iniciar as medições.
Função Loop
O loop lê continuamente dados do sensor.
void loop() {
if (radar.getTargetNumber() > 0) {
A função getTargetNumber() retorna o número de alvos detetados. Se pelo menos um alvo estiver presente, o código procede à leitura dos dados de medição.
Serial.print("Distance: ");
Serial.print(radar.getTargetRange());
A função getTargetRange() retorna a distância ao alvo detetado. O valor é dado em metros.
Serial.print(" m Speed: ");
Serial.print(radar.getTargetSpeed());
A função getTargetSpeed() retorna a velocidade do alvo detetado. É calculada usando o desvio Doppler e expressa em metros por segundo.
Serial.println(" m/s");
}
delay(10);
}
Os resultados são impressos no monitor serial num formato legível. O loop corre continuamente com um curto atraso de 100 milissegundos.
Exemplo de Saída
A captura de ecrã abaixo mostra o que deverás ver no Monitor Serial quando o sensor detetar um objeto.

Move a tua mão para mais longe e mais perto do sensor a diferentes velocidades e deverás ver os valores medidos de distância e velocidade a mudar.
Conclusões
Neste tutorial aprendeste a ligar o sensor mmWave C4001 a um Arduino ou ESP32 para deteção de movimento. Em comparação com sensores de movimento por infravermelhos passivos (PIR), o C4001 baseado em radar é mais fiável e pode detetar pessoas estacionárias em faixas de distância específicas.
Se só precisares de um sinal binário de deteção (detetado, não detetado), podes programar o sensor uma vez (por exemplo, definir a distância de deteção) via microcontrolador e depois usar o pino OUT. Para ações de controlo mais complexas, podes programar o microcontrolador para reagir às medições do sensor.
Note que existe também o Gravity: C4001 mmWave Human Presence Detection Sensor, que é muito semelhante ao C4001 mas tem um alcance mais curto (12 metros) e comunica via I2C, em vez de UART. Dá também uma vista de olhos aos sensores mmWave C4002 e mmWave C1001.
Para informações adicionais sobre o sensor mmWave C4001, vê a página Wiki, o Datasheet e o repo que tem outros exemplos de código.
Se tiveres alguma dúvida, sente-te à vontade para deixar nos comentários.
Boas experiências a criar ; )

