sábado, 24 de novembro de 2018

Arduino Sonar

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. 

<< Sumário  

Nenhum comentário:

Postar um comentário