Arduino Nano - Sensor de Movimento

Você já se perguntou: “Como isso funciona?” ao passar por lugares com portas, luzes e escadas rolantes automáticas? Se sim, este tutorial não só vai responder à sua pergunta, como também vai mostrar como fazer isso acontecer usando o Arduino Nano e o sensor de movimento. Vamos começar!

Este tutorial ensina você a usar o Arduino Nano com o sensor de movimento. Em detalhes, vamos aprender:

Hardware Necessário

1×Official Arduino Nano
1×Alternatively, DIYables Nano V3.0 Development Board
1×Cabo USB A para Mini-B
1×Sensor de Movimento HC-SR501
1×Fios Jumper
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para Arduino Nano
1×(Recomendado) Placa de Expansão Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentação para Arduino Nano

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.

Sobre o Sensor de Movimento HC-SR501

Sensor de movimento HC-SR501

O sensor PIR HC-SR501 é capaz de detectar o movimento de pessoas (ou animais). Ele é muito usado em diversas aplicações, como ligar ou desligar uma lâmpada automaticamente, abrir e fechar uma porta, ativar ou desativar uma escada rolante e detectar um intruso.

Pinagem do Sensor de Movimento

O sensor de movimento HC-SR501 tem 3 pinos:

  • Pino GND: deve ser conectado ao GND (0V)
  • Pino VCC: deve ser conectado ao VCC (5V)
  • Pino OUTPUT: é um pino de saída e fica em LOW quando nenhum movimento é detectado e em HIGH quando um movimento é detectado. Esse pino precisa ser conectado a um pino de entrada do Arduino.

O HC-SR501 tem um jumper e dois potenciômetros que servem para ajustar as configurações do sensor.

Pinagem do sensor de movimento HC-SR501

Como Funciona

O sensor HC-SR501 consegue detectar movimento com base nas mudanças da radiação infravermelha de um objeto em movimento. Para que o sensor HC-SR501 detecte o objeto, dois critérios precisam ser atendidos:

  • O objeto deve estar em movimento ou balançando
  • O objeto deve estar emitindo radiação infravermelha

Consequentemente:

  • Se um objeto estiver se movendo, mas não emitir raios infravermelhos (por exemplo, um robô ou um carrinho de brinquedo), ele não será detectado pelo sensor.
  • Se um objeto estiver emitindo raios infravermelhos, mas não estiver se movendo (por exemplo, uma pessoa parada), ele não será detectado pelo sensor.

Pessoas e animais são fontes de radiação infravermelha. Por isso, o sensor consegue detectar os movimentos deles.

Estado do pino OUTPUT:

  • Quando nenhuma pessoa (ou animal) está dentro da área de detecção do sensor, o pino OUTPUT do sensor fica em LOW.
  • Se uma pessoa (ou animal) entrar na área de detecção do sensor, o pino OUTPUT passa de LOW para HIGH, indicando que um movimento foi detectado.
  • Quando a pessoa (ou animal) sai da área de detecção do sensor, o pino OUTPUT passa de HIGH para LOW, indicando que o movimento terminou.

O vídeo acima demonstra o funcionamento básico de um sensor de movimento. Na realidade, o sensor de movimento pode funcionar de forma diferente dependendo da configuração (que é descrita na seção Usos Avançados).

Detectar a Presença de Pessoas

O sensor em si não reconhece a presença de pessoas. Ele só detecta o movimento. Usamos um Arduino Nano para deduzir a presença de pessoas com base no movimento detectado pelo sensor, seguindo esta regra:

  • Se um movimento for detectado, então há pessoas presentes.
  • Se nenhum movimento for detectado, então não há pessoas presentes.

Essa regra funciona de forma imperfeita em uma situação prática: quando as pessoas estão dentro da área do sensor, mas não se movem, o movimento não será detectado. Consequentemente, o Arduino Nano concluirá que não há pessoas presentes.

Por exemplo, o sensor de movimento da sua sala de reunião está configurado para acender as luzes quando há pessoas presentes. Quando a reunião está em andamento e ninguém se move, o movimento não é detectado e, por isso, a presença humana não é reconhecida, o que faz as luzes serem desligadas. Para acendê-las de novo, alguém precisa se mover.

No entanto, esse problema NÃO é sério e o sensor é barato. Por isso, ele é muito usado para detectar pessoas em várias aplicações.

Arduino Nano - Sensor de Movimento HC-SR501

Conecte um pino de entrada digital do Arduino ao pino OUTPUT do sensor HC-SR501. Com o código do Arduino Nano, podemos verificar o valor do pino OUTPUT para detectar movimento.

Diagrama de Ligação

Diagrama de ligação do Arduino Nano com sensor de movimento

This image is created using Fritzing. Click to enlarge image

Veja A melhor forma de alimentar o Arduino Nano e outros componentes.

Configuração Inicial

Ajuste do Tempo de AtrasoGire totalmente no sentido anti-horário.
Ajuste do Alcance de DetecçãoGire totalmente no sentido horário.
Seletor de Disparo RepetidoColoque o jumper como mostrado na imagem.
Configuração inicial do sensor de movimento para Arduino

Como Programar o Sensor de Movimento

  • Configure um pino do Arduino como entrada digital usando a função pinMode().
pinMode(MOTION_SENSOR_PIN, INPUT);
  • Verifique o estado do pino OUTPUT do sensor com a função digitalRead().
motion_state = digitalRead(MOTION_SENSOR_PIN);
  • Identifique quando o movimento começa (o estado do pino muda de LOW para HIGH).
prev_motion_state = motion_state; // store old state motion_state = digitalRead(MOTION_SENSOR_PIN); // read new state if (prev_motion_state == LOW && motion_state == HIGH) { // pin state change: LOW -> HIGH Serial.println("Motion detected!"); }
  • Identifique quando o estado do pino mudou de HIGH para LOW, indicando que o movimento parou.
prev_motion_state = motion_state; // store old state motion_state = digitalRead(MOTION_SENSOR_PIN); // read new state if (prev_motion_state == HIGH && motion_state == LOW) { // pin state change: HIGH -> LOW Serial.println("Motion stopped!"); }

Código Arduino Nano

/* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-motion-sensor */ #define MOTION_SENSOR_PIN 2 // The Arduino Nano pin connected to the OUTPUT pin of motion sensor int motion_state = LOW; // current state of pin int prev_motion_state = LOW; // previous state of pin void setup() { Serial.begin(9600); // Initialize the Serial to communicate with the Serial Monitor. pinMode(MOTION_SENSOR_PIN, INPUT); // set arduino pin to input mode to read value from OUTPUT pin of sensor } void loop() { prev_motion_state = motion_state; // store old state motion_state = digitalRead(MOTION_SENSOR_PIN); // read new state if (prev_motion_state == LOW && motion_state == HIGH) { // pin state change: LOW -> HIGH Serial.println("Motion detected!"); // TODO: turn on alarm, light or activate a device ... here } else if (prev_motion_state == HIGH && motion_state == LOW) { // pin state change: HIGH -> LOW Serial.println("Motion stopped!"); // TODO: turn off alarm, light or deactivate a device ... here } }

Passos Rápidos

  • Copie o código acima e abra-o no Arduino IDE.
  • Clique no botão Upload no Arduino IDE para compilar e fazer o upload do código para o Arduino Nano.
  • Abra o Serial Monitor.
  • Mova a mão dentro da área do sensor.
  • Veja a saída no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' on 'COM15')
New Line
9600 baud
Motion detected! Motion stopped!
Ln 11, Col 1
Arduino Nano on COM15
2

Vídeo

Usos Avançados

Esta seção traz um conhecimento mais aprofundado. NÃO se preocupe se você não entender. Pule esta seção se ela parecer difícil demais e volte outro dia. Continue lendo as próximas seções.

Como dito antes, podemos alterar a configuração do sensor usando um jumper e dois potenciômetros.

Ajuste do Alcance de Detecção

Este potenciômetro muda a distância em que algo pode ser detectado (cerca de 3 a 7 metros).

  • Girá-lo totalmente para a direita faz o sensor detectar coisas a até 3 metros de distância.
  • Girá-lo totalmente para a esquerda faz o sensor detectar coisas a até 7 metros de distância.
Alcance de detecção do sensor de movimento

Podemos usar o potenciômetro para definir um valor entre 3 m e 7 m.

Ajuste do Tempo de Atraso

Este potenciômetro é usado para modificar o tempo de atraso:

  • Quando ele é girado totalmente no sentido horário, o tempo de atraso é de cerca de 5 minutos.
  • Quando ele é girado totalmente no sentido anti-horário, o tempo de atraso é de aproximadamente 3 segundos.

A seção a seguir explica o conceito de tempo de atraso em conjunto com o Disparo Repetido.

Ajuste do tempo de atraso do sensor de movimento

Seletor de Disparo Repetido

Há um jumper que serve para escolher entre os modos de disparo: disparo único ou disparo repetido.

Seleção do modo de disparo do sensor de movimento

Vamos chamar de time_delay a configuração do tempo de atraso, definida pelo Ajuste do Tempo de Atraso. Se você se mover dentro da área do sensor por um longo período (conhecido como motion_time) que seja várias vezes maior que time_delay:

  • No Modo de Disparo Único: o estado do pino OUTPUT alternará entre LOW e HIGH várias vezes. A duração em HIGH será igual a time_delay, enquanto a duração em LOW é fixa em 3 segundos.
Modo de disparo único do sensor de movimento
  • Modo de disparo repetido: o estado do pino OUTPUT permanecerá em HIGH por um período de (motion_time + time_delay).
Modo de disparo repetido do sensor de movimento

Teste

  • Modo de disparo único:
    • Coloque o jumper para selecionar o modo de disparo único
    • Acene com a mão na frente do sensor por cerca de 10 segundos.
    • Afaste a mão da área do sensor
    • Espere 3 segundos e você deve observar a saída no Serial Monitor da seguinte forma:
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Arduino Nano
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Arduino Nano' on 'COM15')
    New Line
    9600 baud
    Motion detected! Motion stopped! Motion detected! Motion stopped! Motion detected! Motion stopped!
    Ln 11, Col 1
    Arduino Nano on COM15
    2

    Modo de disparo repetido:

    • Coloque o jumper para escolher o modo de disparo repetido
    • Acene com a mão na frente do sensor por cerca de 10 segundos
    • Afaste a mão do alcance do sensor
    • Espere 3 segundos e a saída será exibida no Serial Monitor assim:
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Arduino Nano
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Arduino Nano' on 'COM15')
    New Line
    9600 baud
    Motion detected! Motion stopped!
    Ln 11, Col 1
    Arduino Nano on COM15
    2

    Podemos observar que, no modo de disparo único, o sensor é ativado duas ou três vezes. Já no modo de disparo repetido, o sensor dispara apenas uma vez.

    ※ Nota:

    Durante o tempo em LOW (3 segundos, um valor fixo e não ajustável), o sensor não consegue detectar nenhum movimento. Isso não causa problemas na prática.

    Recomenda-se usar o modo de disparo repetido.

    Em muitos cenários do mundo real:

    • Ligamos ou ativamos dispositivos/máquinas assim que uma pessoa está presente
    • NÃO desligamos nem desativamos dispositivos/máquinas imediatamente depois que a pessoa deixa de estar presente. Desligamos ou desativamos dispositivos/máquinas depois que passa um certo tempo.

    Como Usar o Tempo de Atraso

    Se nenhuma pessoa for detectada, o sistema de automação esperará por um período de tempo antes de agir.

    O sensor de movimento tem um Ajuste do Tempo de Atraso que pode definir o tempo de atraso com mínimo de 3 segundos e máximo de 5 minutos. Além disso, o código do Arduino Nano pode ser usado para definir qualquer valor para o tempo de atraso.

    Se não especificarmos um tempo limite no código do Arduino Nano, o tempo limite será equivalente ao tempo de atraso definido no sensor.

    Se um tempo limite for definido no código do Arduino Nano, ele será a soma do tempo de atraso da configuração do sensor com o tempo de atraso do código do Arduino Nano.

    Definindo o tempo de atraso no código do Arduino Nano

    /* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-motion-sensor */ #define MOTION_SENSOR_PIN 2 // The Arduino Nano pin connected to the OUTPUT pin of motion sensor int motion_state = LOW; // current state of pin int prev_motion_state = LOW; // previous state of pin const unsigned long DELAY_TIME_MS = 30000; // 30000 miliseconds ~ 30 seconds bool delay_enabled = false; unsigned long delay_start_ms; void setup() { Serial.begin(9600); // Initialize the Serial to communicate with the Serial Monitor. pinMode(MOTION_SENSOR_PIN, INPUT); // set arduino pin to input mode to read value from OUTPUT pin of sensor } void loop() { prev_motion_state = motion_state; // store state motion_state = digitalRead(MOTION_SENSOR_PIN); // read new state if (prev_motion_state == LOW && motion_state == HIGH) { // pin state change: LOW -> HIGH Serial.println("Motion detected!"); Serial.println("Turning on / activating"); delay_enabled = false; // disable delay // TODO: turn on alarm, light or activate a device ... here } else if (prev_motion_state == HIGH && motion_state == LOW) { // pin state change: HIGH -> LOW Serial.println("Motion stopped!"); delay_enabled = true; // enable delay delay_start_ms = millis(); // set start time } if (delay_enabled == true && (millis() - delay_start_ms) >= DELAY_TIME_MS) { Serial.println("Turning off / deactivating"); delay_enabled = false; // disable delay // TODO: turn off alarm, light or deactivate a device ... here } }

    Se o modo de disparo repetido estiver ativado, o atraso no código será de 30 segundos mais time_delay, que é definido na configuração do sensor por meio do Ajuste do Tempo de Atraso.

Desafie-se

Use o sensor de movimento para realizar um destes projetos:

  • Acender a luz quando você entrar no seu quarto e apagá-la 30 segundos depois que você sair. Dica: Veja Arduino Nano - Relé.
  • Disparar um alarme quando alguém se aproximar dos seus objetos de valor. Dica: Veja Arduino Nano - Buzzer Piezo.

Referências de Funções

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!