Skip to Content

Deteção de Presença Humana com mmWave C4001

Deteção de Presença Humana com mmWave C4001

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 Lolin32

ESP32 Lite

Cabo USB C

Arduino

Arduino Uno

USB Data Sync cable Arduino

Cabo USB para Arduino UNO

Dupont wire set

Conjunto de Cabos Dupont

Half_breadboard56a

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.

Parte Traseira e Frontal do Sensor mmWave C4001 (source)

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.

Alcance de Deteção do Sensor mmWave C4001 (source)

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:

 Pinout of the mmWave C4001 Sensor
Pinout do Sensor mmWave C4001 (source)

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:

Connecting the mmWave C4001 Sensor to LED
Ligação do Sensor mmWave C4001 a um LED

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:

Connecting the mmWave C4001 Sensor to Relay Module
Ligação do Sensor mmWave C4001 a um Módulo Relé

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:

Connecting the mmWave C4001 Sensor to an Arduino UNO
Ligação do Sensor mmWave C4001 a um Arduino UNO

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:

mmWave C4001 Sensor connected to an Arduino UNO
Sensor mmWave C4001 ligado a um Arduino UNO

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:

Connecting the mmWave C4001 Sensor to an ESP32
Ligação do Sensor mmWave C4001 a um ESP32

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 ; )