Implementação de um Sonar simples. Segundo a Wikipédia, Sonar (do inglês Sound Navigation and Ranging ou “Navegação e Determinação da Distância pelo Som”) é um instrumento inicialmente usado em época de guerra para a localização de submarinos, mas que hoje em dia passou a ter muita utilização na navegação, na pesca, no estudo e pesquisa dos oceanos, estudos atmosféricos.
Nesse projeto foi utilizado um Arduino, um sensor Ultrassônico (HC-SR04), micro servo motor 9g (SG90). Além disso, foi utilizado uma fonte externa de 5 V para o servo motor e sensor. O servo pode necessitar de muita corrente, então resolvi usar uma fonte externa, caso faça o mesmo, lembre-se de ligar o GND da fonte externa no GND do Arduino.
O servo motor será utilizado para a movimentação do sensor ultrassônico, em um angulo entre 0-180°. Faça as ligações conforme a Figura 1.
Esquemático Sonar |
Após a realização e checagem das ligações, conecte o Arduino ao computador e upload o seguinte código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include <Servo.h> const uint8_t trig_pin = 2; const uint8_t echo_pin = 3; const uint8_t servo_pin = 10; uint8_t angle = 0; uint16_t dist = 0; Servo servo; int calcula_distancia() { long duracao = 0; digitalWrite(trig_pin, LOW); delayMicroseconds(2); digitalWrite(trig_pin, HIGH); delayMicroseconds(10); digitalWrite(trig_pin, LOW); duracao = pulseIn(echo_pin, HIGH); return duracao*0.0343/2; } void setup() { servo.attach(servo_pin, 700, 2300); servo.write(angle); Serial.begin(9600); } void loop() { for(angle = 0; angle < 180; angle++) { servo.write(angle); dist = calcula_distancia(); Serial.println(String(angle)+','+String(dist)); delay(50); } delay(1000); for(angle = 180; angle > 0; angle--) { servo.write(angle); dist = calcula_distancia(); Serial.println(String(angle)+','+String(dist)); delay(50); } delay(1000); } |
Ao abrir o Monitor Serial do IDE do Arduino será possível observar informações sobre o angulo e a distancia até um obstaculo. Agora vem a parte interessante, essas informações foram utilizadas para gerar um gráfico semelhante a um sonar, para isso, foi utilizado o seguinte código em Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | from serial import * from math import* from graphics import* width, height = 500, 500 def limpa_tela(win): for item in win.items[4:]: item.undraw() def main(): port = 'COM8' baudrate = 9600 arduino = Serial(port, baudrate) win = GraphWin("Radar", width, height) win.setBackground("green2") x_axis = Line(Point(0, height/2), Point(width, height/2)) y_axis = Line(Point(width/2, 0), Point(width/2, height)) centerPoint = Point(width/2, height/2) c125 = Circle(centerPoint, width/4) c250 = Circle(centerPoint, width/2) x_axis.draw(win) y_axis.draw(win) c125.draw(win) c250.draw(win) while True: data = arduino.readline().decode("utf-8") angle, dist = data.split(',') angle = float(angle) dist = float(dist) x = width/2 - cos(angle*pi/180)*dist y = height/2 - sin(angle*pi/180)*dist obj = Line(Point(250, 250), Point(x, y)) obj.setFill("red") obj.draw(win) if angle == 0 or angle == 180: limpa_tela(win) if __name__ == "__main__": main() |
Note que esse programa utiliza algumas bibliotecas, que necessitam seres instaladas anteriormente. Se tudo estiver ok, ao executar o código será gerado algo semelhante ao gráfico da figura 2.
Gráfico Radar |
Ok, tenho sou obrigado a concordar, esse gráfico não é dos melhores, mas a ideia era criar algo simples mesmo. O importante é que ele funciona razoavelmente bem. Fique a vontade para modificar e melhorar os códigos dessa página. Enfim, espero que esse projeto tenha sido produtivo e inspirador para você. Até a próxima.
Nenhum comentário:
Postar um comentário