En el fragmento de código que te presento hoy vamos a ver cómo hacer un sonar con Arduino. Hay dos partes fundamentales en este dispositivo. Por un lado está el sensor de ultrasonidos, nos va a permitir detectar los objetos, y por otra parte está el servomotor, moverá el sensor en un giro de 180º para poder detectar los objetos que hay alrededor del dispositivo. El sonar puede ser útil en muchos casos como por ejemplo un robot que se desplaza detectando los objetos con el sensor de ultrasonidos.
Las conexiones que debemos hacer ya las conocéis, no difieren mucho de lo visto en anteriores fragmentos de código, te dejo aquí un ejemplo de cómo podríamos hacerlo.
El código que te propongo a continuación es una mezcla entre el servomotor y el sensor de ultrasonidos. Básicamente consiste en mover el servo un número de grados y para cada giro hacer la detección con el sensor. Para girar el servo utilizo dos bucles, uno que va de 0º a 180º y otro que va de 180º a 0º. Los dos movimientos, hacia los 180º y hacia los 0º, son de grado en grado, la mayor precisión. En el caso que se quiera menos precisión se podrían modificar los bucles e incrementar las variables otra cantidad como por ejemplo 2 grados. Esto haría que variara la velocidad ya que tardaría menos en recorrer los 180º en sentido ascendente o descendente. A continuación puedes ver el código que he escrito.
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
1740/* Creado: Luis del Valle (ldelvalleh@programarfacil.com) https://programarfacil.com */ // Incluimos la librería para utilizar el servo #include <Servo.h> // Configuramos los pines del sensor Trigger y Echo const int PinTrig = 2; const int PinEcho = 3; // Constante velocidad sonido en cm/s const float VelSon = 34000.0; float distancia; Servo servoMotor; // create servo object to control a servo void setup() { servoMotor.attach(9); // attaches the servo on pin 9 to the servo object // Iniciamos el monitor serie para mostrar el resultado Serial.begin(9600); // Ponemos el pin Trig en modo salida pinMode(PinTrig, OUTPUT); // Ponemos el pin Echo en modo entrada pinMode(PinEcho, INPUT); } void loop() { // Rotamos el servo de 0 a 180 grados de grado en grado for (int pos = 0; pos <= 180; pos += 1) { // Vamos a la siguiente posición servoMotor.write(pos); // Esperamos 50 ms hasta que el servo alcance la posición delay(50); // Medimos distancia al objeto tomarMedida(pos); } // Rotamos el servo de 180 a 0 grados, de grado en grado for (int pos = 180; pos >= 0; pos -= 1) { // Vamos a la siguiente posición servoMotor.write(pos); // Esperamos 50 ms hasta que el servo alcance la posición delay(50); // Medimos distancia al objeto tomarMedida(pos); } } // Sonar void tomarMedida(int angulo) { iniciarTrigger(); // La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH unsigned long tiempo = pulseIn(PinEcho, HIGH); // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos // por eso se multiplica por 0.000001 distancia = tiempo * 0.000001 * VelSon / 2.0; Serial.print(distancia); Serial.print("@"); Serial.print(angulo); Serial.print("\n"); } // Método que inicia la secuencia del Trigger para comenzar a medir void iniciarTrigger() { // Ponemos el Triiger en estado bajo y esperamos 2 ms //digitalWrite(PinTrig, LOW); //delayMicroseconds(2); // Ponemos el pin Trigger a estado alto y esperamos 10 ms digitalWrite(PinTrig, HIGH); delayMicroseconds(10); // Comenzamos poniendo el pin Trigger en estado bajo digitalWrite(PinTrig, LOW); } |
Por otro lado sería interesante programar una aplicación con Visual Studio que nos representara gráficamente el sonar, pero esto lo veremos en otro fragmento de código. Te dejo un vídeo con una prueba que he realizado en una aplicación realizada con WPF y Visual C#.