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