Датчик расстояния URM37 - подключение к AVR и к компьютеру (по USB)

Ультразвуковой датчик расстояния URM37 может использоваться в радиолюбительских конструкциях (роботах, игрушках) и устройствах сигнализации.
Рис. 1- Внешний вид
 
[Подключение URM37 к микроконтроллеру AVR]
Если нужно подключить датчик к микроконтроллеру, то это сделать довольно просто благодаря наличию в датчике последовательного порта RS-232 с уровнями TTL. Для полного управления всеми возможностями датчика достаточно 5 проводов:
+5V питание
GND питание, общий провод
RST сброс контроллера в URM37, если подан лог. 0 (использовать необязательно)
RXD прием данных (TTL RS232)
TXD передача данных (TTL RS232)
Есть и другие способы подключения датчика URM37 (например, чтение расстояния по сигналу PWM) - см. [1], но в этой статье они не рассматриваются, так как обладают ограниченными возможностями. Внимание! При подключении датчика правильно установите перемычки J1, J2, J3 (см. [1]), иначе можете повредить порты подключаемого микроконтроллера высоким напряжением сигнала ±12V TXD, который генерирует MAX202 (двухканальный приемопередатчик RS-232).
Подключение датчика URM37 к микроконтроллеру AVR на примере макетной платы AVR-USB-MEGA16 (ATmega32A), см. [7]:
 
Рис.2 - Схема подключения URM37 к микроконтроллеру AVR
 
Чтобы осуществить работу с датчиком URM37, нужно настроить порт USART микроконтроллера на параметры соединения 9600; Parity: none; Stop bit: 1. Если используется сигнал сброса URM37 RST (что необязательно), то ножку порта RST нужно настроить как выход и вывести туда лог. уровень 1. Для чтения расстояния нужно вывести через USART 4 байта 0x22 0x00 0x00 0x22 и в ответ принять 4 байта, содержащие код команды, данные расстояния и контрольную сумму (см. в [1] описание протокола URM37).
Пример настройки порта USART для частоты кварца 12 МГц, микроконтроллер ATmega32A (AVR-USB-MEGA16). Макрос SERIAL_2X_UBBRVAL можно подсмотреть в библиотеке LUFA, см. [6]: 
 
// UMSEL=0 (async UART), UPM=00 (no parity), USBS=0 (1 stop-bit),
// UCSZx=011 (8 бит), UCPOL=0 (в режиме async)
u8 ConfigMask = ((1 << UCSZ1) | (1 << UCSZ0));

// Перед реконфигурированием USART нужно выключить, 
// иначе возможна некорректная работа
UCSRB = 0;
UCSRA = 0;
UCSRC = 0;

// Установка новой скорости перед конфигурированием USART
// с учетом установленного бита двойной скорости U2X
UBRR = SERIAL_2X_UBBRVAL(9600);

// Конфигурирование USART в режиме двойной скрости
UCSRC = ConfigMask;
UCSRA = (1 << U2X);
UCSRB = ((1 << RXCIE) | (1 << TXEN) | (1 << RXEN));
 
Пример отправки через USART команды чтения расстояния: 

Пример приема через USART ответа от датчика URM37 в обработчике прерывания (реализацию обработчика прерывания и кольцевого буфера см. в библиотеке LUFA [6]): 
 
ISR(USART_RX_vect, ISR_BLOCK)
{
  u8 ReceivedByte = UDR;

  if (rxUSART_Buffer.Count<sizeof(rxUSART_Buffer_Data))
     RingBuffer_Insert(&rxUSART_Buffer, ReceivedByte);
  rxUSARTtimeout = 0;
}
 
[Подключение URM37 к компьютеру через RS-232]
Если же нужно подключить датчик к компьютеру, то при наличии обычного порта RS-232 это сделать довольно просто - достаточно правильно установить перемычки J1, J2, J3 (см. [1]) для получения ±12V уровней RS-232, и правильно развести сигналы TXD и RXD. Кроме того, для питания датчика URM37 нужно напряжение +5V. Это напряжение можно взять от порта USB, либо от внешнего стабилизированного источника питания +5 вольт. Внимание! Установите перемычки J1, J2, J3 в правильное положение, иначе рискуете испортить датчик высоким уровнем напряжения ±12V, который попадет на вход RXD датчика.

Рис.3 - Схема подключения URM37к компьютеру через RS-232
Для управления датчиком (отправки специальных команд для чтения расстояния) нужно написать специальную программу. Для проверки работоспособности подключения можно взять тест-программу URM37V3.2helpmate.exe, см. [4], которая позволяет отправлять команды протокола датчика URM37 и принимать от него байты данных в сыром, нерасшифрованном виде.
 
Рис.4 - Тест-программа URM37V3.2helpmate.exe
 
Если же в компьютере или ноутбуке нет порта RS-232, то нужен переходник USB-RS232, либо нужно собрать схему на микросхеме моста FT232. Для этих способов подключения датчика на компьютере также нужен специальный софт, поддерживающий протокол датчика URM37, см. [1].
[Подключение URM37 к компьютеру через USB]
 
Мост USB <--> URM37 несложно собрать на микроконтроллере AVR. Такой способ может оказаться предпочтительнее, если нужно получать информацию с датчика URM37 сразу в расшифрованном виде, и отображать её на компьютере. Тогда уже не нужно писать программу для компьютера (поддерживающую протокол URM37), можно воспользоваться любой терминальной программой, которая умеет работать с виртуальным COM-портом. Готовых терминальных программ написано очень много - putty, SecureCRT, TerraTerm, HyperTerminal и т. д., поэтому с отображением текстовой информации от датчика URM37 нет никаких проблем. Обработку протокола датчика URM37 и преобразования данных байт расстояния в текстовый вид может взять на себя микроконтроллер моста. Получится такая общая схема подключения: [терминальная программа] <--> [USB COM-порт] <--> [USB CDC (V-USB, LUFA)] <--> [URM37].

Рис.5 -  Подключение URM37 к компьютеру через USB
 
В этой статье рассмотрен мост USB <--> URM37 на микроконтроллере AT90USB162 (макетные платы AVR-USB162, AVR-USB162MU).
 
[Подключение URM37 к макетной плате AVR-USB162]

Рис.7 - Внешний вид собранного подключения
[Подключение URM37 к макетной плате AVR-USB162MU]
Рис.8 -  Подключение URM37 к макетной плате AVR-USB162MU
Рис.9 - Внешний вид собранного подключения
 
В зависимости от установленной перемычки PB0 BRIDGE мост USB <--> URM37 может работать в двух режимах - как чистый двоичный мост (тогда нужно работать с датчиком URM37 напрямую, например через утилиту URM37V3_2helpmate_exe), либо в режиме автозапуска, когда микроконтроллер моста сам управляет дачиком URM37, читает с него данные, преобразует их в удобный текстовый вид и передает для отображения в USB COM-порт компьютера.
 
 
[Ссылки]
1. Ультразвуковой датчик расстояния URM37 - документация на русском языке. 
2. Макетная плата AVR-USB162.
3. Макетная плата AVR-USB162MU.
4. Программа для работы с датчиком URM37V3.2helpmate.exe, документация по датчику URM37.
5. Исходный код и скомпилированное firmware моста USB <--> URM37 для макетных плат AVR-USB162, AVR-USB162MU.
6. LUFA - бесплатная библиотека USB для микроконтроллеров Atmel AVR.
7. Исходный код и скомпилированное firmware моста USB <--> URM37 для макетной платы AVR-USB-MEGA16.
8. AVR-USB-MEGA16: подключение URM37 ultrasonic sensor через USB
 
   Автор:  Danya