цифровая электроника
вычислительная техника
встраиваемые системы

 


Arduino и ультразвуковой датчик расстояния Pmod MAXSonar

Автор: Mike(admin) от 11-12-2020, 23:55

Arduino и ультразвуковые датчики очень популярны для интеграции при разработке решений для многих приложений в робототехнике и автоматизации. Датчики Pmod MAXSonar, которые могут взаимодействовать с платформой Arduino, позволяют пользователям легко реализовать необходимые возможности измерения дальности независимо от необходимости.


Arduino и ультразвуковой датчик расстояния Pmod MAXSonar

Этот проект демонстрирует, как использовать акустический дальномер Pmod MAXSonar с Arduino Due в трех различных режимах измерения.


Pmod MAXSonar представляет собой ультразвуковой дальномер. Он работает на базе MaxBotix LV-MaxSonar®-EZ1 и может измерять расстояния в диапазоне от 15 до 648 см с точностью до 2,5 см за каждые 50 миллисекунд.


Pmod MAXSONAR может взаимодействовать с Arduino через протокол UART, аналоговый выход и сигнал ШИМ. Протокол UART настроен на скорость передачи 9600 бод, 8 бит, без контроля четности и с одним стоповым битом. Модуль может питаться от 3,3 В или 5 В. Вот таблица распиновки:


Arduino и ультразвуковой датчик расстояния Pmod MAXSonar

Pmod MAXSonar требует 250 миллисекунд для включения, а затем выполнит самокалибровку, если вывод (RX) останется на плавающем или логическом уровне высокого напряжения. Калибровка займет 49 мс, и после дополнительных 100 мс времени ожидания модуль сможет снимать показания каждые 49 миллисекунд. Каждый период 49 миллисекунд начинается с того, что RX становится высоким или открытым, после чего Pmod MAXSonar отправляет пакет передачи, после чего вывод ширины импульса (PW) устанавливается на высокий уровень. Когда объект обнаружен, вывод PW опускается на низкий уровень. На выводе PW высокий уровень до 37,5 миллисекунд, если объект не обнаружен. Остаток от 49 миллисекунд (меньше 4,7 миллисекунды) уходит на настройку аналогового напряжения до нужного уровня. Когда большое расстояние измеряется сразу после считывания короткого расстояния, аналоговое напряжение может не достичь точного уровня в течение одного цикла считывания. Последовательные данные отправляются в течение последних 4,7 миллисекунды.


Arduino и ультразвуковой датчик расстояния Pmod MAXSonar

Когда вывод RX остается плавающим или удерживается на логическом уровне высокого напряжения, 5 байтов будут отправлены через вывод TX, начиная с заглавного символа ASCII 'R', трех цифр ASCII, представляющих обнаруженное расстояние, и символа возврата каретки (символ ASCII 13).


Аналоговый сигнал, представляющий измеренное расстояние до объекта перед Pmod MAXSONAR, также может быть считан. Выход имеет разрешение девять бит. При напряжении питания 3,3 В каждые 2,5 см соответствуют около 6,4 мВ. Пользователи, которые измеряют входящий аналоговый сигнал с помощью популярного 10-битного АЦП, должны будут разделить измеренное значение на 2 перед вычислением сообщенного расстояния.


Pmod MAXSONAR также предоставляет данные о расстоянии через сигнал широтно-импульсной модуляции. Каждые 147 мкс, когда вывод измеряется в состоянии высокого напряжения логического уровня, эквивалентен расстоянию в 2,5 см. Если измеренный уровень сигнала составляет 2,205 миллисекунды, то обнаруженный объект находится на расстоянии 38 см от передней части Pmod MAXSONAR. Максимальное измеренное время импульса 37,5 миллисекунды указывает на то, что в пределах 648 см от Pmod нет объекта.


Теперь подключим датчик Pmod MAXSONAR к Arduino Due и будем считывать результаты измерения расстояния во всех трех режимах. Схема подключения следующая:


Arduino и ультразвуковой датчик расстояния Pmod MAXSonar

Код программы Arduino:



#define PW 2  
#define TX 15 
#define RX 14
#define AN A0 

#define ANALOG   
#define PULSEWIDTH
#define UART  

#define CM
//#define MM
//#define INCH

#define timeout 50

/*------------------------------------------------------------------------*/

int MAXSonar_begin(int RX_pin);    
float MAXSonar_getDistance(int pin, String mode); 
void MAXSonar_end(int RX_pin);
void display_unit(void);  

/*------------------------------------------------------------------------*/

#ifdef UART
#if (RX == 14)
#define Ser Serial3
#elif (RX == 16)
#define Ser Serial2 
#elif (RX == 18)
#define Ser Serial1
#else
#define Ser Serial
#endif
#endif

/*------------------------------------------------------------------------*/

void setup()
{
  Serial.begin(9600);   
  Serial.println("Starting...");

  pinMode(RX, OUTPUT); 
  digitalWrite(RX, LOW);

#ifdef PULSEWIDTH
  pinMode(PW, INPUT);
#endif

#ifdef UART     
  Ser.begin(9600);
#endif

  delay(1000);
}

/*------------------------------------------------------------------------*/

void loop()
{
  Serial.println("Analog aquisition mode: ");
  Serial.print("\tdistane: ");
  MAXSonar_begin(RX);                  
  Serial.print(MAXSonar_getDistance(AN, "analog"));
  MAXSonar_end(RX);  
  display_unit(); 

  Serial.println("PWM aquisition mode: "); 
  Serial.print("\tdistane: ");
  MAXSonar_begin(RX);         
  Serial.print(MAXSonar_getDistance(PW, "pwm"));
  MAXSonar_end(RX); 
  display_unit();  

  Serial.println("UART aquisition mode: ");
  Serial.print("\tdistane: ");
  MAXSonar_begin(RX); 
  Serial.print(MAXSonar_getDistance(RX, "uart")); 
  MAXSonar_end(RX);  
  display_unit();  

  Serial.println();
  delay(3000);  
}

/*------------------------------------------------------------------------*/

int MAXSonar_begin(int RX_pin)
{
  digitalWrite(RX_pin, HIGH); 
  return 0;
}

/*------------------------------------------------------------------------*/

float MAXSonar_getDistance(int pin, String mode)
{
  float distance;

  if (mode.equals("analog"))
  {
#ifdef ANALOG     
    distance = analogRead(pin) / 2.0;
#else
    return -1;
#endif
  }

  /*---------------------------------*/

  else if (mode.equals("pwm"))
  {
#ifdef PULSEWIDTH
    int index = 0;
    while (digitalRead(pin) != HIGH && (index < timeout))
    {
      delay(1);
      index++;
    }
    if (index == timeout)
    {
      return -1;
    }

    index = 0;  
    while (true)
    {
      delayMicroseconds(147);       
      index++;           
      if ((digitalRead(pin) == LOW) || (index > 255))
      {
        if (index > 255)
        {
          return -1; 
        }
        else
        {
          distance = index * 1.0;
          break; 
        }
      }
    }
#endif
  }

  /*---------------------------------*/

  else if (mode.equals("uart"))
  {
#ifdef UART

    int index = 0;
    while (!Ser.available() && (index < timeout))
    {
      delay(1);
      index++;
    }
    if (index == timeout)
    {
      return -1;
    }

    /*--------------*/

    char raw_data[3];  
    if (Ser.available())
    {
      Ser.read();  
      if (Ser.read() == 234)
      {
        for (int i = 0; i < 3; i++)
        {
          while (!Ser.available())
            ;
          raw_data[i] = Ser.read();
        }
        while (!Ser.available())
          ;
        if (Ser.read() == 13)
        {
          distance = String(raw_data).toInt() * 1.0;
        }
        else
        {
          return -1;
        }
      }
      else
      {
        return -1;
      }
    }
#endif
  }

  /*---------------------------------*/

  if (distance != -1)
  {
#if defined(CM)
    distance *= 2.54;
#elif defined(MM)
    distance *= 2.54 * 10;
#endif
  }

  return distance;
}

/*------------------------------------------------------------------------*/

void MAXSonar_end(int RX_pin)
{
  digitalWrite(RX_pin, LOW);
}

/*------------------------------------------------------------------------*/

void display_unit(void)
{
#ifdef INCH
  Serial.println(" inch");
  return;
#endif

#ifdef CM
  Serial.println(" cm");
  return;
#endif

#ifdef MM
  Serial.println(" mm");
  return;
#endif
}

В результате, подключив все компоненты и загрузив код, в последовательном мониторе можно увидеть результаты измерения расстояния ультразвуковым датчиком Pmod MAXSonar.


Arduino и ультразвуковой датчик расстояния Pmod MAXSonar



© digitrode.ru


Теги: Arduino, датчик расстояния




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий