До 24 февраля у нас было все (с. "Не смотри вверх").
Не от хорошей жизни собрал я данное устройство.
У меня не было электиричества, связи и учебника геометрии.
А был ноутбук, Ардуино и взрывы ...


В системе много условностей — что земля плоская, сектор обнаружения — 180 градусов, а скорость звука равна 340м/с.
И еще принималось во внимание, что расстояние до источника на порядки больше базы(340мм) между микрофонами, иначе я не писал-бы эти строки.



Так с помощью линейки и транспортира я вычислсл задержки сигнала для различных углов с шагом 10 градусов.


Собственно, устройство — примитив — цифровые выходы датчиков включаются на входы 2(левый) и 3(правый) Ардуино.


Скетч тоже не отличается изяществом, ибо в таких условиях не до красоты кода:


// Point to shoot sound with two microphones (340mm between it) and one serwo, ~10 degree accuracy
#include <Arduino.h>
#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int degree;    // degree to shoot point
int delta = 0; // delay between microphones
boolean Left = false ;  // mark of sound from left side sensor (number 2)

// variables to write interrupts time
volatile unsigned long int time1 = 0;
volatile unsigned long int time2 = 0;

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
// set pins to work with interrupts;   
      myservo.write(180); //test servo to left
      delay(1000);
      myservo.write(0); //test servo to right
      delay(1000);
       myservo.write(90); //test servo to center
      delay(1000);
      attachInterrupt(0, sensor_1, RISING); //left sensor
      attachInterrupt(1, sensor_2, RISING); //right sensor
}

void loop() 
{
  if ( time1 != 0 && time2 != 0 ) {  
    if ( time2<time1 ) {delta=time1-time2; Left=true;} //sound from the left
    if ( time1<time2 ) {delta=time2-time1; Left=false;} //sound from the right
    time1=0;
    time2=0;

       if ( delta > 0 ) {degree=90;}
       if ( delta > 52 ) {degree=80;}
       if ( delta > 223 ) {degree=70;}
       if ( delta > 423 ) {degree=60;}
       if ( delta > 576 ) {degree=50;}
       if ( delta > 702 ) {degree=40;}
       if ( delta > 808 ) {degree=30;}
       if ( delta > 897 ) {degree=20;}
       if ( delta > 959 ) {degree=10;}
       if ( delta > 990 ) {degree=0;}

       if (!Left){degree=180-degree;}
        }
  myservo.write(degree);                  // sets the servo position according to the scaled value
  delay(333);

}

void sensor_1()
{ if ( time1 == 0 ) { time1 = micros(); } }

void sensor_2()
{ if ( time2 == 0 ) { time2 = micros();}  }

Питание схемы — от стабилизированного источника 5В (powerbank).
Отладка производится подстроечниками на звуковых сенсорах.
При постукивании отверткой посередине между датчиками, сервопривод должен устанавливаться в центральное положение.



"Хотят-ли русские войны?"
С этого стихотворения обычно начинается урок мира.
Очень жаль, что многие его не усвоили...

Комментарии (0)