Manual

do

Maker

.

com

Como acionar laser por sensor ultrassônico

Como acionar laser por sensor ultrassônico

Como acionar laser por sensor ultrassônico com Arduino

Esses módulos laser são muito legais para fazer brinquedos. Claro, ele pode ser utilizado também como interrupção em alarmes fotosensíveis, mas não é comum encontrar, exceto em filmes de espionagem. Mas para utilizar com Arduino é uma ótima opção, pois se trata de um diodo laser de 5V e varia entre 2 e 5mW de potência com comprimento de onda em 650nm. Sua temperatura de operação fica em torno de -10 à 40 graus, portanto não deve servir pra brincar em Moscow nem no Piaui, onde nesse último temos apenas três estações ao ano; quente, fervendo e mormaço - e com o tal do aquecimento global, passaremos a verão e inferno. Continuando.

No post anterior mostrei o quadrúpede que utilizará o sensor ultrassônico e disparará o laser sob ameaça. Um gatilho possível para identificação de ameaça seria uma aproximação abrupta em relação à última medição do sensor, indicando um ataque como por exemplo, alguém se aproximando ou atacando o robô a vassouradas. Não se iluda, não há inteligência nenhuma nesse processo, mas é um bom gatilho e funcionará bem no robô, por isso vamos fazer uma brincadeira nesse artigo e o resultado será agregado no robô do post anterior. A brincadeira será fazer uma aproximação suave de forma a não disparar o laser. Para isso, faremos a configuração do sensor ultrassônico e uma memória de tempo/distância para comparar o estado atual com o estado anterior, se a distância for maior que X, o laser dispara por um breve momento, digamos, 1 segundo. E já que estou com a mão na massa, vou aproveitar para fazer um alarme simples utilizando um LDR e um laser, disparando uma sirene em um buzzer simples.

Lista de material

Uma característica interessante do módulo laser é que o ajuste do feixe pode ser feito girando sua ponta para esquerda ou direita, mas a curta distância não há diferença notável. Se pretende fazer o alarme, certamente precisará de um segundo arduino, exceto monte um circuito simples analógico para o laser, em uma protoboard ou em uma placa de prototipagem.

Wiring do laser

Antes de citar diretamente o wiring, gostaria de sugerir como dica que sempre que possível, faça o teste individual dos componentes. Por exemplo o laser, coloquei-o em uma protoboard alimentando-o com 5V no fio vermelho (que é o positivo do laser) junto ao resistor, enquanto o fio azul foi conectado ao ground exposto na protoboard.

O projeto 1 é a conclusão de uma das fases para o robô quadrúpede, que é a sensibilidade a ataque através da medição de distância com mudança drástica. Para essa fase utilizaremos uma protoboard na qual disporemos o sensor ultrassônico e o módulo laser. Também adicionamos um resistor de 330ohms para o módulo laser e o restante é só programação!

Como queremos interromper e acionar o laser, teremos que utilizar um GPIO invés de alimentação no 5V diretamente como no teste. Para isso, utilizaremos o  10 do Arduino, mas nele ligaremos o fio azul, que é GND. Desse modo, quando colocarmos o pino 10 em HIGH, o laser se apagará e quando colocarmo em LOW, ele se acenderá. O laser tem um consumo baixo o suficiente para ser alimentado diretamente pelo pino do Arduino e se desejar, utilize a lógica comum. Eu sempre prefiro utilizar os pinos apenas para GND quando possível para evitar sobrecarga na controladora.

LaserArduino
Azul10
Vermelho5V

Wiring do sensor ultrassônico

Esse sensor tem uma faixa de medição entre 2cm e 400cm com precisão variante entre 3mm. Ele opera em 5V e consome meros 15mA. Possui um ângulo de medição de 15 graus. É importante considerar esse ângulo porque conforme a distância da medição, objetos arredores poderão influenciar no resultado.

O sensor ultrassônico é muito simples de utilizar também, inclusive já escrevi esse tutorial anteriormente para esse outro robô que fiz com partes de carrinho, parte de HD etc. Ficou bacana, tem até um video do brinquedo que vira o "pescoço" para procurar um caminho:

Robô com Arduino no estilo maker

O wiring é simples e utilizam os pinos 12 e 13 do Arduino, seguindo o código de exemplo disposto logo mais adiante. Quanto à conexão, o datasheet fez um parágrafo de atenção dizendo que primeiramente deve-se conectar o GND para não afetar o modo de operação do módulo.

Caso tenha interesse, eis o datasheet do HC-SR04 (PDF).

Olhando-o de frente, o dispositivo tem a sequência de pinos VCC, Trig, Echo, GND.

hc-src04-300x192.webp

Infelizmente (pra mim) não encontrei um desenho pronto no Fritzing (procurando pelo google images) que correspondesse ao wiring do código. Como estou demasiadamente preguiçoso hoje, vou só recomendar; na ordem que você vê a imagem acima:

HC-SR04Arduino
VCC5V
Trig12
Echo13
GNDGND

Codificando

O primeiro passo é fazer funcionar. Em seguida, aplicam-se as lógicas necessárias para atender o propósito. Acontece que a biblioteca que utilizei no meu artigo sobre o sensor ultrassonico é muito antiga. Ainda assim, você pode baixá-la nesse link se desejar, mas temos uma nova biblioteca que pode ser baixada aqui. Baixe-o e descomprima-o dentro do diretório libraries, contido na raiz do diretório da sua IDE do Arduino. Por exemplo, "/home/djames/arduino-1.6.13/libraries". Depois abra a IDE e use esse código de exemplo:

#include <NewPing.h>
 
#define TRIGGER_PIN  12
#define ECHO_PIN     13
#define MAX_DISTANCE 200
 
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
 
void setup() {
  Serial.begin(115200);
}
 
void loop() {
  delay(50);
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm());
  Serial.println("cm");
}

Não dá pra ser mais fácil que isso, hum? Agora vamos fazer um código de controle do laser:

//define um pino para o laser
int inverter  = 1;
int pin_laser = 10;

void setup() {
    //inicia com o laser desligado
    pinMode(pin_laser,OUTPUT);
    digitalWrite(pin_laser,HIGH);
}

void loop() {
    delay(600);
    inverter =! inverter;
    digitalWrite(pin_laser,inverter);
}

Esse código faz o laser piscar em intervalos de 600ms. Se você inverter a lógica, vai funcionar do mesmo modo, portanto preste atenção na de fazer o wiring, conforme explicado lá em cima do artigo.

Código para acionar o laser conforme a distância do alvo

Vou ter que repetir um pouco do que já escrevi, sinto muito fazê-lo, mas precisamos recaptular o objetivo.

Para ficar divertido, não basta que o alvo esteja próximo. Se o robô estiver andando e se aproximar de uma parede, ele dispararia o laser e não faria muito sentido. Como esse artigo tem o objetivo de familiarizá-lo com a dupla laser/ultrassom, não colocaremos a inteligência necessária para que seja aplicável no robô, isso ficará para o respectivo artigo. Mas para não ser algo simples demais, vamos fazer um algorítmo para brincar:

  • cria-se uma variável de distância limite inicial
  • cria-se uma variável para memorizar a distância a cada loop
  • cria-se uma variável para definir o limite entre tempo A e tempo B
  • compara a distância atual com a anterior e, em caso de mudança abrupta, dispara o laser
  • delay de 1 segundo e desliga o laser

Vejamos como isso fica no código:

#include <NewPing.h>
 
#define TRIGGER_PIN  7
#define ECHO_PIN     8
#define MAX_DISTANCE 2000
#define MAX_BETWEEN 10

NewPing sonar(TRIGGER_PIN, ECHO_PIN);

int pin_laser                   = 10;
unsigned long int last_distance = 10;
unsigned long int range         = 0;
unsigned long int distance_now  = 0;

void setup() {
    Serial.begin(115200);
    //inicia com o laser desligado
    pinMode(pin_laser,OUTPUT);
    digitalWrite(pin_laser,HIGH);
}

void loop() {
    //delay(1000);
    distance_now = sonar.ping_cm();
    range        = last_distance - distance_now;

    if (range > MAX_BETWEEN){
        //acende...
        digitalWrite(pin_laser, LOW);
        //delay...
        delay(1000);
        //apaga
        digitalWrite(pin_laser, HIGH);
    }
    last_distance = distance_now;
    Serial.print("Distancia de movimento: ");
    Serial.print(range);
    Serial.println("cm");
    Serial.print("Medido: ");
    Serial.print(distance_now);
    Serial.print(" NO SENSOR: ");
    Serial.print(sonar.ping_cm());
    Serial.println("cm");
}

Porém tive um problema; meu sensor ultrassônico está um pouco torto e está gerando ruído. Fiz um teste colocando um envelope de papel entre o echo e o trigger, mas ainda assim não conseguir tirar bons valores e não consegui confirmar se o código está bom ou se tem erro de lógica, fiz o teste básico e a parte do laser não funcionou bem o suficiente, mas consegui notar mudanças. Se possível, faça o teste também. No próximo artigo do quadpod vamos integrar isso, até lá já estarei com um novo sensor ultrassônico provavelmente.

Já no próximo artigo pretendo mostrar como fazer um alarme de interrupção com o laser e LDR, é só acompanhar.

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.