quinta-feira, novembro 11, 2021

Franzininho DIY: Detector de Proximidade

 Já faz mais de três anos desde o último post com um projeto com a Franzininho DIY! Finalmente acho que estou avançando em uma ideia daquela época: juntar todos estes projetos em um livro. Daí veio a busca por ideias para novos projetos. O primeiro resultado está aqui.


Este projeto é uma adaptação de um projeto relativamente popular com o Arduino: prender um sensor ultrassônico a um servo motor para fazer algo semelhante a um radar. Na versão tradicional, a saída do sensor é enviada a um micro onde é apresentada de uma forma gráfica. Para dispensar esta comunicação o meu projeto simplesmente para de movimentar o servo e acende um LED quando detecta um objeto próximo.

Já falei até de mais sobre o sensor ultrassônico HC-SR04 e servo motor. Alguns links:

A ligação elétrica é trivial:


A parte mecânica foi resolvida com dois palitos de dente e cola quente. Dei uma entortada no conector para não bater no motor.

Eita gambiarra bonita!

O código também é simples, já que existe a biblioteca servo para os ATtiny. A lógica para mover de um lado para o outro consiste em ter a posição atual e o valor a ser somado (passo); ao atingir uma das extremidades o passo muda de sinal. Na detecção de proximidade são usados dois limites, para evitar ficar oscilando.

/*
 * Detector de Proximidade
 * DQ - 07/11/21
 */

#include <Servo.h>

// Pinos utilizados
const int pinEcho = 0;
const int pinLED = 1;
const int pinTrigger = 2;
const int pinServo = 3;

// Distâncias para detecção (em cm)
const long LIMITE_MIN = 10L;  // detecta quando chega nesta distância
const long LIMITE_MAX = 20L;  // deixa de detectar quando passa disto

// Controle do servomotor
Servo servo;

// Iniciação
void setup() {
  servo.attach(pinServo);
  pinMode (pinEcho, INPUT);
  pinMode (pinTrigger, OUTPUT);
  pinMode (pinLED, OUTPUT);
  digitalWrite (pinTrigger, LOW);
  digitalWrite (pinLED, LOW);
}

// Laço principal
void loop() {
  static bool detectou = false;
  static int pos = 30;
  static int passo = -10; 

  // Move servo se não detectou
  if (!detectou) {
    pos = pos + passo;
    if ((pos <= 20) || (pos >= 160)) {
      // Atingiu o fim do curso, mudar direção
      passo = -passo;
    }
    servo.write(pos);
    delay (100);
  }

  // Verfica se tem objeto próximo
  digitalWrite (pinTrigger, HIGH);  
  delayMicroseconds (20);  
  digitalWrite (pinTrigger, LOW);  
  long tEcho = pulseIn (pinEcho, HIGH, 38000L);  
  if (tEcho < 38000L) {
    long dist = tEcho/58L;
    if (dist < LIMITE_MIN){
      detectou = true;
    }
    if (dist > LIMITE_MAX){
      detectou = false;
    }
  } else {
    detectou = false;
  }   
  digitalWrite (pinLED, detectou? HIGH : LOW);
}

Nenhum comentário: