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.

  1. /* 
  2.  * Detector de Proximidade 
  3.  * DQ - 07/11/21 
  4.  */  
  5.   
  6. #include <Servo.h>  
  7.   
  8. // Pinos utilizados  
  9. const int pinEcho = 0;  
  10. const int pinLED = 1;  
  11. const int pinTrigger = 2;  
  12. const int pinServo = 3;  
  13.   
  14. // Distâncias para detecção (em cm)  
  15. const long LIMITE_MIN = 10L;  // detecta quando chega nesta distância  
  16. const long LIMITE_MAX = 20L;  // deixa de detectar quando passa disto  
  17.   
  18. // Controle do servomotor  
  19. Servo servo;  
  20.   
  21. // Iniciação  
  22. void setup() {  
  23.   servo.attach(pinServo);  
  24.   pinMode (pinEcho, INPUT);  
  25.   pinMode (pinTrigger, OUTPUT);  
  26.   pinMode (pinLED, OUTPUT);  
  27.   digitalWrite (pinTrigger, LOW);  
  28.   digitalWrite (pinLED, LOW);  
  29. }  
  30.   
  31. // Laço principal  
  32. void loop() {  
  33.   static bool detectou = false;  
  34.   static int pos = 30;  
  35.   static int passo = -10;   
  36.   
  37.   // Move servo se não detectou  
  38.   if (!detectou) {  
  39.     pos = pos + passo;  
  40.     if ((pos <= 20) || (pos >= 160)) {  
  41.       // Atingiu o fim do curso, mudar direção  
  42.       passo = -passo;  
  43.     }  
  44.     servo.write(pos);  
  45.     delay (100);  
  46.   }  
  47.   
  48.   // Verfica se tem objeto próximo  
  49.   digitalWrite (pinTrigger, HIGH);    
  50.   delayMicroseconds (20);    
  51.   digitalWrite (pinTrigger, LOW);    
  52.   long tEcho = pulseIn (pinEcho, HIGH, 38000L);    
  53.   if (tEcho < 38000L) {  
  54.     long dist = tEcho/58L;  
  55.     if (dist < LIMITE_MIN){  
  56.       detectou = true;  
  57.     }  
  58.     if (dist > LIMITE_MAX){  
  59.       detectou = false;  
  60.     }  
  61.   } else {  
  62.     detectou = false;  
  63.   }     
  64.   digitalWrite (pinLED, detectou? HIGH : LOW);  
  65. }  

Nenhum comentário: