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:
- https://dqsoft.blogspot.com/2013/04/sensor-ultrassonico-hc-sr04-parte-1.html
- https://dqsoft.blogspot.com/2013/05/sensor-ultrassonico-hc-sr04-parte-2.html
- https://dqsoft.blogspot.com/2009/10/controlando-um-servomotor.html
- https://www.filipeflop.com/blog/usando-um-servomotor-com-a-raspberry-pi-pico/
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:
Postar um comentário