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

Этот проект демонстрирует, как использовать акустический дальномер 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 В. Вот таблица распиновки:

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

Когда вывод 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:
#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.

© digitrode.ru