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